From ed5b727e89db85a05c88abe1e63e52474fe63c67 Mon Sep 17 00:00:00 2001 From: Todd Hill <110035210+tkhill-AWS@users.noreply.github.com> Date: Fri, 19 Jul 2024 11:40:16 -0400 Subject: [PATCH 01/98] Javav2: Examples that show working with S3 event notifications (#6658) Add example to demonstration S3EventNotification class usage and modify example that shows how to configure an S3 bucket to send notifications to EventBridge. --- .doc_gen/metadata/s3_metadata.yaml | 29 +- javav2/example_code/eventbridge/README.md | 13 + javav2/example_code/s3/README.md | 27 +- javav2/example_code/s3/pom.xml | 33 +- .../s3/ProcessS3EventNotification.java | 273 ++++++++++ ...tBucketS3EventNotificationEventBridge.java | 359 ++++++++++++++ .../s3/SetBucketEventBridgeNotification.java | 82 --- .../s3/src/main/resources/direct-target.yaml | 469 ++++++++++++++++++ .../s3/src/main/resources/log4j2.xml | 2 + .../s3/src/main/resources/queue-topic.yaml | 302 +++++++++++ .../s3/ProcessS3EventNotificationTest.java | 47 ++ ...ketS3EventNotificationEventBridgeTest.java | 107 ++++ javav2/example_code/sqs/README.md | 13 + .../javav2_s3_event_notification/README.md | 26 + .../cdk/javav2_s3_event_notification/cdk.json | 68 +++ .../cdk/javav2_s3_event_notification/pom.xml | 60 +++ .../java/com/myorg/DirectTargetStack.java | 38 ++ .../main/java/com/myorg/EventBridgeStack.java | 65 +++ .../myorg/Javav2S3EventNotificationApp.java | 21 + .../main/java/com/myorg/QueueTopicStack.java | 51 ++ 20 files changed, 1999 insertions(+), 86 deletions(-) create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/ProcessS3EventNotification.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/PutBucketS3EventNotificationEventBridge.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/SetBucketEventBridgeNotification.java create mode 100644 javav2/example_code/s3/src/main/resources/direct-target.yaml create mode 100644 javav2/example_code/s3/src/main/resources/queue-topic.yaml create mode 100644 javav2/example_code/s3/src/test/java/com/example/s3/ProcessS3EventNotificationTest.java create mode 100644 javav2/example_code/s3/src/test/java/com/example/s3/PutBucketS3EventNotificationEventBridgeTest.java create mode 100644 resources/cdk/javav2_s3_event_notification/README.md create mode 100644 resources/cdk/javav2_s3_event_notification/cdk.json create mode 100644 resources/cdk/javav2_s3_event_notification/pom.xml create mode 100644 resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/DirectTargetStack.java create mode 100644 resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/EventBridgeStack.java create mode 100644 resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/Javav2S3EventNotificationApp.java create mode 100644 resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/QueueTopicStack.java diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index c04765701b4..0c4e4d7722a 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -2346,6 +2346,14 @@ s3_PutBucketNotificationConfiguration: - description: snippet_tags: - S3.dotnetv3.EnableNotificationsExample + services: + s3: {PutBucketNotificationConfiguration} +s3_Scenario_PutBucketNotificationConfiguration: + title: Send S3 event notifications to &EVlong; using an &AWS; SDK + title_abbrev: Send event notifications to &EV; + synopsis: enable a bucket to send S3 event notifications to &EV; and route notifications to an &SNS; topic and &SQS; queue. + category: Scenarios + languages: Java: versions: - sdk_version: 2 @@ -2354,9 +2362,10 @@ s3_PutBucketNotificationConfiguration: excerpts: - description: snippet_tags: - - s3.java2.s3_enable_notifications.main + - s3.java2.s3_enable_notifications_to_eventbridge services: s3: {PutBucketNotificationConfiguration} + eventbridge: {PutRule, PutTargets} s3_PutBucketAccelerateConfiguration: languages: .NET: @@ -3302,3 +3311,21 @@ s3_Scenario_AbortMultipartUpload: - s3.java2.abort_upload_using_lifecycle_config services: s3: {ListMultipartUploads, AbortMultipartUpload, PutBucketLifecycleConfiguration} +s3_Scenario_ProcessS3EventNotification: + title: Receive and process &S3; event notifications by using an &AWS; SDK. + title_abbrev: Process S3 event notifications + synopsis: work with S3 event notifications in an object-oriented way. + category: Scenarios + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: This example show how to process S3 notification event by using &SQS;. + snippet_tags: + - s3.java2.process_s3_event_notifications + services: + s3: {PutBucketNotificationConfiguration} + sqs: {ReceiveMessage, GetQueueAttributes, DeleteMessageBatch} diff --git a/javav2/example_code/eventbridge/README.md b/javav2/example_code/eventbridge/README.md index 123321cc248..e1b6a380a97 100644 --- a/javav2/example_code/eventbridge/README.md +++ b/javav2/example_code/eventbridge/README.md @@ -56,6 +56,7 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Get started with rules and targets](src/main/java/com/example/eventbridge/EventbridgeMVP.java) +- [Send event notifications to EventBridge](../s3/src/main/java/com/example/s3/PutBucketS3EventNotificationEventBridge.java) @@ -91,6 +92,18 @@ This example shows you how to do the following: +#### Send event notifications to EventBridge + +This example shows you how to enable a bucket to send S3 event notifications to EventBridge and route notifications to an Amazon SNS topic and Amazon SQS queue. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/javav2/example_code/s3/README.md b/javav2/example_code/s3/README.md index bcc097b4e24..5aabc564946 100644 --- a/javav2/example_code/s3/README.md +++ b/javav2/example_code/s3/README.md @@ -57,7 +57,6 @@ Code excerpts that show you how to call individual service functions. - [PutBucketAcl](src/main/java/com/example/s3/SetAcl.java#L6) - [PutBucketCors](src/main/java/com/example/s3/S3Cors.java#L6) - [PutBucketLifecycleConfiguration](src/main/java/com/example/s3/LifecycleConfiguration.java#L6) -- [PutBucketNotificationConfiguration](src/main/java/com/example/s3/SetBucketEventBridgeNotification.java#L6) - [PutBucketPolicy](src/main/java/com/example/s3/SetBucketPolicy.java#L6) - [PutBucketWebsite](src/main/java/com/example/s3/SetWebsiteConfiguration.java#L6) - [PutObject](src/main/java/com/example/s3/PutObject.java#L6) @@ -79,6 +78,8 @@ functions within the same service. - [Lock Amazon S3 objects](src/main/java/com/example/s3/lockscenario/S3ObjectLockWorkflow.java) - [Parse URIs](src/main/java/com/example/s3/ParseUri.java) - [Perform a multipart upload](src/main/java/com/example/s3/PerformMultiPartUpload.java) +- [Process S3 event notifications](src/main/java/com/example/s3/ProcessS3EventNotification.java) +- [Send event notifications to EventBridge](src/main/java/com/example/s3/PutBucketS3EventNotificationEventBridge.java) - [Track uploads and downloads](src/main/java/com/example/s3/transfermanager/UploadFile.java) - [Upload directory to a bucket](src/main/java/com/example/s3/transfermanager/UploadADirectory.java) - [Upload or download large files](src/main/java/com/example/s3/transfermanager/DownloadToDirectory.java) @@ -194,6 +195,30 @@ This example shows you how to perform a multipart upload to an Amazon S3 object. +#### Process S3 event notifications + +This example shows you how to work with S3 event notifications in an object-oriented way. + + + + + + + + + +#### Send event notifications to EventBridge + +This example shows you how to enable a bucket to send S3 event notifications to EventBridge and route notifications to an Amazon SNS topic and Amazon SQS queue. + + + + + + + + + #### Track uploads and downloads This example shows you how to track an Amazon S3 object upload or download. diff --git a/javav2/example_code/s3/pom.xml b/javav2/example_code/s3/pom.xml index 2284c95f640..ddeb5f5b1ca 100644 --- a/javav2/example_code/s3/pom.xml +++ b/javav2/example_code/s3/pom.xml @@ -73,7 +73,7 @@ software.amazon.awssdk bom - 2.25.57 + 2.26.14 pom import @@ -87,6 +87,11 @@ + + com.amazonaws + aws-java-sdk-s3 + 1.12.756 + org.junit.jupiter junit-jupiter-api @@ -112,7 +117,7 @@ software.amazon.awssdk.crt aws-crt - 0.29.14 + 0.29.25 org.junit.platform @@ -124,6 +129,10 @@ software.amazon.awssdk s3 + + software.amazon.awssdk + cloudformation + software.amazon.awssdk apache-client @@ -136,6 +145,10 @@ software.amazon.awssdk ssooidc + + software.amazon.awssdk + sns + software.amazon.awssdk s3-transfer-manager @@ -164,6 +177,22 @@ software.amazon.awssdk sts + + software.amazon.awssdk + sqs + + + software.amazon.awssdk + s3-event-notifications + + + software.amazon.awssdk + eventbridge + + + software.amazon.awssdk + iam-policy-builder + org.apache.logging.log4j log4j-core diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ProcessS3EventNotification.java b/javav2/example_code/s3/src/main/java/com/example/s3/ProcessS3EventNotification.java new file mode 100644 index 00000000000..425eb228b9c --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/ProcessS3EventNotification.java @@ -0,0 +1,273 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.s3; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.eventnotifications.s3.model.S3EventNotification; +import software.amazon.awssdk.services.cloudformation.CloudFormationAsyncClient; +import software.amazon.awssdk.services.cloudformation.model.Capability; +import software.amazon.awssdk.services.cloudformation.model.CloudFormationException; +import software.amazon.awssdk.services.cloudformation.waiters.CloudFormationAsyncWaiter; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.model.Bucket; +import software.amazon.awssdk.services.s3.model.Event; +import software.amazon.awssdk.services.s3.model.ListBucketsResponse; +import software.amazon.awssdk.services.sqs.SqsAsyncClient; +import software.amazon.awssdk.services.sqs.model.DeleteMessageBatchRequest; +import software.amazon.awssdk.services.sqs.model.DeleteMessageBatchRequestEntry; +import software.amazon.awssdk.services.sqs.model.ListQueuesResponse; +import software.amazon.awssdk.services.sqs.model.QueueAttributeName; +import software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse; +import software.amazon.awssdk.transfer.s3.S3TransferManager; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.HashSet; +import java.util.Optional; +import java.util.concurrent.ExecutionException; + +public class ProcessS3EventNotification { + static final CloudFormationAsyncClient cfClient = CloudFormationAsyncClient.create(); + static final SqsAsyncClient sqsClient = SqsAsyncClient.create(); + static final S3AsyncClient s3Client = S3AsyncClient.create(); + static final S3TransferManager transferManager = S3TransferManager.create(); + static final String STACK_NAME = "direct-target"; + private static final Logger logger = LoggerFactory.getLogger(ProcessS3EventNotification.class); + + public static void main(String[] args) { + deployCloudFormationStack(); + String queueUrl = getQueueUrl(); + String queueArn = getQueueArn(queueUrl); + String bucketName = getBucketName(); + processS3Events(bucketName, queueUrl, queueArn); + destroyCloudFormationStack(); + } + +// snippet-start:[s3.java2.process_s3_event_notifications] + /** + * This method receives S3 event notifications by using an SqsAsyncClient. + * After the client receives the messages it deserializes the JSON payload and logs them. It uses + * the S3EventNotification class (part of the S3 event notification API for Java) to deserialize + * the JSON payload and access the messages in an object-oriented way. + * + * @param queueUrl The URL of the AWS SQS queue that receives the S3 event notifications. + * @see S3EventNotification API. + *

+ * To use S3 event notification serialization/deserialization to objects, add the following + * dependency to your Maven pom.xml file. + * + * software.amazon.awssdk + * s3-event-notifications + * + * + *

+ * The S3 event notification API became available with version 2.25.11 of the Java SDK. + *

+ * This example shows the use of the API with AWS SQS, but it can be used to process S3 event notifications + * in AWS SNS or AWS Lambda as well. + *

+ * Note: The S3EventNotification class does not work with messages routed through AWS EventBridge. + */ + static void processS3Events(String bucketName, String queueUrl, String queueArn) { + try { + // Configure the bucket to send Object Created and Object Tagging notifications to an existing SQS queue. + s3Client.putBucketNotificationConfiguration(b -> b + .notificationConfiguration(ncb -> ncb + .queueConfigurations(qcb -> qcb + .events(Event.S3_OBJECT_CREATED, Event.S3_OBJECT_TAGGING) + .queueArn(queueArn))) + .bucket(bucketName) + ).join(); + + triggerS3EventNotifications(bucketName); + // Wait for event notifications to propagate. + Thread.sleep(Duration.ofSeconds(5).toMillis()); + + boolean didReceiveMessages = true; + while (didReceiveMessages) { + // Display the number of messages that are available in the queue. + sqsClient.getQueueAttributes(b -> b + .queueUrl(queueUrl) + .attributeNames(QueueAttributeName.APPROXIMATE_NUMBER_OF_MESSAGES) + ).thenAccept(attributeResponse -> + logger.info("Approximate number of messages in the queue: {}", + attributeResponse.attributes().get(QueueAttributeName.APPROXIMATE_NUMBER_OF_MESSAGES))) + .join(); + + // Receive the messages. + ReceiveMessageResponse response = sqsClient.receiveMessage(b -> b + .queueUrl(queueUrl) + ).get(); + logger.info("Count of received messages: {}", response.messages().size()); + didReceiveMessages = !response.messages().isEmpty(); + + // Create a collection to hold the received message for deletion + // after we log the messages. + HashSet messagesToDelete = new HashSet<>(); + // Process each message. + response.messages().forEach(message -> { + logger.info("Message id: {}", message.messageId()); + // Deserialize JSON message body to a S3EventNotification object + // to access messages in an object-oriented way. + S3EventNotification event = S3EventNotification.fromJson(message.body()); + + // Log the S3 event notification record details. + if (event.getRecords() != null) { + event.getRecords().forEach(record -> { + String eventName = record.getEventName(); + String key = record.getS3().getObject().getKey(); + logger.info(record.toString()); + logger.info("Event name is {} and key is {}", eventName, key); + }); + } + // Add logged messages to collection for batch deletion. + messagesToDelete.add(DeleteMessageBatchRequestEntry.builder() + .id(message.messageId()) + .receiptHandle(message.receiptHandle()) + .build()); + }); + // Delete messages. + if (!messagesToDelete.isEmpty()) { + sqsClient.deleteMessageBatch(DeleteMessageBatchRequest.builder() + .queueUrl(queueUrl) + .entries(messagesToDelete) + .build() + ).join(); + } + } // End of while block. + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + } + + // snippet-end:[s3.java2.process_s3_event_notifications] + static void triggerS3EventNotifications(String bucketName) { + Path uploadDir; + try { + uploadDir = Paths.get( + ProcessS3EventNotification.class.getClassLoader().getResource("uploadDirectory").toURI()); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + + transferManager.uploadDirectory(b -> b + .bucket(bucketName) + .source(uploadDir) + .build()).completionFuture() + .whenComplete((completedUpload, t) -> { + if (t != null) { + logger.error("Failed to upload directory", t); + return; + } + completedUpload.failedTransfers().forEach(failedUpload -> + logger.error("Object {} failed to upload with exception {}", + failedUpload.request().putObjectRequest().key(), + failedUpload.exception().getMessage()) + ); + }).join(); + try { + Thread.sleep(Duration.ofSeconds(1).toMillis()); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + try (S3AsyncClient s3Client = S3AsyncClient.create()) { + s3Client.listObjects(b -> b.bucket(bucketName)) + .thenAccept(listObjectsResponse -> + listObjectsResponse.contents().forEach(s3Object -> { + logger.info("Object key is " + s3Object.key()); + s3Client.putObjectTagging(potr -> potr + .bucket(bucketName) + .key(s3Object.key()) + .tagging(tb -> + tb.tagSet(tsb -> tsb.key("akey").value("avalue")) + ) + ).join(); + })).join(); + } // End of try-with-resources block. + } + + static String getQueueUrl() { + ListQueuesResponse response = sqsClient.listQueues().join(); + Optional queueUrl = response.queueUrls().stream() + .filter(url -> url.contains(STACK_NAME)) + .findFirst(); + return queueUrl.orElse(null); + } + + static String getQueueArn(String queueUrl){ + return sqsClient.getQueueAttributes(b -> b + .queueUrl(queueUrl).attributeNames(QueueAttributeName.QUEUE_ARN)).join() + .attributes().get(QueueAttributeName.QUEUE_ARN); + } + + static String getBucketName() { + ListBucketsResponse listBucketsResponse = s3Client.listBuckets().join(); + for (Bucket bucket : listBucketsResponse.buckets()) { + if (bucket.name().contains(STACK_NAME)) { + return bucket.name(); + } + } + return null; + } + + static void deployCloudFormationStack() { + try { + URL fileUrl = ProcessS3EventNotification.class.getClassLoader().getResource(STACK_NAME + ".yaml"); + String templateBody; + try { + templateBody = Files.readString(Paths.get(fileUrl.toURI())); + + } catch (IOException | URISyntaxException e) { + throw new RuntimeException(e); + } + + cfClient.createStack(b -> b.stackName(STACK_NAME) + .templateBody(templateBody) + .capabilities(Capability.CAPABILITY_IAM)) + .whenComplete((csr, t) -> { + if (csr != null) { + logger.info("Stack creation requested, ARN is " + csr.stackId()); + try (CloudFormationAsyncWaiter waiter = cfClient.waiter()) { + waiter.waitUntilStackCreateComplete(request -> request.stackName(STACK_NAME)) + .whenComplete((dsr, th) -> { + dsr.matched().response().orElseThrow(() -> new RuntimeException("Failed to deploy")); + }).join(); + } + logger.info("Stack created successfully"); + } else { + logger.error("Error creating stack: " + t.getMessage(), t); + throw new RuntimeException(t.getCause().getMessage(), t); + } + }).join(); + } catch (CloudFormationException ex) { + throw new RuntimeException("Failed to deploy CloudFormation stack", ex); + } + } + + static void destroyCloudFormationStack() { + String stackName = STACK_NAME; + cfClient.deleteStack(b -> b.stackName(stackName)) + .whenComplete((dsr, t) -> { + if (dsr != null) { + logger.info("Delete stack requested ...."); + try (CloudFormationAsyncWaiter waiter = cfClient.waiter()) { + waiter.waitUntilStackDeleteComplete(request -> request.stackName(stackName)) + .whenComplete((waiterResponse, throwable) -> + logger.info("Stack deleted successfully.")) + .join(); + } + } else { + logger.error("Error deleting stack: " + t.getMessage(), t); + throw new RuntimeException(t.getCause().getMessage(), t); + } + }).join(); + } +} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/PutBucketS3EventNotificationEventBridge.java b/javav2/example_code/s3/src/main/java/com/example/s3/PutBucketS3EventNotificationEventBridge.java new file mode 100644 index 00000000000..aa31cf598ca --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/PutBucketS3EventNotificationEventBridge.java @@ -0,0 +1,359 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.s3; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.policybuilder.iam.IamConditionOperator; +import software.amazon.awssdk.policybuilder.iam.IamPolicy; +import software.amazon.awssdk.policybuilder.iam.IamPolicyWriter; +import software.amazon.awssdk.policybuilder.iam.IamPrincipalType; +import software.amazon.awssdk.services.cloudformation.CloudFormationAsyncClient; +import software.amazon.awssdk.services.cloudformation.model.Capability; +import software.amazon.awssdk.services.cloudformation.model.CloudFormationException; +import software.amazon.awssdk.services.cloudformation.waiters.CloudFormationAsyncWaiter; +import software.amazon.awssdk.services.eventbridge.EventBridgeAsyncClient; +import software.amazon.awssdk.services.eventbridge.model.EventBus; +import software.amazon.awssdk.services.eventbridge.model.ListEventBusesResponse; +import software.amazon.awssdk.services.eventbridge.model.PutRuleRequest; +import software.amazon.awssdk.services.eventbridge.model.PutRuleResponse; +import software.amazon.awssdk.services.eventbridge.model.Target; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.model.Bucket; +import software.amazon.awssdk.services.s3.model.S3Exception; +import software.amazon.awssdk.services.sns.SnsAsyncClient; +import software.amazon.awssdk.services.sns.model.ListTopicsResponse; +import software.amazon.awssdk.services.sns.model.Topic; +import software.amazon.awssdk.services.sqs.SqsAsyncClient; +import software.amazon.awssdk.services.sqs.model.ListQueuesResponse; +import software.amazon.awssdk.services.sqs.model.QueueAttributeName; +import software.amazon.awssdk.utils.builder.SdkBuilder; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class PutBucketS3EventNotificationEventBridge { + static final CloudFormationAsyncClient cfClient = CloudFormationAsyncClient.create(); + static final SqsAsyncClient sqsClient = SqsAsyncClient.create(); + static final SnsAsyncClient snsClient = SnsAsyncClient.create(); + static final EventBridgeAsyncClient eventBridgeClient = EventBridgeAsyncClient.create(); + static final String STACK_NAME = "queue-topic"; + static final String RULE_NAME = "s3-object-create-rule"; + static final S3AsyncClient s3Client = S3AsyncClient.create(); + private static final Logger logger = LoggerFactory.getLogger(PutBucketS3EventNotificationEventBridge.class); + + public static void main(String[] args) { + deployCloudFormationStack(); + String bucketName = getBucketName(); + String topicArn = getTopicArn(); + String directToQueueUrl = getQueueUrl(false); + String directToQueueArn = getQueueArn(directToQueueUrl); + String subscriberQueueUrl = getQueueUrl(true); + String subscriberQueueArn = getQueueArn(subscriberQueueUrl); + String ruleArn = setBucketNotificationToEventBridge(bucketName, topicArn, directToQueueArn); + addPermissions(directToQueueArn, directToQueueUrl, + subscriberQueueArn, subscriberQueueUrl, topicArn, ruleArn); + deleteRule(); + destroyCloudFormationStack(); + } +// snippet-start:[s3.java2.s3_enable_notifications_to_eventbridge] + /** This method configures a bucket to send events to AWS EventBridge and creates a rule + * to route the S3 object created events to a topic and a queue. + * + * @param bucketName Name of existing bucket + * @param topicArn ARN of existing topic to receive S3 event notifications + * @param queueArn ARN of existing queue to receive S3 event notifications + * + * An AWS CloudFormation stack sets up the bucket, queue, topic before the method runs. + */ + public static String setBucketNotificationToEventBridge(String bucketName, String topicArn, String queueArn) { + try { + // Enable bucket to emit S3 Event notifications to EventBridge. + s3Client.putBucketNotificationConfiguration(b -> b + .bucket(bucketName) + .notificationConfiguration(b1 -> b1 + .eventBridgeConfiguration( + SdkBuilder::build) + ).build()).join(); + + // Create an EventBridge rule to route Object Created notifications. + PutRuleRequest putRuleRequest = PutRuleRequest.builder() + .name(RULE_NAME) + .eventPattern(""" + { + "source": ["aws.s3"], + "detail-type": ["Object Created"], + "detail": { + "bucket": { + "name": ["%s"] + } + } + } + """.formatted(bucketName)) + .build(); + + // Add the rule to the default event bus. + PutRuleResponse putRuleResponse = eventBridgeClient.putRule(putRuleRequest) + .whenComplete((r, t) -> { + if (t != null) { + logger.error("Error creating event bus rule: " + t.getMessage(), t); + throw new RuntimeException(t.getCause().getMessage(), t); + } + logger.info("Event bus rule creation request sent successfully. ARN is: {}", r.ruleArn()); + }).join(); + + // Add the existing SNS topic and SQS queue as targets to the rule. + eventBridgeClient.putTargets(b -> b + .eventBusName("default") + .rule(RULE_NAME) + .targets(List.of ( + Target.builder() + .arn(queueArn) + .id("Queue") + .build(), + Target.builder() + .arn(topicArn) + .id("Topic") + .build()) + ) + ).join(); + return putRuleResponse.ruleArn(); + } catch (S3Exception e) { + System.err.println(e.awsErrorDetails().errorMessage()); + System.exit(1); + } + return null; + } + // snippet-end:[s3.java2.s3_enable_notifications_to_eventbridge] + + /** After we create the EventBridge rule, we add the necessary permissions to the resources + * that receive messages from the rule. + * + * @param directQueueArn ARN of the queue that receives notifications from the S3 bucket directly + * @param directQueueUrl URL of the queue that receives notifications from the S3 bucket directly + * @param subscriberQueueArn ARN of the queue that receives notifications through the subscription to the SNS topic + * @param subscriberQueueUrl URL of the queue that receives notifications through the subscription to the SNS topic + * @param topicArn ARN of the topic that receives notifications from the S3 bucket + * @param ruleArn ARN of the EventBridge rule + */ + static void addPermissions(String directQueueArn, String directQueueUrl, String subscriberQueueArn, + String subscriberQueueUrl, String topicArn, String ruleArn){ + addPermissionToDirectQueue(sqsClient, directQueueArn, directQueueUrl, ruleArn); + addPermissionToSubscriberQueue(sqsClient, subscriberQueueArn, subscriberQueueUrl, topicArn); + addPermissionToTopic(snsClient, topicArn, ruleArn); + } + + static void addPermissionToDirectQueue(SqsAsyncClient sqsClient, String queueArn, String queueUrl, String roleArn){ + /* + We use the Java SDK's IAM Policy Builder API to generate a policy. + This requires the following Maven dependency: + + software.amazon.awssdk + iam-policy-builder + + */ + String policyString = IamPolicy.builder() + .version("2012-10-17") + .id(queueArn) + .addStatement(b -> b + .sid("AllowEventsToQueue") + .effect("Allow") + .addPrincipal(pb -> pb + .type(IamPrincipalType.SERVICE) + .id("events.amazonaws.com")) + .addAction("sqs:SendMessage") + .addResource(queueArn) + .addCondition(cb -> cb + .operator(IamConditionOperator.ARN_EQUALS) + .key("aws:SourceArn") + .value(roleArn)) + .build()) + .build().toJson( + IamPolicyWriter.builder().prettyPrint(true).build()); + + sqsClient.setQueueAttributes(b -> b + .queueUrl(queueUrl) + .attributes(Map.of (QueueAttributeName.POLICY, policyString))) + .join(); + } + + static void addPermissionToSubscriberQueue(SqsAsyncClient sqsClient, String queueArn, String queueUrl, String topicArn){ + String policyString = IamPolicy.builder() + .version("2012-10-17") + .id(queueArn) + .addStatement(b -> b + .sid("AllowMessageToSubscriberQueue") + .effect("Allow") + .addPrincipal(pb -> pb.type(IamPrincipalType.SERVICE) + .id("sns.amazonaws.com")) + .addAction("sqs:SendMessage") + .addResource(queueArn) + .addCondition(cb -> cb + .operator(IamConditionOperator.ARN_EQUALS) + .key("aws:SourceArn") + .value(topicArn)) + .build()) + .build().toJson( + IamPolicyWriter.builder().prettyPrint(true).build() + ); + + sqsClient.setQueueAttributes(b -> b + .queueUrl(queueUrl) + .attributes(Map.of (QueueAttributeName.POLICY, policyString))) + .join(); + } + + static void addPermissionToTopic(SnsAsyncClient snsClient, String topicArn, String roleArn){ + snsClient.getTopicAttributes(b -> b + .topicArn(topicArn).build()) + .thenApply(ar -> { + String policy = ar.attributes().get("Policy"); + IamPolicy iamPolicy = IamPolicy.fromJson(policy); + return iamPolicy.copy(b -> b.addStatement(sb -> sb + .sid("AllowEventsToTopic") + .effect("Allow") + .addPrincipal(pb -> pb + .type(IamPrincipalType.SERVICE) + .id("events.amazonaws.com")) + .addAction("sns:Publish") + .addResource(topicArn) + .addCondition(cb -> cb + .operator(IamConditionOperator.ARN_EQUALS) + .key("aws:SourceArn") + .value(roleArn)) + .build())).toJson(IamPolicyWriter.builder().prettyPrint(true).build()); + }).thenAccept(policy -> snsClient.setTopicAttributes(b -> b + .attributeName("Policy") + .attributeValue(policy) + .topicArn(topicArn))) + .join(); + } + + static String getBucketName() { + return s3Client.listBuckets().handle((r, t) -> { + for (Bucket bucket : r.buckets()) { + if (bucket.name().startsWith(STACK_NAME.substring(0, 10))) { + return bucket.name(); + } + } + return null; + }).join(); + } + + static String getQueueUrl(boolean isSubscriberQueue){ + ListQueuesResponse response = sqsClient.listQueues().join(); + String queueUrl; + if (!isSubscriberQueue) { + queueUrl = response.queueUrls().stream() + .filter(url -> url.contains(STACK_NAME) && !url.contains("Subscriber")) + .findFirst() + .orElse(null); + } else { + queueUrl = response.queueUrls().stream() + .filter(url -> url.contains(STACK_NAME) && url.contains("Subscriber")) + .findFirst() + .orElse(null); + } + if (queueUrl == null) { + throw new RuntimeException("Queue URL not found"); + } + return queueUrl; + } + + static String getQueueArn(String queueUrl) { + return sqsClient.getQueueAttributes(b -> b + .queueUrl(queueUrl).attributeNames(QueueAttributeName.QUEUE_ARN)).join() + .attributes().get(QueueAttributeName.QUEUE_ARN); + } + + static String getTopicArn() { + ListTopicsResponse response = snsClient.listTopics().join(); + Optional topicArn = response.topics().stream() + .map(Topic::topicArn) + .filter(s -> s.contains(STACK_NAME)) + .findFirst(); + return topicArn.orElse(null); + } + + static String getEventBusName() { + ListEventBusesResponse eventBusesResponse = eventBridgeClient.listEventBuses(SdkBuilder::build).join(); + final Optional busName = eventBusesResponse.eventBuses().stream() + .map(EventBus::name) + .filter(s -> s.startsWith(STACK_NAME.substring(0, 4))) + .findFirst(); + return busName.orElse(null); + + } + + static void deployCloudFormationStack() { + try { + URL fileUrl = PutBucketS3EventNotificationEventBridge.class.getClassLoader().getResource(STACK_NAME + ".yaml"); + String templateBody; + try { + templateBody = Files.readString(Paths.get(fileUrl.toURI())); + + } catch (IOException | URISyntaxException e) { + throw new RuntimeException(e); + } + + cfClient.createStack(b -> b.stackName(STACK_NAME) + .templateBody(templateBody) + .capabilities(Capability.CAPABILITY_IAM)) + .whenComplete((csr, t) -> { + if (csr != null) { + logger.info("Stack creation requested, ARN is " + csr.stackId()); + try (CloudFormationAsyncWaiter waiter = cfClient.waiter()) { + waiter.waitUntilStackCreateComplete(request -> request.stackName(STACK_NAME)) + .whenComplete((dsr, th) -> { + dsr.matched().response().orElseThrow(() -> new RuntimeException("Failed to deploy")); + }).join(); + } + logger.info("Stack created successfully"); + } else { + logger.error("Error creating stack: " + t.getMessage(), t); + throw new RuntimeException(t.getCause().getMessage(), t); + } + }).join(); + } catch (CloudFormationException ex) { + throw new RuntimeException("Failed to deploy CloudFormation stack", ex); + } + } + + static void destroyCloudFormationStack() { + String stackName = STACK_NAME; + cfClient.deleteStack(b -> b.stackName(stackName)) + .whenComplete((dsr, t) -> { + if (dsr != null) { + logger.info("Delete stack requested ...."); + try (CloudFormationAsyncWaiter waiter = cfClient.waiter()) { + waiter.waitUntilStackDeleteComplete(request -> request.stackName(stackName)) + .whenComplete((waiterResponse, throwable) -> + logger.info("Stack deleted successfully.")) + .join(); + } + } else { + logger.error("Error deleting stack: " + t.getMessage(), t); + throw new RuntimeException(t.getCause().getMessage(), t); + } + }).join(); + } + + static void deleteRule() { + + eventBridgeClient.removeTargets(b -> b + .rule(RULE_NAME) + .ids("Queue", "Topic") + .build()).join(); + + eventBridgeClient.deleteRule(b -> b + .name(RULE_NAME) + .build()).join(); + } +} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/SetBucketEventBridgeNotification.java b/javav2/example_code/s3/src/main/java/com/example/s3/SetBucketEventBridgeNotification.java deleted file mode 100644 index 8973461696a..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/SetBucketEventBridgeNotification.java +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3; - -// snippet-start:[s3.java2.s3_enable_notifications.main] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.Event; -import software.amazon.awssdk.services.s3.model.NotificationConfiguration; -import software.amazon.awssdk.services.s3.model.PutBucketNotificationConfigurationRequest; -import software.amazon.awssdk.services.s3.model.S3Exception; -import software.amazon.awssdk.services.s3.model.TopicConfiguration; -import java.util.ArrayList; -import java.util.List; - -public class SetBucketEventBridgeNotification { - public static void main(String[] args) { - final String usage = """ - - Usage: - \s - - Where: - bucketName - The Amazon S3 bucket.\s - topicArn - The Simple Notification Service topic ARN.\s - id - An id value used for the topic configuration. This value is displayed in the AWS Management Console.\s - """; - - if (args.length != 3) { - System.out.println(usage); - System.exit(1); - } - - String bucketName = args[0]; - String topicArn = args[1]; - String id = args[2]; - Region region = Region.US_EAST_1; - S3Client s3Client = S3Client.builder() - .region(region) - .build(); - - setBucketNotification(s3Client, bucketName, topicArn, id); - s3Client.close(); - } - - public static void setBucketNotification(S3Client s3Client, String bucketName, String topicArn, String id) { - try { - List events = new ArrayList<>(); - events.add(Event.S3_OBJECT_CREATED_PUT); - - TopicConfiguration config = TopicConfiguration.builder() - .topicArn(topicArn) - .events(events) - .id(id) - .build(); - - List topics = new ArrayList<>(); - topics.add(config); - - NotificationConfiguration configuration = NotificationConfiguration.builder() - .topicConfigurations(topics) - .build(); - - PutBucketNotificationConfigurationRequest configurationRequest = PutBucketNotificationConfigurationRequest - .builder() - .bucket(bucketName) - .notificationConfiguration(configuration) - .skipDestinationValidation(true) - .build(); - - // Set the bucket notification configuration. - s3Client.putBucketNotificationConfiguration(configurationRequest); - System.out.println("Added bucket " + bucketName + " with EventBridge events enabled."); - - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} -// snippet-end:[s3.java2.s3_enable_notifications.main] diff --git a/javav2/example_code/s3/src/main/resources/direct-target.yaml b/javav2/example_code/s3/src/main/resources/direct-target.yaml new file mode 100644 index 00000000000..df9bed6b961 --- /dev/null +++ b/javav2/example_code/s3/src/main/resources/direct-target.yaml @@ -0,0 +1,469 @@ +Resources: + s3EventNotificationBucketB63AEF24: + Type: AWS::S3::Bucket + Properties: + Tags: + - Key: aws-cdk:auto-delete-objects + Value: "true" + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + Metadata: + aws:cdk:path: direct-target/s3EventNotificationBucket/Resource + s3EventNotificationBucketPolicyEEB8E6AC: + Type: AWS::S3::BucketPolicy + Properties: + Bucket: + Ref: s3EventNotificationBucketB63AEF24 + PolicyDocument: + Statement: + - Action: + - s3:DeleteObject* + - s3:GetBucket* + - s3:List* + - s3:PutBucketPolicy + Effect: Allow + Principal: + AWS: + Fn::GetAtt: + - CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092 + - Arn + Resource: + - Fn::GetAtt: + - s3EventNotificationBucketB63AEF24 + - Arn + - Fn::Join: + - "" + - - Fn::GetAtt: + - s3EventNotificationBucketB63AEF24 + - Arn + - /* + Version: "2012-10-17" + Metadata: + aws:cdk:path: direct-target/s3EventNotificationBucket/Policy/Resource + s3EventNotificationBucketAutoDeleteObjectsCustomResource751D0266: + Type: Custom::S3AutoDeleteObjects + Properties: + ServiceToken: + Fn::GetAtt: + - CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F + - Arn + BucketName: + Ref: s3EventNotificationBucketB63AEF24 + DependsOn: + - s3EventNotificationBucketPolicyEEB8E6AC + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + Metadata: + aws:cdk:path: direct-target/s3EventNotificationBucket/AutoDeleteObjectsCustomResource/Default + s3EventNotificationBucketNotifications87DCF05E: + Type: Custom::S3BucketNotifications + Properties: + ServiceToken: + Fn::GetAtt: + - BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691 + - Arn + BucketName: + Ref: s3EventNotificationBucketB63AEF24 + NotificationConfiguration: + QueueConfigurations: + - Events: + - s3:ObjectRemoved:Delete + QueueArn: + Fn::GetAtt: + - 3EventNotificationQueue8DC270B4 + - Arn + Managed: true + DependsOn: + - 3EventNotificationQueuePolicy8BC64376 + - 3EventNotificationQueue8DC270B4 + - s3EventNotificationBucketPolicyEEB8E6AC + Metadata: + aws:cdk:path: direct-target/s3EventNotificationBucket/Notifications/Resource + CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: "2012-10-17" + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: lambda.amazonaws.com + ManagedPolicyArns: + - Fn::Sub: arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole + Metadata: + aws:cdk:path: direct-target/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role + CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F: + Type: AWS::Lambda::Function + Properties: + Code: + S3Bucket: + Fn::Sub: cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region} + S3Key: faa95a81ae7d7373f3e1f242268f904eb748d8d0fdd306e8a6fe515a1905a7d6.zip + Timeout: 900 + MemorySize: 128 + Handler: index.handler + Role: + Fn::GetAtt: + - CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092 + - Arn + Runtime: + Fn::FindInMap: + - LatestNodeRuntimeMap + - Ref: AWS::Region + - value + Description: + Fn::Join: + - "" + - - "Lambda function for auto-deleting objects in " + - Ref: s3EventNotificationBucketB63AEF24 + - " S3 bucket." + DependsOn: + - CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092 + Metadata: + aws:cdk:path: direct-target/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler + aws:asset:path: asset.faa95a81ae7d7373f3e1f242268f904eb748d8d0fdd306e8a6fe515a1905a7d6 + aws:asset:property: Code + 3EventNotificationQueue8DC270B4: + Type: AWS::SQS::Queue + Properties: + ReceiveMessageWaitTimeSeconds: 5 + VisibilityTimeout: 10 + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + Metadata: + aws:cdk:path: direct-target/3EventNotificationQueue/Resource + 3EventNotificationQueuePolicy8BC64376: + Type: AWS::SQS::QueuePolicy + Properties: + PolicyDocument: + Statement: + - Action: + - sqs:GetQueueAttributes + - sqs:GetQueueUrl + - sqs:SendMessage + Condition: + ArnLike: + aws:SourceArn: + Fn::GetAtt: + - s3EventNotificationBucketB63AEF24 + - Arn + Effect: Allow + Principal: + Service: s3.amazonaws.com + Resource: + Fn::GetAtt: + - 3EventNotificationQueue8DC270B4 + - Arn + Version: "2012-10-17" + Queues: + - Ref: 3EventNotificationQueue8DC270B4 + Metadata: + aws:cdk:path: direct-target/3EventNotificationQueue/Policy/Resource + BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: lambda.amazonaws.com + Version: "2012-10-17" + ManagedPolicyArns: + - Fn::Join: + - "" + - - "arn:" + - Ref: AWS::Partition + - :iam::aws:policy/service-role/AWSLambdaBasicExecutionRole + Metadata: + aws:cdk:path: direct-target/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/Resource + BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36: + Type: AWS::IAM::Policy + Properties: + PolicyDocument: + Statement: + - Action: s3:PutBucketNotification + Effect: Allow + Resource: "*" + Version: "2012-10-17" + PolicyName: BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36 + Roles: + - Ref: BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC + Metadata: + aws:cdk:path: direct-target/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role/DefaultPolicy/Resource + BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691: + Type: AWS::Lambda::Function + Properties: + Description: AWS CloudFormation handler for "Custom::S3BucketNotifications" resources (@aws-cdk/aws-s3) + Code: + ZipFile: | + import boto3 # type: ignore + import json + import logging + import urllib.request + + s3 = boto3.client("s3") + + EVENTBRIDGE_CONFIGURATION = 'EventBridgeConfiguration' + CONFIGURATION_TYPES = ["TopicConfigurations", "QueueConfigurations", "LambdaFunctionConfigurations"] + + def handler(event: dict, context): + response_status = "SUCCESS" + error_message = "" + try: + props = event["ResourceProperties"] + notification_configuration = props["NotificationConfiguration"] + managed = props.get('Managed', 'true').lower() == 'true' + stack_id = event['StackId'] + old = event.get("OldResourceProperties", {}).get("NotificationConfiguration", {}) + if managed: + config = handle_managed(event["RequestType"], notification_configuration) + else: + config = handle_unmanaged(props["BucketName"], stack_id, event["RequestType"], notification_configuration, old) + s3.put_bucket_notification_configuration(Bucket=props["BucketName"], NotificationConfiguration=config) + except Exception as e: + logging.exception("Failed to put bucket notification configuration") + response_status = "FAILED" + error_message = f"Error: {str(e)}. " + finally: + submit_response(event, context, response_status, error_message) + + def handle_managed(request_type, notification_configuration): + if request_type == 'Delete': + return {} + return notification_configuration + + def handle_unmanaged(bucket, stack_id, request_type, notification_configuration, old): + def with_id(n): + n['Id'] = f"{stack_id}-{hash(json.dumps(n, sort_keys=True))}" + return n + + external_notifications = {} + existing_notifications = s3.get_bucket_notification_configuration(Bucket=bucket) + for t in CONFIGURATION_TYPES: + if request_type == 'Update': + ids = [with_id(n) for n in old.get(t, [])] + old_incoming_ids = [n['Id'] for n in ids] + external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'] in old_incoming_ids] + elif request_type == 'Delete': + external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f"{stack_id}-")] + elif request_type == 'Create': + external_notifications[t] = [n for n in existing_notifications.get(t, [])] + if EVENTBRIDGE_CONFIGURATION in existing_notifications: + external_notifications[EVENTBRIDGE_CONFIGURATION] = existing_notifications[EVENTBRIDGE_CONFIGURATION] + + if request_type == 'Delete': + return external_notifications + + notifications = {} + for t in CONFIGURATION_TYPES: + external = external_notifications.get(t, []) + incoming = [with_id(n) for n in notification_configuration.get(t, [])] + notifications[t] = external + incoming + + if EVENTBRIDGE_CONFIGURATION in notification_configuration: + notifications[EVENTBRIDGE_CONFIGURATION] = notification_configuration[EVENTBRIDGE_CONFIGURATION] + elif EVENTBRIDGE_CONFIGURATION in external_notifications: + notifications[EVENTBRIDGE_CONFIGURATION] = external_notifications[EVENTBRIDGE_CONFIGURATION] + + return notifications + + def submit_response(event: dict, context, response_status: str, error_message: str): + response_body = json.dumps( + { + "Status": response_status, + "Reason": f"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}", + "PhysicalResourceId": event.get("PhysicalResourceId") or event["LogicalResourceId"], + "StackId": event["StackId"], + "RequestId": event["RequestId"], + "LogicalResourceId": event["LogicalResourceId"], + "NoEcho": False, + } + ).encode("utf-8") + headers = {"content-type": "", "content-length": str(len(response_body))} + try: + req = urllib.request.Request(url=event["ResponseURL"], headers=headers, data=response_body, method="PUT") + with urllib.request.urlopen(req) as response: + print(response.read().decode("utf-8")) + print("Status code: " + response.reason) + except Exception as e: + print("send(..) failed executing request.urlopen(..): " + str(e)) + Handler: index.handler + Role: + Fn::GetAtt: + - BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC + - Arn + Runtime: python3.11 + Timeout: 300 + DependsOn: + - BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36 + - BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC + Metadata: + aws:cdk:path: direct-target/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Resource + CDKMetadata: + Type: AWS::CDK::Metadata + Properties: + Analytics: v2:deflate64:H4sIAAAAAAAA/12PzQ6CMAzHn4X7qIImnoWbiQniA5g5JqnAhuumMQvvrjISiJf+P/rroSkk2x2kEX9RLKombvEK/my5aNi3unjagM+caKRl+U1NLkihWxTvuQ55YPQg8CcnnfztghnnfLCIA0PegS91O+KjzuDEDCx3ZHVXStLOiEAu/JH3Par6jyqMfmIlTcZJsj2RtN/H6h+3vM21qtCiVgM78CdfJTtYQ5JEd0KMjVMWOwll0A+4dEYELgEAAA== + Metadata: + aws:cdk:path: direct-target/CDKMetadata/Default + Condition: CDKMetadataAvailable +Mappings: + LatestNodeRuntimeMap: + af-south-1: + value: nodejs20.x + ap-east-1: + value: nodejs20.x + ap-northeast-1: + value: nodejs20.x + ap-northeast-2: + value: nodejs20.x + ap-northeast-3: + value: nodejs20.x + ap-south-1: + value: nodejs20.x + ap-south-2: + value: nodejs20.x + ap-southeast-1: + value: nodejs20.x + ap-southeast-2: + value: nodejs20.x + ap-southeast-3: + value: nodejs20.x + ap-southeast-4: + value: nodejs20.x + ca-central-1: + value: nodejs20.x + cn-north-1: + value: nodejs18.x + cn-northwest-1: + value: nodejs18.x + eu-central-1: + value: nodejs20.x + eu-central-2: + value: nodejs20.x + eu-north-1: + value: nodejs20.x + eu-south-1: + value: nodejs20.x + eu-south-2: + value: nodejs20.x + eu-west-1: + value: nodejs20.x + eu-west-2: + value: nodejs20.x + eu-west-3: + value: nodejs20.x + il-central-1: + value: nodejs20.x + me-central-1: + value: nodejs20.x + me-south-1: + value: nodejs20.x + sa-east-1: + value: nodejs20.x + us-east-1: + value: nodejs20.x + us-east-2: + value: nodejs20.x + us-west-1: + value: nodejs20.x + us-west-2: + value: nodejs20.x +Conditions: + CDKMetadataAvailable: + Fn::Or: + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - af-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-east-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ap-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ca-central-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-north-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-northwest-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - eu-central-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-north-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-south-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-2 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-3 + - Fn::Equals: + - Ref: AWS::Region + - il-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-south-1 + - Fn::Equals: + - Ref: AWS::Region + - sa-east-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - us-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-2 + - Fn::Equals: + - Ref: AWS::Region + - us-west-1 + - Fn::Equals: + - Ref: AWS::Region + - us-west-2 +Parameters: + BootstrapVersion: + Type: AWS::SSM::Parameter::Value + Default: /cdk-bootstrap/hnb659fds/version + Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip] +Rules: + CheckBootstrapVersion: + Assertions: + - Assert: + Fn::Not: + - Fn::Contains: + - - "1" + - "2" + - "3" + - "4" + - "5" + - Ref: BootstrapVersion + AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI. + diff --git a/javav2/example_code/s3/src/main/resources/log4j2.xml b/javav2/example_code/s3/src/main/resources/log4j2.xml index 4c0eb20893a..e6ac524bde5 100644 --- a/javav2/example_code/s3/src/main/resources/log4j2.xml +++ b/javav2/example_code/s3/src/main/resources/log4j2.xml @@ -19,6 +19,8 @@ + + diff --git a/javav2/example_code/s3/src/main/resources/queue-topic.yaml b/javav2/example_code/s3/src/main/resources/queue-topic.yaml new file mode 100644 index 00000000000..fc5404dd7c3 --- /dev/null +++ b/javav2/example_code/s3/src/main/resources/queue-topic.yaml @@ -0,0 +1,302 @@ +Resources: + s3EventBucket56513D52: + Type: AWS::S3::Bucket + Properties: + Tags: + - Key: aws-cdk:auto-delete-objects + Value: "true" + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + Metadata: + aws:cdk:path: queue-topic/s3EventBucket/Resource + s3EventBucketPolicy9710F554: + Type: AWS::S3::BucketPolicy + Properties: + Bucket: + Ref: s3EventBucket56513D52 + PolicyDocument: + Statement: + - Action: + - s3:DeleteObject* + - s3:GetBucket* + - s3:List* + - s3:PutBucketPolicy + Effect: Allow + Principal: + AWS: + Fn::GetAtt: + - CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092 + - Arn + Resource: + - Fn::GetAtt: + - s3EventBucket56513D52 + - Arn + - Fn::Join: + - "" + - - Fn::GetAtt: + - s3EventBucket56513D52 + - Arn + - /* + Version: "2012-10-17" + Metadata: + aws:cdk:path: queue-topic/s3EventBucket/Policy/Resource + s3EventBucketAutoDeleteObjectsCustomResource87E19A8C: + Type: Custom::S3AutoDeleteObjects + Properties: + ServiceToken: + Fn::GetAtt: + - CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F + - Arn + BucketName: + Ref: s3EventBucket56513D52 + DependsOn: + - s3EventBucketPolicy9710F554 + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + Metadata: + aws:cdk:path: queue-topic/s3EventBucket/AutoDeleteObjectsCustomResource/Default + CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: "2012-10-17" + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: lambda.amazonaws.com + ManagedPolicyArns: + - Fn::Sub: arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole + Metadata: + aws:cdk:path: queue-topic/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role + CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F: + Type: AWS::Lambda::Function + Properties: + Code: + S3Bucket: + Fn::Sub: cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region} + S3Key: faa95a81ae7d7373f3e1f242268f904eb748d8d0fdd306e8a6fe515a1905a7d6.zip + Timeout: 900 + MemorySize: 128 + Handler: index.handler + Role: + Fn::GetAtt: + - CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092 + - Arn + Runtime: + Fn::FindInMap: + - LatestNodeRuntimeMap + - Ref: AWS::Region + - value + Description: + Fn::Join: + - "" + - - "Lambda function for auto-deleting objects in " + - Ref: s3EventBucket56513D52 + - " S3 bucket." + DependsOn: + - CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092 + Metadata: + aws:cdk:path: queue-topic/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler + aws:asset:path: asset.faa95a81ae7d7373f3e1f242268f904eb748d8d0fdd306e8a6fe515a1905a7d6 + aws:asset:property: Code + 3EventQueueD059F0AE: + Type: AWS::SQS::Queue + Properties: + ReceiveMessageWaitTimeSeconds: 5 + VisibilityTimeout: 10 + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + Metadata: + aws:cdk:path: queue-topic/3EventQueue/Resource + Subscriber1956AC64: + Type: AWS::SQS::Queue + Properties: + ReceiveMessageWaitTimeSeconds: 5 + VisibilityTimeout: 10 + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + Metadata: + aws:cdk:path: queue-topic/Subscriber/Resource + 3EventTopicBC6D4CD4: + Type: AWS::SNS::Topic + Metadata: + aws:cdk:path: queue-topic/3EventTopic/Resource + 3EventSubscription83516A75: + Type: AWS::SNS::Subscription + Properties: + Endpoint: + Fn::GetAtt: + - Subscriber1956AC64 + - Arn + Protocol: sqs + TopicArn: + Ref: 3EventTopicBC6D4CD4 + Metadata: + aws:cdk:path: queue-topic/3EventSubscription/Resource + CDKMetadata: + Type: AWS::CDK::Metadata + Properties: + Analytics: v2:deflate64:H4sIAAAAAAAA/12PwQ6CMBBEv4V7qYImnIWbiQmCd1NKISvQYrfFGMK/W8BE4mlm3k4m2ZAGx4iGHnuhz8vGb6GgY24Yb4hD9xEPdIwtb4QhSSW/bpVUtcDfP7zmieAT6Xi1wor5thgHpYM31QOf4WpyWyDX0BtQcqbbPE0ksWhUlwlUVvNla+svrO9B1n+tVKsBSqFjhoKcEIVxv9RLr5KJkiUs4+TMBrYLIrqnQeA9EMDXVhroBM1W/QCZoZgsGAEAAA== + Metadata: + aws:cdk:path: queue-topic/CDKMetadata/Default + Condition: CDKMetadataAvailable +Mappings: + LatestNodeRuntimeMap: + af-south-1: + value: nodejs20.x + ap-east-1: + value: nodejs20.x + ap-northeast-1: + value: nodejs20.x + ap-northeast-2: + value: nodejs20.x + ap-northeast-3: + value: nodejs20.x + ap-south-1: + value: nodejs20.x + ap-south-2: + value: nodejs20.x + ap-southeast-1: + value: nodejs20.x + ap-southeast-2: + value: nodejs20.x + ap-southeast-3: + value: nodejs20.x + ap-southeast-4: + value: nodejs20.x + ca-central-1: + value: nodejs20.x + cn-north-1: + value: nodejs18.x + cn-northwest-1: + value: nodejs18.x + eu-central-1: + value: nodejs20.x + eu-central-2: + value: nodejs20.x + eu-north-1: + value: nodejs20.x + eu-south-1: + value: nodejs20.x + eu-south-2: + value: nodejs20.x + eu-west-1: + value: nodejs20.x + eu-west-2: + value: nodejs20.x + eu-west-3: + value: nodejs20.x + il-central-1: + value: nodejs20.x + me-central-1: + value: nodejs20.x + me-south-1: + value: nodejs20.x + sa-east-1: + value: nodejs20.x + us-east-1: + value: nodejs20.x + us-east-2: + value: nodejs20.x + us-west-1: + value: nodejs20.x + us-west-2: + value: nodejs20.x +Conditions: + CDKMetadataAvailable: + Fn::Or: + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - af-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-east-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ap-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ca-central-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-north-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-northwest-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - eu-central-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-north-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-south-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-2 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-3 + - Fn::Equals: + - Ref: AWS::Region + - il-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-south-1 + - Fn::Equals: + - Ref: AWS::Region + - sa-east-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - us-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-2 + - Fn::Equals: + - Ref: AWS::Region + - us-west-1 + - Fn::Equals: + - Ref: AWS::Region + - us-west-2 +Parameters: + BootstrapVersion: + Type: AWS::SSM::Parameter::Value + Default: /cdk-bootstrap/hnb659fds/version + Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip] +Rules: + CheckBootstrapVersion: + Assertions: + - Assert: + Fn::Not: + - Fn::Contains: + - - "1" + - "2" + - "3" + - "4" + - "5" + - Ref: BootstrapVersion + AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI. + diff --git a/javav2/example_code/s3/src/test/java/com/example/s3/ProcessS3EventNotificationTest.java b/javav2/example_code/s3/src/test/java/com/example/s3/ProcessS3EventNotificationTest.java new file mode 100644 index 00000000000..9d91d1a8701 --- /dev/null +++ b/javav2/example_code/s3/src/test/java/com/example/s3/ProcessS3EventNotificationTest.java @@ -0,0 +1,47 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.s3; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import software.amazon.awssdk.services.sqs.SqsAsyncClient; +import software.amazon.awssdk.services.sqs.model.QueueAttributeName; + +import static org.junit.jupiter.api.Assertions.*; + +class ProcessS3EventNotificationTest { + static SqsAsyncClient sqsClient = ProcessS3EventNotification.sqsClient; + + @BeforeAll + static void setUp() { + ProcessS3EventNotification.deployCloudFormationStack(); + } + + @AfterAll + static void tearDown() { + ProcessS3EventNotification.destroyCloudFormationStack(); + } + + @Test + @Tag("IntegrationTest") + void processS3EventsReadsProcessesAndDeletes() { + String queueUrl = ProcessS3EventNotification.getQueueUrl(); + String queueArn = ProcessS3EventNotification.getQueueArn(queueUrl); + String bucketName = ProcessS3EventNotification.getBucketName(); + + ProcessS3EventNotification.processS3Events(bucketName, queueUrl, queueArn); + + sqsClient.receiveMessage(r -> r + .queueUrl(queueUrl) + .maxNumberOfMessages(1) + ).thenAccept(receiveMessageResponse -> + assertEquals(0, receiveMessageResponse.messages().size()) + ).join(); + } +} \ No newline at end of file diff --git a/javav2/example_code/s3/src/test/java/com/example/s3/PutBucketS3EventNotificationEventBridgeTest.java b/javav2/example_code/s3/src/test/java/com/example/s3/PutBucketS3EventNotificationEventBridgeTest.java new file mode 100644 index 00000000000..6f74e43b838 --- /dev/null +++ b/javav2/example_code/s3/src/test/java/com/example/s3/PutBucketS3EventNotificationEventBridgeTest.java @@ -0,0 +1,107 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.s3; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.services.sqs.SqsAsyncClient; +import software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse; +import software.amazon.awssdk.transfer.s3.S3TransferManager; + +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class PutBucketS3EventNotificationEventBridgeTest { + static String bucketName; + static String topicArn; + static String directToQueueUrl; + static String directToQueueArn; + static String subscriberQueueUrl; + static String subscriberQueueArn; + static SqsAsyncClient sqsClient = PutBucketS3EventNotificationEventBridge.sqsClient; + private static final Logger logger = LoggerFactory.getLogger(PutBucketS3EventNotificationEventBridgeTest.class); + static S3TransferManager transferManager = S3TransferManager.create(); + + @BeforeAll + static void setUp() { + PutBucketS3EventNotificationEventBridge.deployCloudFormationStack(); + bucketName = PutBucketS3EventNotificationEventBridge.getBucketName(); + topicArn = PutBucketS3EventNotificationEventBridge.getTopicArn(); + directToQueueUrl = PutBucketS3EventNotificationEventBridge.getQueueUrl(false); + directToQueueArn = PutBucketS3EventNotificationEventBridge.getQueueArn(directToQueueUrl); + subscriberQueueUrl = PutBucketS3EventNotificationEventBridge.getQueueUrl(true); + subscriberQueueArn = PutBucketS3EventNotificationEventBridge.getQueueArn(subscriberQueueUrl); + } + + @AfterAll + static void tearDown() { + PutBucketS3EventNotificationEventBridge.deleteRule(); + PutBucketS3EventNotificationEventBridge.destroyCloudFormationStack(); + } + + @Test + @Tag("IntegrationTest") + void setBucketNotificationToEventBridge() { + + String ruleArn = PutBucketS3EventNotificationEventBridge.setBucketNotificationToEventBridge(bucketName, topicArn, directToQueueArn); + PutBucketS3EventNotificationEventBridge.addPermissions(directToQueueArn, directToQueueUrl, + subscriberQueueArn, subscriberQueueUrl, topicArn, ruleArn); + triggerS3EventMessages(); + try { + Thread.sleep(Duration.ofSeconds(30).toMillis()); // Wait for messages to route through. + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + List urls = getQueueUrls(); + urls.forEach(url -> { + ReceiveMessageResponse response = sqsClient.receiveMessage(b -> b + .queueUrl(url)).join(); + logger.info("Messages received at queue {}: {}", url, response); + assertTrue(response.hasMessages()); + } + ); + } + + static void triggerS3EventMessages() { + Path uploadDir; + try { + uploadDir = Paths.get( + PutBucketS3EventNotificationEventBridge.class.getClassLoader().getResource("uploadDirectory").toURI()); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + + transferManager.uploadDirectory(b -> b + .bucket(bucketName) + .source(uploadDir) + .build()).completionFuture() + .whenComplete((completedUpload, t) -> { + if (t != null) { + logger.error("Failed to upload directory", t); + return; + } + completedUpload.failedTransfers().forEach(failedUpload -> + logger.error("Object {} failed to upload with exception {}", + failedUpload.request().putObjectRequest().key(), + failedUpload.exception().getMessage()) + ); + }).join(); + } + + static List getQueueUrls() { + return sqsClient.listQueues() + .thenApply(r -> new ArrayList<>(r.queueUrls())).join(); + } +} \ No newline at end of file diff --git a/javav2/example_code/sqs/README.md b/javav2/example_code/sqs/README.md index 06635698724..d8d7935f0d7 100644 --- a/javav2/example_code/sqs/README.md +++ b/javav2/example_code/sqs/README.md @@ -53,6 +53,7 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create and publish to a FIFO topic](../sns/src/main/java/com/example/sns/PriceUpdateExample.java) +- [Process S3 event notifications](../s3/src/main/java/com/example/s3/ProcessS3EventNotification.java) - [Publish messages to queues](../../usecases/topics_and_queues/src/main/java/com/example/sns/SNSWorkflow.java) @@ -85,6 +86,18 @@ This example shows you how to create and publish to a FIFO Amazon SNS topic. +#### Process S3 event notifications + +This example shows you how to work with S3 event notifications in an object-oriented way. + + + + + + + + + #### Publish messages to queues This example shows you how to do the following: diff --git a/resources/cdk/javav2_s3_event_notification/README.md b/resources/cdk/javav2_s3_event_notification/README.md new file mode 100644 index 00000000000..80bcd8c7f76 --- /dev/null +++ b/resources/cdk/javav2_s3_event_notification/README.md @@ -0,0 +1,26 @@ +# Java CDK app for stacks used in Java v2 examples + +This directory contains Java CDK application that produce stacks for code examples. + +The following Java v2 code examples use stacks produced the application in this directory: + +* [PutBucketS3EventNotificationEventBridge.java](../../javav2/example_code/s3/src/main/java/com/example/s3/PutBucketS3EventNotificationEventBridge.java) + * uses stack named `queue-topic` +* [ProcessS3EventNotificationTest.java](../../javav2/example_code/s3/src/test/java/com/example/s3/ProcessS3EventNotificationTest.java) + * uses stack named `direct-target` + + +The `cdk.json` file tells the CDK Toolkit how to execute your app. + +It is a [Maven](https://maven.apache.org/) based project, so you can open this project with any Maven compatible Java IDE to build and run tests. + +## Useful commands + + * `mvn package` compile and run tests + * `cdk ls` list all stacks in the app + * `cdk synth` emits the synthesized CloudFormation template + * `cdk deploy` deploy this stack to your default AWS account/region + * `cdk diff` compare deployed stack with current state + * `cdk docs` open CDK documentation + +Enjoy! diff --git a/resources/cdk/javav2_s3_event_notification/cdk.json b/resources/cdk/javav2_s3_event_notification/cdk.json new file mode 100644 index 00000000000..723b2f18b0c --- /dev/null +++ b/resources/cdk/javav2_s3_event_notification/cdk.json @@ -0,0 +1,68 @@ +{ + "app": "mvn -e -q compile exec:java", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "target", + "pom.xml", + "src/test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-iam:standardizedServicePrincipals": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-efs:denyAnonymousAccess": true, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, + "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, + "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, + "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, + "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, + "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, + "@aws-cdk/aws-eks:nodegroupNameAttribute": true, + "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, + "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, + "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false + } +} diff --git a/resources/cdk/javav2_s3_event_notification/pom.xml b/resources/cdk/javav2_s3_event_notification/pom.xml new file mode 100644 index 00000000000..eaba8e55162 --- /dev/null +++ b/resources/cdk/javav2_s3_event_notification/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + com.myorg + javav2_s3_event_notification + 0.1 + + + UTF-8 + 2.147.2 + [10.0.0,11.0.0) + 5.7.1 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + com.myorg.Javav2S3EventNotificationApp + + + + + + + + + software.amazon.awscdk + aws-cdk-lib + ${cdk.version} + + + + software.constructs + constructs + ${constructs.version} + + + + org.junit.jupiter + junit-jupiter + ${junit.version} + test + + + diff --git a/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/DirectTargetStack.java b/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/DirectTargetStack.java new file mode 100644 index 00000000000..f0b6c61cd11 --- /dev/null +++ b/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/DirectTargetStack.java @@ -0,0 +1,38 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.myorg; + +import software.amazon.awscdk.Duration; +import software.amazon.awscdk.RemovalPolicy; +import software.amazon.awscdk.Stack; +import software.amazon.awscdk.StackProps; +import software.amazon.awscdk.services.s3.Bucket; +import software.amazon.awscdk.services.s3.EventType; +import software.amazon.awscdk.services.s3.notifications.SnsDestination; +import software.amazon.awscdk.services.s3.notifications.SqsDestination; +import software.amazon.awscdk.services.sns.Topic; +import software.amazon.awscdk.services.sqs.Queue; +import software.constructs.Construct; + +public class DirectTargetStack extends Stack { + public DirectTargetStack(final Construct scope, final String id) { + this(scope, id, null); + } + + public DirectTargetStack(final Construct scope, final String id, final StackProps props) { + super(scope, id, props); + + final Bucket bucket = Bucket.Builder.create(this, "s3EventNotificationBucket") + .removalPolicy(RemovalPolicy.DESTROY) + .autoDeleteObjects(true) + .build(); + + final Queue queue = Queue.Builder.create(this, "3EventNotificationQueue") + .visibilityTimeout(Duration.seconds(10)) + .receiveMessageWaitTime(Duration.seconds(5)) + .build(); + + bucket.addEventNotification(EventType.OBJECT_REMOVED_DELETE, new SqsDestination(queue)); + } +} diff --git a/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/EventBridgeStack.java b/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/EventBridgeStack.java new file mode 100644 index 00000000000..f1ae6df5afb --- /dev/null +++ b/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/EventBridgeStack.java @@ -0,0 +1,65 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.myorg; + +import software.amazon.awscdk.Duration; +import software.amazon.awscdk.RemovalPolicy; +import software.amazon.awscdk.Stack; +import software.amazon.awscdk.StackProps; +import software.amazon.awscdk.services.events.EventBus; +import software.amazon.awscdk.services.events.EventPattern; +import software.amazon.awscdk.services.events.Rule; +import software.amazon.awscdk.services.events.targets.SnsTopic; +import software.amazon.awscdk.services.events.targets.SqsQueue; +import software.amazon.awscdk.services.s3.Bucket; +import software.amazon.awscdk.services.sns.Topic; +import software.amazon.awscdk.services.sqs.Queue; +import software.constructs.Construct; + +import java.util.List; +import java.util.Map; + +public class EventBridgeStack extends Stack { + public EventBridgeStack(final Construct scope, final String id) { + this(scope, id, null); + } + + public EventBridgeStack(final Construct scope, final String id, final StackProps props) { + super(scope, id, props); + + final Bucket bucket = Bucket.Builder.create(this, "s3EventNotificationBucket") + .removalPolicy(RemovalPolicy.DESTROY) + .autoDeleteObjects(true) + .eventBridgeEnabled(true) + .build(); + + final Queue queue = Queue.Builder.create(this, "3EventNotificationQueue") + .visibilityTimeout(Duration.seconds(10)) + .receiveMessageWaitTime(Duration.seconds(5)) + .build(); + + final Topic topic = Topic.Builder.create(this, "3EventNotificationTopic") + .build(); + + EventBus eventBus = EventBus.Builder.create(this, "3EventBus") + .eventBusName("3EventBus") + .build(); + + EventPattern objectCreatedPattern = EventPattern.builder() + .source(List.of("aws.s3")) + .detailType(List.of("Object Created")) + .detail(Map.of("bucket", List.of(bucket.getBucketName()))) + .build(); + + Rule.Builder.create(this, "3EventBusRule") + .description("3EventBusRule") + .eventBus(eventBus) + .eventPattern(objectCreatedPattern) + .targets(List.of( + SqsQueue.Builder.create(queue).build(), + SnsTopic.Builder.create(topic).build()) + ) + .build(); + } +} diff --git a/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/Javav2S3EventNotificationApp.java b/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/Javav2S3EventNotificationApp.java new file mode 100644 index 00000000000..3e5ab1a73f1 --- /dev/null +++ b/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/Javav2S3EventNotificationApp.java @@ -0,0 +1,21 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.myorg; + +import software.amazon.awscdk.App; +import software.amazon.awscdk.StackProps; + +public class Javav2S3EventNotificationApp { + public static void main(final String[] args) { + App app = new App(); + + new DirectTargetStack(app, "direct-target", StackProps.builder() + .build()); + new EventBridgeStack(app, "event-bridge", StackProps.builder() + .build()); + new QueueTopicStack(app, "queue-topic", StackProps.builder() + .build()); + app.synth(); + } +} \ No newline at end of file diff --git a/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/QueueTopicStack.java b/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/QueueTopicStack.java new file mode 100644 index 00000000000..f97100a4f9c --- /dev/null +++ b/resources/cdk/javav2_s3_event_notification/src/main/java/com/myorg/QueueTopicStack.java @@ -0,0 +1,51 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.myorg; + +import software.amazon.awscdk.Duration; +import software.amazon.awscdk.RemovalPolicy; +import software.amazon.awscdk.Stack; +import software.amazon.awscdk.StackProps; +import software.amazon.awscdk.services.s3.Bucket; +import software.amazon.awscdk.services.sns.Subscription; +import software.amazon.awscdk.services.sns.SubscriptionProtocol; +import software.amazon.awscdk.services.sns.Topic; +import software.amazon.awscdk.services.sqs.Queue; +import software.constructs.Construct; + +public class QueueTopicStack extends Stack { + public QueueTopicStack(final Construct scope, final String id) { + this(scope, id, null); + } + + public QueueTopicStack(final Construct scope, final String id, final StackProps props) { + super(scope, id, props); + + Bucket.Builder.create(this, "s3EventBucket") + .removalPolicy(RemovalPolicy.DESTROY) + .autoDeleteObjects(true) + .build(); + + Queue.Builder.create(this, "3EventQueue") + .visibilityTimeout(Duration.seconds(10)) + .receiveMessageWaitTime(Duration.seconds(5)) + .removalPolicy(RemovalPolicy.DESTROY) + .build(); + + Queue subscriberQueue = Queue.Builder.create(this, "Subscriber") + .visibilityTimeout(Duration.seconds(10)) + .receiveMessageWaitTime(Duration.seconds(5)) + .removalPolicy(RemovalPolicy.DESTROY) + .build(); + + Topic notificationTopic = Topic.Builder.create(this, "3EventTopic") + .build(); + + Subscription.Builder.create(this, "3EventSubscription") + .topic(notificationTopic) + .endpoint(subscriberQueue.getQueueArn()) + .protocol(SubscriptionProtocol.SQS) + .build(); + } +} From 41b8972849f6bfcba8efb719c07758edefe7033f Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Fri, 19 Jul 2024 11:52:00 -0400 Subject: [PATCH 02/98] Use latest -tool release. (#6672) --- .github/workflows/validate-doc-metadata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index 5e63ab4aa7f..3bb805320f3 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@2024-07-11-A + uses: awsdocs/aws-doc-sdk-examples-tools@2024-07-19-A with: doc_gen_only: "False" strict_titles: "True" From 75c3daadf750406156fc87fa30ee499a206b4a36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 11:54:16 -0400 Subject: [PATCH 03/98] Bump rexml from 3.2.8 to 3.3.2 in /ruby (#6673) Bumps [rexml](https://github.com/ruby/rexml) from 3.2.8 to 3.3.2. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.2.8...v3.3.2) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ruby/Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock index 677f2649859..7b50371f144 100644 --- a/ruby/Gemfile.lock +++ b/ruby/Gemfile.lock @@ -1443,8 +1443,8 @@ GEM rainbow (3.1.1) rake (13.0.6) regexp_parser (2.8.0) - rexml (3.2.8) - strscan (>= 3.0.9) + rexml (3.3.2) + strscan rspec (3.12.0) rspec-core (~> 3.12.0) rspec-expectations (~> 3.12.0) From d7a2154f778daf22eaf5e2c16e4f0a0e97db09b7 Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Mon, 22 Jul 2024 15:02:36 -0400 Subject: [PATCH 04/98] Use latest -tools commit. (#6674) --- .github/workflows/validate-doc-metadata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index 3bb805320f3..218d1623a80 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@2024-07-19-A + uses: awsdocs/aws-doc-sdk-examples-tools@2024-07-22-A with: doc_gen_only: "False" strict_titles: "True" From 099974baa3503e3c2d7a60c2807b2b3c552b6d93 Mon Sep 17 00:00:00 2001 From: Dennis Traub <604796+DennisTraub@users.noreply.github.com> Date: Tue, 23 Jul 2024 09:14:31 -0700 Subject: [PATCH 05/98] Updates to the Bedrock Studio bootstrap script (#6669) * Bump boto to 1.34.144 * Adapt bootstrapper script to new version. * Add confirmation prompts for deletion * Add permissions for prompt flows --------- Co-authored-by: Dennis Traub --- python/example_code/bedrock/requirements.txt | 4 +- .../scenarios/bedrock_studio_bootstrapper.py | 840 ++++++++++-------- 2 files changed, 465 insertions(+), 379 deletions(-) diff --git a/python/example_code/bedrock/requirements.txt b/python/example_code/bedrock/requirements.txt index 21e87d9e568..d7940eedcc1 100644 --- a/python/example_code/bedrock/requirements.txt +++ b/python/example_code/bedrock/requirements.txt @@ -1,5 +1,5 @@ -boto3==1.34.109 -botocore==1.34.109 +boto3==1.34.144 +botocore==1.34.144 colorama==0.4.6 iniconfig==2.0.0 jmespath==1.0.1 diff --git a/python/example_code/bedrock/scenarios/bedrock_studio_bootstrapper.py b/python/example_code/bedrock/scenarios/bedrock_studio_bootstrapper.py index 8530a6336d0..bcc5dda678a 100644 --- a/python/example_code/bedrock/scenarios/bedrock_studio_bootstrapper.py +++ b/python/example_code/bedrock/scenarios/bedrock_studio_bootstrapper.py @@ -309,7 +309,18 @@ def _create_service_role(self): self._get_service_role_policy(), ) + def _create_permission_boundary(self): + logger.info("=" * 80) + logger.info("Step 3: Create Permission Boundary Policy.") + logger.info("-" * 80) + + self._create_policy( + self._permission_boundary_policy_name, self._get_permission_boundary() + ) + def _create_role(self, role_name, trust_policy, role_policy): + inline_policy_name = "InlinePolicy" + logger.info(f"Creating role: '{role_name}'...") try: response = self._iam_client.create_role( @@ -319,37 +330,80 @@ def _create_role(self, role_name, trust_policy, role_policy): logger.info(f"Role created: {role_arn}") except self._iam_client.exceptions.EntityAlreadyExistsException: logger.warning(f"Role with name '{role_name}' already exists.") + try: + self._iam_client.get_role_policy( + RoleName=role_name, + PolicyName=inline_policy_name, + ) + confirm_input = input( + f"Proceed to replace the existing inline policy named '{inline_policy_name}'?" + " (yes/no, default: yes) " + ).lower() + if not (confirm_input in ["", "y" "yes"]): + logger.warning(f"Not updating existing '{role_name}' role.") + return + except self._iam_client.exceptions.NoSuchEntityException: + pass logger.info(f"Attaching inline policy to '{role_name}'...") - try: - self._iam_client.put_role_policy( - RoleName=role_name, - PolicyName="InlinePolicy", - PolicyDocument=role_policy, - ) - logger.info(f"Inline policy successfully attached.") - except self._iam_client.exceptions.EntityAlreadyExistsException: - logger.warning("Inline policy already exists.") - - def _create_permission_boundary(self): - logger.info("=" * 80) - logger.info("Step 3: Create Permission Boundary.") - logger.info("-" * 80) - - logger.info( - f"Creating permission boundary: '{self._permission_boundary_policy_name}'..." + self._iam_client.put_role_policy( + RoleName=role_name, + PolicyName=inline_policy_name, + PolicyDocument=role_policy, ) + logger.info(f"Successfully attached inline policy to '{role_name}'.") + def _create_policy(self, policy_name, policy_document): + policy_arn = f"arn:aws:iam::{self._account_id}:policy/{self._permission_boundary_policy_name}" + + logger.info(f"Creating policy: '{policy_name}'...") try: self._iam_client.create_policy( - PolicyName=self._permission_boundary_policy_name, - PolicyDocument=self._get_permission_boundary(), + PolicyName=policy_name, + PolicyDocument=policy_document, ) - logger.info(f"Permission boundary policy created.") + logger.info(f"Policy created: {policy_arn}") except self._iam_client.exceptions.EntityAlreadyExistsException: - logger.warning( - f"Policy with name '{self._permission_boundary_policy_name}' already exists." + logger.info(f"Policy with name '{policy_name}' already exists.") + + policy_versions = self._iam_client.list_policy_versions( + PolicyArn=policy_arn + )["Versions"] + if len(policy_versions) >= 5: + logger.warning( + f"Cannot create more than 5 versions of '{policy_name}' policy." + ) + sorted_policy_versions = sorted( + policy_versions, key=lambda x: x["CreateDate"] + ) + oldest_non_default_version_id = next( + filter(lambda x: not x["IsDefaultVersion"], sorted_policy_versions) + )["VersionId"] + confirm_input = input( + f"Proceed to delete the oldest non-default version '{oldest_non_default_version_id}'?" + " (yes/no, default: yes) " + ).lower() + if confirm_input in ["", "y" "yes"]: + logger.info( + f"Deleting '{oldest_non_default_version_id}' version of '{policy_name}' policy..." + ) + self._iam_client.delete_policy_version( + PolicyArn=policy_arn, + VersionId=oldest_non_default_version_id, + ) + else: + logger.warning(f"Not updating existing '{policy_name}' policy.") + return + + logger.info( + f"Creating new default version of existing '{policy_name}' policy..." + ) + self._iam_client.create_policy_version( + PolicyArn=policy_arn, + PolicyDocument=policy_document, + SetAsDefault=True, ) + logger.info(f"Successfully updated '{policy_name}' policy.") def _create_kms_key(self): logger.info("=" * 80) @@ -444,8 +498,8 @@ def _get_provisioning_role_trust_policy(self): "Statement": [ { "Effect": "Allow", - "Principal": {"Service": ["datazone.amazonaws.com"]}, - "Action": ["sts:AssumeRole"], + "Principal": {"Service": "datazone.amazonaws.com"}, + "Action": "sts:AssumeRole", "Condition": { "StringEquals": {"aws:SourceAccount": self._account_id} }, @@ -455,27 +509,21 @@ def _get_provisioning_role_trust_policy(self): ) def _get_provisioning_role_policy(self): - account_id = self._account_id - region = self._region return json.dumps( { "Version": "2012-10-17", "Statement": [ { - "Sid": "AmazonDataZonePermissionsToCreateEnvironmentRole", + "Sid": "CreateStacks", "Effect": "Allow", "Action": [ - "iam:CreateRole", - "iam:GetRolePolicy", - "iam:DetachRolePolicy", - "iam:AttachRolePolicy", - "iam:UpdateAssumeRolePolicy", + "cloudformation:CreateStack", + "cloudformation:TagResource", ], - "Resource": "arn:aws:iam::*:role/DataZoneBedrockProjectRole*", + "Resource": "arn:aws:cloudformation:*:*:stack/DataZone*", "Condition": { - "StringEquals": { - "iam:PermissionsBoundary": f"arn:aws:iam::{account_id}:policy/{self._permission_boundary_policy_name}", - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"], + "ForAnyValue:StringEquals": { + "aws:TagKeys": "AmazonDataZoneEnvironment" }, "Null": { "aws:ResourceTag/AmazonDataZoneEnvironment": "false" @@ -483,456 +531,415 @@ def _get_provisioning_role_policy(self): }, }, { - "Sid": "AmazonDataZonePermissionsToServiceRole", + "Sid": "ManageStacks", "Effect": "Allow", "Action": [ - "iam:CreateRole", - "iam:GetRolePolicy", - "iam:DetachRolePolicy", - "iam:AttachRolePolicy", - "iam:UpdateAssumeRolePolicy", + "cloudformation:DescribeStacks", + "cloudformation:DescribeStackEvents", + "cloudformation:UpdateStack", + "cloudformation:DeleteStack", ], - "Resource": [ - "arn:aws:iam::*:role/BedrockStudio*", - "arn:aws:iam::*:role/AmazonBedrockExecution*", + "Resource": "arn:aws:cloudformation:*:*:stack/DataZone*", + }, + { + "Sid": "DenyOtherActionsNotViaCloudFormation", + "Effect": "Deny", + "NotAction": [ + "cloudformation:DescribeStacks", + "cloudformation:DescribeStackEvents", + "cloudformation:CreateStack", + "cloudformation:UpdateStack", + "cloudformation:DeleteStack", + "cloudformation:TagResource", ], + "Resource": "*", "Condition": { - "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - }, - "Null": { - "aws:ResourceTag/AmazonDataZoneEnvironment": "false" - }, + "StringNotEqualsIfExists": { + "aws:CalledViaFirst": "cloudformation.amazonaws.com" + } }, }, { - "Sid": "IamPassRolePermissionsForBedrock", + "Sid": "ListResources", "Effect": "Allow", - "Action": ["iam:PassRole"], - "Resource": "arn:aws:iam::*:role/AmazonBedrockExecution*", - "Condition": { - "StringEquals": { - "iam:PassedToService": ["bedrock.amazonaws.com"], - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"], - } - }, + "Action": [ + "iam:ListRoles", + "s3:ListAllMyBuckets", + "aoss:ListCollections", + "aoss:BatchGetCollection", + "aoss:ListAccessPolicies", + "aoss:ListSecurityPolicies", + "aoss:ListTagsForResource", + "bedrock:ListAgents", + "bedrock:ListKnowledgeBases", + "bedrock:ListGuardrails", + "bedrock:ListPrompts", + "bedrock:ListFlows", + "bedrock:ListTagsForResource", + "lambda:ListFunctions", + "logs:DescribeLogGroups", + "secretsmanager:ListSecrets", + ], + "Resource": "*", }, { - "Sid": "IamPassRolePermissionsForLambda", + "Sid": "GetRoles", "Effect": "Allow", - "Action": ["iam:PassRole"], - "Resource": ["arn:aws:iam::*:role/BedrockStudio*"], + "Action": "iam:GetRole", + "Resource": [ + "arn:aws:iam::*:role/DataZoneBedrockProject*", + "arn:aws:iam::*:role/AmazonBedrockExecution*", + "arn:aws:iam::*:role/BedrockStudio*", + ], + }, + { + "Sid": "CreateRoles", + "Effect": "Allow", + "Action": [ + "iam:CreateRole", + "iam:PutRolePolicy", + "iam:AttachRolePolicy", + "iam:DeleteRolePolicy", + "iam:DetachRolePolicy", + ], + "Resource": [ + "arn:aws:iam::*:role/DataZoneBedrockProject*", + "arn:aws:iam::*:role/AmazonBedrockExecution*", + "arn:aws:iam::*:role/BedrockStudio*", + ], "Condition": { "StringEquals": { - "iam:PassedToService": ["lambda.amazonaws.com"], - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"], + "aws:ResourceTag/AmazonBedrockManaged": "true" } }, }, { - "Sid": "AmazonDataZonePermissionsToManageCreatedEnvironmentRole", + "Sid": "ManageRoles", "Effect": "Allow", "Action": [ + "iam:UpdateRole", "iam:DeleteRole", - "iam:GetRole", - "iam:DetachRolePolicy", - "iam:GetPolicy", - "iam:DeleteRolePolicy", - "iam:PutRolePolicy", + "iam:ListRolePolicies", + "iam:GetRolePolicy", + "iam:ListAttachedRolePolicies", ], "Resource": [ - "arn:aws:iam::*:role/DataZoneBedrockProjectRole*", - "arn:aws:iam::*:role/AmazonBedrock*", + "arn:aws:iam::*:role/DataZoneBedrockProject*", + "arn:aws:iam::*:role/AmazonBedrockExecution*", "arn:aws:iam::*:role/BedrockStudio*", ], "Condition": { "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] + "aws:ResourceTag/AmazonBedrockManaged": "true" } }, }, { - "Sid": "AmazonDataZoneCFStackCreationForEnvironments", + "Sid": "PassRoleToBedrockService", "Effect": "Allow", - "Action": [ - "cloudformation:CreateStack", - "cloudformation:UpdateStack", - "cloudformation:TagResource", + "Action": "iam:PassRole", + "Resource": [ + "arn:aws:iam::*:role/AmazonBedrockExecution*", + "arn:aws:iam::*:role/BedrockStudio*", ], - "Resource": ["arn:aws:cloudformation:*:*:stack/DataZone*"], "Condition": { - "ForAnyValue:StringLike": { - "aws:TagKeys": "AmazonDataZoneEnvironment" - }, - "Null": { - "aws:ResourceTag/AmazonDataZoneEnvironment": "false" - }, + "StringEquals": { + "iam:PassedToService": "bedrock.amazonaws.com" + } }, }, { - "Sid": "AmazonDataZoneCFStackManagementForEnvironments", + "Sid": "PassRoleToLambdaService", "Effect": "Allow", - "Action": [ - "cloudformation:DeleteStack", - "cloudformation:DescribeStacks", - "cloudformation:DescribeStackEvents", - ], - "Resource": ["arn:aws:cloudformation:*:*:stack/DataZone*"], + "Action": "iam:PassRole", + "Resource": "arn:aws:iam::*:role/BedrockStudio*", + "Condition": { + "StringEquals": { + "iam:PassedToService": "lambda.amazonaws.com" + } + }, }, { - "Sid": "AmazonDataZoneEnvironmentBedrockGetViaCloudformation", + "Sid": "CreateRoleForOpenSearchServerless", "Effect": "Allow", - "Action": [ - "bedrock:GetAgent", - "bedrock:GetAgentActionGroup", - "bedrock:GetAgentAlias", - "bedrock:GetAgentKnowledgeBase", - "bedrock:GetKnowledgeBase", - "bedrock:GetDataSource", - "bedrock:GetGuardrail", - "bedrock:DeleteGuardrail", - ], + "Action": "iam:CreateServiceLinkedRole", "Resource": "*", "Condition": { "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] + "iam:AWSServiceName": "observability.aoss.amazonaws.com" } }, }, { - "Sid": "AmazonDataZoneEnvironmentBedrockAgentPermissions", + "Sid": "GetDataZoneBlueprintCfnTemplates", "Effect": "Allow", - "Action": [ - "bedrock:CreateAgent", - "bedrock:UpdateAgent", - "bedrock:DeleteAgent", - "bedrock:ListAgents", - "bedrock:CreateAgentActionGroup", - "bedrock:UpdateAgentActionGroup", - "bedrock:DeleteAgentActionGroup", - "bedrock:ListAgentActionGroups", - "bedrock:CreateAgentAlias", - "bedrock:UpdateAgentAlias", - "bedrock:DeleteAgentAlias", - "bedrock:ListAgentAliases", - "bedrock:AssociateAgentKnowledgeBase", - "bedrock:DisassociateAgentKnowledgeBase", - "bedrock:UpdateAgentKnowledgeBase", - "bedrock:ListAgentKnowledgeBases", - "bedrock:PrepareAgent", - ], + "Action": "s3:GetObject", "Resource": "*", "Condition": { - "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - }, - "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"}, + "StringNotEquals": { + "s3:ResourceAccount": "${aws:PrincipalAccount}" + } }, }, { - "Sid": "AmazonDataZoneEnvironmentOpenSearch", + "Sid": "CreateAndAccessS3Buckets", "Effect": "Allow", "Action": [ + "s3:CreateBucket", + "s3:DeleteBucket", + "s3:GetBucketPolicy", + "s3:PutBucketPolicy", + "s3:DeleteBucketPolicy", + "s3:PutBucketTagging", + "s3:PutBucketCORS", + "s3:PutBucketLogging", + "s3:PutBucketVersioning", + "s3:PutBucketPublicAccessBlock", + "s3:PutEncryptionConfiguration", + "s3:PutLifecycleConfiguration", + "s3:GetObject", + "s3:GetObjectVersion", + ], + "Resource": "arn:aws:s3:::br-studio-*", + }, + { + "Sid": "ManageOssAccessPolicies", + "Effect": "Allow", + "Action": [ + "aoss:GetAccessPolicy", "aoss:CreateAccessPolicy", "aoss:DeleteAccessPolicy", "aoss:UpdateAccessPolicy", - "aoss:GetAccessPolicy", - "aoss:ListAccessPolicies", + ], + "Resource": "*", + "Condition": { + "StringLikeIfExists": { + "aoss:collection": "br-studio-*", + "aoss:index": "br-studio-*", + } + }, + }, + { + "Sid": "ManageOssSecurityPolicies", + "Effect": "Allow", + "Action": [ + "aoss:GetSecurityPolicy", "aoss:CreateSecurityPolicy", "aoss:DeleteSecurityPolicy", "aoss:UpdateSecurityPolicy", - "aoss:GetSecurityPolicy", - "aoss:ListSecurityPolicies", ], "Resource": "*", "Condition": { - "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - } + "StringLikeIfExists": {"aoss:collection": "br-studio-*"} }, }, { - "Sid": "AmazonDataZoneEnvironmentOpenSearchPermissions", + "Sid": "ManageOssCollections", "Effect": "Allow", "Action": [ + "aoss:CreateCollection", "aoss:UpdateCollection", "aoss:DeleteCollection", - "aoss:BatchGetCollection", - "aoss:ListCollections", - "aoss:CreateCollection", ], "Resource": "*", "Condition": { "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - }, - "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"}, + "aws:ResourceTag/AmazonBedrockManaged": "true" + } }, }, { - "Sid": "AmazonDataZoneEnvironmentBedrockKnowledgeBasePermissions", + "Sid": "GetBedrockResources", "Effect": "Allow", "Action": [ + "bedrock:GetAgent", + "bedrock:GetKnowledgeBase", + "bedrock:GetGuardrail", + "bedrock:GetPrompt", + "bedrock:GetFlow", + "bedrock:GetFlowAlias", + ], + "Resource": "*", + }, + { + "Sid": "ManageBedrockResources", + "Effect": "Allow", + "Action": [ + "bedrock:CreateAgent", + "bedrock:UpdateAgent", + "bedrock:PrepareAgent", + "bedrock:DeleteAgent", + "bedrock:ListAgentAliases", + "bedrock:GetAgentAlias", + "bedrock:CreateAgentAlias", + "bedrock:UpdateAgentAlias", + "bedrock:DeleteAgentAlias", + "bedrock:ListAgentActionGroups", + "bedrock:GetAgentActionGroup", + "bedrock:CreateAgentActionGroup", + "bedrock:UpdateAgentActionGroup", + "bedrock:DeleteAgentActionGroup", + "bedrock:ListAgentKnowledgeBases", + "bedrock:GetAgentKnowledgeBase", + "bedrock:AssociateAgentKnowledgeBase", + "bedrock:DisassociateAgentKnowledgeBase", + "bedrock:UpdateAgentKnowledgeBase", "bedrock:CreateKnowledgeBase", "bedrock:UpdateKnowledgeBase", "bedrock:DeleteKnowledgeBase", + "bedrock:ListDataSources", + "bedrock:GetDataSource", "bedrock:CreateDataSource", "bedrock:UpdateDataSource", "bedrock:DeleteDataSource", - "bedrock:ListKnowledgeBases", - "bedrock:ListDataSources", + "bedrock:CreateGuardrail", + "bedrock:UpdateGuardrail", + "bedrock:DeleteGuardrail", + "bedrock:CreateGuardrailVersion", + "bedrock:CreatePrompt", + "bedrock:UpdatePrompt", + "bedrock:DeletePrompt", + "bedrock:CreatePromptVersion", + "bedrock:CreateFlow", + "bedrock:UpdateFlow", + "bedrock:PrepareFlow", + "bedrock:DeleteFlow", + "bedrock:ListFlowAliases", + "bedrock:GetFlowAlias", + "bedrock:CreateFlowAlias", + "bedrock:UpdateFlowAlias", + "bedrock:DeleteFlowAlias", + "bedrock:ListFlowVersions", + "bedrock:GetFlowVersion", + "bedrock:CreateFlowVersion", + "bedrock:DeleteFlowVersion", ], "Resource": "*", "Condition": { "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - }, - "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"}, + "aws:ResourceTag/AmazonBedrockManaged": "true" + } }, }, { - "Sid": "AmazonDataZoneEnvironmentBedrockGuardrailPermissions", + "Sid": "TagBedrockAgentAliases", "Effect": "Allow", - "Action": [ - "bedrock:CreateGuardrail", - "bedrock:CreateGuardrailVersion", - "bedrock:DeleteGuardrail", - "bedrock:ListGuardrails", - "bedrock:ListTagsForResource", - "bedrock:TagResource", - "bedrock:UntagResource", - "bedrock:UpdateGuardrail", - ], - "Resource": "*", + "Action": "bedrock:TagResource", + "Resource": "arn:aws:bedrock:*:*:agent-alias/*", "Condition": { "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - }, - "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"}, + "aws:RequestTag/AmazonBedrockManaged": "true" + } }, }, { - "Sid": "AmazonDataZoneEnvironmentLambdaPermissions", + "Sid": "TagBedrockFlowAliases", "Effect": "Allow", - "Action": [ - "lambda:AddPermission", - "lambda:CreateFunction", - "lambda:ListFunctions", - "lambda:UpdateFunctionCode", - "lambda:UpdateFunctionConfiguration", - "lambda:InvokeFunction", - "lambda:ListVersionsByFunction", - "lambda:PublishVersion", - ], - "Resource": [ - f"arn:aws:lambda:{region}:{account_id}:function:br-studio*", - f"arn:aws:lambda:{region}:{account_id}:function:OpensearchIndexLambda*", - f"arn:aws:lambda:{region}:{account_id}:function:IngestionTriggerLambda*", - ], + "Action": "bedrock:TagResource", + "Resource": "arn:aws:bedrock:*:*:flow/*/alias/*", "Condition": { - "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - }, "Null": { - "aws:ResourceTag/AmazonDataZoneEnvironment": "false" - }, + "aws:RequestTag/AmazonDataZoneEnvironment": "false" + } }, }, { - "Sid": "AmazonDataZoneEnvironmentLambdaManagePermissions", + "Sid": "CreateFunctions", "Effect": "Allow", "Action": [ "lambda:GetFunction", + "lambda:CreateFunction", + "lambda:InvokeFunction", "lambda:DeleteFunction", + "lambda:UpdateFunctionCode", + "lambda:GetFunctionConfiguration", + "lambda:UpdateFunctionConfiguration", + "lambda:ListVersionsByFunction", + "lambda:PublishVersion", + "lambda:GetPolicy", + "lambda:AddPermission", "lambda:RemovePermission", + "lambda:ListTags", ], - "Resource": [ - f"arn:aws:lambda:{region}:{account_id}:function:br-studio*", - f"arn:aws:lambda:{region}:{account_id}:function:OpensearchIndexLambda*", - f"arn:aws:lambda:{region}:{account_id}:function:IngestionTriggerLambda*", - ], - "Condition": { - "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - } - }, + "Resource": "arn:aws:lambda:*:*:function:br-studio-*", }, { "Sid": "ManageLogGroups", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", - "logs:PutRetentionPolicy", "logs:DeleteLogGroup", + "logs:PutRetentionPolicy", + "logs:DeleteRetentionPolicy", + "logs:GetDataProtectionPolicy", + "logs:PutDataProtectionPolicy", + "logs:DeleteDataProtectionPolicy", + "logs:AssociateKmsKey", + "logs:DisassociateKmsKey", + "logs:ListTagsLogGroup", + "logs:ListTagsForResource", ], - "Resource": [ - "arn:aws:logs:*:*:log-group:/aws/lambda/br-studio-*", - "arn:aws:logs:*:*:log-group:datazone-*", - ], - "Condition": { - "StringEquals": { - "aws:CalledViaFirst": "cloudformation.amazonaws.com" - } - }, + "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/br-studio-*", }, { - "Sid": "ListTags", + "Sid": "GetRandomPasswordForSecret", "Effect": "Allow", - "Action": [ - "bedrock:ListTagsForResource", - "aoss:ListTagsForResource", - "lambda:ListTags", - "iam:ListRoleTags", - "iam:ListPolicyTags", - ], + "Action": "secretsmanager:GetRandomPassword", "Resource": "*", - "Condition": { - "StringEquals": { - "aws:CalledViaFirst": "cloudformation.amazonaws.com" - } - }, }, { - "Sid": "AmazonDataZoneEnvironmentTagsCreationPermissions", + "Sid": "ManageSecrets", "Effect": "Allow", "Action": [ - "iam:TagRole", - "iam:TagPolicy", - "iam:UntagRole", - "iam:UntagPolicy", - "logs:TagLogGroup", - "bedrock:TagResource", - "bedrock:UntagResource", - "bedrock:ListTagsForResource", - "aoss:TagResource", - "aoss:UnTagResource", - "aoss:ListTagsForResource", - "lambda:TagResource", - "lambda:UnTagResource", - "lambda:ListTags", + "secretsmanager:CreateSecret", + "secretsmanager:DescribeSecret", + "secretsmanager:UpdateSecret", + "secretsmanager:DeleteSecret", + "secretsmanager:GetResourcePolicy", + "secretsmanager:PutResourcePolicy", + "secretsmanager:DeleteResourcePolicy", ], - "Resource": "*", - "Condition": { - "ForAnyValue:StringLike": { - "aws:TagKeys": "AmazonDataZoneEnvironment" - }, - "Null": { - "aws:ResourceTag/AmazonDataZoneEnvironment": "false" - }, - "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - }, - }, - }, - { - "Sid": "AmazonDataZoneEnvironmentBedrockTagResource", - "Effect": "Allow", - "Action": ["bedrock:TagResource"], - "Resource": f"arn:aws:bedrock:{region}:{account_id}:agent-alias/*", - "Condition": { - "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - }, - "ForAnyValue:StringLike": { - "aws:TagKeys": "AmazonDataZoneEnvironment" - }, - }, + "Resource": "arn:aws:secretsmanager:*:*:secret:br-studio/*", }, { - "Sid": "AmazonDataZoneEnvironmentKMSPermissions", + "Sid": "UseCustomerManagedKmsKey", "Effect": "Allow", "Action": [ - "kms:GenerateDataKey", - "kms:Decrypt", "kms:DescribeKey", - "kms:CreateGrant", "kms:Encrypt", + "kms:Decrypt", + "kms:GenerateDataKey", + "kms:CreateGrant", + "kms:RetireGrant", ], "Resource": "*", "Condition": { - "StringEquals": { - "aws:ResourceTag/EnableBedrock": "true", - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"], - } - }, - }, - { - "Sid": "PermissionsToGetAmazonDataZoneEnvironmentBlueprintTemplates", - "Effect": "Allow", - "Action": "s3:GetObject", - "Resource": "*", - "Condition": { - "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - }, - "StringNotEquals": { - "aws:ResourceAccount": "${aws:PrincipalAccount}" - }, - }, - }, - { - "Sid": "PermissionsToManageSecrets", - "Effect": "Allow", - "Action": ["secretsmanager:GetRandomPassword"], - "Resource": "*", - "Condition": { - "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - } + "StringEquals": {"aws:ResourceTag/EnableBedrock": "true"} }, }, { - "Sid": "PermissionsToStoreSecrets", + "Sid": "TagResources", "Effect": "Allow", "Action": [ - "secretsmanager:CreateSecret", + "iam:TagRole", + "iam:UntagRole", + "aoss:TagResource", + "aoss:UntagResource", + "bedrock:TagResource", + "bedrock:UntagResource", + "lambda:TagResource", + "lambda:UntagResource", + "logs:TagLogGroup", + "logs:UntagLogGroup", + "logs:TagResource", + "logs:UntagResource", "secretsmanager:TagResource", "secretsmanager:UntagResource", - "secretsmanager:PutResourcePolicy", - "secretsmanager:DeleteResourcePolicy", - "secretsmanager:DeleteSecret", ], "Resource": "*", "Condition": { "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - }, - "Null": { - "aws:ResourceTag/AmazonDataZoneEnvironment": "false" - }, - }, - }, - { - "Sid": "AmazonDataZoneManageProjectBuckets", - "Effect": "Allow", - "Action": [ - "s3:CreateBucket", - "s3:DeleteBucket", - "s3:PutBucketTagging", - "s3:PutEncryptionConfiguration", - "s3:PutBucketVersioning", - "s3:PutBucketCORS", - "s3:PutBucketPublicAccessBlock", - "s3:PutBucketPolicy", - "s3:PutLifecycleConfiguration", - "s3:DeleteBucketPolicy", - ], - "Resource": "arn:aws:s3:::br-studio-*", - "Condition": { - "StringEquals": { - "aws:CalledViaFirst": ["cloudformation.amazonaws.com"] - } - }, - }, - { - "Sid": "CreateServiceLinkedRoleForOpenSearchServerless", - "Effect": "Allow", - "Action": "iam:CreateServiceLinkedRole", - "Resource": "*", - "Condition": { - "StringEquals": { - "iam:AWSServiceName": "observability.aoss.amazonaws.com", - "aws:CalledViaFirst": "cloudformation.amazonaws.com", + "aws:ResourceTag/AmazonBedrockManaged": "true" } }, }, @@ -947,7 +954,7 @@ def _get_service_role_trust_policy(self): "Statement": [ { "Effect": "Allow", - "Principal": {"Service": ["datazone.amazonaws.com"]}, + "Principal": {"Service": "datazone.amazonaws.com"}, "Action": ["sts:AssumeRole", "sts:TagSession"], "Condition": { "StringEquals": {"aws:SourceAccount": self._account_id}, @@ -964,10 +971,20 @@ def _get_service_role_policy(self): "Version": "2012-10-17", "Statement": [ { - "Sid": "DomainExecutionRoleStatement", + "Sid": "GetDataZoneDomain", + "Effect": "Allow", + "Action": "datazone:GetDomain", + "Resource": "*", + "Condition": { + "StringEquals": { + "aws:ResourceTag/AmazonBedrockManaged": "true" + } + }, + }, + { + "Sid": "ManageDataZoneResources", "Effect": "Allow", "Action": [ - "datazone:GetDomain", "datazone:ListProjects", "datazone:GetProject", "datazone:CreateProject", @@ -983,17 +1000,13 @@ def _get_service_role_policy(self): "datazone:DeleteEnvironment", "datazone:ListEnvironmentBlueprints", "datazone:GetEnvironmentBlueprint", - "datazone:CreateEnvironmentBlueprint", - "datazone:UpdateEnvironmentBlueprint", - "datazone:DeleteEnvironmentBlueprint", "datazone:ListEnvironmentBlueprintConfigurations", - "datazone:ListEnvironmentBlueprintConfigurationSummaries", + "datazone:GetEnvironmentBlueprintConfiguration", "datazone:ListEnvironmentProfiles", "datazone:GetEnvironmentProfile", "datazone:CreateEnvironmentProfile", "datazone:UpdateEnvironmentProfile", "datazone:DeleteEnvironmentProfile", - "datazone:UpdateEnvironmentDeploymentStatus", "datazone:GetEnvironmentCredentials", "datazone:ListGroupsForUser", "datazone:SearchUserProfiles", @@ -1004,21 +1017,23 @@ def _get_service_role_policy(self): "Resource": "*", }, { - "Sid": "RAMResourceShareStatement", + "Sid": "GetResourceShareAssociations", "Effect": "Allow", "Action": "ram:GetResourceShareAssociations", "Resource": "*", }, { + "Sid": "InvokeBedrockModels", "Effect": "Allow", "Action": [ + "bedrock:GetFoundationModelAvailability", "bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream", - "bedrock:GetFoundationModelAvailability", ], "Resource": "*", }, { + "Sid": "UseCustomerManagedKmsKey", "Effect": "Allow", "Action": [ "kms:DescribeKey", @@ -1026,6 +1041,9 @@ def _get_service_role_policy(self): "kms:Decrypt", ], "Resource": "*", + "Condition": { + "StringEquals": {"aws:ResourceTag/EnableBedrock": "true"} + }, }, ], } @@ -1193,25 +1211,37 @@ def _get_permission_boundary(self): "Version": "2012-10-17", "Statement": [ { - "Sid": "BedrockEnvironmentRoleKMSDecryptPermissions", + "Sid": "AccessS3Buckets", "Effect": "Allow", - "Action": ["kms:Decrypt", "kms:GenerateDataKey"], - "Resource": "*", + "Action": [ + "s3:ListBucket", + "s3:ListBucketVersions", + "s3:GetObject", + "s3:PutObject", + "s3:DeleteObject", + "s3:GetObjectVersion", + "s3:DeleteObjectVersion", + ], + "Resource": "arn:aws:s3:::br-studio-${aws:PrincipalAccount}-*", "Condition": { - "StringEquals": {"aws:ResourceTag/EnableBedrock": "true"} + "StringEquals": { + "s3:ResourceAccount": "${aws:PrincipalAccount}" + } }, }, { - "Sid": "BedrockRuntimeAgentPermissions", + "Sid": "AccessOssCollections", "Effect": "Allow", - "Action": ["bedrock:InvokeAgent"], + "Action": "aoss:APIAccessAll", "Resource": "*", "Condition": { - "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"} + "StringEquals": { + "aws:ResourceAccount": "${aws:PrincipalAccount}" + } }, }, { - "Sid": "BedrockRuntimeModelsAndJobsRole", + "Sid": "InvokeBedrockModels", "Effect": "Allow", "Action": [ "bedrock:InvokeModel", @@ -1221,50 +1251,106 @@ def _get_permission_boundary(self): "Resource": "*", }, { - "Sid": "BedrockApplyGuardrails", + "Sid": "AccessBedrockResources", "Effect": "Allow", - "Action": ["bedrock:ApplyGuardrail"], + "Action": [ + "bedrock:InvokeAgent", + "bedrock:Retrieve", + "bedrock:StartIngestionJob", + "bedrock:GetIngestionJob", + "bedrock:ListIngestionJobs", + "bedrock:ApplyGuardrail", + "bedrock:ListPrompts", + "bedrock:GetPrompt", + "bedrock:CreatePrompt", + "bedrock:DeletePrompt", + "bedrock:CreatePromptVersion", + "bedrock:InvokeFlow", + "bedrock:ListTagsForResource", + "bedrock:TagResource", + "bedrock:UntagResource", + ], "Resource": "*", "Condition": { - "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"} + "StringEquals": { + "aws:ResourceAccount": "${aws:PrincipalAccount}", + "aws:ResourceTag/AmazonBedrockManaged": "true", + }, + "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"}, }, }, { - "Sid": "BedrockRuntimePermissions", + "Sid": "InvokeBedrockFlows", + "Effect": "Allow", + "Action": "bedrock:InvokeFlow", + "Resource": "arn:aws:bedrock:*:*:flow/*/alias/*", + "Condition": { + "StringEquals": { + "aws:ResourceAccount": "${aws:PrincipalAccount}", + }, + "Null": { + "aws:ResourceTag/AmazonDataZoneProject": "false", + }, + }, + }, + { + "Sid": "WriteLogs", "Effect": "Allow", "Action": [ - "bedrock:Retrieve", - "bedrock:StartIngestionJob", - "bedrock:GetIngestionJob", - "bedrock:ListIngestionJobs", + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents", ], "Resource": "*", "Condition": { - "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"} + "StringEquals": { + "aws:ResourceAccount": "${aws:PrincipalAccount}", + "aws:ResourceTag/AmazonBedrockManaged": "true", + }, + "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"}, }, }, { - "Sid": "BedrockFunctionsPermissions", - "Action": ["secretsmanager:PutSecretValue"], - "Resource": "arn:aws:secretsmanager:*:*:secret:br-studio/*", + "Sid": "InvokeLambdaFunctions", "Effect": "Allow", + "Action": "lambda:InvokeFunction", + "Resource": "arn:aws:lambda:*:*:function:br-studio-*", "Condition": { - "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"} + "StringEquals": { + "aws:ResourceAccount": "${aws:PrincipalAccount}", + "aws:ResourceTag/AmazonBedrockManaged": "true", + }, + "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"}, }, }, { - "Sid": "BedrockS3ObjectsHandlingPermissions", + "Sid": "AccessSecretsManagerSecrets", + "Effect": "Allow", "Action": [ - "s3:GetObject", - "s3:PutObject", - "s3:GetObjectVersion", - "s3:ListBucketVersions", - "s3:DeleteObject", - "s3:DeleteObjectVersion", - "s3:ListBucket", + "secretsmanager:DescribeSecret", + "secretsmanager:GetSecretValue", + "secretsmanager:PutSecretValue", ], - "Resource": [f"arn:aws:s3:::br-studio-{self._account_id}-*"], + "Resource": "arn:aws:secretsmanager:*:*:secret:br-studio/*", + "Condition": { + "StringEquals": { + "aws:ResourceAccount": "${aws:PrincipalAccount}", + "aws:ResourceTag/AmazonBedrockManaged": "true", + }, + "Null": {"aws:ResourceTag/AmazonDataZoneProject": "false"}, + }, + }, + { + "Sid": "UseCustomerManagedKmsKey", "Effect": "Allow", + "Action": ["kms:Decrypt", "kms:GenerateDataKey"], + "Resource": "*", + "Condition": { + "StringEquals": { + "aws:ResourceAccount": "${aws:PrincipalAccount}", + "aws:ResourceTag/EnableBedrock": "true", + } + }, }, ], } From 601bf3d20fae4910b510379df0c88ea1737536e8 Mon Sep 17 00:00:00 2001 From: Laren-AWS <57545972+Laren-AWS@users.noreply.github.com> Date: Tue, 23 Jul 2024 12:10:44 -0700 Subject: [PATCH 06/98] SOS: Removed curated examples (#6678) * Remove curated examples because it's obsolete. * Update tools release to remove curated example checks. --- .../zonbook/example_curated_template.xml | 30 ------------------- .../zonbook/library_by_service_chapter.xml | 28 ----------------- .../zonbook/service_chapter_template.xml | 28 ----------------- .../zonbook/utility/curated_examples.xml | 21 ------------- .github/workflows/validate-doc-metadata.yml | 2 +- 5 files changed, 1 insertion(+), 108 deletions(-) delete mode 100644 .doc_gen/templates/zonbook/example_curated_template.xml delete mode 100644 .doc_gen/templates/zonbook/utility/curated_examples.xml diff --git a/.doc_gen/templates/zonbook/example_curated_template.xml b/.doc_gen/templates/zonbook/example_curated_template.xml deleted file mode 100644 index 6f4b3f3db73..00000000000 --- a/.doc_gen/templates/zonbook/example_curated_template.xml +++ /dev/null @@ -1,30 +0,0 @@ -{{- template "prologue"}} -{{- $include_docs := "file://AWSShared/code-samples/docs/"}} -{{- if isSnapshot}} - {{- $include_docs = ""}} -{{- end}} - - {{- if .BlockContent}} - - {{- else}} - {{.Description}} - {{- if .DescriptionList}} - - {{- range $desc := .DescriptionList}} - {{$desc}} - {{- end}} - - {{- end}} - {{- end}} - - For complete source code and instructions on how to set up and run, see - {{.UrlText}} in - {{.SourceName}}. - - - Services used in this example - {{- range $svc_ent := $.Services}} - {{$svc_ent.Short}} - {{- end}} - - \ No newline at end of file diff --git a/.doc_gen/templates/zonbook/library_by_service_chapter.xml b/.doc_gen/templates/zonbook/library_by_service_chapter.xml index 14af8d7999c..78337ee75d4 100644 --- a/.doc_gen/templates/zonbook/library_by_service_chapter.xml +++ b/.doc_gen/templates/zonbook/library_by_service_chapter.xml @@ -104,34 +104,6 @@ {{- end}} {{- end}} {{- end}} - {{- if $service.CuratedExampleSets}} -

- - Curated code examples for {{$service.ServiceEntity.Short}} - Curated examples - - The following curated code examples show a variety of ways to use {{$service.ServiceEntity.Short}}. - - - The following curated code examples show a variety of ways to use {{$service.ServiceEntity.Short}}. - Example sources - {{- range $curated_set := $service.CuratedExampleSets}} -
- - {{$curated_set.Source.Name}} - {{$curated_set.Source.Name}} - - The following code examples show how to use {{$service.ServiceEntity.Short}} with {{$curated_set.Source.Name}}. - - - {{$curated_set.Source.Description}} - The following curated code examples from {{$curated_set.Source.Name}} - show how to use {{$service.ServiceEntity.Short}}. - {{- template "curated_examples" $curated_set}} -
- {{- end}} -
- {{- end}} {{- end}} diff --git a/.doc_gen/templates/zonbook/service_chapter_template.xml b/.doc_gen/templates/zonbook/service_chapter_template.xml index ed98f23aacd..0da03cbc429 100644 --- a/.doc_gen/templates/zonbook/service_chapter_template.xml +++ b/.doc_gen/templates/zonbook/service_chapter_template.xml @@ -81,34 +81,6 @@ {{- end}} {{- end}} {{- end}} - {{- if .CuratedExampleSets}} -
- - Curated code examples for {{$.ServiceEntity.Short}} - Curated examples - - The following curated code examples show a variety of ways to use {{$.ServiceEntity.Short}}. - - - The following curated code examples show a variety of ways to use {{$.ServiceEntity.Short}}. - Example sources - {{- range $curated_set := .CuratedExampleSets}} -
- - {{$curated_set.Source.Name}} - {{$curated_set.Source.Name}} - - The following code examples show how to use {{$.ServiceEntity.Short}} with {{$curated_set.Source.Name}}. - - - {{$curated_set.Source.Description}} - The following curated code examples from {{$curated_set.Source.Name}} - show how to use {{$.ServiceEntity.Short}}. - {{- template "curated_examples" $curated_set}} -
- {{- end}} -
- {{- end}} {{- if .Bundle}} {{- else}} diff --git a/.doc_gen/templates/zonbook/utility/curated_examples.xml b/.doc_gen/templates/zonbook/utility/curated_examples.xml deleted file mode 100644 index 838d2ad1165..00000000000 --- a/.doc_gen/templates/zonbook/utility/curated_examples.xml +++ /dev/null @@ -1,21 +0,0 @@ -{{- define "curated_examples"}} -{{- $curated_set := .}} -{{- $include_docs := "file://AWSShared/code-samples/docs/"}} -{{- if isSnapshot}} - {{- $include_docs = ""}} -{{- end}} -Examples -{{- range $curated_set.Examples}} -
- - {{.Title}} - {{.TitleAbbrev}} - - {{.Title}}. - - - - -
-{{- end}} -{{- end}} \ No newline at end of file diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index 218d1623a80..22ac2290b2e 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@2024-07-22-A + uses: awsdocs/aws-doc-sdk-examples-tools@2024-07-22-B with: doc_gen_only: "False" strict_titles: "True" From 1de3fdf3435ea3521f0e85c20cf6c8416bb4a7da Mon Sep 17 00:00:00 2001 From: Steven Meyer <108885656+meyertst-aws@users.noreply.github.com> Date: Wed, 24 Jul 2024 10:52:59 -0400 Subject: [PATCH 07/98] C++:S3:Object Integrity Workflow (#6599) --- .doc_gen/metadata/s3_metadata.yaml | 65 + .doc_gen/validation.yaml | 1 + cpp/example_code/s3/CMakeLists.txt | 80 +- cpp/example_code/s3/README.md | 20 +- cpp/example_code/s3/copy_object.cpp | 4 +- cpp/example_code/s3/create_bucket.cpp | 4 +- cpp/example_code/s3/delete_bucket.cpp | 4 +- cpp/example_code/s3/delete_bucket_policy.cpp | 4 +- cpp/example_code/s3/delete_object.cpp | 4 +- cpp/example_code/s3/delete_objects.cpp | 4 +- cpp/example_code/s3/delete_website_config.cpp | 4 +- cpp/example_code/s3/get_bucket_acl.cpp | 4 +- cpp/example_code/s3/get_bucket_policy.cpp | 4 +- cpp/example_code/s3/get_object.cpp | 4 +- cpp/example_code/s3/get_put_bucket_acl.cpp | 4 +- cpp/example_code/s3/get_put_object_acl.cpp | 4 +- cpp/example_code/s3/get_website_config.cpp | 4 +- cpp/example_code/s3/list_buckets.cpp | 4 +- .../s3/list_buckets_disabling_dns_cache.cpp | 4 +- cpp/example_code/s3/list_objects.cpp | 10 +- .../list_objects_with_aws_global_region.cpp | 6 +- cpp/example_code/s3/presigned_get_object.cpp | 4 +- cpp/example_code/s3/presigned_put_object.cpp | 4 +- cpp/example_code/s3/put_bucket_acl.cpp | 4 +- cpp/example_code/s3/put_bucket_policy.cpp | 4 +- cpp/example_code/s3/put_object.cpp | 4 +- cpp/example_code/s3/put_object_async.cpp | 4 +- cpp/example_code/s3/put_object_buffer.cpp | 4 +- cpp/example_code/s3/put_website_config.cpp | 4 +- cpp/example_code/s3/s3_demo_for_cloud9.cpp | 4 +- cpp/example_code/s3/s3_examples.h | 4 + .../s3/s3_getting_started_scenario.cpp | 4 +- .../CMakeLists.txt | 66 + .../s3/s3_object_integrity_workflow/README.md | 46 + .../s3/s3_object_integrity_workflow/main.cpp | 45 + .../s3_object_integrity_workflow.cpp | 1718 +++++++++++++++++ cpp/example_code/s3/tests/CMakeLists.txt | 25 +- cpp/example_code/s3/tests/S3_GTests.cpp | 33 +- cpp/example_code/s3/tests/S3_GTests.h | 8 + .../s3/tests/gtest_list_objects.cpp | 3 +- .../gtest_s3_object_integrity_workflow.cpp | 222 +++ workflows/s3_object_integrity/README.md | 30 + .../s3_object_integrity/SPECIFICATION.md | 164 ++ 43 files changed, 2533 insertions(+), 113 deletions(-) create mode 100644 cpp/example_code/s3/s3_object_integrity_workflow/CMakeLists.txt create mode 100644 cpp/example_code/s3/s3_object_integrity_workflow/README.md create mode 100644 cpp/example_code/s3/s3_object_integrity_workflow/main.cpp create mode 100644 cpp/example_code/s3/s3_object_integrity_workflow/s3_object_integrity_workflow.cpp create mode 100644 cpp/example_code/s3/tests/gtest_s3_object_integrity_workflow.cpp create mode 100644 workflows/s3_object_integrity/README.md create mode 100644 workflows/s3_object_integrity/SPECIFICATION.md diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index 0c4e4d7722a..e4403cce6d8 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -1184,6 +1184,18 @@ s3_AbortMultipartUploads: - S3.dotnetv3.AbortMPUExample services: s3: {AbortMultipartUploads} +s3_AbortMultipartUpload: + languages: + C++: + versions: + - sdk_version: 1 + github: cpp/example_code/s3 + excerpts: + - description: + snippet_tags: + - cpp.example_code.s3.AbortMultipartUpload + services: + s3: {AbortMultipartUpload} s3_CompleteMultipartUpload: languages: Rust: @@ -1194,6 +1206,14 @@ s3_CompleteMultipartUpload: - description: snippet_tags: - rust.example_code.s3.complete_multipart_upload + C++: + versions: + - sdk_version: 1 + github: cpp/example_code/s3 + excerpts: + - description: + snippet_tags: + - cpp.example_code.s3.CompleteMultipartUpload services: s3: {CompleteMultipartUpload} s3_CreateMultipartUpload: @@ -1206,6 +1226,14 @@ s3_CreateMultipartUpload: - description: snippet_tags: - rust.example_code.s3.create_multipart_upload + C++: + versions: + - sdk_version: 1 + github: cpp/example_code/s3 + excerpts: + - description: + snippet_tags: + - cpp.example_code.s3.CreateMultipartUpload services: s3: {CreateMultipartUpload} s3_ListMultipartUploads: @@ -2333,6 +2361,14 @@ s3_UploadPart: snippet_tags: - rust.example_code.s3.upload_part - rust.example_code.s3.upload_part.CompletedMultipartUpload + C++: + versions: + - sdk_version: 1 + github: cpp/example_code/s3 + excerpts: + - description: + snippet_tags: + - cpp.example_code.s3.UploadPart services: s3: {UploadPart} s3_PutBucketNotificationConfiguration: @@ -2379,6 +2415,18 @@ s3_PutBucketAccelerateConfiguration: - S3.dotnetv3.TransferAccelerationExample services: s3: {PutBucketAccelerateConfiguration} +s3_GetObjectAttributes: + languages: + C++: + versions: + - sdk_version: 1 + github: cpp/example_code/s3 + excerpts: + - description: + snippet_tags: + - cpp.example_code.s3.GetObjectAttributes + services: + s3: {GetObjectAttributes} s3_DownloadBucketToDirectory: title: Download all objects in an &S3long; (&S3;) bucket to a local directory title_abbrev: Download objects to a local directory @@ -3243,6 +3291,23 @@ s3_Scenario_ObjectLock: - javascriptv3/example_code/s3/scenarios/object-locking/clean.steps.js services: s3: {PutObjectLockConfiguration, PutObjectRetention, GetObjectRetention, PutObjectLegalHold, GetObjectLegalHold, GetObjectLockConfiguration} +s3_Scenario_ObjectIntegrity: + title: Work with &S3; object integrity features using an &AWS; SDK + title_abbrev: Work with &S3; object integrity + synopsis: work with S3 object integrity features. + category: Scenarios + languages: + C++: + versions: + - sdk_version: 1 + github: cpp/example_code/s3/s3_object_integrity_workflow + sdkguide: + excerpts: + - description: Run an interactive scenario demonstrating &S3; object integrity features. + snippet_tags: + - cpp.example_code.s3.Scenario_ObjectIntegrity + services: + s3: {AbortMultipartUpload, CreateMultipartUpload, DeleteObject, GetObjectAttributes, PutObject, UploadPart, CompleteMultipartUpload} s3_SelectObjectContent: languages: Java: diff --git a/.doc_gen/validation.yaml b/.doc_gen/validation.yaml index a93b249c05c..c368e7914a1 100644 --- a/.doc_gen/validation.yaml +++ b/.doc_gen/validation.yaml @@ -204,6 +204,7 @@ allow_list: - "v2/service/cognitoidentityprovider/types" - "abortIncompleteMultipartUploadsOlderThan" - "com/pinterest/ktlint/releases/download/1" + - "aws/s3/model/AbortMultipartUploadRequest" - "src/main/kotlin/com/example/ecr/HelloECR" sample_files: - "README.md" diff --git a/cpp/example_code/s3/CMakeLists.txt b/cpp/example_code/s3/CMakeLists.txt index 0a2fb09ba2f..fb3e9027d03 100644 --- a/cpp/example_code/s3/CMakeLists.txt +++ b/cpp/example_code/s3/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.13) set(SERVICE_NAME s3) -set(SERVICE_COMPONENTS iam s3 sts) +set(SERVICE_COMPONENTS iam s3 sts transfer) # Set this project's name. project("${SERVICE_NAME}-examples") @@ -17,62 +17,62 @@ set(CMAKE_CXX_STANDARD 11) set(WINDOWS_BUILD ${MSVC}) # Set the location of where Windows can find the installed libraries of the SDK. -if(WINDOWS_BUILD) +if (WINDOWS_BUILD) string(REPLACE ";" "/aws-cpp-sdk-all;" SYSTEM_MODULE_PATH "${CMAKE_SYSTEM_PREFIX_PATH}/aws-cpp-sdk-all") list(APPEND CMAKE_PREFIX_PATH ${SYSTEM_MODULE_PATH}) -endif() +endif () # CURL package is optional to test pre-signed url code. find_package(CURL) -if (NOT CURL_FOUND) - unset(CURL_INCLUDE_DIRS) - unset(CURL_LIBRARIES) +if (NOT CURL_FOUND) + unset(CURL_INCLUDE_DIRS) + unset(CURL_LIBRARIES) unset(CURL_LIBRARY) -endif() +endif () # Find the AWS SDK for C++ package. find_package(AWSSDK REQUIRED COMPONENTS ${SERVICE_COMPONENTS}) -if(WINDOWS_BUILD AND AWSSDK_INSTALL_AS_SHARED_LIBS) - # Copy relevant AWS SDK for C++ libraries into the current binary directory for running and debugging. +if (WINDOWS_BUILD AND AWSSDK_INSTALL_AS_SHARED_LIBS) + # Copy relevant AWS SDK for C++ libraries into the current binary directory for running and debugging. - # set(BIN_SUB_DIR "/Debug") # If you are building from the command line, you may need to uncomment this - # and set the proper subdirectory to the executables' location. + # set(BIN_SUB_DIR "/Debug") # If you are building from the command line, you may need to uncomment this + # and set the proper subdirectory to the executables' location. - AWSSDK_CPY_DYN_LIBS(SERVICE_COMPONENTS "" ${CMAKE_CURRENT_BINARY_DIR}${BIN_SUB_DIR}) - endif() + AWSSDK_CPY_DYN_LIBS(SERVICE_COMPONENTS "" ${CMAKE_CURRENT_BINARY_DIR}${BIN_SUB_DIR}) +endif () # Add the code example-specific header files. file(GLOB AWSDOC_S3_HEADERS - "include/awsdoc/s3/*.h" + "include/awsdoc/s3/*.h" ) # AWSDOC_S3_SOURCE can be defined in the command line to limit the files in a build. For example, # you can limit files to one action. -if(NOT DEFINED AWSDOC_S3_SOURCE) +if (NOT DEFINED AWSDOC_S3_SOURCE) file(GLOB AWSDOC_S3_SOURCE - "*.cpp" + "*.cpp" ) -endif() +endif () # Handle special case of list_buckets_disabling_dns_cache.cpp on Windows. -if(WINDOWS_BUILD) +if (WINDOWS_BUILD) list(FIND AWSSDK_CLIENT_LIBS "curl" CONTAINS_CURL) if (CONTAINS_CURL EQUAL -1) - # Remove list_buckets_disabling_dns_cache.cpp when not using curl library for http. + # Remove list_buckets_disabling_dns_cache.cpp when not using curl library for http. list(FILTER AWSDOC_S3_SOURCE EXCLUDE REGEX "/list_buckets_disabling_dns_cache.cpp$") # Not supported in windows without curl, see file for details - else() + else () if (NOT CURL_FOUND) # find_package did not set these. set(CURL_INCLUDE_DIRS "c:/curl/include") # Update this with correct curl install location. set(CURL_LIBRARIES "c:/curl/lib") # Update this with correct curl install location. - endif() - endif() -endif() + endif () + endif () +endif () -foreach(file ${AWSDOC_S3_SOURCE}) +foreach (file ${AWSDOC_S3_SOURCE}) get_filename_component(EXAMPLE ${file} NAME_WE) # Build the code example executables. @@ -80,30 +80,24 @@ foreach(file ${AWSDOC_S3_SOURCE}) add_executable(${EXAMPLE_EXE} ${AWSDOC_S3_HEADERS} ${file}) - target_include_directories(${EXAMPLE_EXE} PUBLIC - $ - $ - ) - - - target_include_directories(${EXAMPLE_EXE} SYSTEM PUBLIC - ${CURL_INCLUDE_DIRS}) - - target_link_libraries(${EXAMPLE_EXE} - ${AWSSDK_LINK_LIBRARIES} - ${AWSSDK_PLATFORM_DEPS} + target_include_directories(${EXAMPLE_EXE} SYSTEM PUBLIC + ${CURL_INCLUDE_DIRS}) + + target_link_libraries(${EXAMPLE_EXE} + ${AWSSDK_LINK_LIBRARIES} + ${AWSSDK_PLATFORM_DEPS} ${CURL_LIBRARIES}) - if(CURL_FOUND) + if (CURL_FOUND) target_compile_definitions(${EXAMPLE_EXE} - PUBLIC - HAS_CURL=1) - endif() + PUBLIC + HAS_CURL=1) + endif () - endforeach() +endforeach () -if(BUILD_TESTS) +if (BUILD_TESTS) add_subdirectory(tests) -endif() +endif () diff --git a/cpp/example_code/s3/README.md b/cpp/example_code/s3/README.md index 3f0b7d13952..aa784db1057 100644 --- a/cpp/example_code/s3/README.md +++ b/cpp/example_code/s3/README.md @@ -46,8 +46,11 @@ Next, for information on code example structures and how to build and run the ex Code excerpts that show you how to call individual service functions. +- [AbortMultipartUpload](s3_object_integrity_workflow/s3_object_integrity_workflow.cpp#L1097) +- [CompleteMultipartUpload](s3_object_integrity_workflow/s3_object_integrity_workflow.cpp#L1129) - [CopyObject](copy_object.cpp#L32) - [CreateBucket](create_bucket.cpp#L30) +- [CreateMultipartUpload](s3_object_integrity_workflow/s3_object_integrity_workflow.cpp#L1006) - [DeleteBucket](delete_bucket.cpp#L30) - [DeleteBucketPolicy](delete_bucket_policy.cpp#L30) - [DeleteBucketWebsite](delete_website_config.cpp#L30) @@ -58,13 +61,15 @@ Code excerpts that show you how to call individual service functions. - [GetBucketWebsite](get_website_config.cpp#L29) - [GetObject](get_object.cpp#L33) - [GetObjectAcl](get_put_object_acl.cpp#L43) +- [GetObjectAttributes](s3_object_integrity_workflow/s3_object_integrity_workflow.cpp#L707) - [ListBuckets](list_buckets.cpp#L29) -- [ListObjectsV2](list_objects.cpp#L31) +- [ListObjectsV2](list_objects.cpp#L32) - [PutBucketAcl](put_bucket_acl.cpp#L47) - [PutBucketPolicy](put_bucket_policy.cpp#L37) - [PutBucketWebsite](put_website_config.cpp#L33) - [PutObject](put_object.cpp#L33) - [PutObjectAcl](get_put_object_acl.cpp#L165) +- [UploadPart](s3_object_integrity_workflow/s3_object_integrity_workflow.cpp#L1040) ### Scenarios @@ -73,6 +78,7 @@ functions within the same service. - [Create a presigned URL](presigned_get_object.cpp) - [Get started with buckets and objects](s3_getting_started_scenario.cpp) +- [Work with Amazon S3 object integrity](s3_object_integrity_workflow/s3_object_integrity_workflow.cpp) ### Cross-service examples @@ -139,6 +145,18 @@ This example shows you how to do the following: +#### Work with Amazon S3 object integrity + +This example shows you how to work with S3 object integrity features. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/cpp/example_code/s3/copy_object.cpp b/cpp/example_code/s3/copy_object.cpp index 3415f2fdeb3..144ad18b538 100644 --- a/cpp/example_code/s3/copy_object.cpp +++ b/cpp/example_code/s3/copy_object.cpp @@ -66,7 +66,7 @@ bool AwsDoc::S3::copyObject(const Aws::String &objectKey, const Aws::String &fro * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { Aws::SDKOptions options; @@ -100,5 +100,5 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/create_bucket.cpp b/cpp/example_code/s3/create_bucket.cpp index 8fd038a4e9a..23be332bb2e 100644 --- a/cpp/example_code/s3/create_bucket.cpp +++ b/cpp/example_code/s3/create_bucket.cpp @@ -64,7 +64,7 @@ bool AwsDoc::S3::createBucket(const Aws::String &bucketName, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main() { Aws::SDKOptions options; @@ -88,5 +88,5 @@ int main() { ShutdownAPI(options); } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/delete_bucket.cpp b/cpp/example_code/s3/delete_bucket.cpp index dd94f7f7486..c8ba0fd6b53 100644 --- a/cpp/example_code/s3/delete_bucket.cpp +++ b/cpp/example_code/s3/delete_bucket.cpp @@ -61,7 +61,7 @@ bool AwsDoc::S3::deleteBucket(const Aws::String &bucketName, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { Aws::SDKOptions options; @@ -90,5 +90,5 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/delete_bucket_policy.cpp b/cpp/example_code/s3/delete_bucket_policy.cpp index b317c48a0af..75bb08c8970 100644 --- a/cpp/example_code/s3/delete_bucket_policy.cpp +++ b/cpp/example_code/s3/delete_bucket_policy.cpp @@ -60,7 +60,7 @@ bool AwsDoc::S3::deleteBucketPolicy(const Aws::String &bucketName, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { Aws::SDKOptions options; @@ -89,4 +89,4 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD \ No newline at end of file +#endif // EXCLUDE_MAIN_FUNCTION \ No newline at end of file diff --git a/cpp/example_code/s3/delete_object.cpp b/cpp/example_code/s3/delete_object.cpp index 1c708715511..2d617a0f086 100644 --- a/cpp/example_code/s3/delete_object.cpp +++ b/cpp/example_code/s3/delete_object.cpp @@ -63,7 +63,7 @@ bool AwsDoc::S3::deleteObject(const Aws::String &objectKey, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { Aws::SDKOptions options; @@ -94,4 +94,4 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/delete_objects.cpp b/cpp/example_code/s3/delete_objects.cpp index 782d0ab46e6..e6d16a15ce5 100644 --- a/cpp/example_code/s3/delete_objects.cpp +++ b/cpp/example_code/s3/delete_objects.cpp @@ -78,7 +78,7 @@ bool AwsDoc::S3::deleteObjects(const std::vector &objectKeys, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char **argv) { @@ -116,4 +116,4 @@ int main(int argc, char **argv) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/delete_website_config.cpp b/cpp/example_code/s3/delete_website_config.cpp index 6a435ff8fab..30ded30c78c 100644 --- a/cpp/example_code/s3/delete_website_config.cpp +++ b/cpp/example_code/s3/delete_website_config.cpp @@ -60,7 +60,7 @@ bool AwsDoc::S3::deleteBucketWebsite(const Aws::String &bucketName, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { Aws::SDKOptions options; @@ -90,4 +90,4 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD \ No newline at end of file +#endif // EXCLUDE_MAIN_FUNCTION \ No newline at end of file diff --git a/cpp/example_code/s3/get_bucket_acl.cpp b/cpp/example_code/s3/get_bucket_acl.cpp index 2b6b571876b..c077b0cd6e3 100644 --- a/cpp/example_code/s3/get_bucket_acl.cpp +++ b/cpp/example_code/s3/get_bucket_acl.cpp @@ -155,7 +155,7 @@ Aws::String getPermissionString(const Aws::S3::Model::Permission &permission) { * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { Aws::SDKOptions options; @@ -184,5 +184,5 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/get_bucket_policy.cpp b/cpp/example_code/s3/get_bucket_policy.cpp index 2f577db3da4..7417aeb67fb 100644 --- a/cpp/example_code/s3/get_bucket_policy.cpp +++ b/cpp/example_code/s3/get_bucket_policy.cpp @@ -69,7 +69,7 @@ bool AwsDoc::S3::getBucketPolicy(const Aws::String &bucketName, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { Aws::SDKOptions options; @@ -98,4 +98,4 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD \ No newline at end of file +#endif // EXCLUDE_MAIN_FUNCTION \ No newline at end of file diff --git a/cpp/example_code/s3/get_object.cpp b/cpp/example_code/s3/get_object.cpp index c1dca3c3bea..9179f82bba2 100644 --- a/cpp/example_code/s3/get_object.cpp +++ b/cpp/example_code/s3/get_object.cpp @@ -70,7 +70,7 @@ bool AwsDoc::S3::getObject(const Aws::String &objectKey, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { Aws::SDKOptions options; @@ -102,4 +102,4 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD \ No newline at end of file +#endif // EXCLUDE_MAIN_FUNCTION \ No newline at end of file diff --git a/cpp/example_code/s3/get_put_bucket_acl.cpp b/cpp/example_code/s3/get_put_bucket_acl.cpp index d4ca7a4a42e..a83eecea3e3 100644 --- a/cpp/example_code/s3/get_put_bucket_acl.cpp +++ b/cpp/example_code/s3/get_put_bucket_acl.cpp @@ -318,7 +318,7 @@ Aws::S3::Model::Type setGranteeType(const Aws::String &type) { * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION static void usage() { std::cout << R"( @@ -385,4 +385,4 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/get_put_object_acl.cpp b/cpp/example_code/s3/get_put_object_acl.cpp index e8bb08a871c..ff3143faf27 100644 --- a/cpp/example_code/s3/get_put_object_acl.cpp +++ b/cpp/example_code/s3/get_put_object_acl.cpp @@ -275,7 +275,7 @@ Aws::S3::Model::Type setGranteeType(const Aws::String &type) { * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION static void usage() { std::cout << R"( @@ -344,5 +344,5 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/get_website_config.cpp b/cpp/example_code/s3/get_website_config.cpp index cca9de0f6b8..380a73ab86c 100644 --- a/cpp/example_code/s3/get_website_config.cpp +++ b/cpp/example_code/s3/get_website_config.cpp @@ -74,7 +74,7 @@ bool AwsDoc::S3::getWebsiteConfig(const Aws::String &bucketName, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { @@ -104,5 +104,5 @@ int main(int argc, char* argv[]) return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/list_buckets.cpp b/cpp/example_code/s3/list_buckets.cpp index 00f80061442..adfaaa47510 100644 --- a/cpp/example_code/s3/list_buckets.cpp +++ b/cpp/example_code/s3/list_buckets.cpp @@ -53,7 +53,7 @@ bool AwsDoc::S3::listBuckets(const Aws::S3::S3ClientConfiguration &clientConfig) * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main() { //The Aws::SDKOptions struct contains SDK configuration options. @@ -77,4 +77,4 @@ int main() { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/list_buckets_disabling_dns_cache.cpp b/cpp/example_code/s3/list_buckets_disabling_dns_cache.cpp index c3057a03373..e7e81ff5256 100644 --- a/cpp/example_code/s3/list_buckets_disabling_dns_cache.cpp +++ b/cpp/example_code/s3/list_buckets_disabling_dns_cache.cpp @@ -117,7 +117,7 @@ bool AwsDoc::S3::listBucketDisablingDnsCache(const Aws::S3::S3ClientConfiguratio * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char *argv[]) { SDKOptions options; @@ -144,4 +144,4 @@ int main(int argc, char *argv[]) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/list_objects.cpp b/cpp/example_code/s3/list_objects.cpp index 3a6b8d2e085..b4cae7fcfca 100644 --- a/cpp/example_code/s3/list_objects.cpp +++ b/cpp/example_code/s3/list_objects.cpp @@ -25,11 +25,13 @@ /*! \param bucketName: Name of the S3 bucket. \param clientConfig: Aws client configuration. + \param[out] keysResult: Vector to receive the keys. \return bool: Function succeeded. */ // snippet-start:[s3.cpp.list_objects.code] bool AwsDoc::S3::listObjects(const Aws::String &bucketName, + Aws::Vector &keysResult, const Aws::S3::S3ClientConfiguration &clientConfig) { Aws::S3::S3Client s3Client(clientConfig); @@ -63,6 +65,7 @@ bool AwsDoc::S3::listObjects(const Aws::String &bucketName, for (const auto &object: allObjects) { std::cout << " " << object.GetKey() << std::endl; + keysResult.push_back(object.GetKey()); } return true; @@ -82,7 +85,7 @@ bool AwsDoc::S3::listObjects(const Aws::String &bucketName, *. */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { @@ -105,12 +108,13 @@ int main(int argc, char* argv[]) Aws::S3::S3ClientConfiguration clientConfig; // Optional: Set to the AWS Region in which the bucket was created (overrides config file). // clientConfig.region = "us-east-1"; - AwsDoc::S3::listObjects(bucketName, clientConfig); + Aws::Vector keysResult; + AwsDoc::S3::listObjects(bucketName, keysResult, clientConfig); } Aws::ShutdownAPI(options); return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/list_objects_with_aws_global_region.cpp b/cpp/example_code/s3/list_objects_with_aws_global_region.cpp index 172f455e940..dc5e87d8306 100644 --- a/cpp/example_code/s3/list_objects_with_aws_global_region.cpp +++ b/cpp/example_code/s3/list_objects_with_aws_global_region.cpp @@ -94,6 +94,7 @@ static bool listTheObjects(const Aws::S3::S3Client &s3Client, const Aws::String &bucketName) { // An S3 API client set to the aws-global AWS Region should be able to get // access to a bucket in any AWS Region. + Aws::S3::Model::ListObjectsV2Request listObjectsRequest; listObjectsRequest.SetBucket(bucketName); @@ -114,6 +115,7 @@ listTheObjects(const Aws::S3::S3Client &s3Client, const Aws::String &bucketName) objects.insert(objects.end(), contents.begin(), contents.end()); continuationToken = listObjectOutcome.GetResult().GetNextContinuationToken(); } else { + std::cerr << "Error. Could not count the objects in the bucket: " << listObjectOutcome.GetError() << std::endl; return false; @@ -186,7 +188,7 @@ bool AwsDoc::S3::listObjectsWithAwsGlobalRegion( * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main() { Aws::SDKOptions options; @@ -201,4 +203,4 @@ int main() { return 0; } -#endif // TESTING_BUILD \ No newline at end of file +#endif // EXCLUDE_MAIN_FUNCTION \ No newline at end of file diff --git a/cpp/example_code/s3/presigned_get_object.cpp b/cpp/example_code/s3/presigned_get_object.cpp index fb68194d050..e3a708b3281 100644 --- a/cpp/example_code/s3/presigned_get_object.cpp +++ b/cpp/example_code/s3/presigned_get_object.cpp @@ -127,7 +127,7 @@ bool AwsDoc::S3::getObjectWithPresignedObjectUrl(const Aws::String &presignedURL * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char **argv) { @@ -169,4 +169,4 @@ int main(int argc, char **argv) { return 0; } -#endif // TESTING_BUILD \ No newline at end of file +#endif // EXCLUDE_MAIN_FUNCTION \ No newline at end of file diff --git a/cpp/example_code/s3/presigned_put_object.cpp b/cpp/example_code/s3/presigned_put_object.cpp index e0f767d35a8..76f1d984aaa 100644 --- a/cpp/example_code/s3/presigned_put_object.cpp +++ b/cpp/example_code/s3/presigned_put_object.cpp @@ -164,7 +164,7 @@ bool AwsDoc::S3::PutStringWithPresignedObjectURL(const Aws::String &presignedURL * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char **argv) { @@ -205,4 +205,4 @@ int main(int argc, char **argv) { return 0; } -#endif // TESTING_BUILD \ No newline at end of file +#endif // EXCLUDE_MAIN_FUNCTION \ No newline at end of file diff --git a/cpp/example_code/s3/put_bucket_acl.cpp b/cpp/example_code/s3/put_bucket_acl.cpp index 3c7008a90f5..09b83b1a7a6 100644 --- a/cpp/example_code/s3/put_bucket_acl.cpp +++ b/cpp/example_code/s3/put_bucket_acl.cpp @@ -158,7 +158,7 @@ Aws::S3::Model::Type setGranteeType(const Aws::String &type) { * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION static void usage() { std::cout << R"( @@ -225,4 +225,4 @@ int main(int argc, char* argv[]) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/put_bucket_policy.cpp b/cpp/example_code/s3/put_bucket_policy.cpp index 678085c7e53..76b36c9b39b 100644 --- a/cpp/example_code/s3/put_bucket_policy.cpp +++ b/cpp/example_code/s3/put_bucket_policy.cpp @@ -109,7 +109,7 @@ Aws::String getPolicyString(const Aws::String &userArn, * b*/ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { @@ -165,4 +165,4 @@ int main(int argc, char* argv[]) return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/put_object.cpp b/cpp/example_code/s3/put_object.cpp index 9c02a7e0faf..74e24650fc1 100644 --- a/cpp/example_code/s3/put_object.cpp +++ b/cpp/example_code/s3/put_object.cpp @@ -79,7 +79,7 @@ bool AwsDoc::S3::putObject(const Aws::String &bucketName, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { @@ -113,4 +113,4 @@ int main(int argc, char* argv[]) return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/put_object_async.cpp b/cpp/example_code/s3/put_object_async.cpp index c0ad6d71d24..b671d459a4c 100644 --- a/cpp/example_code/s3/put_object_async.cpp +++ b/cpp/example_code/s3/put_object_async.cpp @@ -118,7 +118,7 @@ bool AwsDoc::S3::putObjectAsync(const Aws::S3::S3Client &s3Client, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION // snippet-start:[s3.cpp.put_object_async.invoke.code] int main(int argc, char* argv[]) @@ -177,4 +177,4 @@ int main(int argc, char* argv[]) // snippet-end:[s3.cpp.put_object_async.invoke.code] -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/put_object_buffer.cpp b/cpp/example_code/s3/put_object_buffer.cpp index 47e5f50d1de..66bfd75a947 100644 --- a/cpp/example_code/s3/put_object_buffer.cpp +++ b/cpp/example_code/s3/put_object_buffer.cpp @@ -70,7 +70,7 @@ bool AwsDoc::S3::putObjectBuffer(const Aws::String &bucketName, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { @@ -105,4 +105,4 @@ int main(int argc, char* argv[]) return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/put_website_config.cpp b/cpp/example_code/s3/put_website_config.cpp index 4baaef58f6b..54cd57d14d7 100644 --- a/cpp/example_code/s3/put_website_config.cpp +++ b/cpp/example_code/s3/put_website_config.cpp @@ -76,7 +76,7 @@ bool AwsDoc::S3::putWebsiteConfig(const Aws::String &bucketName, * */ -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, char* argv[]) { @@ -112,4 +112,4 @@ int main(int argc, char* argv[]) return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/s3_demo_for_cloud9.cpp b/cpp/example_code/s3/s3_demo_for_cloud9.cpp index d8805751c38..c4e141c6fa5 100644 --- a/cpp/example_code/s3/s3_demo_for_cloud9.cpp +++ b/cpp/example_code/s3/s3_demo_for_cloud9.cpp @@ -113,7 +113,7 @@ bool DeleteTheBucket(const Aws::S3::S3Client &s3Client, return outcome.IsSuccess(); } -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION // Create an S3 bucket and then delete it. // Before and after creating the bucket, and again after deleting the bucket, // try to determine whether that bucket still exists. @@ -161,5 +161,5 @@ int main(int argc, char *argv[]) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION // snippet-end:[s3.cpp.bucket_operations.list_create_delete] diff --git a/cpp/example_code/s3/s3_examples.h b/cpp/example_code/s3/s3_examples.h index 5b3880ecfe9..98cf60a37f9 100644 --- a/cpp/example_code/s3/s3_examples.h +++ b/cpp/example_code/s3/s3_examples.h @@ -58,6 +58,7 @@ namespace AwsDoc { const Aws::S3::S3ClientConfiguration &clientConfig); bool listObjects(const Aws::String &bucketName, + Aws::Vector &keysResult, const Aws::S3::S3ClientConfiguration &clientConfig); bool listObjectsWithAwsGlobalRegion( @@ -128,5 +129,8 @@ namespace AwsDoc { bool getObjectWithPresignedObjectUrl(const Aws::String &presignedURL, Aws::String &resultString); + + bool s3ObjectIntegrityWorkflow( + const Aws::S3::S3ClientConfiguration &clientConfiguration); } // namespace S3 } // namespace AwsDoc diff --git a/cpp/example_code/s3/s3_getting_started_scenario.cpp b/cpp/example_code/s3/s3_getting_started_scenario.cpp index e50e46c6652..2e670c59b35 100644 --- a/cpp/example_code/s3/s3_getting_started_scenario.cpp +++ b/cpp/example_code/s3/s3_getting_started_scenario.cpp @@ -288,7 +288,7 @@ AwsDoc::S3::deleteBucket(const Aws::String &bucketName, Aws::S3::S3Client &clien } // snippet-end:[cpp.example_code.s3.Scenario_GettingStarted] -#ifndef TESTING_BUILD +#ifndef EXCLUDE_MAIN_FUNCTION int main(int argc, const char *argv[]) { @@ -319,6 +319,6 @@ int main(int argc, const char *argv[]) { return 0; } -#endif // TESTING_BUILD +#endif // EXCLUDE_MAIN_FUNCTION diff --git a/cpp/example_code/s3/s3_object_integrity_workflow/CMakeLists.txt b/cpp/example_code/s3/s3_object_integrity_workflow/CMakeLists.txt new file mode 100644 index 00000000000..4e63e72e46b --- /dev/null +++ b/cpp/example_code/s3/s3_object_integrity_workflow/CMakeLists.txt @@ -0,0 +1,66 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Set the minimum required version of CMake for this project. +cmake_minimum_required(VERSION 3.13) + +set(SERVICE_COMPONENTS s3 transfer) + +# Set this project's name. +project("s3_object_integrity_workflow") + +# Build shared libraries by default. +set(BUILD_SHARED_LIBS ON) + +# Set the C++ standard to use to build this target. +set(CMAKE_CXX_STANDARD 17) + +# Use the MSVC variable to determine if this is a Windows build. +set(WINDOWS_BUILD ${MSVC}) + +# Set the location of where Windows can find the installed libraries of the SDK. +if (WINDOWS_BUILD) + string(REPLACE ";" "/aws-cpp-sdk-all;" SYSTEM_MODULE_PATH "${CMAKE_SYSTEM_PREFIX_PATH}/aws-cpp-sdk-all") + list(APPEND CMAKE_PREFIX_PATH ${SYSTEM_MODULE_PATH}) +endif () + +# Find the AWS SDK for C++ package. +find_package(AWSSDK REQUIRED COMPONENTS ${SERVICE_COMPONENTS}) + +if (WINDOWS_BUILD) + # Copy relevant AWS SDK for C++ libraries into the current binary directory for running and debugging. + + # set(BIN_SUB_DIR "/Debug") # If you are building from the command line, you may need to uncomment this + # and set the proper subdirectory to the executable's location. + + AWSSDK_CPY_DYN_LIBS(SERVICE_COMPONENTS "" ${CMAKE_CURRENT_BINARY_DIR} ${BIN_SUB_DIR}) +endif () + +set(EXAMPLE_EXE run_${PROJECT_NAME}) + +add_executable(${EXAMPLE_EXE} + s3_object_integrity_workflow.cpp + main.cpp + ../create_bucket.cpp + ../delete_objects.cpp + ../list_objects.cpp + ../delete_bucket.cpp +) + +target_compile_definitions(${EXAMPLE_EXE} + PRIVATE + EXCLUDE_MAIN_FUNCTION + SRC_DIR="${CMAKE_CURRENT_SOURCE_DIR}" + LARGE_FILE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/../../../../resources/sample_files/" +) + +target_include_directories(${EXAMPLE_EXE} + PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/.." +) + +target_link_libraries(${EXAMPLE_EXE} + PRIVATE + ${AWSSDK_LINK_LIBRARIES} + ${AWSSDK_PLATFORM_DEPS} +) diff --git a/cpp/example_code/s3/s3_object_integrity_workflow/README.md b/cpp/example_code/s3/s3_object_integrity_workflow/README.md new file mode 100644 index 00000000000..6dbd15fe66f --- /dev/null +++ b/cpp/example_code/s3/s3_object_integrity_workflow/README.md @@ -0,0 +1,46 @@ +# Amazon S3 Object Integrity Workflow + +## Overview + +- The workflow demonstrates how to use the AWS SDK for C++ to verify the integrity of objects uploaded to Amazon S3. +- It shows how object integrity is verified for different upload methods: PutObject, TransferManager, and multipart upload. +- The workflow demonstrates the use of all 5 hash algorithms supported by S3 for object verification: MD5, CRC32, CRC32C, SHA1, and SHA256. +- This workflow demonstrates the different options provided by the SDK for hashing. +- To demonstrate how the hashes are calculated, the workflow calculates the hashes in the code and compares the results with the hashes calculated automatically by the SDK. + + +The workflow runs as a command-line application that prompts the user for input. + +## Scenario + +### Prerequisites + +To run this workflow, you'll need the following: + +- CMake - A C++ cross-platform build system. +- AWS SDK for C++. + +### Build and Run the Workflow + + + +```shell +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Debug +cmake --build . --config=Debug +./run_medical_image_sets_and_frames_workflow +``` + +## Additional Resources + +- [Checking Object Integrity](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html) +- [Amazon S3 User Guide](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html) +- [AWS SDK for C++ Developer Guide](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/welcome.html) +- [AWS SDK for C++ API Reference](https://sdk.amazonaws.com/cpp/api/LATEST/index.html) + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/cpp/example_code/s3/s3_object_integrity_workflow/main.cpp b/cpp/example_code/s3/s3_object_integrity_workflow/main.cpp new file mode 100644 index 00000000000..8a636351efc --- /dev/null +++ b/cpp/example_code/s3/s3_object_integrity_workflow/main.cpp @@ -0,0 +1,45 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/** + * Before running this C++ code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started.html + * + * For information on the structure of the code examples and how to build and run the examples, see + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started-code-examples.html. + * + **/ + +#include +#include "s3_examples.h" + +/* + * + * main function + * + * Usage: 'run_s3_object_integrity_workflow' + * +*/ + +int main(int argc, char **argv) { + (void) argc; + (void) argv; + Aws::SDKOptions options; + options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Debug; + Aws::InitAPI(options); + { + Aws::S3::S3ClientConfiguration clientConfig; + // Optional: Set to the AWS Region in which the bucket was created (overrides config file). + // clientConfig.region = "us-east-1"; + + AwsDoc::S3::s3ObjectIntegrityWorkflow( + clientConfig); + } + Aws::ShutdownAPI(options); + + return 0; +} + diff --git a/cpp/example_code/s3/s3_object_integrity_workflow/s3_object_integrity_workflow.cpp b/cpp/example_code/s3/s3_object_integrity_workflow/s3_object_integrity_workflow.cpp new file mode 100644 index 00000000000..2f0ff5af39b --- /dev/null +++ b/cpp/example_code/s3/s3_object_integrity_workflow/s3_object_integrity_workflow.cpp @@ -0,0 +1,1718 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +/** + * Before running this C++ code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started.html + * + * For information on the structure of the code examples and how to build and run the examples, see + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started-code-examples.html. + * + **/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "s3_examples.h" + + +#pragma clang diagnostic push +#pragma ide diagnostic ignored "UnreachableCode" +namespace AwsDoc::S3 { + constexpr char TEST_FILE_KEY[] = "test_file.cpp"; + constexpr char TEST_FILE[] = __FILE__; // Use this source file as the test file. + constexpr char MULTI_PART_TEST_FILE[] = "large_test_file.cpp"; // Large file created for multipart upload tests. + constexpr char TEST_BUCKET_PREFIX[] = "integrity-workflow-"; + constexpr size_t MAX_BUCKET_NAME_LENGTH = 63; + const size_t BUFFER_SIZE_IN_MEGABYTES = 5; + const size_t UPLOAD_BUFFER_SIZE = BUFFER_SIZE_IN_MEGABYTES * 1024 * 1024; + + const size_t LARGE_FILE_SIZE = 3 * UPLOAD_BUFFER_SIZE; + + static bool gUseCalculatedChecksum = false; + + typedef int HASH_METHOD; + + static const HASH_METHOD DEFAULT = 1; + static const HASH_METHOD MD5 = DEFAULT + 1; + static const HASH_METHOD CRC32 = MD5 + 1; + static const HASH_METHOD CRC32C = CRC32 + 1; + static const HASH_METHOD SHA1 = CRC32C + 1; + static const HASH_METHOD SHA256 = SHA1 + 1; + + //! A class that provides functionality for calculating hash values of data. + /*! + The `Hasher` class is responsible for calculating hash values of data using various hashing algorithms, such as MD5, CRC32, CRC32C, SHA1, and SHA256. + It provides methods to calculate the hash value of data stored in a `std::vector` or an `Aws::IOStream`, and to retrieve the + hash value in different formats (base64, hex, and byte buffer). + + The class maintains an internal `Aws::Utils::ByteBuffer` to store the calculated hash value. The `calculateObjectHash` methods update + this internal buffer with the calculated hash value. + + The supported hashing algorithms are defined as static constants within the class: + - `MD5`: The default hashing algorithm. + - `CRC32`: The CRC32 hashing algorithm. + - `CRC32C`: The CRC32C hashing algorithm. + - `SHA1`: The SHA1 hashing algorithm. + - `SHA256`: The SHA256 hashing algorithm. + */ + class Hasher { + Aws::Utils::ByteBuffer m_Hash; + + public: + Hasher() = default; + + //! Calculate the object hash for vector input. + /*! + \param data: A vector of unsigned bytes. + \param hashMethod: The hash method to use. + \return bool: Function succeeded. + */ + bool calculateObjectHash(std::vector &data, + HASH_METHOD hashMethod); + + //! Calculate the object hash for stream input. + /*! + \param data: An IOStream for input. + \param hashMethod: The hash method to use. + \return bool: Function succeeded. + */ + bool calculateObjectHash(Aws::IOStream &data, + HASH_METHOD hashMethod); + + //! Retrieve the stored hash as a Base64 string. + /*! + \return String: Hash as Base64 string. + */ + [[nodiscard]] Aws::String getBase64HashString() const; + + //! Retrieve the stored hash as a hexadecimal string. + /*! + \return String: Hash as hexadecimal string. + */ + [[nodiscard]] Aws::String getHexHashString() const; + + //! Retrieve the stored hash as a ByteBuffer. + /*! + \return String: Hash as ByteBuffer. + */ + [[nodiscard]] Aws::Utils::ByteBuffer getByteBufferHash() const; + }; + + //! Routine which uploads an object to an S3 bucket with different object integrity hashing methods. + /*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param hashData: The hash value that will be associated with the uploaded object. + \param hashMethod: The hashing algorithm to use when calculating the hash value. + \param body: The data content of the object being uploaded. + \param useDefaultHashMethod: A flag indicating whether to use the default hash method or the one specified in the hashMethod parameter. + \param client: The S3 client instance used to perform the upload operation. + \return bool: Function succeeded. + */ + bool putObjectWithHash(const Aws::String &bucket, const Aws::String &key, + const Aws::String &hashData, + AwsDoc::S3::HASH_METHOD hashMethod, + const std::shared_ptr &body, + bool useDefaultHashMethod, + const Aws::S3::S3Client &client); + + //! Routine which retrieves the hash value of an object stored in an S3 bucket. + /*! + \param bucket: The name of the S3 bucket where the object is stored. + \param key: The unique identifier (key) of the object within the S3 bucket. + \param hashMethod: The hashing algorithm used to calculate the hash value of the object. + \param client: The S3 client instance used to retrieve the object. + \param[out] hashValue: The retrieved hash value of the object. + \return bool: Function succeeded. + */ + bool retrieveObjectHash(const Aws::String &bucket, const Aws::String &key, + AwsDoc::S3::HASH_METHOD hashMethod, + Aws::String &hashData, + std::vector *partHashes, + const Aws::S3::S3Client &client); + + //! Verifies the hashing results between the retrieved and local hashes. + /*! + \param retrievedHash The hash value retrieved from the remote source. + \param localHash The hash value calculated locally. + \param uploadtype The type of upload (e.g., "multipart", "single-part"). + \param hashMethod The hashing method used (e.g., MD5, SHA-256). + \param retrievedPartHashes (Optional) The list of hashes for the individual parts retrieved from the remote source. + \param localPartHashes (Optional) The list of hashes for the individual parts calculated locally. + */ + void verifyHashingResults(const Aws::String &retrievedHash, const Hasher &localHash, + const Aws::String &uploadtype, HASH_METHOD hashMethod, + const std::vector &retrievedPartHashes = std::vector(), + const std::vector &localPartHashes = std::vector()); + + //! Routine which uploads an object to an S3 bucket using the AWS C++ SDK's Transfer Manager. + /*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param hashMethod: The hashing algorithm to use when calculating the hash value. + \param useDefaultHashMethod: A flag indicating whether to use the default hash method or the one specified in the hashMethod parameter. + \param client: The S3 client instance used to perform the upload operation. + \return bool: Function succeeded. + */ + bool doTransferManagerUpload(const Aws::String &bucket, const Aws::String &key, + AwsDoc::S3::HASH_METHOD hashMethod, + bool useDefaultHashMethod, + const std::shared_ptr &client); + + //! Routine which calculates the hash values for each part of a file being uploaded to an S3 bucket. + /*! + \param hashMethod: The hashing algorithm to use when calculating the hash values. + \param fileName: The path to the file for which the part hashes will be calculated. + \param bufferSize: The size of the buffer to use when reading the file. + \param[out] hashDataResult: The Hasher object that will store the concatenated hash value. + \param[out] partHashes: The vector that will store the calculated hash values for each part of the file. + \return bool: Function succeeded. + */ + bool calculatePartHashesForFile(AwsDoc::S3::HASH_METHOD hashMethod, + const Aws::String &fileName, + size_t bufferSize, + AwsDoc::S3::Hasher &hashDataResult, + std::vector &partHashes); + + //! Create a multipart upload. + /*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param client: The S3 client instance used to perform the upload operation. + \return Aws::String: Upload ID or empty string if failed. + */ + Aws::String + createMultipartUpload(const Aws::String &bucket, const Aws::String &key, + Aws::S3::Model::ChecksumAlgorithm checksumAlgorithm, + const Aws::S3::S3Client &client); + + //! Upload a part to an S3 bucket. + /*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param uploadID: An upload ID string. + \param partNumber: + \param checksumAlgorithm: Checksum algorithm, ignored when NOT_SET. + \param calculatedHash: A data integrity hash to set, depending on the checksum algorithm, + ignored when it is an empty string. + \param body: An shared_ptr IOStream of the data to be uploaded. + \param client: The S3 client instance used to perform the upload operation. + \return UploadPartOutcome: The outcome. + */ + Aws::S3::Model::UploadPartOutcome uploadPart(const Aws::String &bucket, + const Aws::String &key, + const Aws::String &uploadID, + int partNumber, + Aws::S3::Model::ChecksumAlgorithm checksumAlgorithm, + const Aws::String &calculatedHash, + const std::shared_ptr &body, + const Aws::S3::S3Client &client); + + //! Abort a multipart upload to an S3 bucket. + /*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param uploadID: An upload ID string. + \param client: The S3 client instance used to perform the upload operation. + \return bool: Function succeeded. + */ + + bool abortMultipartUpload(const Aws::String &bucket, + const Aws::String &key, + const Aws::String &uploadID, + const Aws::S3::S3Client &client); + + //! Complete a multipart upload to an S3 bucket. + /*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param uploadID: An upload ID string. + \param parts: A vector of CompleteParts. + \param client: The S3 client instance used to perform the upload operation. + \return CompleteMultipartUploadOutcome: The request outcome. + */ + Aws::S3::Model::CompleteMultipartUploadOutcome completeMultipartUpload(const Aws::String &bucket, + const Aws::String &key, + const Aws::String &uploadID, + const Aws::Vector &parts, + const Aws::S3::S3Client &client); + + //! Routine which performs a multi-part upload. + /*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param hashMethod: The hashing algorithm to use when calculating the hash value. + \param ioStream: An IOStream for the data to be uploaded. + \param useDefaultHashMethod: A flag indicating whether to use the default hash method or the one specified in the hashMethod parameter. + \param[out] hashDataResult: The Hasher object that will store the concatenated hash value. + \param[out] partHashes: The vector that will store the calculated hash values for each part of the file. + \param client: The S3 client instance used to perform the upload operation. + \return bool: Function succeeded. + */ + bool doMultipartUpload(const Aws::String &bucket, + const Aws::String &key, + AwsDoc::S3::HASH_METHOD hashMethod, + const std::shared_ptr &ioStream, + bool useDefaultHashMethod, + AwsDoc::S3::Hasher &hashDataResult, + std::vector &partHashes, + const Aws::S3::S3Client &client); + + //! Routine which retrieves the string for a HASH_METHOD constant. + /*! + \param: hashMethod: A HASH_METHOD constant. + \return: String: A string description of the hash method. + */ + Aws::String stringForHashMethod(AwsDoc::S3::HASH_METHOD hashMethod); + + //! Routine that returns the ChecksumAlgorithm for a HASH_METHOD constant. + /*! + \param: hashMethod: A HASH_METHOD constant. + \return: ChecksumAlgorithm: The ChecksumAlgorithm enum. + */ + Aws::S3::Model::ChecksumAlgorithm + getChecksumAlgorithmForHashMethod(AwsDoc::S3::HASH_METHOD hashMethod); + + //! Routine which cleans up after the example is complete. + /*! + \param bucket: The name of the S3 bucket where the object was uploaded. + \param clientConfiguration: The client configuration for the S3 client. + \return bool: Function succeeded. + */ + bool cleanUp(const Aws::String &bucket, + const Aws::S3::S3ClientConfiguration &clientConfiguration); + + //! Console interaction introducing the workflow. + /*! + \param bucketName: The name of the S3 bucket to use. + */ + void introductoryExplanations(const Aws::String &bucketName); + + //! Console interaction which explains the PutObject results. + /*! + */ + void explainPutObjectResults(); + + //! Console interaction explaining transfer manager uploads. + /*! + \param objectKey: The key for the object being uploaded. + */ + void introductoryTransferManagerUploadExplanations(const Aws::String &objectKey); + + //! Console interaction explaining multi-part uploads. + /*! + \param objectKey: The key for the object being uploaded. + \param chosenHashMethod: The hash method selected by the user. + */ + void multiPartUploadExplanations(const Aws::String &objectKey, + HASH_METHOD chosenHashMethod); + + //! Create a large file for doing multi-part uploads. + /*! + */ + bool createLargeFileIfNotExists(); + + //! Test routine passed as argument to askQuestion routine. + /*! + \param string: A string to test. + \return bool: True if empty. + */ + static bool testForEmptyString(const Aws::String &string); + + //! Command line prompt/response utility function. + /*! + \param string: A question prompt. + \param test: Test function for response. + \return Aws::String: User's response. + */ + static Aws::String askQuestion(const Aws::String &string, + const std::function &test = testForEmptyString); + + //! Command line prompt/response for yes/no question. + /*! + \param string: A question prompt expecting a 'y' or 'n' response. + \return bool: True if yes. + */ + static bool askYesNoQuestion(const Aws::String &string); + + //! Command line prompt/response utility function for an int result confined to + //! a range. + /*! + \param string: A question prompt. + \param low: Low inclusive. + \param high: High inclusive. + \return int: User's response. + */ + static int askQuestionForIntRange(const Aws::String &string, int low, + int high); + + //! Utility routine to print a line of asterisks to standard out. + /*! + \return void: + */ + static void printAsterisksLine() { + std::cout << "\n" << std::setfill('*') << std::setw(88) << "\n" + << std::endl; + } + + //! Test routine passed as argument to askQuestion routine. + /*! + \return bool: Always true. + */ + static bool alwaysTrueTest(const Aws::String &) { return true; } + + void pressEnterToContinue() { + askQuestion("Press Enter to continue...", alwaysTrueTest); + } // namespace S3 +} // namespace AwsDoc + +// snippet-start:[cpp.example_code.s3.Scenario_ObjectIntegrity] +//! Routine which runs the S3 object integrity workflow. +/*! + \param clientConfig: Aws client configuration. + \return bool: Function succeeded. +*/ +bool AwsDoc::S3::s3ObjectIntegrityWorkflow( + const Aws::S3::S3ClientConfiguration &clientConfiguration) { + + /* + * Create a large file to be used for multipart uploads. + */ + if (!createLargeFileIfNotExists()) { + std::cerr << "Workflow exiting because large file creation failed." << std::endl; + return false; + } + + Aws::String bucketName = TEST_BUCKET_PREFIX; + bucketName += Aws::Utils::UUID::RandomUUID(); + bucketName = Aws::Utils::StringUtils::ToLower(bucketName.c_str()); + + bucketName.resize(std::min(bucketName.size(), MAX_BUCKET_NAME_LENGTH)); + + introductoryExplanations(bucketName); + + if (!AwsDoc::S3::createBucket(bucketName, clientConfiguration)) { + std::cerr << "Workflow exiting because bucket creation failed." << std::endl; + return false; + } + + Aws::S3::S3ClientConfiguration s3ClientConfiguration(clientConfiguration); + std::shared_ptr client = Aws::MakeShared("S3Client", s3ClientConfiguration); + + printAsterisksLine(); + std::cout << "Choose from one of the following checksum algorithms." + << std::endl; + + for (HASH_METHOD hashMethod = DEFAULT; hashMethod <= SHA256; ++hashMethod) { + std::cout << " " << hashMethod << " - " << stringForHashMethod(hashMethod) + << std::endl; + } + + HASH_METHOD chosenHashMethod = askQuestionForIntRange("Enter an index: ", DEFAULT, + SHA256); + + + gUseCalculatedChecksum = !askYesNoQuestion( + "Let the SDK calculate the checksum for you? (y/n) "); + + printAsterisksLine(); + + std::cout << "The workflow will now upload a file using PutObject." + << std::endl; + std::cout << "Object integrity will be verified using the " + << stringForHashMethod(chosenHashMethod) << " algorithm." + << std::endl; + if (gUseCalculatedChecksum) { + std::cout + << "A checksum computed by this workflow will be used for object integrity verification," + << std::endl; + std::cout << "except for the TransferManager upload." << std::endl; + } else { + std::cout + << "A checksum computed by the SDK will be used for object integrity verification." + << std::endl; + } + + pressEnterToContinue(); + printAsterisksLine(); + + std::shared_ptr inputData = + Aws::MakeShared("SampleAllocationTag", + TEST_FILE, + std::ios_base::in | + std::ios_base::binary); + + if (!*inputData) { + std::cerr << "Error unable to read file " << TEST_FILE << std::endl; + cleanUp(bucketName, clientConfiguration); + return false; + } + + Hasher hasher; + HASH_METHOD putObjectHashMethod = chosenHashMethod; + if (putObjectHashMethod == DEFAULT) { + putObjectHashMethod = MD5; // MD5 is the default hash method for PutObject. + + std::cout << "The default checksum algorithm for PutObject is " + << stringForHashMethod(putObjectHashMethod) + << std::endl; + } + + // Demonstrate in code how the hash is computed. + if (!hasher.calculateObjectHash(*inputData, putObjectHashMethod)) { + std::cerr << "Error calculating hash for file " << TEST_FILE << std::endl; + cleanUp(bucketName, clientConfiguration); + return false; + } + Aws::String key = stringForHashMethod(putObjectHashMethod); + key += "_"; + key += TEST_FILE_KEY; + Aws::String localHash = hasher.getBase64HashString(); + + // Upload the object with PutObject + if (!putObjectWithHash(bucketName, key, localHash, putObjectHashMethod, + inputData, chosenHashMethod == DEFAULT, + *client)) { + std::cerr << "Error putting file " << TEST_FILE << " to bucket " + << bucketName << " with key " << key << std::endl; + cleanUp(bucketName, clientConfiguration); + return false; + } + + Aws::String retrievedHash; + if (!retrieveObjectHash(bucketName, key, + putObjectHashMethod, retrievedHash, + nullptr, *client)) { + std::cerr << "Error getting file " << TEST_FILE << " from bucket " + << bucketName << " with key " << key << std::endl; + cleanUp(bucketName, clientConfiguration); + return false; + } + + explainPutObjectResults(); + verifyHashingResults(retrievedHash, hasher, + "PutObject upload", putObjectHashMethod); + + + printAsterisksLine(); + pressEnterToContinue(); + + key = "tr_"; + key += stringForHashMethod(chosenHashMethod) + "_" + MULTI_PART_TEST_FILE; + + introductoryTransferManagerUploadExplanations(key); + + HASH_METHOD transferManagerHashMethod = chosenHashMethod; + if (transferManagerHashMethod == DEFAULT) { + transferManagerHashMethod = CRC32; // The default hash method for the TransferManager is CRC32. + + std::cout << "The default checksum algorithm for TransferManager is " + << stringForHashMethod(transferManagerHashMethod) + << std::endl; + } + + // Upload the large file using the transfer manager. + if (!doTransferManagerUpload(bucketName, key, transferManagerHashMethod, chosenHashMethod == DEFAULT, + client)) { + std::cerr << "Exiting because of an error in doTransferManagerUpload." << std::endl; + cleanUp(bucketName, clientConfiguration); + return false; + } + + std::vector retrievedTransferManagerPartHashes; + Aws::String retrievedTransferManagerFinalHash; + + // Retrieve all the hashes for the TransferManager upload. + if (!retrieveObjectHash(bucketName, key, + transferManagerHashMethod, + retrievedTransferManagerFinalHash, + &retrievedTransferManagerPartHashes, *client)) { + std::cerr << "Exiting because of an error in retrieveObjectHash for TransferManager." << std::endl; + cleanUp(bucketName, clientConfiguration); + return false; + } + + AwsDoc::S3::Hasher locallyCalculatedFinalHash; + std::vector locallyCalculatedPartHashes; + + // Calculate the hashes locally to demonstrate how TransferManager hashes are computed. + if (!calculatePartHashesForFile(transferManagerHashMethod, MULTI_PART_TEST_FILE, + UPLOAD_BUFFER_SIZE, + locallyCalculatedFinalHash, + locallyCalculatedPartHashes)) { + std::cerr << "Exiting because of an error in calculatePartHashesForFile." << std::endl; + cleanUp(bucketName, clientConfiguration); + return false; + } + + verifyHashingResults(retrievedTransferManagerFinalHash, + locallyCalculatedFinalHash, "TransferManager upload", + transferManagerHashMethod, + retrievedTransferManagerPartHashes, + locallyCalculatedPartHashes); + + printAsterisksLine(); + + key = "mp_"; + key += stringForHashMethod(chosenHashMethod) + "_" + MULTI_PART_TEST_FILE; + + multiPartUploadExplanations(key, chosenHashMethod); + + pressEnterToContinue(); + + std::shared_ptr largeFileInputData = + Aws::MakeShared("SampleAllocationTag", + MULTI_PART_TEST_FILE, + std::ios_base::in | + std::ios_base::binary); + + if (!largeFileInputData->good()) { + std::cerr << "Error unable to read file " << TEST_FILE << std::endl; + cleanUp(bucketName, clientConfiguration); + return false; + } + + HASH_METHOD multipartUploadHashMethod = chosenHashMethod; + if (multipartUploadHashMethod == DEFAULT) { + multipartUploadHashMethod = MD5; // The default hash method for multipart uploads is MD5. + + std::cout << "The default checksum algorithm for multipart upload is " + << stringForHashMethod(putObjectHashMethod) + << std::endl; + } + + AwsDoc::S3::Hasher hashData; + std::vector partHashes; + + if (!doMultipartUpload(bucketName, key, + multipartUploadHashMethod, + largeFileInputData, chosenHashMethod == DEFAULT, + hashData, + partHashes, + *client)) { + std::cerr << "Exiting because of an error in doMultipartUpload." << std::endl; + cleanUp(bucketName, clientConfiguration); + return false; + } + + std::cout << "Finished multipart upload of with hash method " << + stringForHashMethod(multipartUploadHashMethod) << std::endl; + + std::cout << "Now we will retrieve the checksums from the server." << std::endl; + + retrievedHash.clear(); + std::vector retrievedPartHashes; + if (!retrieveObjectHash(bucketName, key, + multipartUploadHashMethod, + retrievedHash, &retrievedPartHashes, *client)) { + std::cerr << "Exiting because of an error in retrieveObjectHash for multipart." << std::endl; + cleanUp(bucketName, clientConfiguration); + return false; + } + + verifyHashingResults(retrievedHash, hashData, "MultiPart upload", + multipartUploadHashMethod, + retrievedPartHashes, partHashes); + + printAsterisksLine(); + + if (askYesNoQuestion("Would you like to delete the resources created in this workflow? (y/n)")) { + return cleanUp(bucketName, clientConfiguration); + } else { + std::cout << "The bucket " << bucketName << " was not deleted." << std::endl; + return true; + } +} + +//! Routine which uploads an object to an S3 bucket with different object integrity hashing methods. +/*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param hashData: The hash value that will be associated with the uploaded object. + \param hashMethod: The hashing algorithm to use when calculating the hash value. + \param body: The data content of the object being uploaded. + \param useDefaultHashMethod: A flag indicating whether to use the default hash method or the one specified in the hashMethod parameter. + \param client: The S3 client instance used to perform the upload operation. + \return bool: Function succeeded. +*/ +bool AwsDoc::S3::putObjectWithHash(const Aws::String &bucket, const Aws::String &key, + const Aws::String &hashData, + AwsDoc::S3::HASH_METHOD hashMethod, + const std::shared_ptr &body, + bool useDefaultHashMethod, + const Aws::S3::S3Client &client) { + Aws::S3::Model::PutObjectRequest request; + request.SetBucket(bucket); + request.SetKey(key); + if (!useDefaultHashMethod) { + if (hashMethod != MD5) { + request.SetChecksumAlgorithm(getChecksumAlgorithmForHashMethod(hashMethod)); + } + } + + if (gUseCalculatedChecksum) { + switch (hashMethod) { + case AwsDoc::S3::MD5: + request.SetContentMD5(hashData); + break; + case AwsDoc::S3::SHA1: + request.SetChecksumSHA1(hashData); + break; + case AwsDoc::S3::SHA256: + request.SetChecksumSHA256(hashData); + break; + case AwsDoc::S3::CRC32: + request.SetChecksumCRC32(hashData); + break; + case AwsDoc::S3::CRC32C: + request.SetChecksumCRC32C(hashData); + break; + default: + std::cerr << "Unknown hash method." << std::endl; + return false; + } + } + request.SetBody(body); + Aws::S3::Model::PutObjectOutcome outcome = client.PutObject(request); + body->seekg(0, body->beg); + if (outcome.IsSuccess()) { + std::cout << "Object successfully uploaded." << std::endl; + } else { + std::cerr << "Error uploading object." << + outcome.GetError().GetMessage() << std::endl; + } + return outcome.IsSuccess(); +} + + +// snippet-start:[cpp.example_code.s3.GetObjectAttributes] +// ! Routine which retrieves the hash value of an object stored in an S3 bucket. +/*! + \param bucket: The name of the S3 bucket where the object is stored. + \param key: The unique identifier (key) of the object within the S3 bucket. + \param hashMethod: The hashing algorithm used to calculate the hash value of the object. + \param[out] hashData: The retrieved hash. + \param[out] partHashes: The part hashes if available. + \param client: The S3 client instance used to retrieve the object. + \return bool: Function succeeded. +*/ +bool AwsDoc::S3::retrieveObjectHash(const Aws::String &bucket, const Aws::String &key, + AwsDoc::S3::HASH_METHOD hashMethod, + Aws::String &hashData, + std::vector *partHashes, + const Aws::S3::S3Client &client) { + Aws::S3::Model::GetObjectAttributesRequest request; + request.SetBucket(bucket); + request.SetKey(key); + + if (hashMethod == MD5) { + Aws::Vector attributes; + attributes.push_back(Aws::S3::Model::ObjectAttributes::ETag); + request.SetObjectAttributes(attributes); + + Aws::S3::Model::GetObjectAttributesOutcome outcome = client.GetObjectAttributes( + request); + if (outcome.IsSuccess()) { + const Aws::S3::Model::GetObjectAttributesResult &result = outcome.GetResult(); + hashData = result.GetETag(); + } else { + std::cerr << "Error retrieving object etag attributes." << + outcome.GetError().GetMessage() << std::endl; + return false; + } + } else { // hashMethod != MD5 + Aws::Vector attributes; + attributes.push_back(Aws::S3::Model::ObjectAttributes::Checksum); + request.SetObjectAttributes(attributes); + + Aws::S3::Model::GetObjectAttributesOutcome outcome = client.GetObjectAttributes( + request); + if (outcome.IsSuccess()) { + const Aws::S3::Model::GetObjectAttributesResult &result = outcome.GetResult(); + switch (hashMethod) { + case AwsDoc::S3::DEFAULT: // NOLINT(*-branch-clone) + break; // Default is not supported. +#pragma clang diagnostic push +#pragma ide diagnostic ignored "UnreachableCode" + case AwsDoc::S3::MD5: + break; // MD5 is not supported. +#pragma clang diagnostic pop + case AwsDoc::S3::SHA1: + hashData = result.GetChecksum().GetChecksumSHA1(); + break; + case AwsDoc::S3::SHA256: + hashData = result.GetChecksum().GetChecksumSHA256(); + break; + case AwsDoc::S3::CRC32: + hashData = result.GetChecksum().GetChecksumCRC32(); + break; + case AwsDoc::S3::CRC32C: + hashData = result.GetChecksum().GetChecksumCRC32C(); + break; + default: + std::cerr << "Unknown hash method." << std::endl; + return false; + } + } else { + std::cerr << "Error retrieving object checksum attributes." << + outcome.GetError().GetMessage() << std::endl; + return false; + } + + if (nullptr != partHashes) { + attributes.clear(); + attributes.push_back(Aws::S3::Model::ObjectAttributes::ObjectParts); + request.SetObjectAttributes(attributes); + outcome = client.GetObjectAttributes(request); + if (outcome.IsSuccess()) { + const Aws::S3::Model::GetObjectAttributesResult &result = outcome.GetResult(); + const Aws::Vector parts = result.GetObjectParts().GetParts(); + for (const Aws::S3::Model::ObjectPart &part: parts) { + switch (hashMethod) { + case AwsDoc::S3::DEFAULT: // Default is not supported. NOLINT(*-branch-clone) + break; + case AwsDoc::S3::MD5: // MD5 is not supported. + break; + case AwsDoc::S3::SHA1: + partHashes->push_back(part.GetChecksumSHA1()); + break; + case AwsDoc::S3::SHA256: + partHashes->push_back(part.GetChecksumSHA256()); + break; + case AwsDoc::S3::CRC32: + partHashes->push_back(part.GetChecksumCRC32()); + break; + case AwsDoc::S3::CRC32C: + partHashes->push_back(part.GetChecksumCRC32C()); + break; + default: + std::cerr << "Unknown hash method." << std::endl; + return false; + } + } + } else { + std::cerr << "Error retrieving object attributes for object parts." << + outcome.GetError().GetMessage() << std::endl; + return false; + } + } + } + + return true; +} +// snippet-end:[cpp.example_code.s3.GetObjectAttributes] + +//! Verifies the hashing results between the retrieved and local hashes. +/*! + \param retrievedHash The hash value retrieved from the remote source. + \param localHash The hash value calculated locally. + \param uploadtype The type of upload (e.g., "multipart", "single-part"). + \param hashMethod The hashing method used (e.g., MD5, SHA-256). + \param retrievedPartHashes (Optional) The list of hashes for the individual parts retrieved from the remote source. + \param localPartHashes (Optional) The list of hashes for the individual parts calculated locally. + */ +void AwsDoc::S3::verifyHashingResults(const Aws::String &retrievedHash, + const Hasher &localHash, + const Aws::String &uploadtype, + HASH_METHOD hashMethod, + const std::vector &retrievedPartHashes, + const std::vector &localPartHashes) { + std::cout << "For " << uploadtype << " retrieved hash is " << retrievedHash << std::endl; + if (!retrievedPartHashes.empty()) { + std::cout << retrievedPartHashes.size() << " part hash(es) were also retrieved." + << std::endl; + for (auto &retrievedPartHash: retrievedPartHashes) { + std::cout << " Part hash " << retrievedPartHash << std::endl; + } + } + Aws::String hashString; + if (hashMethod == MD5) { + hashString = localHash.getHexHashString(); + if (!localPartHashes.empty()) { + hashString += "-" + std::to_string(localPartHashes.size()); + } + } else { + hashString = localHash.getBase64HashString(); + } + + bool allMatch = true; + if (hashString != retrievedHash) { + std::cerr << "For " << uploadtype << ", the main hashes do not match" << std::endl; + std::cerr << "Local hash- '" << hashString << "'" << std::endl; + std::cerr << "Remote hash - '" << retrievedHash << "'" << std::endl; + allMatch = false; + } + + if (hashMethod != MD5) { + if (localPartHashes.size() != retrievedPartHashes.size()) { + std::cerr << "For " << uploadtype << ", the number of part hashes do not match" << std::endl; + std::cerr << "Local number of hashes- '" << localPartHashes.size() << "'" + << std::endl; + std::cerr << "Remote number of hashes - '" + << retrievedPartHashes.size() + << "'" << std::endl; + } + + for (int i = 0; i < localPartHashes.size(); ++i) { + if (localPartHashes[i] != retrievedPartHashes[i]) { + std::cerr << "For " << uploadtype << ", the part hashes do not match for part " << i + 1 + << "." << std::endl; + std::cerr << "Local hash- '" << localPartHashes[i] << "'" + << std::endl; + std::cerr << "Remote hash - '" << retrievedPartHashes[i] << "'" + << std::endl; + allMatch = false; + } + } + } + + if (allMatch) { + std::cout << "For " << uploadtype << ", locally and remotely calculated hashes all match!" << std::endl; + } + +} + +static void transferManagerErrorCallback(const Aws::Transfer::TransferManager *, + const std::shared_ptr &, + const Aws::Client::AWSError &err) { + std::cerr << "Error during transfer: '" << err.GetMessage() << "'" << std::endl; +} + +static void transferManagerStatusCallback(const Aws::Transfer::TransferManager *, + const std::shared_ptr &handle) { + if (handle->GetStatus() == Aws::Transfer::TransferStatus::IN_PROGRESS) { + std::cout << "Bytes transferred: " << handle->GetBytesTransferred() << std::endl; + } +} + +//! Routine which uploads an object to an S3 bucket using the AWS C++ SDK's Transfer Manager. +/*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param hashMethod: The hashing algorithm to use when calculating the hash value. + \param useDefaultHashMethod: A flag indicating whether to use the default hash method or the one specified in the hashMethod parameter. + \param client: The S3 client instance used to perform the upload operation. + \return bool: Function succeeded. +*/ +bool +AwsDoc::S3::doTransferManagerUpload(const Aws::String &bucket, const Aws::String &key, + AwsDoc::S3::HASH_METHOD hashMethod, + bool useDefaultHashMethod, + const std::shared_ptr &client) { + std::shared_ptr executor = Aws::MakeShared( + "executor", 25); + Aws::Transfer::TransferManagerConfiguration transfer_config(executor.get()); + transfer_config.s3Client = client; + transfer_config.bufferSize = UPLOAD_BUFFER_SIZE; + if (!useDefaultHashMethod) { + if (hashMethod == MD5) { + transfer_config.computeContentMD5 = true; + } else { + transfer_config.checksumAlgorithm = getChecksumAlgorithmForHashMethod( + hashMethod); + } + } + transfer_config.errorCallback = transferManagerErrorCallback; + transfer_config.transferStatusUpdatedCallback = transferManagerStatusCallback; + + std::shared_ptr transfer_manager = Aws::Transfer::TransferManager::Create( + transfer_config); + + std::cout << "Uploading the file..." << std::endl; + std::shared_ptr uploadHandle = transfer_manager->UploadFile(MULTI_PART_TEST_FILE, + bucket, key, + "text/plain", + Aws::Map()); + uploadHandle->WaitUntilFinished(); + bool success = + uploadHandle->GetStatus() == Aws::Transfer::TransferStatus::COMPLETED; + if (!success) { + Aws::Client::AWSError err = uploadHandle->GetLastError(); + std::cerr << "File upload failed: " << err.GetMessage() << std::endl; + } + + return success; +} + +//! Routine which calculates the hash values for each part of a file being uploaded to an S3 bucket. +/*! + \param hashMethod: The hashing algorithm to use when calculating the hash values. + \param fileName: The path to the file for which the part hashes will be calculated. + \param bufferSize: The size of the buffer to use when reading the file. + \param[out] hashDataResult: The Hasher object that will store the concatenated hash value. + \param[out] partHashes: The vector that will store the calculated hash values for each part of the file. + \return bool: Function succeeded. +*/ +bool AwsDoc::S3::calculatePartHashesForFile(AwsDoc::S3::HASH_METHOD hashMethod, + const Aws::String &fileName, + size_t bufferSize, + AwsDoc::S3::Hasher &hashDataResult, + std::vector &partHashes) { + std::ifstream fileStream(fileName.c_str(), std::ifstream::binary); + fileStream.seekg(0, std::ifstream::end); + size_t objectSize = fileStream.tellg(); + fileStream.seekg(0, std::ifstream::beg); + std::vector totalHashBuffer; + size_t uploadedBytes = 0; + + + while (uploadedBytes < objectSize) { + std::vector buffer(bufferSize); + std::streamsize bytesToRead = static_cast(std::min(buffer.size(), objectSize - uploadedBytes)); + fileStream.read((char *) buffer.data(), bytesToRead); + Aws::Utils::Stream::PreallocatedStreamBuf preallocatedStreamBuf(buffer.data(), + bytesToRead); + std::shared_ptr body = + Aws::MakeShared("SampleAllocationTag", + &preallocatedStreamBuf); + Hasher hasher; + if (!hasher.calculateObjectHash(*body, hashMethod)) { + std::cerr << "Error calculating hash." << std::endl; + return false; + } + Aws::String base64HashString = hasher.getBase64HashString(); + partHashes.push_back(base64HashString); + + Aws::Utils::ByteBuffer hashBuffer = hasher.getByteBufferHash(); + + totalHashBuffer.insert(totalHashBuffer.end(), hashBuffer.GetUnderlyingData(), + hashBuffer.GetUnderlyingData() + hashBuffer.GetLength()); + + uploadedBytes += bytesToRead; + } + + return hashDataResult.calculateObjectHash(totalHashBuffer, hashMethod); +} + +// snippet-start:[cpp.example_code.s3.CreateMultipartUpload] +//! Create a multipart upload. +/*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param client: The S3 client instance used to perform the upload operation. + \return Aws::String: Upload ID or empty string if failed. +*/ +Aws::String +AwsDoc::S3::createMultipartUpload(const Aws::String &bucket, const Aws::String &key, + Aws::S3::Model::ChecksumAlgorithm checksumAlgorithm, + const Aws::S3::S3Client &client) { + Aws::S3::Model::CreateMultipartUploadRequest request; + request.SetBucket(bucket); + request.SetKey(key); + + if (checksumAlgorithm != Aws::S3::Model::ChecksumAlgorithm::NOT_SET) { + request.SetChecksumAlgorithm(checksumAlgorithm); + } + + Aws::S3::Model::CreateMultipartUploadOutcome outcome = + client.CreateMultipartUpload(request); + + Aws::String uploadID; + if (outcome.IsSuccess()) { + uploadID = outcome.GetResult().GetUploadId(); + } else { + std::cerr << "Error creating multipart upload: " << outcome.GetError().GetMessage() << std::endl; + } + + return uploadID; +} +// snippet-end:[cpp.example_code.s3.CreateMultipartUpload] + +// snippet-start:[cpp.example_code.s3.UploadPart] +//! Upload a part to an S3 bucket. +/*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param uploadID: An upload ID string. + \param partNumber: + \param checksumAlgorithm: Checksum algorithm, ignored when NOT_SET. + \param calculatedHash: A data integrity hash to set, depending on the checksum algorithm, + ignored when it is an empty string. + \param body: An shared_ptr IOStream of the data to be uploaded. + \param client: The S3 client instance used to perform the upload operation. + \return UploadPartOutcome: The outcome. +*/ + +Aws::S3::Model::UploadPartOutcome AwsDoc::S3::uploadPart(const Aws::String &bucket, + const Aws::String &key, + const Aws::String &uploadID, + int partNumber, + Aws::S3::Model::ChecksumAlgorithm checksumAlgorithm, + const Aws::String &calculatedHash, + const std::shared_ptr &body, + const Aws::S3::S3Client &client) { + Aws::S3::Model::UploadPartRequest request; + request.SetBucket(bucket); + request.SetKey(key); + request.SetUploadId(uploadID); + request.SetPartNumber(partNumber); + if (checksumAlgorithm != Aws::S3::Model::ChecksumAlgorithm::NOT_SET) { + request.SetChecksumAlgorithm(checksumAlgorithm); + } + request.SetBody(body); + + if (!calculatedHash.empty()) { + switch (checksumAlgorithm) { + case Aws::S3::Model::ChecksumAlgorithm::NOT_SET: + request.SetContentMD5(calculatedHash); + break; + case Aws::S3::Model::ChecksumAlgorithm::CRC32: + request.SetChecksumCRC32(calculatedHash); + break; + case Aws::S3::Model::ChecksumAlgorithm::CRC32C: + request.SetChecksumCRC32C(calculatedHash); + break; + case Aws::S3::Model::ChecksumAlgorithm::SHA1: + request.SetChecksumSHA1(calculatedHash); + break; + case Aws::S3::Model::ChecksumAlgorithm::SHA256: + request.SetChecksumSHA256(calculatedHash); + break; + } + } + + return client.UploadPart(request); +} +// snippet-end:[cpp.example_code.s3.UploadPart] + +// snippet-start:[cpp.example_code.s3.AbortMultipartUpload] +//! Abort a multipart upload to an S3 bucket. +/*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param uploadID: An upload ID string. + \param client: The S3 client instance used to perform the upload operation. + \return bool: Function succeeded. +*/ + +bool AwsDoc::S3::abortMultipartUpload(const Aws::String &bucket, + const Aws::String &key, + const Aws::String &uploadID, + const Aws::S3::S3Client &client) { + Aws::S3::Model::AbortMultipartUploadRequest request; + request.SetBucket(bucket); + request.SetKey(key); + request.SetUploadId(uploadID); + + Aws::S3::Model::AbortMultipartUploadOutcome outcome = + client.AbortMultipartUpload(request); + + if (outcome.IsSuccess()) { + std::cout << "Multipart upload aborted." << std::endl; + } else { + std::cerr << "Error aborting multipart upload: " << outcome.GetError().GetMessage() << std::endl; + } + + return outcome.IsSuccess(); +} +// snippet-end:[cpp.example_code.s3.AbortMultipartUpload] + +// snippet-start:[cpp.example_code.s3.CompleteMultipartUpload] +//! Complete a multipart upload to an S3 bucket. +/*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param uploadID: An upload ID string. + \param parts: A vector of CompleteParts. + \param client: The S3 client instance used to perform the upload operation. + \return CompleteMultipartUploadOutcome: The request outcome. +*/ +Aws::S3::Model::CompleteMultipartUploadOutcome AwsDoc::S3::completeMultipartUpload(const Aws::String &bucket, + const Aws::String &key, + const Aws::String &uploadID, + const Aws::Vector &parts, + const Aws::S3::S3Client &client) { + Aws::S3::Model::CompletedMultipartUpload completedMultipartUpload; + completedMultipartUpload.SetParts(parts); + + Aws::S3::Model::CompleteMultipartUploadRequest request; + request.SetBucket(bucket); + request.SetKey(key); + request.SetUploadId(uploadID); + request.SetMultipartUpload(completedMultipartUpload); + + Aws::S3::Model::CompleteMultipartUploadOutcome outcome = + client.CompleteMultipartUpload(request); + + if (!outcome.IsSuccess()) { + std::cerr << "Error completing multipart upload: " << outcome.GetError().GetMessage() << std::endl; + } + return outcome; +} +// snippet-end:[cpp.example_code.s3.CompleteMultipartUpload] + +//! Routine which performs a multi-part upload. +/*! + \param bucket: The name of the S3 bucket where the object will be uploaded. + \param key: The unique identifier (key) for the object within the S3 bucket. + \param hashMethod: The hashing algorithm to use when calculating the hash value. + \param ioStream: An IOStream for the data to be uploaded. + \param useDefaultHashMethod: A flag indicating whether to use the default hash method or the one specified in the hashMethod parameter. + \param[out] hashDataResult: The Hasher object that will store the concatenated hash value. + \param[out] partHashes: The vector that will store the calculated hash values for each part of the file. + \param client: The S3 client instance used to perform the upload operation. + \return bool: Function succeeded. +*/ +bool AwsDoc::S3::doMultipartUpload(const Aws::String &bucket, + const Aws::String &key, + AwsDoc::S3::HASH_METHOD hashMethod, + const std::shared_ptr &ioStream, + bool useDefaultHashMethod, + AwsDoc::S3::Hasher &hashDataResult, + std::vector &partHashes, + const Aws::S3::S3Client &client) { + // Get object size. + ioStream->seekg(0, ioStream->end); + size_t objectSize = ioStream->tellg(); + ioStream->seekg(0, ioStream->beg); + + Aws::S3::Model::ChecksumAlgorithm checksumAlgorithm = Aws::S3::Model::ChecksumAlgorithm::NOT_SET; + if (!useDefaultHashMethod) { + if (hashMethod != MD5) { + checksumAlgorithm = getChecksumAlgorithmForHashMethod(hashMethod); + } + } + Aws::String uploadID = createMultipartUpload(bucket, key, checksumAlgorithm, client); + if (uploadID.empty()) { + return false; + } + + std::vector totalHashBuffer; + bool uploadSucceeded = true; + std::streamsize uploadedBytes = 0; + int partNumber = 1; + Aws::Vector parts; + while (uploadedBytes < objectSize) { + std::cout << "Uploading part " << partNumber << "." << std::endl; + + std::vector buffer(UPLOAD_BUFFER_SIZE); + std::streamsize bytesToRead = static_cast(std::min(buffer.size(), + objectSize - uploadedBytes)); + ioStream->read((char *) buffer.data(), bytesToRead); + Aws::Utils::Stream::PreallocatedStreamBuf preallocatedStreamBuf(buffer.data(), + bytesToRead); + std::shared_ptr body = + Aws::MakeShared("SampleAllocationTag", + &preallocatedStreamBuf); + + Hasher hasher; + if (!hasher.calculateObjectHash(*body, hashMethod)) { + std::cerr << "Error calculating hash." << std::endl; + uploadSucceeded = false; + break; + } + + Aws::String base64HashString = hasher.getBase64HashString(); + partHashes.push_back(base64HashString); + + Aws::Utils::ByteBuffer hashBuffer = hasher.getByteBufferHash(); + + totalHashBuffer.insert(totalHashBuffer.end(), hashBuffer.GetUnderlyingData(), + hashBuffer.GetUnderlyingData() + hashBuffer.GetLength()); + + Aws::String calculatedHash; + if (gUseCalculatedChecksum) { + calculatedHash = base64HashString; + } + Aws::S3::Model::UploadPartOutcome uploadPartOutcome = uploadPart(bucket, key, uploadID, partNumber, + checksumAlgorithm, base64HashString, body, + client); + if (uploadPartOutcome.IsSuccess()) { + const Aws::S3::Model::UploadPartResult &uploadPartResult = uploadPartOutcome.GetResult(); + Aws::S3::Model::CompletedPart completedPart; + completedPart.SetETag(uploadPartResult.GetETag()); + completedPart.SetPartNumber(partNumber); + switch (hashMethod) { + case AwsDoc::S3::MD5: + break; // Do nothing. + case AwsDoc::S3::SHA1: + completedPart.SetChecksumSHA1(uploadPartResult.GetChecksumSHA1()); + break; + case AwsDoc::S3::SHA256: + completedPart.SetChecksumSHA256(uploadPartResult.GetChecksumSHA256()); + break; + case AwsDoc::S3::CRC32: + completedPart.SetChecksumCRC32(uploadPartResult.GetChecksumCRC32()); + break; + case AwsDoc::S3::CRC32C: + completedPart.SetChecksumCRC32C(uploadPartResult.GetChecksumCRC32C()); + break; + default: + std::cerr << "Unhandled hash method for completedPart." << std::endl; + break; + } + + parts.push_back(completedPart); + } else { + std::cerr << "Error uploading part. " << + uploadPartOutcome.GetError().GetMessage() << std::endl; + uploadSucceeded = false; + break; + } + + uploadedBytes += bytesToRead; + partNumber++; + } + + if (!uploadSucceeded) { + abortMultipartUpload(bucket, key, uploadID, client); + return false; + } else { + + Aws::S3::Model::CompleteMultipartUploadOutcome completeMultipartUploadOutcome = completeMultipartUpload(bucket, + key, + uploadID, + parts, + client); + + if (completeMultipartUploadOutcome.IsSuccess()) { + std::cout << "Multipart upload completed." << std::endl; + if (!hashDataResult.calculateObjectHash(totalHashBuffer, hashMethod)) { + std::cerr << "Error calculating hash." << std::endl; + return false; + } + } else { + std::cerr << "Error completing multipart upload." << + completeMultipartUploadOutcome.GetError().GetMessage() + << std::endl; + } + + return completeMultipartUploadOutcome.IsSuccess(); + } +} + +//! Routine which retrieves the string for a HASH_METHOD constant. +/*! + \param: hashMethod: A HASH_METHOD constant. + \return: String: A string description of the hash method. +*/ +Aws::String AwsDoc::S3::stringForHashMethod(AwsDoc::S3::HASH_METHOD hashMethod) { + switch (hashMethod) { + case AwsDoc::S3::DEFAULT: + return "Default"; + case AwsDoc::S3::MD5: + return "MD5"; + case AwsDoc::S3::SHA1: + return "SHA1"; + case AwsDoc::S3::SHA256: + return "SHA256"; + case AwsDoc::S3::CRC32: + return "CRC32"; + case AwsDoc::S3::CRC32C: + return "CRC32C"; + default: + return "Unknown"; + } +} + +//! Routine that returns the ChecksumAlgorithm for a HASH_METHOD constant. +/*! + \param: hashMethod: A HASH_METHOD constant. + \return: ChecksumAlgorithm: The ChecksumAlgorithm enum. +*/ +Aws::S3::Model::ChecksumAlgorithm +AwsDoc::S3::getChecksumAlgorithmForHashMethod(AwsDoc::S3::HASH_METHOD hashMethod) { + Aws::S3::Model::ChecksumAlgorithm result = Aws::S3::Model::ChecksumAlgorithm::NOT_SET; + switch (hashMethod) { + case AwsDoc::S3::DEFAULT: + std::cerr << "getChecksumAlgorithmForHashMethod- DEFAULT is not valid." << std::endl; + break; // Default is not supported. + case AwsDoc::S3::MD5: + break; // Ignore MD5. + case AwsDoc::S3::SHA1: + result = Aws::S3::Model::ChecksumAlgorithm::SHA1; + break; + case AwsDoc::S3::SHA256: + result = Aws::S3::Model::ChecksumAlgorithm::SHA256; + break; + case AwsDoc::S3::CRC32: + result = Aws::S3::Model::ChecksumAlgorithm::CRC32; + break; + case AwsDoc::S3::CRC32C: + result = Aws::S3::Model::ChecksumAlgorithm::CRC32C; + break; + default: + std::cerr << "Unknown hash method." << std::endl; + break; + + } + + return result; +} + +//! Routine which cleans up after the example is complete. +/*! + \param bucket: The name of the S3 bucket where the object was uploaded. + \param clientConfiguration: The client configuration for the S3 client. + \return bool: Function succeeded. +*/ +bool AwsDoc::S3::cleanUp(const Aws::String &bucketName, + const Aws::S3::S3ClientConfiguration &clientConfiguration) { + + Aws::Vector keysResult; + bool result = true; + if (AwsDoc::S3::listObjects(bucketName, keysResult, clientConfiguration)) { + if (!keysResult.empty()) { + result = AwsDoc::S3::deleteObjects(keysResult, bucketName, + clientConfiguration); + } + } else { + result = false; + } + + return result && AwsDoc::S3::deleteBucket(bucketName, clientConfiguration); +} + +//! Console interaction introducing the workflow. +/*! + \param bucketName: The name of the S3 bucket to use. +*/ +void AwsDoc::S3::introductoryExplanations(const Aws::String &bucketName) { + + std::cout + << "Welcome to the Amazon Simple Storage Service (Amazon S3) object integrity workflow." + << std::endl; + printAsterisksLine(); + std::cout + << "This workflow demonstrates how Amazon S3 uses checksum values to verify the integrity of data\n"; + std::cout << "uploaded to Amazon S3 buckets" << std::endl; + std::cout + << "The AWS SDK for C++ automatically handles checksums.\n"; + std::cout + << "By default it calculates a checksum that is uploaded with an object.\n" + << "The default checksum algorithm for PutObject and MultiPart upload is an MD5 hash.\n" + << "The default checksum algorithm for TransferManager uploads is a CRC32 checksum." + << std::endl; + std::cout + << "You can override the default behavior, requiring one of the following checksums,\n"; + std::cout << "MD5, CRC32, CRC32C, SHA-1 or SHA-256." << std::endl; + std::cout << "You can also set the checksum hash value, instead of letting the SDK calculate the value." + << std::endl; + std::cout + << "For more information, see https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html." + << std::endl; + + std::cout + << "This workflow will locally compute checksums for files uploaded to an Amazon S3 bucket,\n"; + std::cout << "even when the SDK also computes the checksum." << std::endl; + std::cout + << "This is done to provide demonstration code for how the checksums are calculated." + << std::endl; + std::cout << "A bucket named '" << bucketName << "' will be created for the object uploads." + << std::endl; +} + +//! Console interaction which explains the PutObject results. +/*! +*/ +void AwsDoc::S3::explainPutObjectResults() { + + std::cout << "The upload was successful.\n"; + std::cout << "If the checksums had not matched, the upload would have failed." + << std::endl; + std::cout + << "The checksums calculated by the server have been retrieved using the GetObjectAttributes." + << std::endl; + std::cout + << "The locally calculated checksums have been verified against the retrieved checksums." + << std::endl; +} + +//! Console interaction explaining transfer manager uploads. +/*! + \param objectKey: The key for the object being uploaded. +*/ +void AwsDoc::S3::introductoryTransferManagerUploadExplanations( + const Aws::String &objectKey) { + std::cout + << "Now the workflow will demonstrate object integrity for TransferManager multi-part uploads." + << std::endl; + std::cout + << "The AWS C++ SDK has a TransferManager class which simplifies multipart uploads." + << std::endl; + std::cout + << "The following code lets the TransferManager handle much of the checksum configuration." + << std::endl; + + std::cout << "An object with the key '" << objectKey + << " will be uploaded by the TransferManager using a " + << BUFFER_SIZE_IN_MEGABYTES << " MB buffer." << std::endl; + if (gUseCalculatedChecksum) { + std::cout << "For TransferManager uploads, this demo always lets the SDK calculate the hash value." + << std::endl; + } + + pressEnterToContinue(); + printAsterisksLine(); +} + +//! Console interaction explaining multi-part uploads. +/*! + \param objectKey: The key for the object being uploaded. + \param chosenHashMethod: The hash method selected by the user. +*/ +void AwsDoc::S3::multiPartUploadExplanations(const Aws::String &objectKey, + HASH_METHOD chosenHashMethod) { + std::cout + << "Now we will provide an in-depth demonstration of multi-part uploading by calling the multi-part upload APIs directly." + << std::endl; + std::cout << "These are the same APIs used by the TransferManager when uploading large files." + << std::endl; + std::cout + << "In the following code, the checksums are also calculated locally and then compared." + << std::endl; + std::cout + << "For multi-part uploads, a checksum is uploaded with each part. The final checksum is a concatenation of" + << std::endl; + std::cout << "the checksums for each part." << std::endl; + std::cout + << "This is explained in the user guide, https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html,\"" + << " in the section \"Using part-level checksums for multipart uploads\"." << std::endl; + + std::cout << "Starting multipart upload of with hash method " << + stringForHashMethod(chosenHashMethod) << " uploading to with object key\n" + << "'" << objectKey << "'," << std::endl; + +} + +//! Create a large file for doing multi-part uploads. +/*! +*/ +bool AwsDoc::S3::createLargeFileIfNotExists() { + // Generate a large file by writing this source file multiple times to a new file. + if (std::filesystem::exists(MULTI_PART_TEST_FILE)) { + return true; + } + + std::ofstream newFile(MULTI_PART_TEST_FILE, std::ios::out + + | std::ios::binary); + + if (!newFile) { + std::cerr << "createLargeFileIfNotExists- Error creating file " << MULTI_PART_TEST_FILE << + std::endl; + return false; + } + + std::ifstream input(TEST_FILE, std::ios::in + + | std::ios::binary); + if (!input) { + std::cerr << "Error opening file " << TEST_FILE << + std::endl; + return false; + } + std::stringstream buffer; + buffer << input.rdbuf(); + + input.close(); + + while (newFile.tellp() < LARGE_FILE_SIZE && !newFile.bad()) { + buffer.seekg(std::stringstream::beg); + newFile << buffer.rdbuf(); + } + + newFile.close(); + + return true; +} +// snippet-end:[cpp.example_code.s3.Scenario_ObjectIntegrity] + +//! Calculate the object hash for vector input. +/*! + \param data: A vector of unsigned bytes. + \param hashMethod: The hash method to use. + \return bool: Function succeeded. +*/ +bool AwsDoc::S3::Hasher::calculateObjectHash(std::vector &data, + AwsDoc::S3::HASH_METHOD hashMethod) { + Aws::Utils::Stream::PreallocatedStreamBuf preallocatedStreamBuf(data.data(), + data.size()); + std::shared_ptr body = + Aws::MakeShared("SampleAllocationTag", + &preallocatedStreamBuf); + return calculateObjectHash(*body, hashMethod); +} + +//! Calculate the object hash for stream input. +/*! + \param data: An IOStream for input. + \param hashMethod: The hash method to use. + \return bool: Function succeeded. +*/ +bool AwsDoc::S3::Hasher::calculateObjectHash(Aws::IOStream &data, + AwsDoc::S3::HASH_METHOD hashMethod) { + switch (hashMethod) { + case AwsDoc::S3::DEFAULT: + std::cerr << "Default hash method in calculateObjectHash." << std::endl; + break; + case AwsDoc::S3::MD5: + m_Hash = Aws::Utils::HashingUtils::CalculateMD5(data); + break; + case AwsDoc::S3::SHA1: + m_Hash = Aws::Utils::HashingUtils::CalculateSHA1(data); + break; + case AwsDoc::S3::SHA256: + m_Hash = Aws::Utils::HashingUtils::CalculateSHA256(data); + break; + case AwsDoc::S3::CRC32: + m_Hash = Aws::Utils::HashingUtils::CalculateCRC32(data); + break; + case AwsDoc::S3::CRC32C: + m_Hash = Aws::Utils::HashingUtils::CalculateCRC32C(data); + break; + default: + std::cerr << "Unknown hash method." << std::endl; + return false; + } + data.clear(); + data.seekg(0, std::ifstream::beg); + return true; +} + +//! Retrieve the stored hash as a Base64 string. +/*! + \return String: Hash as Base64 string. +*/ +Aws::String AwsDoc::S3::Hasher::getBase64HashString() const { + return Aws::Utils::HashingUtils::Base64Encode(m_Hash); +} + +//! Retrieve the stored hash as a hexadecimal string. +/*! + \return String: Hash as hexadecimal string. +*/ +Aws::String AwsDoc::S3::Hasher::getHexHashString() const { + std::stringstream stringstream; + stringstream << std::hex << std::setfill('0'); + for (int i = 0; i < m_Hash.GetLength(); ++i) { + stringstream << std::setw(2) << (int) m_Hash[i]; + } + + return stringstream.str(); +} + +//! Retrieve the stored hash as a ByteBuffer. +/*! + \return String: Hash as ByteBuffer. +*/ +Aws::Utils::ByteBuffer AwsDoc::S3::Hasher::getByteBufferHash() const { + return m_Hash; +} + +//! Test routine passed as argument to askQuestion routine. +/*! +\param string: A string to test. +\return bool: True if empty. +*/ +bool AwsDoc::S3::testForEmptyString(const Aws::String &string) { + if (string.empty()) { + std::cout << "Enter some text." << std::endl; + return false; + } + + return true; +} + +//! Command line prompt/response utility function. +/*! + \param string: A question prompt. + \param test: Test function for response. + \return Aws::String: User's response. + */ +Aws::String AwsDoc::S3::askQuestion(const Aws::String &string, + const std::function &test) { + Aws::String result; + do { + std::cout << string; + std::getline(std::cin, result); + } while (!test(result)); + + return result; +} + +//! Command line prompt/response for yes/no question. +/*! + \param string: A question prompt expecting a 'y' or 'n' response. + \return bool: True if yes. + */ +bool AwsDoc::S3::askYesNoQuestion(const Aws::String &string) { + Aws::String resultString = askQuestion(string, []( + const Aws::String &string1) -> bool { + bool result = false; + if (string1.length() == 1) { + int answer = std::tolower(string1[0]); + result = (answer == 'y') || (answer == 'n'); + } + + if (!result) { + std::cout << "Answer 'y' or 'n'." << std::endl; + } + + return result; + }); + + return std::tolower(resultString[0]) == 'y'; +} + +//! Command line prompt/response utility function for an int result confined to +//! a range. +/*! + \param string: A question prompt. + \param low: Low inclusive. + \param high: High inclusive. + \return int: User's response. + */ +int +AwsDoc::S3::askQuestionForIntRange(const Aws::String &string, int low, + int high) { + Aws::String resultString = askQuestion(string, [low, high]( + const Aws::String &string1) -> bool { + try { + int number = std::stoi(string1); + bool result = number >= low && number <= high; + if (!result) { + std::cerr << "\nThe number is out of range." << std::endl; + } + return result; + } + catch (const std::invalid_argument &) { + std::cerr << "\nNot a valid number." << std::endl; + return false; + } + }); + + int result = 0; + try { + result = std::stoi(resultString); + } + catch (const std::invalid_argument &) { + std::cerr << "askQuestionForFloatRange string not an int " + << resultString << std::endl; + } + + return result; +} + + +#pragma clang diagnostic pop \ No newline at end of file diff --git a/cpp/example_code/s3/tests/CMakeLists.txt b/cpp/example_code/s3/tests/CMakeLists.txt index c32c01045d1..ca0993eda66 100644 --- a/cpp/example_code/s3/tests/CMakeLists.txt +++ b/cpp/example_code/s3/tests/CMakeLists.txt @@ -6,13 +6,13 @@ cmake_minimum_required(VERSION 3.14) set(EXAMPLE_SERVICE_NAME "s3") set(CURRENT_TARGET "${EXAMPLE_SERVICE_NAME}_gtest") -set(CURRENT_TARGET_AWS_DEPENDENCIES s3 sts iam) +set(CURRENT_TARGET_AWS_DEPENDENCIES s3 sts iam transfer) # Set this project's name. project("${EXAMPLE_SERVICE_NAME}-examples-gtests") # Set the C++ standard to use to build this target. -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) find_package(GTest) @@ -91,13 +91,21 @@ endif () enable_testing() +# The Object Integrity Workflow is a special case and is handled differently. +set(OBJECT_INTEGRITY_WORKFLOW_SOURCE s3_object_integrity_workflow.cpp) foreach (TEST_FILE ${GTEST_SOURCE_FILES}) string(REPLACE "gtest_" "../" SOURCE_FILE ${TEST_FILE}) if (EXISTS ${SOURCE_FILE}) list(APPEND GTEST_SOURCE ${SOURCE_FILE} ${TEST_FILE}) + else () - message("Error: no associated source file found for ${TEST_FILE}") + string(FIND ${SOURCE_FILE} ${OBJECT_INTEGRITY_WORKFLOW_SOURCE} POS) + if (POS EQUAL -1) + message("Error: no associated source file found for ${TEST_FILE}") + else () + list(APPEND GTEST_SOURCE ../s3_object_integrity_workflow/${OBJECT_INTEGRITY_WORKFLOW_SOURCE} ${TEST_FILE}) + endif () endif () endforeach () @@ -112,20 +120,14 @@ target_sources( target_include_directories( ${CURRENT_TARGET} PUBLIC - $ - $ -) - -target_include_directories( - ${CURRENT_TARGET} - SYSTEM PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/.. ${CURL_INCLUDE_DIRS} ) target_compile_definitions( ${CURRENT_TARGET} PUBLIC - TESTING_BUILD + EXCLUDE_MAIN_FUNCTION SRC_DIR="${CMAKE_CURRENT_SOURCE_DIR}" ) @@ -148,6 +150,7 @@ target_link_directories(${CURRENT_TARGET} ${CURL_LIBRARIES}) include(GoogleTest) + gtest_add_tests( TARGET ${CURRENT_TARGET} diff --git a/cpp/example_code/s3/tests/S3_GTests.cpp b/cpp/example_code/s3/tests/S3_GTests.cpp index 8e3bb0c0e0b..ada6dc9af0b 100644 --- a/cpp/example_code/s3/tests/S3_GTests.cpp +++ b/cpp/example_code/s3/tests/S3_GTests.cpp @@ -380,6 +380,13 @@ void AwsDocTest::S3_GTests::SetUp() { m_savedBuffer = std::cout.rdbuf(); std::cout.rdbuf(&m_coutBuffer); } + + m_savedInBuffer = std::cin.rdbuf(); + std::cin.rdbuf(&m_cinBuffer); + + // The following code is needed for the AwsDocTest::MyStringBuffer::underflow exception. + // Otherwise, we get an infinite loop when the buffer is empty. + std::cin.exceptions(std::ios_base::badbit); } void AwsDocTest::S3_GTests::TearDown() { @@ -387,8 +394,13 @@ void AwsDocTest::S3_GTests::TearDown() { std::cout.rdbuf(m_savedBuffer); m_savedBuffer = nullptr; } -} + if (m_savedInBuffer != nullptr) { + std::cin.rdbuf(m_savedInBuffer); + std::cin.exceptions(std::ios_base::goodbit); + m_savedInBuffer = nullptr; + } +} Aws::String AwsDocTest::S3_GTests::preconditionError() { return "Failed to meet precondition."; @@ -398,6 +410,16 @@ bool AwsDocTest::S3_GTests::suppressStdOut() { return std::getenv("EXAMPLE_TESTS_LOG_ON") == nullptr; } +void AwsDocTest::S3_GTests::AddCommandLineResponses( + const std::vector &responses) { + + std::stringstream stringStream; + for (auto &response: responses) { + stringStream << response << "\n"; + } + m_cinBuffer.str(stringStream.str()); +} + AwsDocTest::MockHTTP::MockHTTP() { requestTmp = CreateHttpRequest(Aws::Http::URI("https://test.com/"), Aws::Http::HttpMethod::HTTP_GET, @@ -436,5 +458,12 @@ bool AwsDocTest::MockHTTP::addResponseWithBody(const std::string &fileName, return false; } +int AwsDocTest::MyStringBuffer::underflow() { + int result = basic_stringbuf::underflow(); + if (result == EOF) { + std::cerr << "Error AwsDocTest::MyStringBuffer::underflow." << std::endl; + throw std::underflow_error("AwsDocTest::MyStringBuffer::underflow"); + } - + return result; +} diff --git a/cpp/example_code/s3/tests/S3_GTests.h b/cpp/example_code/s3/tests/S3_GTests.h index 727a494f82a..19e9d3ac190 100644 --- a/cpp/example_code/s3/tests/S3_GTests.h +++ b/cpp/example_code/s3/tests/S3_GTests.h @@ -12,6 +12,9 @@ #include namespace AwsDocTest { + class MyStringBuffer : public std::stringbuf { + int underflow() override; + }; class S3_GTests : public testing::Test { protected: @@ -52,6 +55,8 @@ namespace AwsDocTest { static Aws::String preconditionError(); + void AddCommandLineResponses(const std::vector &responses); + // s_clientConfig must be a pointer because the client config must be initialized after InitAPI. static std::unique_ptr s_clientConfig; @@ -69,6 +74,9 @@ namespace AwsDocTest { std::stringbuf m_coutBuffer; // used just to silence cout. std::streambuf *m_savedBuffer = nullptr; + + MyStringBuffer m_cinBuffer; + std::streambuf *m_savedInBuffer = nullptr; }; class MockHTTP { diff --git a/cpp/example_code/s3/tests/gtest_list_objects.cpp b/cpp/example_code/s3/tests/gtest_list_objects.cpp index f58d26df98c..8a75cbb7d77 100644 --- a/cpp/example_code/s3/tests/gtest_list_objects.cpp +++ b/cpp/example_code/s3/tests/gtest_list_objects.cpp @@ -22,7 +22,8 @@ namespace AwsDocTest { std::vector bucketNames = GetCachedS3Buckets(BUCKETS_NEEDED); ASSERT_GE(bucketNames.size(), BUCKETS_NEEDED) << "Failed to meet precondition" << std::endl; - bool result = AwsDoc::S3::listObjects(bucketNames[0], *s_clientConfig); + Aws::Vector keysResult; + bool result = AwsDoc::S3::listObjects(bucketNames[0], keysResult, *s_clientConfig); EXPECT_TRUE(result); } } // namespace AwsDocTest diff --git a/cpp/example_code/s3/tests/gtest_s3_object_integrity_workflow.cpp b/cpp/example_code/s3/tests/gtest_s3_object_integrity_workflow.cpp new file mode 100644 index 00000000000..f46ee953b0d --- /dev/null +++ b/cpp/example_code/s3/tests/gtest_s3_object_integrity_workflow.cpp @@ -0,0 +1,222 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/* + * Test types are indicated by the test label ending. + * + * _1_ Requires credentials, permissions, and AWS resources. + * _2_ Requires credentials and permissions. + * _3_ Does not require credentials. + * + */ + +#include +#include "s3_examples.h" +#include "S3_GTests.h" + +namespace AwsDocTest { + // NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_default_sdk_checksum_2_ + ) { + AddCommandLineResponses({ + "1", // Choose from one of the following checksum algorithms + "y", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + } + ); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_MD5_sdk_checksum_2_ + ) { + AddCommandLineResponses({ + "2", // Choose from one of the following checksum algorithms + "y", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_CRC32_sdk_checksum_2_ + ) { + AddCommandLineResponses({ + "3", // Choose from one of the following checksum algorithms + "y", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_CRC32C_sdk_checksum_2_ + ) { + AddCommandLineResponses({ + "4", // Choose from one of the following checksum algorithms + "y", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_SHA1_sdk_checksum_2_ + ) { + AddCommandLineResponses({ + "5", // Choose from one of the following checksum algorithms + "y", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_SHA256_sdk_checksum_2_ + ) { + AddCommandLineResponses({ + "6", // Choose from one of the following checksum algorithms + "y", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_default_calc_checksum_2_ + ) { + AddCommandLineResponses({ + "1", // Choose from one of the following checksum algorithms + "n", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_MD5_calc_checksum_2_ + ) { + AddCommandLineResponses({ + "2", // Choose from one of the following checksum algorithms + "n", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_CRC32_calc_checksum_2_ + ) { + AddCommandLineResponses({ + "3", // Choose from one of the following checksum algorithms + "n", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_CRC32C_calc_checksum_2_ + ) { + AddCommandLineResponses({ + "4", // Choose from one of the following checksum algorithms + "n", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_SHA1_calc_checksum_2_ + ) { + AddCommandLineResponses({ + "5", // Choose from one of the following checksum algorithms + "n", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } + +// NOLINTNEXTLINE(readability-named-parameter) + TEST_F(S3_GTests, s3_object_integrity_workflow_SHA256_calc_checksum_2_ + ) { + AddCommandLineResponses({ + "6", // Choose from one of the following checksum algorithms + "n", // Let the SDK calculate the checksum for you? (y/n) + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "", // Press Enter to continue... + "y" // Would you like to delete the resources created in this workflow? (y/n) + }); + + auto result = AwsDoc::S3::s3ObjectIntegrityWorkflow(*s_clientConfig); + ASSERT_TRUE(result); + } +} // namespace AwsDocTest diff --git a/workflows/s3_object_integrity/README.md b/workflows/s3_object_integrity/README.md new file mode 100644 index 00000000000..72debba2f33 --- /dev/null +++ b/workflows/s3_object_integrity/README.md @@ -0,0 +1,30 @@ +# Amazon S3 Object Integrity Workflow + +## Overview + +- The workflow demonstrates how to use AWS SDKs to verify the integrity of objects uploaded to Amazon S3. +- It shows how object integrity is verified for different upload methods: PutObject, TransferManager, and multipart upload. +- The workflow demonstrates the use of all 5 hash algorithms supported by S3 for object verification: MD5, CRC32, CRC32C, SHA1, and SHA256. +- This workflow demonstrates the different options provided by the SDK for hashing. +- To demonstrate how the hashes are calculated, the workflow calculates the hashes in the code and compares the results with the hashes calculated automatically by the SDK. + + +The workflow runs as a command-line application that prompts the user for input. + +### Resources + +The workflow scenario steps create the bucket and objects needed for the example. No additional resources are required. + +## Implementations + +This example is implemented in the following languages: + +- [C++](../../cpp/example_code/s3/s3_object_integrity_workflow/README.md) + +## Additional reading + +- [Checking Object Integrity](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html) + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 diff --git a/workflows/s3_object_integrity/SPECIFICATION.md b/workflows/s3_object_integrity/SPECIFICATION.md new file mode 100644 index 00000000000..a4eafeb7297 --- /dev/null +++ b/workflows/s3_object_integrity/SPECIFICATION.md @@ -0,0 +1,164 @@ +# Amazon S3 Object Integrity Workflow - Technical specification + +This document contains the technical specifications for _Amazon S3 Integrity Lock Workflow_, +a workflow scenario that showcases AWS services and SDKs. It is primarily intended for the AWS code +examples team to use while developing this example in additional languages. + +This document explains the following: + +- Architecture and features of the example workflow. +- Metadata information for the scenario. +- Sample reference output. + +For an introduction, see the [README.md](README.md). + +--- + +### Table of contents + +- [Resources and User Input](#resources-and-user-input) +- [Metadata](#metadata) + +## Resources and User Input + +- Amazon Simple Storage Service (Amazon S3) Buckets and objects (created in the scenario) + - One bucket to upload files to. + +A file that is at least 10 MB is needed to demonstrate multi-part uploads. +This file is create by writing the workspace source file repeated to a new +file in the working directory. +Example: +``` +This workflow demonstrates how Amazon S3 uses checksum values to verify the integrity of data +uploaded to Amazon S3 buckets +The AWS SDK for C++ automatically handles checksums. +By default it calculates a checksum that is uploaded with an object. +The default checksum algorithm for PutObject and MultiPart upload is an MD5 hash. +The default checksum algorithm for TransferManager uploads is a CRC32 checksum. +You can override the default behavior, requiring one of the following checksums, +MD5, CRC32, CRC32C, SHA-1 or SHA-256. +You can also set the checksum hash value, instead of letting the SDK calculate the value. +For more information, see https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html. +This workflow will locally compute checksums for files uploaded to an Amazon S3 bucket, +even when the SDK also computes the checksum. +This is done to provide demonstration code for how the checksums are calculated. +A bucket named 'integrity-workflow-92e7e370-b096-4b7f-bf24-7d3496a19772' will be created for the object uploads. +Created bucket integrity-workflow-92e7e370-b096-4b7f-bf24-7d3496a19772 in the specified AWS Region. + + +``` +The user chooses the hash method. They also choose whether to let the SDK calculate hashes +or to use a hash calculated by this app. +Example: + +``` +Choose from one of the following checksum algorithms. + 1 - Default + 2 - MD5 + 3 - CRC32 + 4 - CRC32C + 5 - SHA1 + 6 - SHA256 +Enter an index: 3 +Let the SDK calculate the checksum for you? (y/n) n +``` + +The workflow demonstrates object integrity for PutObject. The hash +is always calculated in the app, providing the user with example code +demonstrating hash calculation. Hashes are downloaded from the server +and compared to locally calculated hashes. +Example +``` +The workflow will now upload a file using PutObject. +Object integrity will be verified using the CRC32 algorithm. +A checksum computed by this workflow will be used for object integrity verification, +except for the TransferManager upload. +Press Enter to continue... + +*************************************************************************************** + +Object successfully uploaded. +The upload was successful. +If the checksums had not matched, the upload would have failed. +The checksums calculated by the server have been retrieved using the GetObjectAttributes. +The locally calculated checksums have been verified against the retrieved checksums. +For PutObject upload retrieved hash is AP39dw== +For PutObject upload, locally and remotely calculated hashes all match! +``` +The workflow repeats this process with the TransferManager, uploading the +large file using the multi-part upload APIs. In the case of the TransferManager, +SDK calculated APIs are always used, because of difficulties using locally calculated +hashes. +Example: + +``` +Now the workflow will demonstrate object integrity for TransferManager multi-part uploads. +The AWS C++ SDK has a TransferManager class which simplifies multipart uploads. +The following code lets the TransferManager handle much of the checksum configuration. +An object with the key 'tr_CRC32_large_test_file.cpp will be uploaded by the TransferManager using a 5 MB buffer. +For TransferManager uploads, this demo always lets the SDK calculate the hash value. +Press Enter to continue... + +*************************************************************************************** + +Uploading the file... +For TransferManager upload retrieved hash is 7YCXxg== +6 part hash(es) were also retrieved. + Part hash rCTaNA== + Part hash yOLe+Q== + Part hash I60aeg== + Part hash boj9Ew== + Part hash 0tmIfQ== + Part hash 6/tRKA== +For TransferManager upload, locally and remotely calculated hashes all match! +``` + +The workflow demonstrates hashing using the multi-part upload APIs. In this case, +locally calculated hashes are used if the user selected that option. + +``` +Now we will provide an in-depth demonstration of multi-part uploading by calling the multi-part upload APIs directly. +These are the same APIs used by the TransferManager when uploading large files. +In the following code, the checksums are also calculated locally and then compared. +For multi-part uploads, a checksum is uploaded with each part. The final checksum is a concatenation of +the checksums for each part. +This is explained in the user guide, https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html," in the section "Using part-level checksums for multipart uploads". +Starting multipart upload of with hash method CRC32 uploading to with object key +'mp_CRC32_large_test_file.cpp', +Press Enter to continue... + +Uploading part 1. +Uploading part 2. +Uploading part 3. +Uploading part 4. +Uploading part 5. +Uploading part 6. +Multipart upload completed. +Finished multipart upload of with hash method CRC32 +Now we will retrieve the checksums from the server. +For MultiPart upload retrieved hash is 7YCXxg== +6 part hash(es) were also retrieved. + Part hash rCTaNA== + Part hash yOLe+Q== + Part hash I60aeg== + Part hash boj9Ew== + Part hash 0tmIfQ== + Part hash 6/tRKA== +For MultiPart upload, locally and remotely calculated hashes all match! +``` + +The user is given the option to delete the resources created by this workflow. + +## Metadata + +| action / scenario | metadata file | metadata key | +|--------------------------------|------------------|-----------------------------| +| `AbortMultipartUpload` | s3_metadata.yaml | s3_AbortMultipartUpload | +| `CreateMultipartUpload` | s3_metadata.yaml | s3_CreateMultipartUpload | +| `DeleteObject` | s3_metadata.yaml | s3_DeleteObject | +| `GetObjectAttributes` | s3_metadata.yaml | s3_GetObjectAttributes | +| `PutObject` | s3_metadata.yaml | s3_PutObject | +| `UploadPart` | s3_metadata.yaml | s3_UploadPart | +| `CompleteMultipartUpload` | s3_metadata.yaml | s3_CompleteMultipartUpload | +| `S3 Object Integrity Scenario` | s3_metadata.yaml | s3_Scenario_ObjectIntegrity | + From eafb697c06171b5f79cf620f833b0cb058f67a02 Mon Sep 17 00:00:00 2001 From: Rachel Hagerman <110480692+rlhagerm@users.noreply.github.com> Date: Wed, 24 Jul 2024 11:58:40 -0500 Subject: [PATCH 08/98] .NET and Python: Adding genai tags to metadata. (#6682) Adding genai tags to metadata. --- .doc_gen/metadata/medical-imaging_metadata.yaml | 8 ++++++++ .doc_gen/metadata/sesv2_metadata.yaml | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/.doc_gen/metadata/medical-imaging_metadata.yaml b/.doc_gen/metadata/medical-imaging_metadata.yaml index ffeaa831aef..9b1b97be602 100644 --- a/.doc_gen/metadata/medical-imaging_metadata.yaml +++ b/.doc_gen/metadata/medical-imaging_metadata.yaml @@ -33,6 +33,7 @@ medical-imaging_Hello: github_note_at_bottom: true excerpts: - description: + genai: some snippet_tags: - python.example_code.medical-imaging.Hello services: @@ -1162,31 +1163,38 @@ medical-imaging_Scenario_ImageSetsAndFrames: github_note_at_bottom: true excerpts: - description: Create an &CFN; stack with the necessary resources. + genai: some snippet_tags: - python.example_code.medical-imaging.workflow.deploy - description: Copy DICOM files to the &S3; import bucket. + genai: some snippet_tags: - python.example_code.medical-imaging.workflow.copy - description: Import the DICOM files to the &S3; data store. + genai: some snippet_tags: - python.example_code.medical-imaging.MedicalImagingWorkflowWrapper.decl - python.example_code.medical-imaging.workflow.StartDICOMImportJob - description: Get image sets created by the DICOM import job. + genai: some snippet_tags: - python.example_code.medical-imaging.MedicalImagingWorkflowWrapper.decl - python.example_code.medical-imaging.workflow.GetImageSetsForImportJob - python.example_code.medical-imaging.workflow.GetImageSet - description: Get image frame information for image sets. + genai: some snippet_tags: - python.example_code.medical-imaging.MedicalImagingWorkflowWrapper.decl - python.example_code.medical-imaging.workflow.GetImageFrames - python.example_code.medical-imaging.workflow.GetImageSetMetadata - description: Download, decode and verify image frames. + genai: some snippet_tags: - python.example_code.medical-imaging.MedicalImagingWorkflowWrapper.decl - python.example_code.medical-imaging.workflow.GetPixelData - python.example_code.medical-imaging.workflow.downloadAndCheck - description: Clean up resources. + genai: some snippet_tags: - python.example_code.medical-imaging.workflow.destroy - python.example_code.medical-imaging.MedicalImagingWorkflowWrapper.decl diff --git a/.doc_gen/metadata/sesv2_metadata.yaml b/.doc_gen/metadata/sesv2_metadata.yaml index 69d75526f4b..a380f9ca83c 100644 --- a/.doc_gen/metadata/sesv2_metadata.yaml +++ b/.doc_gen/metadata/sesv2_metadata.yaml @@ -6,6 +6,7 @@ sesv2_CreateContactList: github: dotnetv3/SESv2 excerpts: - description: + genai: most snippet_tags: - SESWorkflow.dotnetv3.SESv2Wrapper.CreateContactList Rust: @@ -47,6 +48,7 @@ sesv2_CreateContact: github: dotnetv3/SESv2 excerpts: - description: + genai: most snippet_tags: - SESWorkflow.dotnetv3.SESv2Wrapper.CreateContact Rust: @@ -111,6 +113,7 @@ sesv2_ListContacts: github: dotnetv3/SESv2 excerpts: - description: + genai: most snippet_tags: - SESWorkflow.dotnetv3.SESv2Wrapper.ListContacts Rust: @@ -151,6 +154,7 @@ sesv2_SendEmail: github: dotnetv3/SESv2 excerpts: - description: + genai: most snippet_tags: - SESWorkflow.dotnetv3.SESv2Wrapper.SendEmail Java: @@ -211,6 +215,7 @@ sesv2_CreateEmailIdentity: github: dotnetv3/SESv2 excerpts: - description: + genai: most snippet_tags: - SESWorkflow.dotnetv3.SESv2Wrapper.CreateEmailIdentity Java: @@ -252,6 +257,7 @@ sesv2_CreateEmailTemplate: github: dotnetv3/SESv2 excerpts: - description: + genai: most snippet_tags: - SESWorkflow.dotnetv3.SESv2Wrapper.CreateEmailTemplate Java: @@ -293,6 +299,7 @@ sesv2_DeleteContactList: github: dotnetv3/SESv2 excerpts: - description: + genai: most snippet_tags: - SESWorkflow.dotnetv3.SESv2Wrapper.DeleteContactList Java: @@ -334,6 +341,7 @@ sesv2_DeleteEmailIdentity: github: dotnetv3/SESv2 excerpts: - description: + genai: most snippet_tags: - SESWorkflow.dotnetv3.SESv2Wrapper.DeleteEmailIdentity Java: @@ -375,6 +383,7 @@ sesv2_DeleteEmailTemplate: github: dotnetv3/SESv2 excerpts: - description: + genai: most snippet_tags: - SESWorkflow.dotnetv3.SESv2Wrapper.DeleteEmailTemplate Java: @@ -420,9 +429,11 @@ sesv2_NewsletterWorkflow: github: dotnetv3/SESv2 excerpts: - description: Run the workflow. + genai: most snippet_tags: - SESWorkflow.dotnetv3.NewsletterWorkflow - description: Wrapper for service operations. + genai: most snippet_tags: - SESWorkflow.dotnetv3.SESv2Wrapper Java: From 5abd82ccd3f68555fa5b7b880b47ec31bcf63490 Mon Sep 17 00:00:00 2001 From: David Souther Date: Thu, 25 Jul 2024 12:03:48 -0400 Subject: [PATCH 09/98] Update rust api link_template. (#6683) Relies on internal commit 139264199 --- .doc_gen/metadata/sdks.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.doc_gen/metadata/sdks.yaml b/.doc_gen/metadata/sdks.yaml index 9ba84ff8956..b9fa685c376 100644 --- a/.doc_gen/metadata/sdks.yaml +++ b/.doc_gen/metadata/sdks.yaml @@ -279,7 +279,8 @@ Rust: api_ref: uid: "SdkForRustV1" name: "&guide-rust-api;" - link_template: "https://docs.rs/releases/search?query=aws-sdk" + # https://docs.rs/aws-sdk-apigateway/latest/aws_sdk_apigateway/client/struct.Client.html#method.get_rest_apis + link_template: "https://docs.rs/aws-sdk-{{.ServiceCollapsed}}/latest/aws_sdk_{{.ServiceCollapsed}}/client/struct.Client.html#method.{{.ActionSnake}}" guide: "&guide-rust-dev;" Swift: property: swift From 70b06d499f5a048088de0a371fc60d4a6438220c Mon Sep 17 00:00:00 2001 From: David Souther Date: Thu, 25 Jul 2024 14:03:39 -0400 Subject: [PATCH 10/98] Rust: Filter Aurora Instance Option list. (#6689) Filter Aurora Instance Option list. --- rustv1/examples/aurora/README.md | 22 +++++++++---------- .../aurora/src/aurora_scenario/mod.rs | 1 + .../aurora/src/aurora_scenario/tests.rs | 7 ++++++ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/rustv1/examples/aurora/README.md b/rustv1/examples/aurora/README.md index 81b6272eba6..59a51080207 100644 --- a/rustv1/examples/aurora/README.md +++ b/rustv1/examples/aurora/README.md @@ -38,19 +38,19 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv Code excerpts that show you how to call individual service functions. -- [CreateDBCluster](src/aurora_scenario/mod.rs#L352) -- [CreateDBClusterParameterGroup](src/aurora_scenario/mod.rs#L203) -- [CreateDBClusterSnapshot](src/aurora_scenario/mod.rs#L352) -- [CreateDBInstance](src/aurora_scenario/mod.rs#L352) -- [DeleteDBCluster](src/aurora_scenario/mod.rs#L512) -- [DeleteDBClusterParameterGroup](src/aurora_scenario/mod.rs#L512) -- [DeleteDBInstance](src/aurora_scenario/mod.rs#L512) -- [DescribeDBClusterParameters](src/aurora_scenario/mod.rs#L286) -- [DescribeDBClusters](src/aurora_scenario/mod.rs#L352) +- [CreateDBCluster](src/aurora_scenario/mod.rs#L353) +- [CreateDBClusterParameterGroup](src/aurora_scenario/mod.rs#L204) +- [CreateDBClusterSnapshot](src/aurora_scenario/mod.rs#L353) +- [CreateDBInstance](src/aurora_scenario/mod.rs#L353) +- [DeleteDBCluster](src/aurora_scenario/mod.rs#L513) +- [DeleteDBClusterParameterGroup](src/aurora_scenario/mod.rs#L513) +- [DeleteDBInstance](src/aurora_scenario/mod.rs#L513) +- [DescribeDBClusterParameters](src/aurora_scenario/mod.rs#L287) +- [DescribeDBClusters](src/aurora_scenario/mod.rs#L353) - [DescribeDBEngineVersions](src/aurora_scenario/mod.rs#L142) -- [DescribeDBInstances](src/aurora_scenario/mod.rs#L512) +- [DescribeDBInstances](src/aurora_scenario/mod.rs#L513) - [DescribeOrderableDBInstanceOptions](src/aurora_scenario/mod.rs#L179) -- [ModifyDBClusterParameterGroup](src/aurora_scenario/mod.rs#L315) +- [ModifyDBClusterParameterGroup](src/aurora_scenario/mod.rs#L316) ### Scenarios diff --git a/rustv1/examples/aurora/src/aurora_scenario/mod.rs b/rustv1/examples/aurora/src/aurora_scenario/mod.rs index bd5402ac5fb..f509f7432d7 100644 --- a/rustv1/examples/aurora/src/aurora_scenario/mod.rs +++ b/rustv1/examples/aurora/src/aurora_scenario/mod.rs @@ -193,6 +193,7 @@ impl AuroraScenario { .map(|options| { options .iter() + .filter(|o| o.storage_type() == Some("aurora")) .map(|o| o.db_instance_class().unwrap_or_default().to_string()) .collect::>() }) diff --git a/rustv1/examples/aurora/src/aurora_scenario/tests.rs b/rustv1/examples/aurora/src/aurora_scenario/tests.rs index 28c27bc44f1..70f8a5e5051 100644 --- a/rustv1/examples/aurora/src/aurora_scenario/tests.rs +++ b/rustv1/examples/aurora/src/aurora_scenario/tests.rs @@ -205,12 +205,19 @@ async fn test_scenario_get_instance_classes() { Ok(vec![ OrderableDbInstanceOption::builder() .db_instance_class("t1") + .storage_type("aurora") + .build(), + OrderableDbInstanceOption::builder() + .db_instance_class("t1") + .storage_type("aurora-iopt1") .build(), OrderableDbInstanceOption::builder() .db_instance_class("t2") + .storage_type("aurora") .build(), OrderableDbInstanceOption::builder() .db_instance_class("t3") + .storage_type("aurora") .build(), ]) }); From 8025bf7e42b94b424f5a40ecf6325d0a3a4a5d8a Mon Sep 17 00:00:00 2001 From: David Souther Date: Thu, 25 Jul 2024 15:14:27 -0400 Subject: [PATCH 11/98] Rust: Bedrock Examples (#6686) Bedrock Runtime Converse API in Rust to Anthropic Claude --- .../metadata/bedrock-runtime_metadata.yaml | 40 ++ rustv1/examples/Cargo.toml | 1 + rustv1/examples/bedrock-runtime/Cargo.toml | 18 + rustv1/examples/bedrock-runtime/README.md | 77 ++++ .../src/bin/converse-stream.rs | 138 ++++++ .../bedrock-runtime/src/bin/converse.rs | 93 ++++ .../bedrock-runtime/src/bin/tool-use.rs | 416 ++++++++++++++++++ 7 files changed, 783 insertions(+) create mode 100644 rustv1/examples/bedrock-runtime/Cargo.toml create mode 100644 rustv1/examples/bedrock-runtime/README.md create mode 100644 rustv1/examples/bedrock-runtime/src/bin/converse-stream.rs create mode 100644 rustv1/examples/bedrock-runtime/src/bin/converse.rs create mode 100644 rustv1/examples/bedrock-runtime/src/bin/tool-use.rs diff --git a/.doc_gen/metadata/bedrock-runtime_metadata.yaml b/.doc_gen/metadata/bedrock-runtime_metadata.yaml index 5e75132ec8e..136a70cef54 100644 --- a/.doc_gen/metadata/bedrock-runtime_metadata.yaml +++ b/.doc_gen/metadata/bedrock-runtime_metadata.yaml @@ -154,6 +154,17 @@ bedrock-runtime_Converse_AnthropicClaude: - description: Send a text message to Anthropic Claude, using Bedrock's Converse API. snippet_tags: - javascript.v3.bedrock-runtime.Converse_AnthropicClaude + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/bedrock-runtime + excerpts: + - description: Send a text message to Anthropic Claude, using Bedrock's Converse API. + snippet_tags: + - rust.bedrock-runtime.Converse_AnthropicClaude + - description: Use statements, Error utility, and constants. + snippet_tags: + - rust.bedrock-runtime.Converse_AnthropicClaude.supporting services: bedrock-runtime: {Converse} @@ -369,6 +380,17 @@ bedrock-runtime_ConverseStream_AnthropicClaude: - description: Send a text message to Anthropic Claude, using Bedrock's Converse API and process the response stream in real-time. snippet_tags: - javascript.v3.bedrock-runtime.ConverseStream_AnthropicClaude + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/bedrock-runtime + excerpts: + - description: Send a text message to Anthropic Claude and stream reply tokens, using Bedrock's ConverseStream API. + snippet_tags: + - rust.bedrock-runtime.ConverseStream_AnthropicClaude + - description: Use statements, Error utility, and constants. + snippet_tags: + - rust.bedrock-runtime.ConverseStream_AnthropicClaude.supporting services: bedrock-runtime: {ConverseStream} @@ -1276,6 +1298,24 @@ bedrock-runtime_Scenario_ToolUseDemo_AnthropicClaude: - description: "The weather tool used by the demo. This script defines the tool specification and implements the logic to retrieve weather data using from the Open-Meteo API." snippet_files: - python/example_code/bedrock-runtime/cross-model-scenarios/tool_use_demo/weather_tool.py + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/bedrock-runtime + excerpts: + - description: "The primary scenario and logic for the demo. This orchestrates the conversation between the user, the &BR; Converse API, and a weather tool." + snippet_tags: + - rust.bedrock-runtime.Converse_AnthropicClaude.tool-use + - description: "The weather tool used by the demo. This script defines the tool specification and implements the logic to retrieve weather data using from the Open-Meteo API." + snippet_tags: + - rust.bedrock-runtime.Converse_AnthropicClaude.tool-use.weather-tool + - description: "Utilities to print the Message Content Blocks" + snippet_tags: + - rust.bedrock-runtime.Converse_AnthropicClaude.tool-use.user-interface + - description: "Use statements, Error utility, and constants." + snippet_tags: + - rust.bedrock-runtime.Converse_AnthropicClaude.tool-use.supporting + services: bedrock-runtime: {Converse} diff --git a/rustv1/examples/Cargo.toml b/rustv1/examples/Cargo.toml index b9fdf16a236..92a620b4185 100644 --- a/rustv1/examples/Cargo.toml +++ b/rustv1/examples/Cargo.toml @@ -10,6 +10,7 @@ members = [ "auto-scaling", "autoscalingplans", "batch", + "bedrock-runtime", "cloudformation", "cloudwatch", "cloudwatchlogs", diff --git a/rustv1/examples/bedrock-runtime/Cargo.toml b/rustv1/examples/bedrock-runtime/Cargo.toml new file mode 100644 index 00000000000..06a20e8a411 --- /dev/null +++ b/rustv1/examples/bedrock-runtime/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "bedrock-runtime" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +aws-config = "1.5.4" +aws-sdk-bedrockruntime = "1.40.0" +aws-smithy-runtime-api = "1.7.1" +aws-smithy-types = "1.2.0" +reqwest = "0.12.5" +serde = "1.0.204" +serde_json = "1.0.120" +tokio = { version = "1.38.1", features = ["full"] } +tracing = "0.1.40" +tracing-subscriber = "0.3.18" diff --git a/rustv1/examples/bedrock-runtime/README.md b/rustv1/examples/bedrock-runtime/README.md new file mode 100644 index 00000000000..ae64bcc7542 --- /dev/null +++ b/rustv1/examples/bedrock-runtime/README.md @@ -0,0 +1,77 @@ +# Amazon Bedrock Runtime code examples for the SDK for Rust + +## Overview + +Shows how to use the AWS SDK for Rust to work with Amazon Bedrock Runtime. + + + + +_Amazon Bedrock Runtime is a fully managed service that makes it easy to use foundation models from third-party providers and Amazon._ + +## ⚠ Important + +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + + + + +## Code examples + +### Prerequisites + +For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv1` folder. + + + + +### Anthropic Claude + +- [Converse](src/bin/converse.rs#L43) +- [ConverseStream](src/bin/converse-stream.rs#L70) +- [Scenario: Tool use with the Converse API](src/bin/tool-use.rs#L242) + + + + + +## Run the examples + +### Instructions + + + + + + + +### Tests + +⚠ Running tests might result in charges to your AWS account. + + +To find instructions for running these tests, see the [README](../../README.md#Tests) +in the `rustv1` folder. + + + + + + +## Additional resources + +- [Amazon Bedrock Runtime User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) +- [Amazon Bedrock Runtime API Reference](https://docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html) +- [SDK for Rust Amazon Bedrock Runtime reference](https://docs.rs/aws-sdk-bedrock-runtime/latest/aws_sdk_bedrock-runtime/) + + + + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/rustv1/examples/bedrock-runtime/src/bin/converse-stream.rs b/rustv1/examples/bedrock-runtime/src/bin/converse-stream.rs new file mode 100644 index 00000000000..403215f0f1b --- /dev/null +++ b/rustv1/examples/bedrock-runtime/src/bin/converse-stream.rs @@ -0,0 +1,138 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[rust.bedrock-runtime.ConverseStream_AnthropicClaude.supporting] +use aws_config::BehaviorVersion; +use aws_sdk_bedrockruntime::{ + error::ProvideErrorMetadata, + operation::converse_stream::ConverseStreamError, + types::{ + error::ConverseStreamOutputError, ContentBlock, ConversationRole, + ConverseStreamOutput as ConverseStreamOutputType, Message, + }, + Client, +}; + +// Set the model ID, e.g., Claude 3 Haiku. +const MODEL_ID: &str = "anthropic.claude-3-haiku-20240307-v1:0"; +const CLAUDE_REGION: &str = "us-east-1"; + +// Start a conversation with the user message. +const USER_MESSAGE: &str = "Describe the purpose of a 'hello world' program in one line."; + +#[derive(Debug)] +struct BedrockConverseStreamError(String); +impl std::fmt::Display for BedrockConverseStreamError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Can't invoke '{}'. Reason: {}", MODEL_ID, self.0) + } +} +impl std::error::Error for BedrockConverseStreamError {} +impl From<&str> for BedrockConverseStreamError { + fn from(value: &str) -> Self { + BedrockConverseStreamError(value.into()) + } +} + +impl From<&ConverseStreamError> for BedrockConverseStreamError { + fn from(value: &ConverseStreamError) -> Self { + BedrockConverseStreamError( + match value { + ConverseStreamError::ModelTimeoutException(_) => "Model took too long", + ConverseStreamError::ModelNotReadyException(_) => "Model is not ready", + _ => "Unknown", + } + .into(), + ) + } +} + +impl From<&ConverseStreamOutputError> for BedrockConverseStreamError { + fn from(value: &ConverseStreamOutputError) -> Self { + match value { + ConverseStreamOutputError::ValidationException(ve) => BedrockConverseStreamError( + ve.message().unwrap_or("Unknown ValidationException").into(), + ), + ConverseStreamOutputError::ThrottlingException(te) => BedrockConverseStreamError( + te.message().unwrap_or("Unknown ThrottlingException").into(), + ), + value => BedrockConverseStreamError( + value + .message() + .unwrap_or("Unknown StreamOutput exception") + .into(), + ), + } + } +} +// snippet-end:[rust.bedrock-runtime.ConverseStream_AnthropicClaude.supporting] + +// snippet-start:[rust.bedrock-runtime.ConverseStream_AnthropicClaude] +#[tokio::main] +async fn main() -> Result<(), BedrockConverseStreamError> { + tracing_subscriber::fmt::init(); + let sdk_config = aws_config::defaults(BehaviorVersion::latest()) + .region(CLAUDE_REGION) + .load() + .await; + let client = Client::new(&sdk_config); + + let response = client + .converse_stream() + .model_id(MODEL_ID) + .messages( + Message::builder() + .role(ConversationRole::User) + .content(ContentBlock::Text(USER_MESSAGE.to_string())) + .build() + .map_err(|_| "failed to build message")?, + ) + .send() + .await; + + let mut stream = match response { + Ok(output) => Ok(output.stream), + Err(e) => Err(BedrockConverseStreamError::from( + e.as_service_error().unwrap(), + )), + }?; + + loop { + let token = stream.recv().await; + match token { + Ok(Some(text)) => { + let next = get_converse_output_text(text)?; + print!("{}", next); + Ok(()) + } + Ok(None) => break, + Err(e) => Err(e + .as_service_error() + .map(BedrockConverseStreamError::from) + .unwrap_or(BedrockConverseStreamError( + "Unknown error receiving stream".into(), + ))), + }? + } + + println!(); + + Ok(()) +} + +fn get_converse_output_text( + output: ConverseStreamOutputType, +) -> Result { + Ok(match output { + ConverseStreamOutputType::ContentBlockDelta(event) => match event.delta() { + Some(delta) => delta + .as_text() + .map(|s| s.clone()) + .unwrap_or_else(|_| "".into()), + None => "".into(), + }, + _ => "".into(), + }) +} + +// snippet-end:[rust.bedrock-runtime.ConverseStream_AnthropicClaude] diff --git a/rustv1/examples/bedrock-runtime/src/bin/converse.rs b/rustv1/examples/bedrock-runtime/src/bin/converse.rs new file mode 100644 index 00000000000..88075e4b1b5 --- /dev/null +++ b/rustv1/examples/bedrock-runtime/src/bin/converse.rs @@ -0,0 +1,93 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[rust.bedrock-runtime.Converse_AnthropicClaude.supporting] +use aws_config::BehaviorVersion; +use aws_sdk_bedrockruntime::{ + operation::converse::{ConverseError, ConverseOutput}, + types::{ContentBlock, ConversationRole, Message}, + Client, +}; + +// Set the model ID, e.g., Claude 3 Haiku. +const MODEL_ID: &str = "anthropic.claude-3-haiku-20240307-v1:0"; +const CLAUDE_REGION: &str = "us-east-1"; + +// Start a conversation with the user message. +const USER_MESSAGE: &str = "Describe the purpose of a 'hello world' program in one line."; + +#[derive(Debug)] +struct BedrockConverseError(String); +impl std::fmt::Display for BedrockConverseError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Can't invoke '{}'. Reason: {}", MODEL_ID, self.0) + } +} +impl std::error::Error for BedrockConverseError {} +impl From<&str> for BedrockConverseError { + fn from(value: &str) -> Self { + BedrockConverseError(value.to_string()) + } +} +impl From<&ConverseError> for BedrockConverseError { + fn from(value: &ConverseError) -> Self { + BedrockConverseError::from(match value { + ConverseError::ModelTimeoutException(_) => "Model took too long", + ConverseError::ModelNotReadyException(_) => "Model is not ready", + _ => "Unknown", + }) + } +} +// snippet-end:[rust.bedrock-runtime.Converse_AnthropicClaude.supporting] + +// snippet-start:[rust.bedrock-runtime.Converse_AnthropicClaude] +#[tokio::main] +async fn main() -> Result<(), BedrockConverseError> { + tracing_subscriber::fmt::init(); + let sdk_config = aws_config::defaults(BehaviorVersion::latest()) + .region(CLAUDE_REGION) + .load() + .await; + let client = Client::new(&sdk_config); + + let response = client + .converse() + .model_id(MODEL_ID) + .messages( + Message::builder() + .role(ConversationRole::User) + .content(ContentBlock::Text(USER_MESSAGE.to_string())) + .build() + .map_err(|_| "failed to build message")?, + ) + .send() + .await; + + match response { + Ok(output) => { + let text = get_converse_output_text(output)?; + println!("{}", text); + Ok(()) + } + Err(e) => Err(e + .as_service_error() + .map(BedrockConverseError::from) + .unwrap_or_else(|| BedrockConverseError("Unknown service error".into()))), + } +} + +fn get_converse_output_text(output: ConverseOutput) -> Result { + let text = output + .output() + .ok_or("no output")? + .as_message() + .map_err(|_| "output not a message")? + .content() + .first() + .ok_or("no content in message")? + .as_text() + .map_err(|_| "content is not text")? + .to_string(); + Ok(text) +} +// snippet-end:[rust.bedrock-runtime.Converse_AnthropicClaude] diff --git a/rustv1/examples/bedrock-runtime/src/bin/tool-use.rs b/rustv1/examples/bedrock-runtime/src/bin/tool-use.rs new file mode 100644 index 00000000000..090aa51b942 --- /dev/null +++ b/rustv1/examples/bedrock-runtime/src/bin/tool-use.rs @@ -0,0 +1,416 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[rust.bedrock-runtime.Converse_AnthropicClaude.tool-use.supporting] +use std::{collections::HashMap, io::stdin}; + +use aws_config::BehaviorVersion; +use aws_sdk_bedrockruntime::{ + error::{BuildError, SdkError}, + operation::converse::{ConverseError, ConverseOutput}, + types::{ + ContentBlock, ConversationRole::User, Message, StopReason, SystemContentBlock, Tool, + ToolConfiguration, ToolInputSchema, ToolResultBlock, ToolResultContentBlock, + ToolSpecification, ToolUseBlock, + }, + Client, +}; +use aws_smithy_runtime_api::http::Response; +use aws_smithy_types::Document; +use tracing::debug; + +/// This demo illustrates a tool use scenario using Amazon Bedrock's Converse API and a weather tool. +/// The script interacts with a foundation model on Amazon Bedrock to provide weather information based on user +/// input. It uses the Open-Meteo API (https://open-meteo.com) to retrieve current weather data for a given location. + +// Set the model ID, e.g., Claude 3 Haiku. +const MODEL_ID: &str = "anthropic.claude-3-haiku-20240307-v1:0"; +const CLAUDE_REGION: &str = "us-east-1"; + +const SYSTEM_PROMPT: &str = "You are a weather assistant that provides current weather data for user-specified locations using only +the Weather_Tool, which expects latitude and longitude. Infer the coordinates from the location yourself. +If the user provides coordinates, infer the approximate location and refer to it in your response. +To use the tool, you strictly apply the provided tool specification. + +- Explain your step-by-step process, and give brief updates before each step. +- Only use the Weather_Tool for data. Never guess or make up information. +- Repeat the tool use for subsequent requests if necessary. +- If the tool errors, apologize, explain weather is unavailable, and suggest other options. +- Report temperatures in °C (°F) and wind in km/h (mph). Keep weather reports concise. Sparingly use + emojis where appropriate. +- Only respond to weather queries. Remind off-topic users of your purpose. +- Never claim to search online, access external data, or use tools besides Weather_Tool. +- Complete the entire process until you have all required data before sending the complete response. +"; + +// The maximum number of recursive calls allowed in the tool_use_demo function. +// This helps prevent infinite loops and potential performance issues. +const MAX_RECURSIONS: i8 = 5; + +const TOOL_NAME: &str = "Weather_Tool"; +const TOOL_DESCRIPTION: &str = + "Get the current weather for a given location, based on its WGS84 coordinates."; +fn make_tool_schema() -> Document { + Document::Object(HashMap::::from([ + ("type".into(), Document::String("object".into())), + ( + "properties".into(), + Document::Object(HashMap::from([ + ( + "latitude".into(), + Document::Object(HashMap::from([ + ("type".into(), Document::String("string".into())), + ( + "description".into(), + Document::String("Geographical WGS84 latitude of the location.".into()), + ), + ])), + ), + ( + "longitude".into(), + Document::Object(HashMap::from([ + ("type".into(), Document::String("string".into())), + ( + "description".into(), + Document::String( + "Geographical WGS84 longitude of the location.".into(), + ), + ), + ])), + ), + ])), + ), + ( + "required".into(), + Document::Array(vec![ + Document::String("latitude".into()), + Document::String("longitude".into()), + ]), + ), + ])) +} + +#[derive(Debug)] +struct ToolUseScenarioError(String); +impl std::fmt::Display for ToolUseScenarioError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Tool use error with '{}'. Reason: {}", MODEL_ID, self.0) + } +} +impl From<&str> for ToolUseScenarioError { + fn from(value: &str) -> Self { + ToolUseScenarioError(value.into()) + } +} +impl From for ToolUseScenarioError { + fn from(value: BuildError) -> Self { + ToolUseScenarioError(value.to_string().clone()) + } +} +impl From> for ToolUseScenarioError { + fn from(value: SdkError) -> Self { + ToolUseScenarioError(match value.as_service_error() { + Some(value) => value.meta().message().unwrap_or("Unknown").into(), + None => "Unknown".into(), + }) + } +} +// snippet-end:[rust.bedrock-runtime.Converse_AnthropicClaude.tool-use.supporting] + +// snippet-start:[rust.bedrock-runtime.Converse_AnthropicClaude.tool-use.user-interface] +fn print_model_response(block: &ContentBlock) -> Result<(), ToolUseScenarioError> { + if block.is_text() { + let text = block.as_text().unwrap(); + println!("\x1b[0;90mThe model's response:\x1b[0m\n{text}"); + Ok(()) + } else { + Err(ToolUseScenarioError(format!( + "Content block is not text ({block:?})" + ))) + } +} +// snippet-end:[rust.bedrock-runtime.Converse_AnthropicClaude.tool-use.user-interface] + +async fn get_input() -> Result, ToolUseScenarioError> { + let mut line = String::new(); + let mut first = true; + while line.is_empty() { + if first { + println!("Your weather request (x to exit):") + } else { + println!("Please enter your weather request, e.g. the name of a city (x to exit):") + } + first = false; + + stdin() + .read_line(&mut line) + .map_err(|e| ToolUseScenarioError(format!("Failed to read line from stdin: {e:?}")))?; + + if line.trim().to_ascii_lowercase().starts_with('x') { + return Ok(None); + } + } + Ok(Some(line)) +} + +fn header() { + println!( + "================================================================================ +Welcome to the Amazon Bedrock Tool Use demo! +================================================================================ +This assistant provides current weather information for user-specified locations. +You can ask for weather details by providing the location name or coordinates. + +Example queries: +- What's the weather like in New York? +- Current weather for latitude 40.70, longitude -74.01 +- Is it warmer in Rome or Barcelona today? + +To exit the program, simply type 'x' and press Enter. + +P.S.: You're not limited to single locations, or even to using English! +Have fun and experiment with the app!" + ); +} + +fn footer() { + println!( + "================================================================================ +Thank you for checking out the Amazon Bedrock Tool Use demo. We hope you +learned something new, or got some inspiration for your own apps today! + +For more Bedrock examples in different programming languages, have a look at: +https://docs.aws.amazon.com/bedrock/latest/userguide/service_code_examples.html +================================================================================" + ); +} + +// snippet-start:[rust.bedrock-runtime.Converse_AnthropicClaude.tool-use.weather-tool] +const ENDPOINT: &str = "https://api.open-meteo.com/v1/forecast"; +async fn fetch_weather_data( + tool_use: &ToolUseBlock, +) -> Result { + let input = tool_use.input(); + let latitude = input + .as_object() + .unwrap() + .get("latitude") + .unwrap() + .as_string() + .unwrap(); + let longitude = input + .as_object() + .unwrap() + .get("longitude") + .unwrap() + .as_string() + .unwrap(); + let params = [ + ("latitude", latitude), + ("longitude", longitude), + ("current_weather", "true"), + ]; + + debug!("Calling {ENDPOINT} with {params:?}"); + + let response = reqwest::Client::new() + .get(ENDPOINT) + .query(¶ms) + .send() + .await + .map_err(|e| ToolUseScenarioError(format!("Error requesting weather: {e:?}")))? + .error_for_status() + .map_err(|e| ToolUseScenarioError(format!("Failed to request weather: {e:?}")))?; + + debug!("Response: {response:?}"); + + let bytes = response + .bytes() + .await + .map_err(|e| ToolUseScenarioError(format!("Error reading response: {e:?}")))?; + + let result = String::from_utf8(bytes.to_vec()) + .map_err(|_| ToolUseScenarioError("Response was not utf8".into()))?; + + Ok(ToolResultBlock::builder() + .tool_use_id(tool_use.tool_use_id()) + .content(ToolResultContentBlock::Text(result)) + .build()?) +} +// snippet-end:[rust.bedrock-runtime.Converse_AnthropicClaude.tool-use.weather-tool] + +// snippet-start:[rust.bedrock-runtime.Converse_AnthropicClaude.tool-use] +struct InvokeToolResult(String, ToolResultBlock); +struct ToolUseScenario { + client: Client, + conversation: Vec, + system_prompt: SystemContentBlock, + tool_config: ToolConfiguration, +} + +impl ToolUseScenario { + fn new(client: Client) -> Self { + let system_prompt = SystemContentBlock::Text(SYSTEM_PROMPT.into()); + let tool_config = ToolConfiguration::builder() + .tools(Tool::ToolSpec( + ToolSpecification::builder() + .name(TOOL_NAME) + .description(TOOL_DESCRIPTION) + .input_schema(ToolInputSchema::Json(make_tool_schema())) + .build() + .unwrap(), + )) + .build() + .unwrap(); + + ToolUseScenario { + client, + conversation: vec![], + system_prompt, + tool_config, + } + } + + async fn run(&mut self) -> Result<(), ToolUseScenarioError> { + loop { + let input = get_input().await?; + if input.is_none() { + break; + } + + let message = Message::builder() + .role(User) + .content(ContentBlock::Text(input.unwrap())) + .build() + .map_err(ToolUseScenarioError::from)?; + self.conversation.push(message); + + let response = self.send_to_bedrock().await?; + + self.process_model_response(response).await?; + } + + Ok(()) + } + + async fn send_to_bedrock(&mut self) -> Result { + debug!("Sending conversation to bedrock"); + self.client + .converse() + .model_id(MODEL_ID) + .set_messages(Some(self.conversation.clone())) + .system(self.system_prompt.clone()) + .tool_config(self.tool_config.clone()) + .send() + .await + .map_err(ToolUseScenarioError::from) + } + + async fn process_model_response( + &mut self, + mut response: ConverseOutput, + ) -> Result<(), ToolUseScenarioError> { + let mut iteration = 0; + + while iteration < MAX_RECURSIONS { + iteration += 1; + let message = if let Some(ref output) = response.output { + if output.is_message() { + Ok(output.as_message().unwrap().clone()) + } else { + Err(ToolUseScenarioError( + "Converse Output is not a message".into(), + )) + } + } else { + Err(ToolUseScenarioError("Missing Converse Output".into())) + }?; + + self.conversation.push(message.clone()); + + match response.stop_reason { + StopReason::ToolUse => { + response = self.handle_tool_use(&message).await?; + } + StopReason::EndTurn => { + print_model_response(&message.content[0])?; + return Ok(()); + } + _ => (), + } + } + + Err(ToolUseScenarioError( + "Exceeded MAX_ITERATIONS when calling tools".into(), + )) + } + + async fn handle_tool_use( + &mut self, + message: &Message, + ) -> Result { + let mut tool_results: Vec = vec![]; + + for block in &message.content { + match block { + ContentBlock::Text(_) => print_model_response(block)?, + ContentBlock::ToolUse(tool) => { + let tool_response = self.invoke_tool(tool).await?; + tool_results.push(ContentBlock::ToolResult(tool_response.1)); + } + _ => (), + }; + } + + let message = Message::builder() + .role(User) + .set_content(Some(tool_results)) + .build()?; + self.conversation.push(message); + + self.send_to_bedrock().await + } + + async fn invoke_tool( + &mut self, + tool: &ToolUseBlock, + ) -> Result { + match tool.name() { + TOOL_NAME => { + println!( + "\x1b[0;90mExecuting tool: {TOOL_NAME} with input: {:?}...\x1b[0m", + tool.input() + ); + let content = fetch_weather_data(tool).await?; + println!( + "\x1b[0;90mTool responded with {:?}\x1b[0m", + content.content() + ); + Ok(InvokeToolResult(tool.tool_use_id.clone(), content)) + } + _ => Err(ToolUseScenarioError(format!( + "The requested tool with name {} does not exist", + tool.name() + ))), + } + } +} + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + let sdk_config = aws_config::defaults(BehaviorVersion::latest()) + .region(CLAUDE_REGION) + .load() + .await; + let client = Client::new(&sdk_config); + + let mut scenario = ToolUseScenario::new(client); + + header(); + if let Err(err) = scenario.run().await { + println!("There was an error running the scenario! {}", err.0) + } + footer(); +} +// snippet-end:[rust.bedrock-runtime.Converse_AnthropicClaude.tool-use] From 5512ed9679fb676dddabafc391f6939fabceacd9 Mon Sep 17 00:00:00 2001 From: Scott Macdonald <57190223+scmacdon@users.noreply.github.com> Date: Fri, 26 Jul 2024 08:28:28 -0400 Subject: [PATCH 12/98] Add example to get an EC2 password (#6685) --- .doc_gen/metadata/ec2_metadata.yaml | 13 +++ javav2/example_code/ec2/README.md | 1 + .../java/com/example/ec2/GetPasswordData.java | 81 +++++++++++++++++++ .../ec2/src/test/java/EC2Test.java | 26 +++++- 4 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/GetPasswordData.java diff --git a/.doc_gen/metadata/ec2_metadata.yaml b/.doc_gen/metadata/ec2_metadata.yaml index fc424893507..e1568abd7ba 100644 --- a/.doc_gen/metadata/ec2_metadata.yaml +++ b/.doc_gen/metadata/ec2_metadata.yaml @@ -70,6 +70,19 @@ ec2_Hello: - ec2.ruby.hello_ec2 services: ec2: {DescribeSecurityGroups} +ec2_GetPasswordData: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/ec2 + sdkguide: + excerpts: + - description: + snippet_tags: + - ec2.java2.get_password.main + services: + ec2: {GetPasswordData} ec2_CreateKeyPair: languages: .NET: diff --git a/javav2/example_code/ec2/README.md b/javav2/example_code/ec2/README.md index d39ac28b398..017539272d7 100644 --- a/javav2/example_code/ec2/README.md +++ b/javav2/example_code/ec2/README.md @@ -50,6 +50,7 @@ Code excerpts that show you how to call individual service functions. - [DescribeKeyPairs](src/main/java/com/example/ec2/EC2Scenario.java#L623) - [DescribeSecurityGroups](src/main/java/com/example/ec2/EC2Scenario.java#L556) - [DisassociateAddress](src/main/java/com/example/ec2/EC2Scenario.java#L314) +- [GetPasswordData](src/main/java/com/example/ec2/GetPasswordData.java#L7) - [ReleaseAddress](src/main/java/com/example/ec2/EC2Scenario.java#L298) - [RunInstances](src/main/java/com/example/ec2/CreateInstance.java#L6) - [StartInstances](src/main/java/com/example/ec2/EC2Scenario.java#L368) diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/GetPasswordData.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/GetPasswordData.java new file mode 100644 index 00000000000..4b9f6405c20 --- /dev/null +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/GetPasswordData.java @@ -0,0 +1,81 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + + +package com.example.ec2; + +// snippet-start:[ec2.java2.get_password.main] +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.exception.SdkServiceException; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.ec2.Ec2Client; +import software.amazon.awssdk.services.ec2.model.Ec2Exception; +import software.amazon.awssdk.services.ec2.model.GetPasswordDataRequest; +import software.amazon.awssdk.services.ec2.model.GetPasswordDataResponse; +import software.amazon.awssdk.services.secretsmanager.model.ResourceNotFoundException; + +/** + * Before running this Java V2 code example, set up your development + * environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html + */ +public class GetPasswordData { + + public static void main(String[] args) { + final String usage = """ + + Usage: + + + Where: + instanceId - An instance id from which the password is obtained.\s + """; + + if (args.length != 1) { + System.out.println(usage); + return; + } + + Region region = Region.US_EAST_1; + Ec2Client ec2 = Ec2Client.builder() + .region(region) + .build(); + + String instanceId = args[0]; + getPasswordData(ec2,instanceId); + } + + /** + * Retrieves and prints the encrypted administrator password data for a specified EC2 instance. + * + *

The password data is encrypted using the key pair that was specified when the instance was launched. + * To decrypt the password data, you can use the private key of the key pair.

+ * + * @param ec2 The {@link Ec2Client} to use for making the request. + * @param instanceId The ID of the instance for which to get the encrypted password data. + */ + public static void getPasswordData(Ec2Client ec2,String instanceId) { + GetPasswordDataRequest getPasswordDataRequest = GetPasswordDataRequest.builder() + .instanceId(instanceId) + .build(); + + try { + GetPasswordDataResponse getPasswordDataResponse = ec2.getPasswordData(getPasswordDataRequest); + String encryptedPasswordData = getPasswordDataResponse.passwordData(); + System.out.println("Encrypted Password Data: " + encryptedPasswordData); + + } catch (Ec2Exception e) { + String errorCode = e.awsErrorDetails().errorCode(); + if (errorCode.matches("InvalidInstanceID.NotFound")) { + System.err.println("Instance ID not found, unable to retrieve password data."); + } else { + System.err.println("There was a problem retrieving password data. Details:"); + e.printStackTrace(); + } + } + } + } +// snippet-end:[ec2.java2.get_password.main] \ No newline at end of file diff --git a/javav2/example_code/ec2/src/test/java/EC2Test.java b/javav2/example_code/ec2/src/test/java/EC2Test.java index afa59b8d561..f282b898902 100644 --- a/javav2/example_code/ec2/src/test/java/EC2Test.java +++ b/javav2/example_code/ec2/src/test/java/EC2Test.java @@ -26,6 +26,8 @@ public class EC2Test { private static Ec2Client ec2; + + private static Ec2Client ec2East; private static SsmClient ssmClient; // Define the data members required for the tests. @@ -44,6 +46,8 @@ public class EC2Test { private static String vpcIdSc = ""; private static String myIpAddressSc = ""; + private static String winServer = ""; + @BeforeAll public static void setUp() throws IOException { Region region = Region.US_WEST_2; @@ -52,6 +56,12 @@ public static void setUp() throws IOException { .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .build(); + Region regionEast = Region.US_EAST_1; + ec2East = Ec2Client.builder() + .region(regionEast) + .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) + .build(); + ssmClient = SsmClient.builder() .region(region) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) @@ -73,6 +83,7 @@ public static void setUp() throws IOException { groupNameSc = values.getGroupDescSc() + java.util.UUID.randomUUID(); vpcIdSc = values.getVpcIdSc(); myIpAddressSc = values.getMyIpAddressSc(); + winServer = values.getWinServer(); // Uncomment this code block if you prefer using a config.properties file to // retrieve AWS values required for these tests. @@ -221,7 +232,15 @@ public void TerminateInstance() { @Test @Tag("IntegrationTest") @Order(15) - public void TestEC2Scenario() throws InterruptedException { + public void testGetPassword() { + GetPasswordData.getPasswordData(ec2East, winServer); + System.out.println(EC2Scenario.DASHES); + } + + @Test + @Tag("IntegrationTest") + @Order(16) + public void TestEC2Scenario() { System.out.println(EC2Scenario.DASHES); System.out.println("1. Create an RSA key pair and save the private key material as a .pem file."); EC2Scenario.createKeyPair(ec2, keyNameSc, fileNameSc); @@ -314,6 +333,7 @@ public void TestEC2Scenario() throws InterruptedException { EC2Scenario.releaseEC2Address(ec2, allocationId); System.out.println(EC2Scenario.DASHES); + System.out.println(EC2Scenario.DASHES); System.out.println("15. Terminate the instance."); EC2Scenario.terminateEC2(ec2, newInstanceId); @@ -370,6 +390,8 @@ class SecretValues { private String myIpAddressSc; + private String winServer; + public String getAmi() { return ami; } @@ -417,5 +439,7 @@ public String getVpcIdSc() { public String getMyIpAddressSc() { return myIpAddressSc; } + + public String getWinServer(){return winServer;} } } From 9e049d85454052fd586bdc2edaf461901e11863c Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Fri, 26 Jul 2024 16:36:09 -0400 Subject: [PATCH 13/98] JavaScript (v3): README - Offload contribution guidance to the wiki. (#6694) --- javascriptv3/README.md | 55 +----------------------------------------- 1 file changed, 1 insertion(+), 54 deletions(-) diff --git a/javascriptv3/README.md b/javascriptv3/README.md index da10c4c05dd..f027828e091 100644 --- a/javascriptv3/README.md +++ b/javascriptv3/README.md @@ -78,60 +78,7 @@ This example is available in a container image hosted on [Amazon Elastic Contain ## Contribute -Contributions are welcome. To increase the likelihood of your contribution -being accepted, adhere to the following guidelines. - -### Maintain directory structure - -- `javascriptv3` is considered the project root. -- All examples exist under `example_code`. -- Each directory under `example_code` corresponds to an AWS service. -- Directory names should be lowercase with underscores. -- File names should be lowercase with dashes. -- `cross-services` is a special directory for examples that use multiple services. -- A service directory has the following structure: - - ``` - actions/ - {action-name}.js - scenarios/ - web/ - {web-scenario-name}/ - {scenario-name}.js - tests/ - {integ-test-name}.integration.test.js - {unit-test-name}.unit.test.js - client.js - package.json - README.md - vite.config.js - ``` - -### Create runnable actions and scenarios - -Place the following code at the bottom of each example -to make it runnable from the command line. - -``` -// Invoke main function if this file was run directly. -if (process.argv[1] === fileURLToPath(import.meta.url)) { - functionName(); -} -``` - -### Create testable actions and scenarios - -Export one primary function from each example. Do not create examples -that require input or cannot run without human intervention. - -Create function names that match the action name. `CreateUserCommand` becomes -`createUser`. - -``` -export const createUser = (name) => { - const command = new CreateUserCommand({ UserName: name }); - return client.send(command); -}; -``` +Contributions are welcome. To increase the likelihood of your contribution being accepted, please adhere to the [JavaScript standards](https://github.com/awsdocs/aws-doc-sdk-examples/wiki/JavaScript-code-example-standards) ### Create tests From 4ed4fa5dfead7fe689df2a61bfb645ed33dce2a0 Mon Sep 17 00:00:00 2001 From: Scott Macdonald <57190223+scmacdon@users.noreply.github.com> Date: Thu, 1 Aug 2024 10:33:34 -0400 Subject: [PATCH 14/98] Java V2 Add S3 files for the S3 Basics Batch scenario (#6676) Add the S3 Batch Basics Scenario --- .doc_gen/metadata/s3-control_metadata.yaml | 129 +++ basics_scenarios/s3_batch/README.md | 67 ++ basics_scenarios/s3_batch/SPECIFICATION.md | 223 ++++++ javav2/example_code/s3/pom.xml | 21 +- .../s3/batch/CloudFormationHelper.java | 128 +++ .../com/example/s3/batch/HelloS3Batch.java | 115 +++ .../com/example/s3/batch/S3BatchActions.java | 733 ++++++++++++++++++ .../com/example/s3/batch/S3BatchScenario.java | 238 ++++++ .../src/main/resources/batch/job-manifest.csv | 4 + .../s3/src/test/java/S3BatchTest.java | 207 +++++ javav2/example_code/s3/template.yaml | 142 ++++ 11 files changed, 1991 insertions(+), 16 deletions(-) create mode 100644 .doc_gen/metadata/s3-control_metadata.yaml create mode 100644 basics_scenarios/s3_batch/README.md create mode 100644 basics_scenarios/s3_batch/SPECIFICATION.md create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/batch/CloudFormationHelper.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/batch/HelloS3Batch.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/batch/S3BatchActions.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/batch/S3BatchScenario.java create mode 100644 javav2/example_code/s3/src/main/resources/batch/job-manifest.csv create mode 100644 javav2/example_code/s3/src/test/java/S3BatchTest.java create mode 100644 javav2/example_code/s3/template.yaml diff --git a/.doc_gen/metadata/s3-control_metadata.yaml b/.doc_gen/metadata/s3-control_metadata.yaml new file mode 100644 index 00000000000..120f1242d6d --- /dev/null +++ b/.doc_gen/metadata/s3-control_metadata.yaml @@ -0,0 +1,129 @@ +s3-control_Hello: + title: Hello &S3Control; + title_abbrev: Hello '&S3Control;' + synopsis: get started using '&S3Control;' + category: Hello + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: + snippet_tags: + - s3control.java2.list_jobs.main + services: + s3-control: {ListJobsPaginator} + +s3-control_CreateJob: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: + snippet_tags: + - s3control.java2.create_job.async.main + services: + s3-control: {CreateJob} +s3-control_PutJobTagging: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: + snippet_tags: + - s3control.java2.job.put.tags.main + services: + s3-control: {PutJobTagging} +s3-control_DescribeJob: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: + snippet_tags: + - s3control.java2.describe_job.main + services: + s3-control: {DescribeJob} +s3-control_DeleteJobTagging: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: + snippet_tags: + - s3control.java2.del_job_tagging.main + services: + s3-control: {DeleteJobTagging} +s3-control_GetJobTagging: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: + snippet_tags: + - s3control.java2.get_job_tagging.main + services: + s3-control: {GetJobTagging} +s3-control_UpdateJobStatus: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: + snippet_tags: + - s3control.java2.cancel_job.main + services: + s3-control: {UpdateJobStatus} +s3-control_UpdateJobPriority: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: + snippet_tags: + - s3control.java2.update_job.main + services: + s3-control: {UpdateJobPriority} +s3-control_Basics: + title: Learn core operations for'&S3Control;' using an &AWS; SDK + title_abbrev: Learn core operations + synopsis: learn core operations for'&S3Control;'. + category: Scenarios + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: Learn core operations. + snippet_tags: + - s3control.java2.job.scenario.main + - description: An action class that wraps operations. + snippet_tags: + - s3control.java2.job.actions.main + services: + s3-control: {CreateJob, DeleteJobTagging, DescribeJob, GetJobTagging, ListJobs, PutJobTagging, UpdateJobPriority, UpdateJobStatus} diff --git a/basics_scenarios/s3_batch/README.md b/basics_scenarios/s3_batch/README.md new file mode 100644 index 00000000000..dec3b028d4e --- /dev/null +++ b/basics_scenarios/s3_batch/README.md @@ -0,0 +1,67 @@ +# Amazon S3 Batch Basics Scenario + +## Introduction +This scenario demonstrates how to use the AWS SDK to interact with Amazon Simple Storage Service (S3) using AWS Batch. The scenario covers various operations such as creating a batch job, modifying the job, and adding additional tags to the job. + +## Setting up Resources +To successfully run this basic scenario, the program requires an IAM (Identity and Access Management) role. However, the program creates the IAM role by using an AWS CloudFormation template. + +## Service Operations Invoked +The program performs the following tasks: + +1. **Create Batch Job**: + - Amazon S3 Batch Operation: `CreateJob` + +2. **Describe Batch Job**: + - Amazon S3 Batch Operation: `DescribeJob` + +3. **Describe the tags associated with the job**: + - Amazon S3 Batch Operation: `getJobTagging` + +4. **Update Batch Job Tags**: + - Amazon S3 Batch Operation: `putJobTagging` + +5. **List Batch Jobs**: + - Amazon S3 Batch Operation: `listJobs` + +6. **Update an existing S3 Batch Operations job's priority**: + - Amazon S3 Batch Operation: `updateJobPriority` + +7. **Cancel the S3 Batch job**: + - Amazon S3 Batch Operation: `updateJobStatus` + +8. **Delete the Amazon S3 Batch job tagging**: + - Amazon S3 Batch Operation: `deleteJobTagging` + + +## Usage +1. Clone the repository or download the source code. +2. Open the code in your preferred IDE. +3. Invoke the main method in the `S3BatchScenario` class. + +## Code Explanation +The provided code demonstrates the following key features of the AWS SDK and the S3 Batch functionality: + +1. **User Interaction**: The program begins with a user prompt to provide the AWS account ID and continues to interact with the user for input to proceed with various steps of the scenario. + +2. **Resource Setup**: It uses AWS CloudFormation to set up necessary resources, such as an IAM role required for S3 Batch operations. + +3. **Bucket Operations**: Creates an S3 bucket and uploads required files, including a manifest file listing the objects for the batch job. + +4. **Job Creation**: Creates an S3 Batch job to tag objects listed in the manifest file with specific tags. + +5. **Job Priority Update**: Modifies the priority of the created S3 Batch job. + +6. **Job Cancellation**: Provides the option to cancel the S3 Batch job based on user input. + +7. **Job Description**: Retrieves and displays details of the created S3 Batch job. + +8. **Job Tag Description**: Retrieves and displays tags associated with the S3 Batch job. + +9. **Job Tag Update**: Updates the tags of the S3 Batch job. + +10. **List Batch Jobs**: Lists all batch jobs in the account. + +11. **Delete Job Tags**: Provides the option to delete the tags associated with the S3 Batch job. + +12. **Cleanup Resources**: Provides the option to delete the created S3 bucket, its contents, and the CloudFormation stack to clean up resources used in the scenario. diff --git a/basics_scenarios/s3_batch/SPECIFICATION.md b/basics_scenarios/s3_batch/SPECIFICATION.md new file mode 100644 index 00000000000..3a014758e10 --- /dev/null +++ b/basics_scenarios/s3_batch/SPECIFICATION.md @@ -0,0 +1,223 @@ +# Amazon S3 Batch Basics Scenario Specification + +## Overview + +This document outlines the technical specifications for the _Amazon S3 Batch Basic Scenario_, a scenario designed to demonstrate Amazon S3 Batch opertions functionality and SDKs. It is primarily intended for the AWS code examples team to use while developing this example in additional languages. + + +## Resources +The required resource is an IAM role that is automatically created using an AWS CloudFormation template. + +## Scenario Program Flow +The Amazon S3 Batch basic scenario executes the following steps: + +1. **Introduce Amazon S3 Batch**: The program provides a brief introduction to Amazon S3 Batch functionality. + +2. **Create resources**: Uses Amazon CloudFormation to create the resources. + +3. **Create Batch Job**: The program creates an S3 Batch job. + +4. **Cancel the S3 Batch job**: The program cancels the S3 Batch job if the user requests that action. + +5. **Describe the job**: The program describes the job that was just created. Details such as the status and the job priority are displayed. + +6. **Describe the tags**: The program describes the tags associated with the job. + +7. **Update Batch Job Tags**: The program adds additional tags to the job. + +8. **List Batch Jobs**: The program lists all batch jobs under the account. + +9. **Delete the Amazon S3 Batch job tagging**: The program deletes the job tagging. + +10. **Delete the resources**: The program deletes the CloudFormation stack and the S3 bucket used in the scenario. + + +### Program execution +The following shows the output of the Amazon S3 Batch program in the console. + +``` +-------------------------------------------------------------------------------- +Welcome to the Amazon S3 Batch basics scenario. +S3 Batch is a powerful service provided by AWS that enables efficient and +cost-effective processing of large-scale data stored in Amazon S3. +It automatically scales resources to handle varying workloads without the need for manual +intervention. + +One of the key features of S3 Batch is its ability to perform tagging operations on objects stored in +S3 buckets. Users can leverage S3 Batch to apply, update, or remove tags on thousands or millions of +objects in a single operation, streamlining the management and organization of their data. + +This can be particularly useful for tasks such as cost allocation, lifecycle management, or +metadata-driven workflows, where consistent and accurate tagging is essential. +S3 Batch's scalability and serverless nature make it an ideal solution for organizations with +growing data volumes and complex data management requirements. + +This Java program walks you through Amazon S3 Batch operations. + +Let's get started... + + + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Use CloudFormation to stand up the resource required for this scenario. +Stack creation requested, ARN is arn:aws:cloudformation:us-east-1:814548047983:stack/MyS3Stack/b8ae9450-482a-11ef-ab7a-0affc0d36e9d +Stack created successfully +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +Setup the required bucket for this scenario. + +Enter 'c' followed by to continue: +c +Continuing with the program... + +HeadBucketResponse(BucketRegion=us-east-1, AccessPointAlias=false) +x-fc084273-7496-4528-bd74-172a6141ae02 is ready +Populate the bucket with the required files. +CSV file updated successfully. +Successfully placed job-manifest.csv into bucket x-fc084273-7496-4528-bd74-172a6141ae02 +Successfully placed object-key-1.txt into bucket x-fc084273-7496-4528-bd74-172a6141ae02 +Successfully placed object-key-2.txt into bucket x-fc084273-7496-4528-bd74-172a6141ae02 +Successfully placed object-key-3.txt into bucket x-fc084273-7496-4528-bd74-172a6141ae02 +Successfully placed object-key-4.txt into bucket x-fc084273-7496-4528-bd74-172a6141ae02 +All files are placed in bucket x-fc084273-7496-4528-bd74-172a6141ae02 + +Enter 'c' followed by to continue: +c +Continuing with the program... + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +1. Create a S3 Batch Job +This job tags all objects listed in the manifest file with tags + +Enter 'c' followed by to continue: +c +Continuing with the program... + +The Job id is 391171f8-d831-4931-a7eb-d56c43610e4b + +Enter 'c' followed by to continue: +c +Continuing with the program... + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +2. Update an existing S3 Batch Operations job's priority +In this step, we modify the job priority value. The higher the number, the higher the priority. +So, a job with a priority of `30` would have a higher priority than a job with +a priority of `20`. This is a common way to represent the priority of a task +or job, with higher numbers indicating a higher priority. + +Ensure that the job status allows for priority updates. Jobs in certain +states (e.g., Cancelled, Failed, or Completed) cannot have their priorities +updated. Only jobs in the Active or Suspended state typically allow priority +updates. + +The job priority was updated + +Enter 'c' followed by to continue: +c +Continuing with the program... + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +3. Cancel the S3 Batch job +Do you want to cancel the Batch job? (y/n): n +Job 391171f8-d831-4931-a7eb-d56c43610e4b was not canceled. +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +4. Describe the job that was just created + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Job ID: 391171f8-d831-4931-a7eb-d56c43610e4b +Description: Job created using the AWS Java SDK +Status: Active +Role ARN: arn:aws:iam::1234567890983:role/MyS3Stack-S3BatchRole8238262D-Vi5aVsQaZ776 +Priority: 60 +Progress Summary: JobProgressSummary(TotalNumberOfTasks=4, NumberOfTasksSucceeded=0, NumberOfTasksFailed=0, Timers=JobTimers(ElapsedTimeInActiveSeconds=5)) +Manifest Location: arn:aws:s3:::x-fc084273-7496-4528-bd74-172a6141ae02/job-manifest.csv +Manifest ETag: "a7709805d2162c992ad79219340af58b" +Operation: S3 Put Object Tagging +Tag Set: [S3Tag(Key=keyOne, Value=ValueOne), S3Tag(Key=keyTwo, Value=ValueTwo)] +Report Bucket: arn:aws:s3:::x-fc084273-7496-4528-bd74-172a6141ae02 +Report Prefix: reports +Report Format: Report_CSV_20180820 +Report Enabled: true +Report Scope: AllTasks +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +5. Describe the tags associated with the job + +Enter 'c' followed by to continue: +c +Continuing with the program... + +No tags found for job ID: 391171f8-d831-4931-a7eb-d56c43610e4b +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +6. Update Batch Job Tags + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Additional Tags were added to job 391171f8-d831-4931-a7eb-d56c43610e4b +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +7. List Batch Jobs + +Enter 'c' followed by to continue: +c +Continuing with the program... + +The job id is eb27cb53-7793-4d5d-95f0-fa3226f25540 +The job priority is 60 +The job id is 66ea3d82-936e-4c9c-90dc-f0bb5aaf315e +The job priority is 42 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +8. Delete the Amazon S3 Batch job tagging. +Do you want to delete Batch job tagging? (y/n)y +You have successfully deleted 391171f8-d831-4931-a7eb-d56c43610e4b tagging. +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +Do you want to delete the AWS resources used in this scenario? (y/n)y +All files have been deleted from the bucket x-fc084273-7496-4528-bd74-172a6141ae02 +The object was deleted! +The object was deleted! +The object was deleted! +The object was deleted! +The object was deleted! +Deleted object: reports/job-391171f8-d831-4931-a7eb-d56c43610e4b/manifest.json +Deleted folder: reports/ +x-fc084273-7496-4528-bd74-172a6141ae02 was deleted +Delete stack requested .... +Stack deleted successfully. +The Amazon S3 Batch scenario has successfully completed. +-------------------------------------------------------------------------------- + +``` + +## SOS Tags + +The following table describes the metadata used in this Basics Scenario. + + +| action | metadata file | metadata key | +|------------------------------|------------------------------|---------------------------------------- | +| `createjob` | s3-control_metadata.yaml | s3-control_CreateJob | +| `updateJobPriority` | s3-control_metadata.yaml | s3-control_UpdateJobPriority | +| `updateJobStatus` | s3-control_metadata.yaml | s3-control_UpdateJobStatus | +| `listJobs` | s3-control_metadata.yaml | s3-control_ListJobs | +| `getJobTagging` | s3-control_metadata.yaml | s3-control_GetJobTagging | +| `deleteJobTagging` | s3-control_metadata.yaml | s3-control_DeleteJobTagging | +| `describeJob` | s3-control_metadata.yaml | s3-control_DescribeJob | +| `putJobTagging` | s3-control_metadata.yaml | s3-control_PutJobTagging | +| `scenario | s3-control_metadata.yaml | s3-control_Basics | + diff --git a/javav2/example_code/s3/pom.xml b/javav2/example_code/s3/pom.xml index ddeb5f5b1ca..6a5badbe402 100644 --- a/javav2/example_code/s3/pom.xml +++ b/javav2/example_code/s3/pom.xml @@ -51,22 +51,7 @@ - - org.apache.maven.plugins - maven-checkstyle-plugin - 3.1.1 - - checkstyle.xml - - - - com.puppycrawl.tools - checkstyle - 10.15.0 - - - - + @@ -98,6 +83,10 @@ 5.9.2 test
+ + software.amazon.awssdk + cloudformation + org.junit.jupiter junit-jupiter-engine diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/batch/CloudFormationHelper.java b/javav2/example_code/s3/src/main/java/com/example/s3/batch/CloudFormationHelper.java new file mode 100644 index 00000000000..e8e51901b2f --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/batch/CloudFormationHelper.java @@ -0,0 +1,128 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.s3.batch; + +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.cloudformation.CloudFormationAsyncClient; +import software.amazon.awssdk.services.cloudformation.CloudFormationClient; +import software.amazon.awssdk.services.cloudformation.model.Capability; +import software.amazon.awssdk.services.cloudformation.model.CloudFormationException; +import software.amazon.awssdk.services.cloudformation.model.DescribeStacksRequest; +import software.amazon.awssdk.services.cloudformation.model.DescribeStacksResponse; +import software.amazon.awssdk.services.cloudformation.model.Stack; +import software.amazon.awssdk.services.cloudformation.model.Output; +import software.amazon.awssdk.services.cloudformation.waiters.CloudFormationAsyncWaiter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +public class CloudFormationHelper { + + private static CloudFormationAsyncClient getCloudFormationClient() { + CloudFormationAsyncClient cfClient = CloudFormationAsyncClient.builder() + .region(Region.US_EAST_1) + .build(); + + return cfClient; + } + + public static void deployCloudFormationStack(String stackName) { + String templateBody; + boolean doesExist = describeStack(stackName); + if (!doesExist) { + try { + Path filePath = Paths.get("template.yaml").toAbsolutePath(); + templateBody = Files.readString(filePath); + } catch (IOException e) { + throw new RuntimeException(e); + } + + getCloudFormationClient().createStack(b -> b.stackName(stackName) + .templateBody(templateBody) + .capabilities(Capability.CAPABILITY_IAM)) + .whenComplete((csr, t) -> { + if (csr != null) { + System.out.println("Stack creation requested, ARN is " + csr.stackId()); + try (CloudFormationAsyncWaiter waiter = getCloudFormationClient().waiter()) { + waiter.waitUntilStackCreateComplete(request -> request.stackName(stackName)) + .whenComplete((dsr, th) -> { + if (th != null) { + System.out.println("Error waiting for stack creation: " + th.getMessage()); + } else { + dsr.matched().response().orElseThrow(() -> new RuntimeException("Failed to deploy")); + System.out.println("Stack created successfully"); + } + }).join(); + } + } else { + System.out.format("Error creating stack: " + t.getMessage(), t); + throw new RuntimeException(t.getCause().getMessage(), t); + } + }).join(); + } + } + + // Check to see if the Stack exists before deploying it + + public static Boolean describeStack(String stackName) { + try { + CompletableFuture future = getCloudFormationClient().describeStacks(); + DescribeStacksResponse stacksResponse = (DescribeStacksResponse) future.join(); + List stacks = stacksResponse.stacks(); + for (Stack myStack :stacks) { + if (myStack.stackName().compareTo(stackName)==0){ + return true; + } + } + } catch (CloudFormationException e) { + System.err.println(e.getMessage()); + } + return false; + } + public static void destroyCloudFormationStack(String stackName) { + getCloudFormationClient().deleteStack(b -> b.stackName(stackName)) + .whenComplete((dsr, t) -> { + if (dsr != null) { + System.out.println("Delete stack requested ...."); + try (CloudFormationAsyncWaiter waiter = getCloudFormationClient().waiter()) { + waiter.waitUntilStackDeleteComplete(request -> request.stackName(stackName)) + .whenComplete((waiterResponse, throwable) -> + System.out.println("Stack deleted successfully.")) + .join(); + } + } else { + System.out.format("Error deleting stack: " + t.getMessage(), t); + throw new RuntimeException(t.getCause().getMessage(), t); + } + }).join(); + } + + public static Map getStackOutputs(String stackName) { + CloudFormationClient cfClient = CloudFormationClient.create(); + DescribeStacksRequest describeStacksRequest = DescribeStacksRequest.builder() + .stackName(stackName) + .build(); + + DescribeStacksResponse describeStacksResponse = cfClient.describeStacks(describeStacksRequest); + List stacks = describeStacksResponse.stacks(); + + if (stacks.isEmpty()) { + throw new RuntimeException("Stack not found: " + stackName); + } + + Stack stack = stacks.get(0); + Map outputs = new HashMap<>(); + for (Output output : stack.outputs()) { + outputs.put(output.outputKey(), output.outputValue()); + } + + return outputs; + } +} + diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/batch/HelloS3Batch.java b/javav2/example_code/s3/src/main/java/com/example/s3/batch/HelloS3Batch.java new file mode 100644 index 00000000000..0d8cde36b09 --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/batch/HelloS3Batch.java @@ -0,0 +1,115 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.s3.batch; +// snippet-start:[s3control.java2.list_jobs.main] +import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; +import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; +import software.amazon.awssdk.core.retry.RetryPolicy; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3control.S3ControlAsyncClient; +import software.amazon.awssdk.services.s3control.model.JobListDescriptor; +import software.amazon.awssdk.services.s3control.model.JobStatus; +import software.amazon.awssdk.services.s3control.model.ListJobsRequest; +import software.amazon.awssdk.services.s3control.paginators.ListJobsPublisher; +import java.time.Duration; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; + +public class HelloS3Batch { + private static S3ControlAsyncClient asyncClient; + public static void main(String []args ) { + S3BatchActions actions = new S3BatchActions(); + String accountId= actions.getAccountId(); + try { + listBatchJobsAsync(accountId) + .exceptionally(ex -> { + System.err.println("List batch jobs failed: " + ex.getMessage()); + return null; + }) + .join(); // Wait for completion + + } catch (CompletionException ex) { + System.err.println("Failed to list batch jobs: " + ex.getMessage()); + } + } + + /** + * Retrieves the asynchronous S3 Control client instance. + *

+ * This method creates and returns a singleton instance of the {@link S3ControlAsyncClient}. If the instance + * has not been created yet, it will be initialized with the following configuration: + *

    + *
  • Maximum concurrency: 100
  • + *
  • Connection timeout: 60 seconds
  • + *
  • Read timeout: 60 seconds
  • + *
  • Write timeout: 60 seconds
  • + *
  • API call timeout: 2 minutes
  • + *
  • API call attempt timeout: 90 seconds
  • + *
  • Retry policy: 3 retries
  • + *
  • Region: US_EAST_1
  • + *
  • Credentials provider: {@link EnvironmentVariableCredentialsProvider}
  • + *
+ * + * @return the asynchronous S3 Control client instance + */ + private static S3ControlAsyncClient getAsyncClient() { + if (asyncClient == null) { + SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() + .maxConcurrency(100) + .connectionTimeout(Duration.ofSeconds(60)) + .readTimeout(Duration.ofSeconds(60)) + .writeTimeout(Duration.ofSeconds(60)) + .build(); + + ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() + .apiCallTimeout(Duration.ofMinutes(2)) + .apiCallAttemptTimeout(Duration.ofSeconds(90)) + .retryPolicy(RetryPolicy.builder() + .numRetries(3) + .build()) + .build(); + + asyncClient = S3ControlAsyncClient.builder() + .region(Region.US_EAST_1) + .httpClient(httpClient) + .overrideConfiguration(overrideConfig) + .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) + .build(); + } + return asyncClient; + } + + + /** + * Asynchronously lists batch jobs that have completed for the specified account. + * + * @param accountId the ID of the account to list jobs for + * @return a CompletableFuture that completes when the job listing operation is finished + */ + public static CompletableFuture listBatchJobsAsync(String accountId) { + ListJobsRequest jobsRequest = ListJobsRequest.builder() + .jobStatuses(JobStatus.COMPLETE) + .accountId(accountId) + .maxResults(10) + .build(); + + ListJobsPublisher publisher = getAsyncClient().listJobsPaginator(jobsRequest); + return publisher.subscribe(response -> { + List jobs = response.jobs(); + for (JobListDescriptor job : jobs) { + System.out.println("The job id is " + job.jobId()); + System.out.println("The job priority is " + job.priority()); + } + }).thenAccept(response -> { + System.out.println("Listing batch jobs completed"); + }).exceptionally(ex -> { + System.err.println("Failed to list batch jobs: " + ex.getMessage()); + throw new RuntimeException(ex); + }); + } + // snippet-end:[s3control.java2.list_jobs.main] +} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/batch/S3BatchActions.java b/javav2/example_code/s3/src/main/java/com/example/s3/batch/S3BatchActions.java new file mode 100644 index 00000000000..70f0edb0f1e --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/batch/S3BatchActions.java @@ -0,0 +1,733 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.s3.batch; +import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; +import software.amazon.awssdk.core.async.AsyncRequestBody; +import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; +import software.amazon.awssdk.core.retry.RetryPolicy; +import software.amazon.awssdk.core.waiters.WaiterResponse; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.CreateBucketRequest; +import software.amazon.awssdk.services.s3.model.Delete; +import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; +import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; +import software.amazon.awssdk.services.s3.model.DeleteObjectResponse; +import software.amazon.awssdk.services.s3.model.DeleteObjectsRequest; +import software.amazon.awssdk.services.s3.model.HeadBucketRequest; +import software.amazon.awssdk.services.s3.model.HeadBucketResponse; +import software.amazon.awssdk.services.s3.model.HeadObjectRequest; +import software.amazon.awssdk.services.s3.model.HeadObjectResponse; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; +import software.amazon.awssdk.services.s3.model.ObjectIdentifier; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectResponse; +import software.amazon.awssdk.services.s3.model.S3Exception; +import software.amazon.awssdk.services.s3.waiters.S3Waiter; +import software.amazon.awssdk.services.s3control.S3ControlAsyncClient; +import software.amazon.awssdk.services.s3control.model.CreateJobRequest; +import software.amazon.awssdk.services.s3control.model.CreateJobResponse; +import software.amazon.awssdk.services.s3control.model.DeleteJobTaggingRequest; +import software.amazon.awssdk.services.s3control.model.DescribeJobRequest; +import software.amazon.awssdk.services.s3control.model.GetJobTaggingRequest; +import software.amazon.awssdk.services.s3control.model.JobManifest; +import software.amazon.awssdk.services.s3control.model.JobManifestLocation; +import software.amazon.awssdk.services.s3control.model.JobManifestSpec; +import software.amazon.awssdk.services.s3control.model.JobOperation; +import software.amazon.awssdk.services.s3control.model.JobReport; +import software.amazon.awssdk.services.s3control.model.JobStatus; +import software.amazon.awssdk.services.s3control.model.PutJobTaggingRequest; +import software.amazon.awssdk.services.s3control.model.S3ControlException; +import software.amazon.awssdk.services.s3control.model.S3SetObjectTaggingOperation; +import software.amazon.awssdk.services.s3control.model.S3Tag; +import software.amazon.awssdk.services.s3control.model.UpdateJobPriorityRequest; +import software.amazon.awssdk.services.s3control.model.UpdateJobStatusRequest; +import software.amazon.awssdk.services.sts.StsClient; +import software.amazon.awssdk.services.sts.model.GetCallerIdentityResponse; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.stream.Collectors; + +// snippet-start:[s3control.java2.job.actions.main] +public class S3BatchActions { + + private static S3ControlAsyncClient asyncClient; + + private static S3AsyncClient s3AsyncClient ; + /** + * Retrieves the asynchronous S3 Control client instance. + *

+ * This method creates and returns a singleton instance of the {@link S3ControlAsyncClient}. If the instance + * has not been created yet, it will be initialized with the following configuration: + *

    + *
  • Maximum concurrency: 100
  • + *
  • Connection timeout: 60 seconds
  • + *
  • Read timeout: 60 seconds
  • + *
  • Write timeout: 60 seconds
  • + *
  • API call timeout: 2 minutes
  • + *
  • API call attempt timeout: 90 seconds
  • + *
  • Retry policy: 3 retries
  • + *
  • Region: US_EAST_1
  • + *
  • Credentials provider: {@link EnvironmentVariableCredentialsProvider}
  • + *
+ * + * @return the asynchronous S3 Control client instance + */ + private static S3ControlAsyncClient getAsyncClient() { + if (asyncClient == null) { + SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() + .maxConcurrency(100) + .connectionTimeout(Duration.ofSeconds(60)) + .readTimeout(Duration.ofSeconds(60)) + .writeTimeout(Duration.ofSeconds(60)) + .build(); + + ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() + .apiCallTimeout(Duration.ofMinutes(2)) + .apiCallAttemptTimeout(Duration.ofSeconds(90)) + .retryPolicy(RetryPolicy.builder() + .numRetries(3) + .build()) + .build(); + + asyncClient = S3ControlAsyncClient.builder() + .region(Region.US_EAST_1) + .httpClient(httpClient) + .overrideConfiguration(overrideConfig) + .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) + .build(); + } + return asyncClient; + } + + private static S3AsyncClient getS3AsyncClient() { + if (asyncClient == null) { + SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() + .maxConcurrency(100) + .connectionTimeout(Duration.ofSeconds(60)) + .readTimeout(Duration.ofSeconds(60)) + .writeTimeout(Duration.ofSeconds(60)) + .build(); + + ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() + .apiCallTimeout(Duration.ofMinutes(2)) + .apiCallAttemptTimeout(Duration.ofSeconds(90)) + .retryPolicy(RetryPolicy.builder() + .numRetries(3) + .build()) + .build(); + + s3AsyncClient = S3AsyncClient.builder() + .region(Region.US_EAST_1) + .httpClient(httpClient) + .overrideConfiguration(overrideConfig) + .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) + .build(); + } + return s3AsyncClient; + } + + + // snippet-start:[s3control.java2.cancel_job.main] + /** + * Cancels a job asynchronously. + * + * @param jobId The ID of the job to be canceled. + * @param accountId The ID of the account associated with the job. + * @return A {@link CompletableFuture} that completes when the job status has been updated to "CANCELLED". + * If an error occurs during the update, the returned future will complete exceptionally. + */ + public CompletableFuture cancelJobAsync(String jobId, String accountId) { + UpdateJobStatusRequest updateJobStatusRequest = UpdateJobStatusRequest.builder() + .accountId(accountId) + .jobId(jobId) + .requestedJobStatus(String.valueOf(JobStatus.CANCELLED)) + .build(); + + return asyncClient.updateJobStatus(updateJobStatusRequest) + .thenAccept(updateJobStatusResponse -> { + System.out.println("Job status updated to: " + updateJobStatusResponse.status()); + }) + .exceptionally(ex -> { + System.err.println("Failed to cancel job: " + ex.getMessage()); + throw new RuntimeException(ex); // Propagate the exception + }); + } + // snippet-end:[s3control.java2.cancel_job.main] + + // snippet-start:[s3control.java2.update_job.main] + /** + * Updates the priority of a job asynchronously. + * + * @param jobId the ID of the job to update + * @param accountId the ID of the account associated with the job + * @return a {@link CompletableFuture} that represents the asynchronous operation, which completes when the job priority has been updated or an error has occurred + */ + public CompletableFuture updateJobPriorityAsync(String jobId, String accountId) { + UpdateJobPriorityRequest priorityRequest = UpdateJobPriorityRequest.builder() + .accountId(accountId) + .jobId(jobId) + .priority(60) + .build(); + + CompletableFuture future = new CompletableFuture<>(); + getAsyncClient().updateJobPriority(priorityRequest) + .thenAccept(response -> { + System.out.println("The job priority was updated"); + future.complete(null); // Complete the CompletableFuture on successful execution + }) + .exceptionally(ex -> { + System.err.println("Failed to update job priority: " + ex.getMessage()); + future.completeExceptionally(ex); // Complete the CompletableFuture exceptionally on error + return null; // Return null to handle the exception + }); + + return future; + } + // snippet-end:[s3control.java2.update_job.main] + + // snippet-start:[s3control.java2.get_job_tagging.main] + /** + * Asynchronously retrieves the tags associated with a specific job in an AWS account. + * + * @param jobId the ID of the job for which to retrieve the tags + * @param accountId the ID of the AWS account associated with the job + * @return a {@link CompletableFuture} that completes when the job tags have been retrieved, or with an exception if the operation fails + * @throws RuntimeException if an error occurs while retrieving the job tags + */ + public CompletableFuture getJobTagsAsync(String jobId, String accountId) { + GetJobTaggingRequest request = GetJobTaggingRequest.builder() + .jobId(jobId) + .accountId(accountId) + .build(); + + return asyncClient.getJobTagging(request) + .thenAccept(response -> { + List tags = response.tags(); + if (tags.isEmpty()) { + System.out.println("No tags found for job ID: " + jobId); + } else { + for (S3Tag tag : tags) { + System.out.println("Tag key is: " + tag.key()); + System.out.println("Tag value is: " + tag.value()); + } + } + }) + .exceptionally(ex -> { + System.err.println("Failed to get job tags: " + ex.getMessage()); + throw new RuntimeException(ex); // Propagate the exception + }); + } + // snippet-end:[s3control.java2.get_job_tagging.main] + + // snippet-start:[s3control.java2.del_job_tagging.main] + /** + * Asynchronously deletes the tags associated with a specific batch job. + * + * @param jobId The ID of the batch job whose tags should be deleted. + * @param accountId The ID of the account associated with the batch job. + * @return A CompletableFuture that completes when the job tags have been successfully deleted, or an exception is thrown if the deletion fails. + */ + public CompletableFuture deleteBatchJobTagsAsync(String jobId, String accountId) { + DeleteJobTaggingRequest jobTaggingRequest = DeleteJobTaggingRequest.builder() + .accountId(accountId) + .jobId(jobId) + .build(); + + return asyncClient.deleteJobTagging(jobTaggingRequest) + .thenAccept(response -> { + System.out.println("You have successfully deleted " + jobId + " tagging."); + }) + .exceptionally(ex -> { + System.err.println("Failed to delete job tags: " + ex.getMessage()); + throw new RuntimeException(ex); + }); + } + // snippet-end:[s3control.java2.del_job_tagging.main] + + // snippet-start:[s3control.java2.describe_job.main] + /** + * Asynchronously describes the specified job. + * + * @param jobId the ID of the job to describe + * @param accountId the ID of the AWS account associated with the job + * @return a {@link CompletableFuture} that completes when the job description is available + * @throws RuntimeException if an error occurs while describing the job + */ + public CompletableFuture describeJobAsync(String jobId, String accountId) { + DescribeJobRequest jobRequest = DescribeJobRequest.builder() + .jobId(jobId) + .accountId(accountId) + .build(); + + return getAsyncClient().describeJob(jobRequest) + .thenAccept(response -> { + System.out.println("Job ID: " + response.job().jobId()); + System.out.println("Description: " + response.job().description()); + System.out.println("Status: " + response.job().statusAsString()); + System.out.println("Role ARN: " + response.job().roleArn()); + System.out.println("Priority: " + response.job().priority()); + System.out.println("Progress Summary: " + response.job().progressSummary()); + + // Print out details about the job manifest. + JobManifest manifest = response.job().manifest(); + System.out.println("Manifest Location: " + manifest.location().objectArn()); + System.out.println("Manifest ETag: " + manifest.location().eTag()); + + // Print out details about the job operation. + JobOperation operation = response.job().operation(); + if (operation.s3PutObjectTagging() != null) { + System.out.println("Operation: S3 Put Object Tagging"); + System.out.println("Tag Set: " + operation.s3PutObjectTagging().tagSet()); + } + + // Print out details about the job report. + JobReport report = response.job().report(); + System.out.println("Report Bucket: " + report.bucket()); + System.out.println("Report Prefix: " + report.prefix()); + System.out.println("Report Format: " + report.format()); + System.out.println("Report Enabled: " + report.enabled()); + System.out.println("Report Scope: " + report.reportScopeAsString()); + }) + .exceptionally(ex -> { + System.err.println("Failed to describe job: " + ex.getMessage()); + throw new RuntimeException(ex); + }); + } + // snippet-end:[s3control.java2.describe_job.main] + + // snippet-start:[s3control.java2.create_job.async.main] + /** + * Creates an asynchronous S3 job using the AWS Java SDK. + * + * @param accountId the AWS account ID associated with the job + * @param iamRoleArn the ARN of the IAM role to be used for the job + * @param manifestLocation the location of the job manifest file in S3 + * @param reportBucketName the name of the S3 bucket to store the job report + * @param uuid a unique identifier for the job + * @return a CompletableFuture that represents the asynchronous creation of the S3 job. + * The CompletableFuture will return the job ID if the job is created successfully, + * or throw an exception if there is an error. + */ + public CompletableFuture createS3JobAsync(String accountId, String iamRoleArn, + String manifestLocation, String reportBucketName, String uuid) { + + String[] bucketName = new String[]{""}; + String[] parts = reportBucketName.split(":::"); + if (parts.length > 1) { + bucketName[0] = parts[1]; + } else { + System.out.println("The input string does not contain the expected format."); + } + + return CompletableFuture.supplyAsync(() -> getETag(bucketName[0], "job-manifest.csv")) + .thenCompose(eTag -> { + ArrayList tagSet = new ArrayList<>(); + S3Tag s3Tag = S3Tag.builder() + .key("keyOne") + .value("ValueOne") + .build(); + S3Tag s3Tag2 = S3Tag.builder() + .key("keyTwo") + .value("ValueTwo") + .build(); + tagSet.add(s3Tag); + tagSet.add(s3Tag2); + + S3SetObjectTaggingOperation objectTaggingOperation = S3SetObjectTaggingOperation.builder() + .tagSet(tagSet) + .build(); + + JobOperation jobOperation = JobOperation.builder() + .s3PutObjectTagging(objectTaggingOperation) + .build(); + + JobManifestLocation jobManifestLocation = JobManifestLocation.builder() + .objectArn(manifestLocation) + .eTag(eTag) + .build(); + + JobManifestSpec manifestSpec = JobManifestSpec.builder() + .fieldsWithStrings("Bucket", "Key") + .format("S3BatchOperations_CSV_20180820") + .build(); + + JobManifest jobManifest = JobManifest.builder() + .spec(manifestSpec) + .location(jobManifestLocation) + .build(); + + JobReport jobReport = JobReport.builder() + .bucket(reportBucketName) + .prefix("reports") + .format("Report_CSV_20180820") + .enabled(true) + .reportScope("AllTasks") + .build(); + + CreateJobRequest jobRequest = CreateJobRequest.builder() + .accountId(accountId) + .description("Job created using the AWS Java SDK") + .manifest(jobManifest) + .operation(jobOperation) + .report(jobReport) + .priority(42) + .roleArn(iamRoleArn) + .clientRequestToken(uuid) + .confirmationRequired(false) + .build(); + + // Create the job asynchronously. + return getAsyncClient().createJob(jobRequest) + .thenApply(CreateJobResponse::jobId); + }) + .handle((jobId, ex) -> { + if (ex != null) { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof S3ControlException) { + throw new CompletionException(cause); + } else { + throw new RuntimeException(cause); + } + } + return jobId; + }); + } + // snippet-end:[s3control.java2.create_job.async.main] + + /** + * Retrieves the ETag (Entity Tag) for an object stored in an Amazon S3 bucket. + * + * @param bucketName the name of the Amazon S3 bucket where the object is stored + * @param key the key (file name) of the object in the Amazon S3 bucket + * @return the ETag of the object + */ + public String getETag(String bucketName, String key) { + S3Client s3Client = S3Client.builder() + .region(Region.US_EAST_1) + .build(); + + HeadObjectRequest headObjectRequest = HeadObjectRequest.builder() + .bucket(bucketName) + .key(key) + .build(); + + HeadObjectResponse headObjectResponse = s3Client.headObject(headObjectRequest); + return headObjectResponse.eTag(); + } + + // snippet-start:[s3control.java2.job.put.tags.main] + /** + * Asynchronously adds tags to a job in the system. + * + * @param jobId the ID of the job to add tags to + * @param accountId the account ID associated with the job + * @return a CompletableFuture that completes when the tagging operation is finished + */ + public CompletableFuture putJobTaggingAsync(String jobId, String accountId) { + S3Tag departmentTag = S3Tag.builder() + .key("department") + .value("Marketing") + .build(); + + S3Tag fiscalYearTag = S3Tag.builder() + .key("FiscalYear") + .value("2020") + .build(); + + PutJobTaggingRequest putJobTaggingRequest = PutJobTaggingRequest.builder() + .jobId(jobId) + .accountId(accountId) + .tags(departmentTag, fiscalYearTag) + .build(); + + return asyncClient.putJobTagging(putJobTaggingRequest) + .thenRun(() -> { + System.out.println("Additional Tags were added to job " + jobId); + }) + .exceptionally(ex -> { + System.err.println("Failed to add tags to job: " + ex.getMessage()); + throw new RuntimeException(ex); // Propagate the exception + }); + } + // snippet-end:[s3control.java2.job.put.tags.main] + + // Setup the S3 bucket required for this scenario. + /** + * Creates an Amazon S3 bucket with the specified name. + * + * @param bucketName the name of the S3 bucket to create + * @throws S3Exception if there is an error creating the bucket + */ + public void createBucket(String bucketName) { + try { + S3Client s3Client = S3Client.builder() + .region(Region.US_EAST_1) + .build(); + + + S3Waiter s3Waiter = s3Client.waiter(); + CreateBucketRequest bucketRequest = CreateBucketRequest.builder() + .bucket(bucketName) + .build(); + + s3Client.createBucket(bucketRequest); + HeadBucketRequest bucketRequestWait = HeadBucketRequest.builder() + .bucket(bucketName) + .build(); + + // Wait until the bucket is created and print out the response. + WaiterResponse waiterResponse = s3Waiter.waitUntilBucketExists(bucketRequestWait); + waiterResponse.matched().response().ifPresent(System.out::println); + System.out.println(bucketName + " is ready"); + + } catch (S3Exception e) { + System.err.println(e.awsErrorDetails().errorMessage()); + System.exit(1); + } + } + + /** + * Uploads a file to an Amazon S3 bucket asynchronously. + * + * @param bucketName the name of the S3 bucket to upload the file to + * @param fileName the name of the file to be uploaded + * @throws RuntimeException if an error occurs during the file upload + */ + public void populateBucket(String bucketName, String fileName) { + // Define the path to the directory. + Path filePath = Paths.get("src/main/resources/batch/", fileName).toAbsolutePath(); + PutObjectRequest putOb = PutObjectRequest.builder() + .bucket(bucketName) + .key(fileName) + .build(); + + CompletableFuture future = getS3AsyncClient().putObject(putOb, AsyncRequestBody.fromFile(filePath)); + future.whenComplete((result, ex) -> { + if (ex != null) { + System.err.println("Error uploading file: " + ex.getMessage()); + } else { + System.out.println("Successfully placed " + fileName + " into bucket " + bucketName); + } + }).join(); + } + + + // Update the bucketName in CSV. + public void updateCSV(String newValue) { + Path csvFilePath = Paths.get("src/main/resources/batch/job-manifest.csv").toAbsolutePath(); + try { + // Read all lines from the CSV file. + List lines = Files.readAllLines(csvFilePath); + + // Update the first value in each line. + List updatedLines = lines.stream() + .map(line -> { + String[] parts = line.split(","); + parts[0] = newValue; + return String.join(",", parts); + }) + .collect(Collectors.toList()); + + // Write the updated lines back to the CSV file + Files.write(csvFilePath, updatedLines); + System.out.println("CSV file updated successfully."); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Deletes an object from an Amazon S3 bucket asynchronously. + * + * @param bucketName The name of the S3 bucket where the object is stored. + * @param objectName The name of the object to be deleted. + * @return A {@link CompletableFuture} that completes when the object has been deleted, + * or throws a {@link RuntimeException} if an error occurs during the deletion. + */ + public CompletableFuture deleteBucketObjects(String bucketName, String objectName) { + ArrayList toDelete = new ArrayList<>(); + toDelete.add(ObjectIdentifier.builder() + .key(objectName) + .build()); + + DeleteObjectsRequest dor = DeleteObjectsRequest.builder() + .bucket(bucketName) + .delete(Delete.builder() + .objects(toDelete).build()) + .build(); + + return getS3AsyncClient().deleteObjects(dor) + .thenAccept(result -> { + System.out.println("The object was deleted!"); + }) + .exceptionally(ex -> { + throw new RuntimeException("Error deleting object: " + ex.getMessage(), ex); + }); + } + + /** + * Deletes a folder and all its contents asynchronously from an Amazon S3 bucket. + * + * @param bucketName the name of the S3 bucket containing the folder to be deleted + * @return a {@link CompletableFuture} that completes when the folder and its contents have been deleted + * @throws RuntimeException if any error occurs during the deletion process + */ + public void deleteBucketFolderAsync(String bucketName) { + String folderName = "reports/"; + ListObjectsV2Request request = ListObjectsV2Request.builder() + .bucket(bucketName) + .prefix(folderName) + .build(); + + CompletableFuture listObjectsFuture = getS3AsyncClient().listObjectsV2(request); + listObjectsFuture.thenCompose(response -> { + List> deleteFutures = response.contents().stream() + .map(obj -> { + DeleteObjectRequest deleteRequest = DeleteObjectRequest.builder() + .bucket(bucketName) + .key(obj.key()) + .build(); + return getS3AsyncClient().deleteObject(deleteRequest) + .thenApply(deleteResponse -> { + System.out.println("Deleted object: " + obj.key()); + return deleteResponse; + }); + }) + .collect(Collectors.toList()); + + return CompletableFuture.allOf(deleteFutures.toArray(new CompletableFuture[0])) + .thenCompose(v -> { + // Delete the folder. + DeleteObjectRequest deleteRequest = DeleteObjectRequest.builder() + .bucket(bucketName) + .key(folderName) + .build(); + return getS3AsyncClient().deleteObject(deleteRequest) + .thenApply(deleteResponse -> { + System.out.println("Deleted folder: " + folderName); + return deleteResponse; + }); + }); + }).join(); + } + + /** + * Deletes an Amazon S3 bucket. + * + * @param bucketName the name of the bucket to delete + * @return a {@link CompletableFuture} that completes when the bucket has been deleted, or exceptionally if there is an error + * @throws RuntimeException if there is an error deleting the bucket + */ + public CompletableFuture deleteBucket(String bucketName) { + S3AsyncClient s3Client = getS3AsyncClient(); + return s3Client.deleteBucket(DeleteBucketRequest.builder() + .bucket(bucketName) + .build()) + .thenAccept(deleteBucketResponse -> { + System.out.println(bucketName + " was deleted"); + }) + .exceptionally(ex -> { + // Handle the exception or rethrow it. + throw new RuntimeException("Failed to delete bucket: " + bucketName, ex); + }); + } + + /** + * Uploads a set of files to an Amazon S3 bucket. + * + * @param bucketName the name of the S3 bucket to upload the files to + * @param fileNames an array of file names to be uploaded + * @param actions an instance of {@link S3BatchActions} that provides the implementation for the necessary S3 operations + * @throws IOException if there's an error creating the text files or uploading the files to the S3 bucket + */ + public static void uploadFilesToBucket(String bucketName, String[] fileNames, S3BatchActions actions) throws IOException { + actions.updateCSV(bucketName); + createTextFiles(fileNames); + for (String fileName : fileNames) { + actions.populateBucket(bucketName, fileName); + } + System.out.println("All files are placed in the S3 bucket " + bucketName); + } + + /** + * Deletes the specified files from the given S3 bucket. + * + * @param bucketName the name of the S3 bucket + * @param fileNames an array of file names to be deleted from the bucket + * @param actions the S3BatchActions instance to be used for the file deletion + * @throws IOException if an I/O error occurs during the file deletion + */ + public void deleteFilesFromBucket(String bucketName, String[] fileNames, S3BatchActions actions) throws IOException { + for (String fileName : fileNames) { + actions.deleteBucketObjects(bucketName, fileName) + .thenRun(() -> System.out.println("Object deletion completed")) + .exceptionally(ex -> { + System.err.println("Error occurred: " + ex.getMessage()); + return null; + }); + } + System.out.println("All files have been deleted from the bucket " + bucketName); + } + + public static void createTextFiles(String[] fileNames) { + String currentDirectory = System.getProperty("user.dir"); + String directoryPath = currentDirectory + "\\src\\main\\resources\\batch"; + Path path = Paths.get(directoryPath); + + try { + // Create the directory if it doesn't exist. + if (Files.notExists(path)) { + Files.createDirectories(path); + System.out.println("Created directory: " + path.toString()); + } else { + System.out.println("Directory already exists: " + path.toString()); + } + + for (String fileName : fileNames) { + // Check if the file is a .txt file. + if (fileName.endsWith(".txt")) { + // Define the path for the new file. + Path filePath = path.resolve(fileName); + System.out.println("Attempting to create file: " + filePath.toString()); + + // Create and write content to the new file. + Files.write(filePath, "This is a test".getBytes()); + + // Verify the file was created. + if (Files.exists(filePath)) { + System.out.println("Successfully created file: " + filePath.toString()); + } else { + System.out.println("Failed to create file: " + filePath.toString()); + } + } + } + + } catch (IOException e) { + System.err.println("An error occurred: " + e.getMessage()); + e.printStackTrace(); + } + } + + public String getAccountId() { + StsClient stsClient = StsClient.builder() + .region(Region.US_EAST_1) + .build(); + + GetCallerIdentityResponse callerIdentityResponse = stsClient.getCallerIdentity(); + return callerIdentityResponse.account(); + } +} +// snippet-end:[s3control.java2.job.actions.main] diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/batch/S3BatchScenario.java b/javav2/example_code/s3/src/main/java/com/example/s3/batch/S3BatchScenario.java new file mode 100644 index 00000000000..9cd4be0cce2 --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/batch/S3BatchScenario.java @@ -0,0 +1,238 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[s3control.java2.job.scenario.main] +package com.example.s3.batch; + +import software.amazon.awssdk.services.s3.model.S3Exception; +import java.io.IOException; +import java.util.Map; +import java.util.Scanner; +import java.util.UUID; +import java.util.concurrent.CompletionException; + +public class S3BatchScenario { + + public static final String DASHES = new String(new char[80]).replace("\0", "-"); + private static final String STACK_NAME = "MyS3Stack"; + public static void main(String[] args) throws IOException { + S3BatchActions actions = new S3BatchActions(); + String accountId = actions.getAccountId(); + String uuid = java.util.UUID.randomUUID().toString(); + Scanner scanner = new Scanner(System.in); + + System.out.println(DASHES); + System.out.println("Welcome to the Amazon S3 Batch basics scenario."); + System.out.println(""" + S3 Batch operations enables efficient and cost-effective processing of large-scale + data stored in Amazon S3. It automatically scales resources to handle varying workloads + without the need for manual intervention. + + One of the key features of S3 Batch is its ability to perform tagging operations on objects stored in + S3 buckets. Users can leverage S3 Batch to apply, update, or remove tags on thousands or millions of + objects in a single operation, streamlining the management and organization of their data. + + This can be particularly useful for tasks such as cost allocation, lifecycle management, or + metadata-driven workflows, where consistent and accurate tagging is essential. + S3 Batch's scalability and serverless nature make it an ideal solution for organizations with + growing data volumes and complex data management requirements. + + This Java program walks you through Amazon S3 Batch operations. + + Let's get started... + + """); + waitForInputToContinue(scanner); + // Use CloudFormation to stand up the resource required for this scenario. + System.out.println("Use CloudFormation to stand up the resource required for this scenario."); + CloudFormationHelper.deployCloudFormationStack(STACK_NAME); + + Map stackOutputs = CloudFormationHelper.getStackOutputs(STACK_NAME); + String iamRoleArn = stackOutputs.get("S3BatchRoleArn"); + System.out.println(DASHES); + + System.out.println(DASHES); + System.out.println("Setup the required bucket for this scenario."); + waitForInputToContinue(scanner); + String bucketName = "x-" + UUID.randomUUID(); + actions.createBucket(bucketName); + String reportBucketName = "arn:aws:s3:::"+bucketName; + String manifestLocation = "arn:aws:s3:::"+bucketName+"/job-manifest.csv"; + System.out.println("Populate the bucket with the required files."); + String[] fileNames = {"job-manifest.csv", "object-key-1.txt", "object-key-2.txt", "object-key-3.txt", "object-key-4.txt"}; + actions.uploadFilesToBucket(bucketName, fileNames, actions); + waitForInputToContinue(scanner); + System.out.println(DASHES); + + System.out.println(DASHES); + System.out.println("1. Create a S3 Batch Job"); + System.out.println("This job tags all objects listed in the manifest file with tags"); + waitForInputToContinue(scanner); + String jobId ; + try { + jobId = actions.createS3JobAsync(accountId, iamRoleArn, manifestLocation, reportBucketName, uuid).join(); + System.out.println("The Job id is " + jobId); + + } catch (S3Exception e) { + System.err.println("SSM error: " + e.getMessage()); + return; + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + return; + } + + waitForInputToContinue(scanner); + System.out.println(DASHES); + + System.out.println(DASHES); + System.out.println("2. Update an existing S3 Batch Operations job's priority"); + System.out.println(""" + In this step, we modify the job priority value. The higher the number, the higher the priority. + So, a job with a priority of `30` would have a higher priority than a job with + a priority of `20`. This is a common way to represent the priority of a task + or job, with higher numbers indicating a higher priority. + + Ensure that the job status allows for priority updates. Jobs in certain + states (e.g., Cancelled, Failed, or Completed) cannot have their priorities + updated. Only jobs in the Active or Suspended state typically allow priority + updates. + """); + + try { + actions.updateJobPriorityAsync(jobId, accountId) + .exceptionally(ex -> { + System.err.println("Update job priority failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + System.err.println("Failed to update job priority: " + ex.getMessage()); + } + waitForInputToContinue(scanner); + System.out.println(DASHES); + + System.out.println(DASHES); + System.out.println("3. Cancel the S3 Batch job"); + System.out.print("Do you want to cancel the Batch job? (y/n): "); + String cancelAns = scanner.nextLine(); + if (cancelAns != null && cancelAns.trim().equalsIgnoreCase("y")) { + try { + actions.cancelJobAsync(jobId, accountId) + .exceptionally(ex -> { + System.err.println("Cancel job failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + System.err.println("Failed to cancel job: " + ex.getMessage()); + } + } else { + System.out.println("Job " +jobId +" was not canceled."); + } + System.out.println(DASHES); + + System.out.println(DASHES); + System.out.println("4. Describe the job that was just created"); + waitForInputToContinue(scanner); + try { + actions.describeJobAsync(jobId, accountId) + .exceptionally(ex -> { + System.err.println("Describe job failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + System.err.println("Failed to describe job: " + ex.getMessage()); + } + System.out.println(DASHES); + + System.out.println(DASHES); + System.out.println("5. Describe the tags associated with the job"); + waitForInputToContinue(scanner); + try { + actions.getJobTagsAsync(jobId, accountId) + .exceptionally(ex -> { + System.err.println("Get job tags failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + System.err.println("Failed to get job tags: " + ex.getMessage()); + } + System.out.println(DASHES); + + System.out.println(DASHES); + System.out.println("6. Update Batch Job Tags"); + waitForInputToContinue(scanner); + try { + actions.putJobTaggingAsync(jobId, accountId) + .exceptionally(ex -> { + System.err.println("Put job tagging failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + System.err.println("Failed to put job tagging: " + ex.getMessage()); + } + System.out.println(DASHES); + + System.out.println(DASHES); + System.out.println("7. Delete the Amazon S3 Batch job tagging."); + System.out.print("Do you want to delete Batch job tagging? (y/n)"); + String delAns = scanner.nextLine(); + if (delAns != null && delAns.trim().equalsIgnoreCase("y")) { + try { + actions.deleteBatchJobTagsAsync(jobId, accountId) + .exceptionally(ex -> { + System.err.println("Delete batch job tags failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + System.err.println("Failed to delete batch job tags: " + ex.getMessage()); + } + } else { + System.out.println("Tagging was not deleted."); + } + System.out.println(DASHES); + + System.out.println(DASHES); + System.out.print("Do you want to delete the AWS resources used in this scenario? (y/n)"); + String delResAns = scanner.nextLine(); + if (delResAns != null && delResAns.trim().equalsIgnoreCase("y")) { + actions.deleteFilesFromBucket(bucketName, fileNames, actions); + actions.deleteBucketFolderAsync(bucketName); + actions.deleteBucket(bucketName) + .thenRun(() -> System.out.println("Bucket deletion completed")) + .exceptionally(ex -> { + System.err.println("Error occurred: " + ex.getMessage()); + return null; + }); + CloudFormationHelper.destroyCloudFormationStack(STACK_NAME); + } else { + System.out.println("The AWS resources were not deleted."); + } + System.out.println("The Amazon S3 Batch scenario has successfully completed."); + System.out.println(DASHES); + } + + private static void waitForInputToContinue(Scanner scanner) { + while (true) { + System.out.println(); + System.out.println("Enter 'c' followed by to continue:"); + String input = scanner.nextLine(); + + if (input.trim().equalsIgnoreCase("c")) { + System.out.println("Continuing with the program..."); + System.out.println(); + break; + } else { + // Handle invalid input. + System.out.println("Invalid input. Please try again."); + } + } + } + + +} +// snippet-end:[s3control.java2.job.scenario.main] \ No newline at end of file diff --git a/javav2/example_code/s3/src/main/resources/batch/job-manifest.csv b/javav2/example_code/s3/src/main/resources/batch/job-manifest.csv new file mode 100644 index 00000000000..8d08f24a3b4 --- /dev/null +++ b/javav2/example_code/s3/src/main/resources/batch/job-manifest.csv @@ -0,0 +1,4 @@ +x-f8798006-c1ac-44b9-8372-ec2b4704faa7,object-key-1.txt +x-f8798006-c1ac-44b9-8372-ec2b4704faa7,object-key-2.txt +x-f8798006-c1ac-44b9-8372-ec2b4704faa7,object-key-3.txt +x-f8798006-c1ac-44b9-8372-ec2b4704faa7,object-key-4.txt diff --git a/javav2/example_code/s3/src/test/java/S3BatchTest.java b/javav2/example_code/s3/src/test/java/S3BatchTest.java new file mode 100644 index 00000000000..9ada7bfe46d --- /dev/null +++ b/javav2/example_code/s3/src/test/java/S3BatchTest.java @@ -0,0 +1,207 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import com.example.s3.batch.CloudFormationHelper; +import com.example.s3.batch.HelloS3Batch; +import com.example.s3.batch.S3BatchActions; +import com.google.gson.Gson; +import org.junit.jupiter.api.*; +import java.io.IOException; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.CompletionException; + +import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.model.S3Exception; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class S3BatchTest { + + private static String accountId = ""; + private static final String STACK_NAME = "MyS3Stack"; + private static String bucketName; + private static String reportBucketName; + private static String manifestLocation; + private static S3BatchActions actions; + private static String jobId; + + private static String iamRoleArn; + + @BeforeAll + public static void setUp() throws IOException { + // Get the values to run these tests from AWS Secrets Manager. + Gson gson = new Gson(); + String json = getSecretValues(); + AmazonS3Test.SecretValues values = gson.fromJson(json, AmazonS3Test.SecretValues.class); + accountId = values.getAccountId(); + + actions = new S3BatchActions(); + CloudFormationHelper.deployCloudFormationStack(STACK_NAME); + Map stackOutputs = CloudFormationHelper.getStackOutputs(STACK_NAME); + iamRoleArn = stackOutputs.get("S3BatchRoleArn"); + + bucketName = "x-" + UUID.randomUUID(); + actions.createBucket(bucketName); + reportBucketName = "arn:aws:s3:::" + bucketName; + manifestLocation = "arn:aws:s3:::" + bucketName + "/job-manifest.csv"; + + String[] fileNames = {"job-manifest.csv", "object-key-1.txt", "object-key-2.txt", "object-key-3.txt", "object-key-4.txt"}; + actions.uploadFilesToBucket(bucketName, fileNames, actions); + } + + @AfterAll + public static void tearDown() throws IOException { + if (actions != null) { + String[] fileNames = {"job-manifest.csv", "object-key-1.txt", "object-key-2.txt", "object-key-3.txt", "object-key-4.txt"}; + actions.deleteFilesFromBucket(bucketName, fileNames, actions); + actions.deleteBucketFolderAsync(bucketName); + actions.deleteBucket(bucketName); + CloudFormationHelper.destroyCloudFormationStack(STACK_NAME); + } + } + + @Test + @Tag("IntegrationTest") + @Order(1) + public void testCreateAndCancelJob() { + try { + jobId = actions.createS3JobAsync(accountId, iamRoleArn, manifestLocation, reportBucketName, UUID.randomUUID().toString()).join(); + assertNotNull(jobId); + } catch (S3Exception e) { + fail("S3Exception during job creation: " + e.getMessage()); + } catch (RuntimeException e) { + fail("Unexpected error during job creation: " + e.getMessage()); + } + + try { + actions.updateJobPriorityAsync(jobId, accountId) + .exceptionally(ex -> { + fail("Update job priority failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + fail("Failed to update job priority: " + ex.getMessage()); + } + + try { + actions.cancelJobAsync(jobId, accountId) + .exceptionally(ex -> { + fail("Cancel job failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + fail("Failed to cancel job: " + ex.getMessage()); + } + } + + @Test + @Tag("IntegrationTest") + @Order(2) + public void testDescribeJob() { + try { + actions.describeJobAsync(jobId, accountId) + .exceptionally(ex -> { + fail("Describe job failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + fail("Failed to describe job: " + ex.getMessage()); + } + } + + @Test + @Tag("IntegrationTest") + @Order(3) + public void testGetAndPutJobTags() { + try { + actions.getJobTagsAsync(jobId, accountId) + .exceptionally(ex -> { + fail("Get job tags failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + fail("Failed to get job tags: " + ex.getMessage()); + } + + try { + actions.putJobTaggingAsync(jobId, accountId) + .exceptionally(ex -> { + fail("Put job tagging failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + fail("Failed to put job tagging: " + ex.getMessage()); + } + } + + @Test + @Tag("IntegrationTest") + @Order(4) + public void testListBatchJobs() { + try { + HelloS3Batch.listBatchJobsAsync(accountId) + .exceptionally(ex -> { + fail("List batch jobs failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + fail("Failed to list batch jobs: " + ex.getMessage()); + } + } + + @Test + @Tag("IntegrationTest") + @Order(5) + public void testDeleteJobTags() { + try { + actions.deleteBatchJobTagsAsync(jobId, accountId) + .exceptionally(ex -> { + fail("Delete batch job tags failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + fail("Failed to delete batch job tags: " + ex.getMessage()); + } + } + + private static String getSecretValues() { + SecretsManagerClient secretClient = SecretsManagerClient.builder() + .region(Region.US_EAST_1) + .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) + .build(); + String secretName = "test/s3"; + + GetSecretValueRequest valueRequest = GetSecretValueRequest.builder() + .secretId(secretName) + .build(); + + GetSecretValueResponse valueResponse = secretClient.getSecretValue(valueRequest); + return valueResponse.secretString(); + } + + @Nested + @DisplayName("A class used to get test values from test/s3 (an AWS Secrets Manager secret)") + class SecretValues { + private String accountId; + public String getAccountId() { + return accountId; + } + + + } +} diff --git a/javav2/example_code/s3/template.yaml b/javav2/example_code/s3/template.yaml new file mode 100644 index 00000000000..952db67fac1 --- /dev/null +++ b/javav2/example_code/s3/template.yaml @@ -0,0 +1,142 @@ +Resources: + S3BatchRole8238262D: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: batchoperations.s3.amazonaws.com + Version: "2012-10-17" + Metadata: + aws:cdk:path: MyS3Stack/S3BatchRole/Resource + S3BatchPolicy13F783AA: + Type: AWS::IAM::Policy + Properties: + PolicyDocument: + Statement: + - Action: + - s3:DeleteObject + - s3:GetObject + - s3:ListBucket + - s3:PutObject + Effect: Allow + Resource: "*" + Version: "2012-10-17" + PolicyName: S3BatchPolicy13F783AA + Roles: + - Ref: S3BatchRole8238262D + Metadata: + aws:cdk:path: MyS3Stack/S3BatchPolicy/Resource + CDKMetadata: + Type: AWS::CDK::Metadata + Properties: + Analytics: v2:deflate64:H4sIAAAAAAAA/zPSMzQ21TNQTCwv1k1OydbNyUzSqw4uSUzO1kksL47PTMzVqw7Kz0nVcU7LA9MB+TmZyZUgLoRVqxOUWpxfWpQMVuJfWlJQWgJWjCTqnJ+XklmSmZ9Xq+OVWJaob2iuZ6BnaKCYVZyZqVtUmleSmZuqFwShAWIQoq+RAAAA + Metadata: + aws:cdk:path: MyS3Stack/CDKMetadata/Default + Condition: CDKMetadataAvailable +Outputs: + S3BatchRoleArn: + Description: The ARN of the S3 Batch Role + Value: + Fn::GetAtt: + - S3BatchRole8238262D + - Arn +Conditions: + CDKMetadataAvailable: + Fn::Or: + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - af-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-east-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ap-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ca-central-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-north-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-northwest-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - eu-central-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-north-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-south-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-2 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-3 + - Fn::Equals: + - Ref: AWS::Region + - il-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-south-1 + - Fn::Equals: + - Ref: AWS::Region + - sa-east-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - us-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-2 + - Fn::Equals: + - Ref: AWS::Region + - us-west-1 + - Fn::Equals: + - Ref: AWS::Region + - us-west-2 +Parameters: + BootstrapVersion: + Type: AWS::SSM::Parameter::Value + Default: /cdk-bootstrap/hnb659fds/version + Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip] +Rules: + CheckBootstrapVersion: + Assertions: + - Assert: + Fn::Not: + - Fn::Contains: + - - "1" + - "2" + - "3" + - "4" + - "5" + - Ref: BootstrapVersion + AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI. + From ae69757d912e3f1cf4ab537e00dffa4dc2421901 Mon Sep 17 00:00:00 2001 From: Steven Meyer <108885656+meyertst-aws@users.noreply.github.com> Date: Fri, 2 Aug 2024 09:24:20 -0400 Subject: [PATCH 15/98] Mult-language: HealthImaging - update examples (#6696) --- .../metadata/medical-imaging_metadata.yaml | 30 ++- .../medical-imaging/actions/copy-image-set.js | 194 +++++++++------- .../actions/update-image-set-metadata.js | 83 ++++--- .../example_code/medical-imaging/package.json | 10 +- .../update-image-set-metadata.unit.test.js | 111 ++++----- javav2/example_code/medicalimaging/README.md | 4 +- javav2/example_code/medicalimaging/pom.xml | 23 +- .../example/medicalimaging/CopyImageSet.java | 211 ++++++++++++++---- .../medicalimaging/SearchImageSets.java | 2 +- .../UpdateImageSetMetadata.java | 197 +++++++++------- .../src/test/java/AWSMedicalImagingTest.java | 18 +- python/example_code/medical-imaging/README.md | 10 +- .../medical-imaging/medical_imaging_basics.py | 46 +++- .../medical-imaging/requirements.txt | 4 +- .../test/test_medical_imaging_basics.py | 20 +- python/test_tools/medical_imaging_stubber.py | 19 +- 16 files changed, 646 insertions(+), 336 deletions(-) diff --git a/.doc_gen/metadata/medical-imaging_metadata.yaml b/.doc_gen/metadata/medical-imaging_metadata.yaml index 9b1b97be602..9ae05d50516 100644 --- a/.doc_gen/metadata/medical-imaging_metadata.yaml +++ b/.doc_gen/metadata/medical-imaging_metadata.yaml @@ -661,6 +661,7 @@ medical-imaging_UpdateImageSetMetadata: github_note_at_bottom: true excerpts: - description: + genai: some snippet_tags: - python.example_code.medical-imaging.MedicalImagingWrapper - python.example_code.medical-imaging.UpdateImageSetMetadata @@ -677,6 +678,9 @@ medical-imaging_UpdateImageSetMetadata: - description: 'Use case #3: Remove an instance.' snippet_tags: - python.example_code.medical-imaging.UpdateImageSetMetadata.remove_instance + - description: 'Use case #4: Revert to an earlier version.' + snippet_tags: + - python.example_code.medical-imaging.UpdateImageSetMetadata.revert JavaScript: versions: - sdk_version: 3 @@ -684,9 +688,10 @@ medical-imaging_UpdateImageSetMetadata: github_note_at_bottom: true excerpts: - description: + genai: some snippet_tags: - medical-imaging.JavaScript.datastore.updateImageSetMetadataV3 - - description: 'Use case #1: Insert or update an attribute.' + - description: 'Use case #1: Insert or update an attribute and force the update.' snippet_tags: - medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.insert_or_update_attributes - description: 'Use case #2: Remove an attribute.' @@ -695,6 +700,9 @@ medical-imaging_UpdateImageSetMetadata: - description: 'Use case #3: Remove an instance.' snippet_tags: - medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.remove_instance + - description: 'Use case #4: Revert to an earlier version.' + snippet_tags: + - medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.revert Java: versions: - sdk_version: 2 @@ -702,6 +710,7 @@ medical-imaging_UpdateImageSetMetadata: github_note_at_bottom: true excerpts: - description: + genai: some snippet_tags: - medicalimaging.java2.update_image_set_metadata.main - description: 'Use case #1: Insert or update an attribute.' @@ -713,6 +722,9 @@ medical-imaging_UpdateImageSetMetadata: - description: 'Use case #3: Remove an instance.' snippet_tags: - medicalimaging.java2.update_image_set_metadata.remove_instance + - description: 'Use case #4: Revert to a previous version.' + snippet_tags: + - medicalimaging.java2.update_image_set_metadata.revert services: medical-imaging: {UpdateImageSetMetadata} medical-imaging_CopyImageSet: @@ -724,18 +736,24 @@ medical-imaging_CopyImageSet: github_note_at_bottom: true excerpts: - description: Utility function to copy an image set. + genai: some snippet_tags: - python.example_code.medical-imaging.MedicalImagingWrapper - python.example_code.medical-imaging.CopyImageSet - description: Copy an image set without a destination. snippet_tags: - python.example_code.medical-imaging.CopyImageSet1 - - python.example_code.medical-imaging.CopyImageSet3 + - python.example_code.medical-imaging.CopyImageSet4 - description: Copy an image set with a destination. snippet_tags: - python.example_code.medical-imaging.CopyImageSet1 - python.example_code.medical-imaging.CopyImageSet2 + - python.example_code.medical-imaging.CopyImageSet4 + - description: Copy a subset of an image set. + snippet_tags: + - python.example_code.medical-imaging.CopyImageSet1 - python.example_code.medical-imaging.CopyImageSet3 + - python.example_code.medical-imaging.CopyImageSet4 - description: > The following code instantiates the MedicalImagingWrapper object. snippet_tags: @@ -747,6 +765,7 @@ medical-imaging_CopyImageSet: github_note_at_bottom: true excerpts: - description: Utility function to copy an image set. + genai: some snippet_tags: - medical-imaging.JavaScript.imageset.copyImageSetV3 - description: Copy an image set without a destination. @@ -755,6 +774,9 @@ medical-imaging_CopyImageSet: - description: Copy an image set with a destination. snippet_tags: - medical-imaging.JavaScript.imageset.copyImageSetV3.with_destination + - description: Copy a subset of an image set with a destination and force the copy. + snippet_tags: + - medical-imaging.JavaScript.imageset.copyImageSetV3.with_destination_and_subsets Java: versions: - sdk_version: 2 @@ -762,8 +784,12 @@ medical-imaging_CopyImageSet: github_note_at_bottom: true excerpts: - description: + genai: some snippet_tags: - medicalimaging.java2.copy_imageset.main + - description: Utility function to create copiable attributes. + snippet_tags: + - medicalimaging.java2.copy_imageset.copiable_attributes services: medical-imaging: {CopyImageSet} medical-imaging_DeleteImageSet: diff --git a/javascriptv3/example_code/medical-imaging/actions/copy-image-set.js b/javascriptv3/example_code/medical-imaging/actions/copy-image-set.js index c01f14061f5..6a045332865 100644 --- a/javascriptv3/example_code/medical-imaging/actions/copy-image-set.js +++ b/javascriptv3/example_code/medical-imaging/actions/copy-image-set.js @@ -1,11 +1,11 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; +import {fileURLToPath} from "url"; // snippet-start:[medical-imaging.JavaScript.imageset.copyImageSetV3] -import { CopyImageSetCommand } from "@aws-sdk/client-medical-imaging"; -import { medicalImagingClient } from "../libs/medicalImagingClient.js"; +import {CopyImageSetCommand} from "@aws-sdk/client-medical-imaging"; +import {medicalImagingClient} from "../libs/medicalImagingClient.js"; /** * @param {string} datastoreId - The ID of the data store. @@ -13,90 +13,132 @@ import { medicalImagingClient } from "../libs/medicalImagingClient.js"; * @param {string} sourceVersionId - The source version ID. * @param {string} destinationImageSetId - The optional ID of the destination image set. * @param {string} destinationVersionId - The optional version ID of the destination image set. + * @param {boolean} force - Force the copy action. + * @param {[string]} copySubsets - A subset of instance IDs to copy. */ export const copyImageSet = async ( - datastoreId = "xxxxxxxxxxx", - imageSetId = "xxxxxxxxxxxx", - sourceVersionId = "1", - destinationImageSetId = "", - destinationVersionId = "" + datastoreId = "xxxxxxxxxxx", + imageSetId = "xxxxxxxxxxxx", + sourceVersionId = "1", + destinationImageSetId = "", + destinationVersionId = "", + force = false, + copySubsets = [] ) => { - const params = { - datastoreId: datastoreId, - sourceImageSetId: imageSetId, - copyImageSetInformation: { - sourceImageSet: { latestVersionId: sourceVersionId }, - }, - }; - if (destinationImageSetId !== "" && destinationVersionId !== "") { - params.copyImageSetInformation.destinationImageSet = { - imageSetId: destinationImageSetId, - latestVersionId: destinationVersionId, - }; - } - - const response = await medicalImagingClient.send( - new CopyImageSetCommand(params) - ); - console.log(response); - // { - // '$metadata': { - // httpStatusCode: 200, - // requestId: 'd9b219ce-cc48-4a44-a5b2-c5c3068f1ee8', - // extendedRequestId: undefined, - // cfId: undefined, - // attempts: 1, - // totalRetryDelay: 0 - // }, - // datastoreId: 'xxxxxxxxxxxxxx', - // destinationImageSetProperties: { - // createdAt: 2023-09-27T19:46:21.824Z, - // imageSetArn: 'arn:aws:medical-imaging:us-east-1:xxxxxxxxxxx:datastore/xxxxxxxxxxxxx/imageset/xxxxxxxxxxxxxxxxxxx', - // imageSetId: 'xxxxxxxxxxxxxxx', - // imageSetState: 'LOCKED', - // imageSetWorkflowStatus: 'COPYING', - // latestVersionId: '1', - // updatedAt: 2023-09-27T19:46:21.824Z - // }, - // sourceImageSetProperties: { - // createdAt: 2023-09-22T14:49:26.427Z, - // imageSetArn: 'arn:aws:medical-imaging:us-east-1:xxxxxxxxxxx:datastore/xxxxxxxxxxxxx/imageset/xxxxxxxxxxxxxxxx', - // imageSetId: 'xxxxxxxxxxxxxxxx', - // imageSetState: 'LOCKED', - // imageSetWorkflowStatus: 'COPYING_WITH_READ_ONLY_ACCESS', - // latestVersionId: '4', - // updatedAt: 2023-09-27T19:46:21.824Z - // } - // } - return response; + try { + const params = { + datastoreId: datastoreId, + sourceImageSetId: imageSetId, + copyImageSetInformation: { + sourceImageSet: {latestVersionId: sourceVersionId}, + }, + force: force + }; + if (destinationImageSetId !== "" && destinationVersionId !== "") { + params.copyImageSetInformation.destinationImageSet = { + imageSetId: destinationImageSetId, + latestVersionId: destinationVersionId, + }; + } + + if (copySubsets.length > 0) { + let copySubsetsJson; + copySubsetsJson = { + SchemaVersion: 1.1, + Study: { + Series: { + imageSetId: { + Instances: {} + } + } + } + }; + + for (let i = 0; i < copySubsets.length; i++) { + copySubsetsJson.Study.Series.imageSetId.Instances[ + copySubsets[i] + ] = {}; + } + + params.copyImageSetInformation.dicomCopies = copySubsetsJson; + } + + const response = await medicalImagingClient.send( + new CopyImageSetCommand(params) + ); + console.log(response); + // { + // '$metadata': { + // httpStatusCode: 200, + // requestId: 'd9b219ce-cc48-4a44-a5b2-c5c3068f1ee8', + // extendedRequestId: undefined, + // cfId: undefined, + // attempts: 1, + // totalRetryDelay: 0 + // }, + // datastoreId: 'xxxxxxxxxxxxxx', + // destinationImageSetProperties: { + // createdAt: 2023-09-27T19:46:21.824Z, + // imageSetArn: 'arn:aws:medical-imaging:us-east-1:xxxxxxxxxxx:datastore/xxxxxxxxxxxxx/imageset/xxxxxxxxxxxxxxxxxxx', + // imageSetId: 'xxxxxxxxxxxxxxx', + // imageSetState: 'LOCKED', + // imageSetWorkflowStatus: 'COPYING', + // latestVersionId: '1', + // updatedAt: 2023-09-27T19:46:21.824Z + // }, + // sourceImageSetProperties: { + // createdAt: 2023-09-22T14:49:26.427Z, + // imageSetArn: 'arn:aws:medical-imaging:us-east-1:xxxxxxxxxxx:datastore/xxxxxxxxxxxxx/imageset/xxxxxxxxxxxxxxxx', + // imageSetId: 'xxxxxxxxxxxxxxxx', + // imageSetState: 'LOCKED', + // imageSetWorkflowStatus: 'COPYING_WITH_READ_ONLY_ACCESS', + // latestVersionId: '4', + // updatedAt: 2023-09-27T19:46:21.824Z + // } + // } + return response; + } catch (err) { + console.error(err); + } }; // snippet-end:[medical-imaging.JavaScript.imageset.copyImageSetV3] // Invoke the following code if this file is being run directly. if (process.argv[1] === fileURLToPath(import.meta.url)) { - // snippet-start:[medical-imaging.JavaScript.imageset.copyImageSetV3.without_destination] - try { + // snippet-start:[medical-imaging.JavaScript.imageset.copyImageSetV3.without_destination] + await copyImageSet( - "12345678901234567890123456789012", - "12345678901234567890123456789012", - "1" + "12345678901234567890123456789012", + "12345678901234567890123456789012", + "1" ); - } catch (err) { - console.error(err); - } - // snippet-end:[medical-imaging.JavaScript.imageset.copyImageSetV3.without_destination] + // snippet-end:[medical-imaging.JavaScript.imageset.copyImageSetV3.without_destination] + + // snippet-start:[medical-imaging.JavaScript.imageset.copyImageSetV3.with_destination] - // snippet-start:[medical-imaging.JavaScript.imageset.copyImageSetV3.with_destination] - try { await copyImageSet( - "12345678901234567890123456789012", - "12345678901234567890123456789012", - "4", - "12345678901234567890123456789012", - "1" + "12345678901234567890123456789012", + "12345678901234567890123456789012", + "1", + "12345678901234567890123456789012", + "1", + false, ); - } catch (err) { - console.error(err); - } - // snippet-end:[medical-imaging.JavaScript.imageset.copyImageSetV3.with_destination] + + // snippet-end:[medical-imaging.JavaScript.imageset.copyImageSetV3.with_destination] + + // snippet-start:[medical-imaging.JavaScript.imageset.copyImageSetV3.with_destination_and_subsets] + + await copyImageSet( + "12345678901234567890123456789012", + "12345678901234567890123456789012", + "1", + "12345678901234567890123456789012", + "1", + true, + ["12345678901234567890123456789012", "11223344556677889900112233445566"] + ); + + // snippet-end:[medical-imaging.JavaScript.imageset.copyImageSetV3.with_destination_and_subsets] + } diff --git a/javascriptv3/example_code/medical-imaging/actions/update-image-set-metadata.js b/javascriptv3/example_code/medical-imaging/actions/update-image-set-metadata.js index 65a073b7ab0..c2133008006 100644 --- a/javascriptv3/example_code/medical-imaging/actions/update-image-set-metadata.js +++ b/javascriptv3/example_code/medical-imaging/actions/update-image-set-metadata.js @@ -16,38 +16,45 @@ import {medicalImagingClient} from "../libs/medicalImagingClient.js"; * @param {string} imageSetId - The ID of the HealthImaging image set. * @param {string} latestVersionId - The ID of the HealthImaging image set version. * @param {{}} updateMetadata - The metadata to update. + * @param {boolean} force - Force the update. */ export const updateImageSetMetadata = async (datastoreId = "xxxxxxxxxx", imageSetId = "xxxxxxxxxx", latestVersionId = "1", - updateMetadata = '{}') => { - const response = await medicalImagingClient.send( - new UpdateImageSetMetadataCommand({ - datastoreId: datastoreId, - imageSetId: imageSetId, - latestVersionId: latestVersionId, - updateImageSetMetadataUpdates: updateMetadata - }) - ); - console.log(response); - // { - // '$metadata': { - // httpStatusCode: 200, - // requestId: '7966e869-e311-4bff-92ec-56a61d3003ea', - // extendedRequestId: undefined, - // cfId: undefined, - // attempts: 1, - // totalRetryDelay: 0 - // }, - // createdAt: 2023-09-22T14:49:26.427Z, - // datastoreId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', - // imageSetId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', - // imageSetState: 'LOCKED', - // imageSetWorkflowStatus: 'UPDATING', - // latestVersionId: '4', - // updatedAt: 2023-09-27T19:41:43.494Z - // } - return response; + updateMetadata = '{}', + force = false) => { + try { + const response = await medicalImagingClient.send( + new UpdateImageSetMetadataCommand({ + datastoreId: datastoreId, + imageSetId: imageSetId, + latestVersionId: latestVersionId, + updateImageSetMetadataUpdates: updateMetadata, + force: force, + }) + ); + console.log(response); + // { + // '$metadata': { + // httpStatusCode: 200, + // requestId: '7966e869-e311-4bff-92ec-56a61d3003ea', + // extendedRequestId: undefined, + // cfId: undefined, + // attempts: 1, + // totalRetryDelay: 0 + // }, + // createdAt: 2023-09-22T14:49:26.427Z, + // datastoreId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', + // imageSetId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', + // imageSetState: 'LOCKED', + // imageSetWorkflowStatus: 'UPDATING', + // latestVersionId: '4', + // updatedAt: 2023-09-27T19:41:43.494Z + // } + return response; + } catch (err) { + console.error(err); + } }; // snippet-end:[medical-imaging.JavaScript.datastore.updateImageSetMetadataV3] @@ -58,7 +65,7 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) { const imageSetID = "12345678901234567890123456789012"; const versionID = "1"; const updateType = "insert"; // or "remove-attribute" or "remove_instance". - if (updateType == "insert") { + if (updateType === "insert") { // Insert or update an attribute. // snippet-start:[medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.insert_or_update_attributes] const insertAttributes = @@ -79,9 +86,9 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) { }; await updateImageSetMetadata(datastoreID, imageSetID, - versionID, updateMetadata); + versionID, updateMetadata, true); // snippet-end:[medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.insert_or_update_attributes] - } else if (updateType == "remove_attribute") { + } else if (updateType === "remove_attribute") { // Remove an existing attribute. // snippet-start:[medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.remove_attributes] // Attribute key and value must match the existing attribute. @@ -105,7 +112,7 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) { await updateImageSetMetadata(datastoreID, imageSetID, versionID, updateMetadata); // snippet-end:[medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.remove_attributes] - } else if (updateType == "remove_instance") { + } else if (updateType === "remove_instance") { // Remove an existing instance. // snippet-start:[medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.remove_instance] const remove_instance = @@ -132,6 +139,16 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) { await updateImageSetMetadata(datastoreID, imageSetID, versionID, updateMetadata); // snippet-end:[medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.remove_instance] - } + } else if (updateType === "revert") { + // Remove an existing instance. +// snippet-start:[medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.revert] + const updateMetadata = { + "revertToVersionId": "1" + }; + + await updateImageSetMetadata(datastoreID, imageSetID, + versionID, updateMetadata); +// snippet-end:[medical-imaging.JavaScript.datastore.updateImageSetMetadataV3.revert] +} } diff --git a/javascriptv3/example_code/medical-imaging/package.json b/javascriptv3/example_code/medical-imaging/package.json index 45bc8f62c23..72e664b221f 100644 --- a/javascriptv3/example_code/medical-imaging/package.json +++ b/javascriptv3/example_code/medical-imaging/package.json @@ -4,10 +4,10 @@ "author": "Steven Meyer { - const actual = await vi.importActual("@aws-sdk/client-medical-imaging"); - return { - ...actual, - MedicalImagingClient: class { - send = send; - }, - }; + const actual = await vi.importActual("@aws-sdk/client-medical-imaging"); + return { + ...actual, + MedicalImagingClient: class { + send = send; + }, + }; }); -const { updateImageSetMetadata } = await import( - "../actions/update-image-set-metadata.js" -); +const {updateImageSetMetadata} = await import( + "../actions/update-image-set-metadata.js" + ); describe("update-image-set-metadata", () => { - it("should log the response", async () => { - const logSpy = vi.spyOn(console, "log"); - const datastoreId = "12345678901234567890123456789012"; - const imageSetId = "12345678901234567890123456789012"; - const versionID = "1"; - const updatableAttributes = JSON.stringify({ - SchemaVersion: 1.1, - Patient: { - DICOM: { - PatientName: "Garcia^Gloria", - }, - }, - }); + it("should log the response", async () => { + const logSpy = vi.spyOn(console, "log"); + const datastoreId = "12345678901234567890123456789012"; + const imageSetId = "12345678901234567890123456789012"; + const versionID = "1"; + const updatableAttributes = JSON.stringify({ + SchemaVersion: 1.1, + Patient: { + DICOM: { + PatientName: "Garcia^Gloria", + }, + }, + }); - const updateMetadata = { - DICOMUpdates: { - updatableAttributes: new TextEncoder().encode(updatableAttributes), - }, - }; - const response = { - $metadata: { - httpStatusCode: 200, - requestId: "7966e869-e311-4bff-92ec-56a61d3003ea", - extendedRequestId: undefined, - cfId: undefined, - attempts: 1, - totalRetryDelay: 0, - }, - createdAt: "2023-09-22T14:49:26.427Z", - datastoreId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", - imageSetId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", - imageSetState: "LOCKED", - imageSetWorkflowStatus: "UPDATING", - latestVersionId: "4", - updatedAt: "2023-09-27T19:41:43.494Z", - }; + const updateMetadata = { + DICOMUpdates: { + updatableAttributes: new TextEncoder().encode(updatableAttributes), + }, + }; + const response = { + $metadata: { + httpStatusCode: 200, + requestId: "7966e869-e311-4bff-92ec-56a61d3003ea", + extendedRequestId: undefined, + cfId: undefined, + attempts: 1, + totalRetryDelay: 0, + }, + createdAt: "2023-09-22T14:49:26.427Z", + datastoreId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + imageSetId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + imageSetState: "LOCKED", + imageSetWorkflowStatus: "UPDATING", + latestVersionId: "4", + updatedAt: "2023-09-27T19:41:43.494Z", + }; - send.mockResolvedValueOnce(response); + send.mockResolvedValueOnce(response); - await updateImageSetMetadata( - datastoreId, - imageSetId, - versionID, - updateMetadata - ); + await updateImageSetMetadata( + datastoreId, + imageSetId, + versionID, + updateMetadata, + true + ); - expect(logSpy).toHaveBeenCalledWith(response); - }); + expect(logSpy).toHaveBeenCalledWith(response); + }); }); diff --git a/javav2/example_code/medicalimaging/README.md b/javav2/example_code/medicalimaging/README.md index 339cc4a7781..2e2a4e64cf2 100644 --- a/javav2/example_code/medicalimaging/README.md +++ b/javav2/example_code/medicalimaging/README.md @@ -33,7 +33,7 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav Code excerpts that show you how to call individual service functions. -- [CopyImageSet](src/main/java/com/example/medicalimaging/CopyImageSet.java#L65) +- [CopyImageSet](src/main/java/com/example/medicalimaging/CopyImageSet.java#L132) - [CreateDatastore](src/main/java/com/example/medicalimaging/CreateDatastore.java#L52) - [DeleteDatastore](src/main/java/com/example/medicalimaging/DeleteDatastore.java#L50) - [DeleteImageSet](src/main/java/com/example/medicalimaging/DeleteImageSet.java#L53) @@ -50,7 +50,7 @@ Code excerpts that show you how to call individual service functions. - [StartDICOMImportJob](src/main/java/com/example/medicalimaging/StartDicomImportJob.java#L65) - [TagResource](src/main/java/com/example/medicalimaging/TagResource.java#L54) - [UntagResource](src/main/java/com/example/medicalimaging/UntagResource.java#L54) -- [UpdateImageSetMetadata](src/main/java/com/example/medicalimaging/UpdateImageSetMetadata.java#L144) +- [UpdateImageSetMetadata](src/main/java/com/example/medicalimaging/UpdateImageSetMetadata.java#L163) ### Scenarios diff --git a/javav2/example_code/medicalimaging/pom.xml b/javav2/example_code/medicalimaging/pom.xml index bf1a283a6e0..ef3b9b979e6 100644 --- a/javav2/example_code/medicalimaging/pom.xml +++ b/javav2/example_code/medicalimaging/pom.xml @@ -8,8 +8,8 @@ 1.0-SNAPSHOT UTF-8 - 1.8 - 2.25.25 + 17 + 2.26.24 @@ -18,8 +18,8 @@ maven-compiler-plugin 3.1 - ${java.version} - ${java.version} + 15 + 15 @@ -50,10 +50,6 @@ 5.9.2 test
- - software.amazon.awssdk - secretsmanager - com.google.code.gson gson @@ -65,7 +61,7 @@ 5.9.2 test - + org.junit.platform junit-platform-commons 1.9.2 @@ -90,5 +86,14 @@ software.amazon.awssdk s3 + + software.amazon.awssdk + secretsmanager + + + commons-cli + commons-cli + 1.8.0 +
\ No newline at end of file diff --git a/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/CopyImageSet.java b/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/CopyImageSet.java index c8aad5f2626..537e4c4528d 100644 --- a/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/CopyImageSet.java +++ b/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/CopyImageSet.java @@ -2,13 +2,23 @@ // SPDX-License-Identifier: Apache-2.0 package com.example.medicalimaging; +import org.apache.commons.cli.*; // snippet-start:[medicalimaging.java2.copy_imageset.import] import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.medicalimaging.MedicalImagingClient; -import software.amazon.awssdk.services.medicalimaging.model.*; +import software.amazon.awssdk.services.medicalimaging.model.CopyDestinationImageSet; +import software.amazon.awssdk.services.medicalimaging.model.CopyImageSetInformation; +import software.amazon.awssdk.services.medicalimaging.model.CopyImageSetRequest; +import software.amazon.awssdk.services.medicalimaging.model.CopyImageSetResponse; +import software.amazon.awssdk.services.medicalimaging.model.CopySourceImageSetInformation; +import software.amazon.awssdk.services.medicalimaging.model.MedicalImagingException; +import software.amazon.awssdk.services.medicalimaging.model.MetadataCopies; + +import java.util.Collections; +import java.util.Vector; // snippet-end:[medicalimaging.java2.copy_imageset.import] @@ -20,33 +30,87 @@ *

* https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html */ + public class CopyImageSet { + /** + * The main function. + *

+ * usage: Copy Image Set + * -c One or more comma separated optional subsets to copy + * -d The ID of the data store + * -di The optional destination image set ID + * -dv The optional destination version ID + * -f The optional force copy flag + * -h Prints this help message + * -i The ID of the image set + * -v The latest version ID of the image set + */ public static void main(String[] args) { - final String usage = "\n" + - "Usage:\n" + - " \n\n" + - "Where:\n" + - " datastoreId - The ID of the data store.\n" + - " imageSetId - The ID of the image set.\n" + - " latestVersionId - The latest version ID of the image set.\n" + - " destinationImageSetId - The optional destination image set ID.\n" + - " destinationVersionId - The optional destination version ID.\n"; - - if ((args.length != 3) && (args.length != 5)) { - System.out.println(usage); - System.exit(1); - } - - String datastoreId = args[0]; - String imageSetId = args[1]; - String versionId = args[2]; + Options options = new Options(); + Option datastoreIdOption = Option.builder("d").hasArg().desc("The ID of the data store").build(); + Option imageSetIdOption = Option.builder("i").hasArg().desc("The ID of the image set").build(); + Option latestVersionIdOption = Option.builder("v").hasArg().desc("The latest version ID of the image set").build(); + Option destinationImageSetIdOption = Option.builder("di").hasArg().desc("The optional destination image set ID").build(); + Option destinationVersionIdOption = Option.builder("dv").hasArg().desc("The optional destination version ID").build(); + Option forceOption = Option.builder("f").desc("The optional force copy flag").build(); + Option copySubset = Option.builder("c").hasArg().desc("One or more comma separated optional subsets to copy").build(); + Option help = Option.builder("h").desc("Prints this help message").build(); + options.addOption(datastoreIdOption); + options.addOption(imageSetIdOption); + options.addOption(latestVersionIdOption); + options.addOption(destinationImageSetIdOption); + options.addOption(destinationVersionIdOption); + options.addOption(forceOption); + options.addOption(copySubset); + options.addOption(help); + CommandLineParser parser = new DefaultParser(); + + String datastoreId = null; + String imageSetId = null; + String versionId = null; String destinationImageSetId = null; String destinationVersionId = null; + boolean force = false; + Vector subsets = null; + try { + CommandLine cmd = parser.parse(options, args); + + if (cmd.hasOption(help)) { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp("Copy Image Set", options); + System.exit(0); + } - if (args.length == 5) { - destinationImageSetId = args[3]; - destinationVersionId = args[4]; + datastoreId = cmd.getOptionValue(datastoreIdOption); + imageSetId = cmd.getOptionValue(imageSetIdOption); + versionId = cmd.getOptionValue(latestVersionIdOption); + destinationImageSetId = cmd.getOptionValue(destinationImageSetIdOption); + destinationVersionId = cmd.getOptionValue(destinationVersionIdOption); + force = cmd.hasOption(forceOption); + + if (cmd.hasOption(copySubset)) { + subsets = new Vector<>(); + String commaSeparatedSubsets = cmd.getOptionValue(copySubset); + String[] subsetsArray = commaSeparatedSubsets.split(","); + Collections.addAll(subsets, subsetsArray); + } + + } catch (UnrecognizedOptionException ex) { + System.out.println(ex.getMessage()); + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp("Copy Image Set", options); + System.exit(1); + } catch (ParseException e) { + System.err.println(e.getLocalizedMessage()); + System.exit(1); + } + + if (datastoreId == null || imageSetId == null || versionId == null) { + System.err.println("Data store ID, image set ID, and version ID are required"); + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp("Copy Image Set", options); + System.exit(1); } Region region = Region.US_WEST_2; @@ -54,30 +118,58 @@ public static void main(String[] args) { .region(region) .credentialsProvider(ProfileCredentialsProvider.create()) .build(); + try { + String copiedImageSetId = copyMedicalImageSet(medicalImagingClient, datastoreId, imageSetId, + versionId, destinationImageSetId, destinationVersionId, force, subsets); - String copiedImageSetId = copyMedicalImageSet(medicalImagingClient, datastoreId, imageSetId, - versionId, destinationImageSetId, destinationVersionId); - - System.out.println("The copied image set ID is " + copiedImageSetId); + System.out.println("The copied image set ID is " + copiedImageSetId); + } catch (MedicalImagingException e) { + System.err.println(e.awsErrorDetails().errorMessage()); + } medicalImagingClient.close(); } // snippet-start:[medicalimaging.java2.copy_imageset.main] + + /** + * Copy an AWS HealthImaging image set. + * + * @param medicalImagingClient - The AWS HealthImaging client object. + * @param datastoreId - The datastore ID. + * @param imageSetId - The image set ID. + * @param latestVersionId - The version ID. + * @param destinationImageSetId - The optional destination image set ID, ignored if null. + * @param destinationVersionId - The optional destination version ID, ignored if null. + * @param force - The force flag. + * @param subsets - The optional subsets to copy, ignored if null. + * @return - The image set ID of the copy. + * @throws MedicalImagingException - Base exception for all service exceptions thrown by AWS HealthImaging. + */ public static String copyMedicalImageSet(MedicalImagingClient medicalImagingClient, - String datastoreId, - String imageSetId, - String latestVersionId, - String destinationImageSetId, - String destinationVersionId) { + String datastoreId, + String imageSetId, + String latestVersionId, + String destinationImageSetId, + String destinationVersionId, + boolean force, + Vector subsets) { try { - CopySourceImageSetInformation copySourceImageSetInformation = CopySourceImageSetInformation.builder() - .latestVersionId(latestVersionId) - .build(); + CopySourceImageSetInformation.Builder copySourceImageSetInformation = CopySourceImageSetInformation.builder() + .latestVersionId(latestVersionId); + + // Optionally copy a subset of image instances. + if (subsets != null) { + String subsetInstanceToCopy = getCopiableAttributesJSON(imageSetId, subsets); + copySourceImageSetInformation.dicomCopies(MetadataCopies.builder() + .copiableAttributes(subsetInstanceToCopy) + .build()); + } CopyImageSetInformation.Builder copyImageSetBuilder = CopyImageSetInformation.builder() - .sourceImageSet(copySourceImageSetInformation); + .sourceImageSet(copySourceImageSetInformation.build()); + // Optionally designate a destination image set. if (destinationImageSetId != null) { copyImageSetBuilder = copyImageSetBuilder.destinationImageSet(CopyDestinationImageSet.builder() .imageSetId(destinationImageSetId) @@ -89,6 +181,7 @@ public static String copyMedicalImageSet(MedicalImagingClient medicalImagingClie .datastoreId(datastoreId) .sourceImageSetId(imageSetId) .copyImageSetInformation(copyImageSetBuilder.build()) + .force(force) .build(); CopyImageSetResponse response = medicalImagingClient.copyImageSet(copyImageSetRequest); @@ -96,10 +189,52 @@ public static String copyMedicalImageSet(MedicalImagingClient medicalImagingClie return response.destinationImageSetProperties().imageSetId(); } catch (MedicalImagingException e) { System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); + throw e; } - - return ""; } // snippet-end:[medicalimaging.java2.copy_imageset.main] + + // snippet-start:[medicalimaging.java2.copy_imageset.copiable_attributes] + + /** + * Create a JSON string of copiable image instances. + * + * @param imageSetId - The image set ID. + * @param subsets - The subsets to copy. + * @return A JSON string of copiable image instances. + */ + private static String getCopiableAttributesJSON(String imageSetId, Vector subsets) { + StringBuilder subsetInstanceToCopy = new StringBuilder( + """ + { + "SchemaVersion": 1.1, + "Study": { + "Series": { + " + """ + ); + + subsetInstanceToCopy.append(imageSetId); + + subsetInstanceToCopy.append( + """ + ": { + "Instances": { + """ + ); + + for (String subset : subsets) { + subsetInstanceToCopy.append('"' + subset + "\": {},"); + } + subsetInstanceToCopy.deleteCharAt(subsetInstanceToCopy.length() - 1); + subsetInstanceToCopy.append(""" + } + } + } + } + } + """); + return subsetInstanceToCopy.toString(); + } + // snippet-end:[medicalimaging.java2.copy_imageset.copiable_attributes] } diff --git a/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/SearchImageSets.java b/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/SearchImageSets.java index f5e88eb4a03..0cd11ca7e28 100644 --- a/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/SearchImageSets.java +++ b/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/SearchImageSets.java @@ -50,7 +50,7 @@ public static void main(String[] args) { String patientId = args[1]; String seriesInstanceUID = args[2]; - Region region = Region.US_EAST_1; + Region region = Region.US_WEST_2; MedicalImagingClient medicalImagingClient = MedicalImagingClient.builder() .region(region) .credentialsProvider(ProfileCredentialsProvider.create()) diff --git a/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/UpdateImageSetMetadata.java b/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/UpdateImageSetMetadata.java index 0e13b77b1f2..a3b2a4b6582 100644 --- a/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/UpdateImageSetMetadata.java +++ b/javav2/example_code/medicalimaging/src/main/java/com/example/medicalimaging/UpdateImageSetMetadata.java @@ -29,14 +29,15 @@ public class UpdateImageSetMetadata { public static void main(String[] args) { final String usage = "\n" + "Usage:\n" + - " n\n" + + " [force]n\n" + "Where:\n" + " datastoreId - The ID of the data store.\n" + " imagesetId - The ID of the image set.\n" + " versionId - The latest version ID of the image set.\n" + - " updateType - Choice of (insert | remove_attribute | remove_instance) for update type.\n"; + " updateType - Choice of (insert | remove_attribute | remove_instance | revert) for update type.\n" + + " force - Optional force (true | false) when updating.\n"; - if (args.length != 4) { + if (args.length != 4 && args.length != 5) { System.out.println(usage); System.exit(1); } @@ -45,115 +46,147 @@ public static void main(String[] args) { String imagesetId = args[1]; String versionid = args[2]; String updateType = args[3]; + boolean force = false; + if (args.length == 5) { + force = args[4].equals("true"); + } - if (!updateType.equals("insert") && !updateType.equals("remove_attribute") && !updateType.equals("remove_instance")) { + if (!updateType.equals("insert") && !updateType.equals("remove_attribute") && !updateType.equals("remove_instance") + && !updateType.equals("revert")) { System.out.println("Invalid update type, '" + updateType + "'."); System.out.println(usage); System.exit(1); } - Region region = Region.US_EAST_1; + Region region = Region.US_WEST_2; MedicalImagingClient medicalImagingClient = MedicalImagingClient.builder() .region(region) .credentialsProvider(ProfileCredentialsProvider.create()) .build(); - if (updateType.equals("insert")) { - // Add a new attribute or update an existing attribute. - // snippet-start:[medicalimaging.java2.update_image_set_metadata.insert_or_update_attributes] - final String insertAttributes = """ - { - "SchemaVersion": 1.1, - "Study": { - "DICOM": { - "StudyDescription": "CT CHEST" - } - } - } - """; - MetadataUpdates metadataInsertUpdates = MetadataUpdates.builder() - .dicomUpdates(DICOMUpdates.builder() - .updatableAttributes(SdkBytes.fromByteBuffer( - ByteBuffer.wrap(insertAttributes - .getBytes(StandardCharsets.UTF_8)))) - .build()) - .build(); - - updateMedicalImageSetMetadata(medicalImagingClient, datastoreId, imagesetId, - versionid, metadataInsertUpdates); - // snippet-end:[medicalimaging.java2.update_image_set_metadata.insert_or_update_attributes] - } else if (updateType.equals("remove_attribute")) { - // Remove an attribute. - // snippet-start:[medicalimaging.java2.update_image_set_metadata.remove_attributes] - final String removeAttributes = """ - { - "SchemaVersion": 1.1, - "Study": { - "DICOM": { - "StudyDescription": "CT CHEST" + try { + if (updateType.equals("insert")) { + // Add a new attribute or update an existing attribute. + // snippet-start:[medicalimaging.java2.update_image_set_metadata.insert_or_update_attributes] + final String insertAttributes = """ + { + "SchemaVersion": 1.1, + "Study": { + "DICOM": { + "StudyDescription": "CT CHEST" + } + } } - } - } - """; - MetadataUpdates metadataRemoveUpdates = MetadataUpdates.builder() - .dicomUpdates(DICOMUpdates.builder() - .removableAttributes(SdkBytes.fromByteBuffer( - ByteBuffer.wrap(removeAttributes - .getBytes(StandardCharsets.UTF_8)))) - .build()) - .build(); - - updateMedicalImageSetMetadata(medicalImagingClient, datastoreId, imagesetId, - versionid, metadataRemoveUpdates); - // snippet-end:[medicalimaging.java2.update_image_set_metadata.remove_attributes] - } else if (updateType.equals("remove_instance")) { - // Remove an instance. - // snippet-start:[medicalimaging.java2.update_image_set_metadata.remove_instance] - final String removeInstance = """ - { - "SchemaVersion": 1.1, - "Study": { - "Series": { - "1.1.1.1.1.1.12345.123456789012.123.12345678901234.1": { - "Instances": { - "1.1.1.1.1.1.12345.123456789012.123.12345678901234.1": {} + """; + MetadataUpdates metadataInsertUpdates = MetadataUpdates.builder() + .dicomUpdates(DICOMUpdates.builder() + .updatableAttributes(SdkBytes.fromByteBuffer( + ByteBuffer.wrap(insertAttributes + .getBytes(StandardCharsets.UTF_8)))) + .build()) + .build(); + + updateMedicalImageSetMetadata(medicalImagingClient, datastoreId, imagesetId, + versionid, metadataInsertUpdates, force); + // snippet-end:[medicalimaging.java2.update_image_set_metadata.insert_or_update_attributes] + } else if (updateType.equals("remove_attribute")) { + // Remove an attribute. + // snippet-start:[medicalimaging.java2.update_image_set_metadata.remove_attributes] + final String removeAttributes = """ + { + "SchemaVersion": 1.1, + "Study": { + "DICOM": { + "StudyDescription": "CT CHEST" } } } - } - } - """; - MetadataUpdates metadataRemoveUpdates = MetadataUpdates.builder() - .dicomUpdates(DICOMUpdates.builder() - .removableAttributes(SdkBytes.fromByteBuffer( - ByteBuffer.wrap(removeInstance - .getBytes(StandardCharsets.UTF_8)))) - .build()) - .build(); - - updateMedicalImageSetMetadata(medicalImagingClient, datastoreId, imagesetId, - versionid, metadataRemoveUpdates); - // snippet-end:[medicalimaging.java2.update_image_set_metadata.remove_instance] + """; + MetadataUpdates metadataRemoveUpdates = MetadataUpdates.builder() + .dicomUpdates(DICOMUpdates.builder() + .removableAttributes(SdkBytes.fromByteBuffer( + ByteBuffer.wrap(removeAttributes + .getBytes(StandardCharsets.UTF_8)))) + .build()) + .build(); + + updateMedicalImageSetMetadata(medicalImagingClient, datastoreId, imagesetId, + versionid, metadataRemoveUpdates, force); + // snippet-end:[medicalimaging.java2.update_image_set_metadata.remove_attributes] + } else if (updateType.equals("remove_instance")) { + // Remove an instance. + // snippet-start:[medicalimaging.java2.update_image_set_metadata.remove_instance] + final String removeInstance = """ + { + "SchemaVersion": 1.1, + "Study": { + "Series": { + "1.1.1.1.1.1.12345.123456789012.123.12345678901234.1": { + "Instances": { + "1.1.1.1.1.1.12345.123456789012.123.12345678901234.1": {} + } + } + } + } + } + """; + MetadataUpdates metadataRemoveUpdates = MetadataUpdates.builder() + .dicomUpdates(DICOMUpdates.builder() + .removableAttributes(SdkBytes.fromByteBuffer( + ByteBuffer.wrap(removeInstance + .getBytes(StandardCharsets.UTF_8)))) + .build()) + .build(); + + updateMedicalImageSetMetadata(medicalImagingClient, datastoreId, imagesetId, + versionid, metadataRemoveUpdates, force); + // snippet-end:[medicalimaging.java2.update_image_set_metadata.remove_instance] + } else if (updateType.equals("revert")) { + // snippet-start:[medicalimaging.java2.update_image_set_metadata.revert] + // In this case, revert to previous version. + String revertVersionId = Integer.toString(Integer.parseInt(versionid) - 1); + MetadataUpdates metadataRemoveUpdates = MetadataUpdates.builder() + .revertToVersionId(revertVersionId) + .build(); + updateMedicalImageSetMetadata(medicalImagingClient, datastoreId, imagesetId, + versionid, metadataRemoveUpdates, force); + // snippet-end:[medicalimaging.java2.update_image_set_metadata.revert] + } + } catch (MedicalImagingException e) { + System.err.println(e.awsErrorDetails().errorMessage()); } - medicalImagingClient.close(); } // snippet-start:[medicalimaging.java2.update_image_set_metadata.main] + + /** + * Update the metadata of an AWS HealthImaging image set. + * + * @param medicalImagingClient - The AWS HealthImaging client object. + * @param datastoreId - The datastore ID. + * @param imageSetId - The image set ID. + * @param versionId - The version ID. + * @param metadataUpdates - A MetadataUpdates object containing the updates. + * @param force - The force flag. + * @throws MedicalImagingException - Base exception for all service exceptions thrown by AWS HealthImaging. + */ public static void updateMedicalImageSetMetadata(MedicalImagingClient medicalImagingClient, String datastoreId, - String imagesetId, + String imageSetId, String versionId, - MetadataUpdates metadataUpdates) { + MetadataUpdates metadataUpdates, + boolean force) { try { UpdateImageSetMetadataRequest updateImageSetMetadataRequest = UpdateImageSetMetadataRequest .builder() .datastoreId(datastoreId) - .imageSetId(imagesetId) + .imageSetId(imageSetId) .latestVersionId(versionId) .updateImageSetMetadataUpdates(metadataUpdates) + .force(force) .build(); UpdateImageSetMetadataResponse response = medicalImagingClient.updateImageSetMetadata(updateImageSetMetadataRequest); @@ -161,7 +194,7 @@ public static void updateMedicalImageSetMetadata(MedicalImagingClient medicalIma System.out.println("The image set metadata was updated" + response); } catch (MedicalImagingException e) { System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); + throw e; } } // snippet-end:[medicalimaging.java2.update_image_set_metadata.main] diff --git a/javav2/example_code/medicalimaging/src/test/java/AWSMedicalImagingTest.java b/javav2/example_code/medicalimaging/src/test/java/AWSMedicalImagingTest.java index 64b0bc18670..09b63ccc5a2 100644 --- a/javav2/example_code/medicalimaging/src/test/java/AWSMedicalImagingTest.java +++ b/javav2/example_code/medicalimaging/src/test/java/AWSMedicalImagingTest.java @@ -142,18 +142,7 @@ public void listDatastoresTest() { } - @Test - @Tag("IntegrationTest") - @Order(4) - public void getDicomImportJobTest() { - final DICOMImportJobProperties[] dicomImportJobSummaries = { null }; - assertDoesNotThrow(() -> dicomImportJobSummaries[0] = GetDicomImportJob.getDicomImportJob(medicalImagingClient, - workingDatastoreId, importJobId)); - assertNotNull(dicomImportJobSummaries[0]); - - System.out.println("Test 4 passed"); - } - + @Test @Tag("IntegrationTest") @Order(5) @@ -182,10 +171,13 @@ public void searchImageSetsTest() { .build()) .build()); + SearchCriteria searchCriteria = SearchCriteria.builder() + .filters(searchFilters) + .build(); @SuppressWarnings("rawtypes") final List[] searchResults = { null }; assertDoesNotThrow(() -> searchResults[0] = SearchImageSets.searchMedicalImagingImageSets(medicalImagingClient, - workingDatastoreId, searchFilters)); + workingDatastoreId, searchCriteria)); assertNotNull(searchResults[0]); System.out.println("Test 6 passed"); diff --git a/python/example_code/medical-imaging/README.md b/python/example_code/medical-imaging/README.md index 1d91c6c05bf..90b913b7dc5 100644 --- a/python/example_code/medical-imaging/README.md +++ b/python/example_code/medical-imaging/README.md @@ -43,10 +43,10 @@ python -m pip install -r requirements.txt Code excerpts that show you how to call individual service functions. -- [CopyImageSet](medical_imaging_basics.py#L415) +- [CopyImageSet](medical_imaging_basics.py#L417) - [CreateDatastore](medical_imaging_basics.py#L31) - [DeleteDatastore](medical_imaging_basics.py#L104) -- [DeleteImageSet](medical_imaging_basics.py#L466) +- [DeleteImageSet](medical_imaging_basics.py#L489) - [GetDICOMImportJob](medical_imaging_basics.py#L158) - [GetDatastore](medical_imaging_basics.py#L54) - [GetImageFrame](medical_imaging_basics.py#L318) @@ -55,11 +55,11 @@ Code excerpts that show you how to call individual service functions. - [ListDICOMImportJobs](medical_imaging_basics.py#L183) - [ListDatastores](medical_imaging_basics.py#L79) - [ListImageSetVersions](medical_imaging_basics.py#L350) -- [ListTagsForResource](medical_imaging_basics.py#L533) +- [ListTagsForResource](medical_imaging_basics.py#L556) - [SearchImageSets](medical_imaging_basics.py#L211) - [StartDICOMImportJob](medical_imaging_basics.py#L124) -- [TagResource](medical_imaging_basics.py#L491) -- [UntagResource](medical_imaging_basics.py#L511) +- [TagResource](medical_imaging_basics.py#L514) +- [UntagResource](medical_imaging_basics.py#L534) - [UpdateImageSetMetadata](medical_imaging_basics.py#L381) ### Scenarios diff --git a/python/example_code/medical-imaging/medical_imaging_basics.py b/python/example_code/medical-imaging/medical_imaging_basics.py index 1555bc81f9a..b870ca12ced 100644 --- a/python/example_code/medical-imaging/medical_imaging_basics.py +++ b/python/example_code/medical-imaging/medical_imaging_basics.py @@ -380,7 +380,7 @@ def list_image_set_versions(self, datastore_id, image_set_id): # snippet-start:[python.example_code.medical-imaging.UpdateImageSetMetadata] def update_image_set_metadata( - self, datastore_id, image_set_id, version_id, metadata + self, datastore_id, image_set_id, version_id, metadata, force=False ): """ Update the metadata of an image set. @@ -391,6 +391,7 @@ def update_image_set_metadata( :param metadata: The image set metadata as a dictionary. For example {"DICOMUpdates": {"updatableAttributes": "{\"SchemaVersion\":1.1,\"Patient\":{\"DICOM\":{\"PatientName\":\"Garcia^Gloria\"}}}"}} + :param: force: Force the update. :return: The updated image set metadata. """ try: @@ -399,6 +400,7 @@ def update_image_set_metadata( datastoreId=datastore_id, latestVersionId=version_id, updateImageSetMetadataUpdates=metadata, + force=force, ) except ClientError as err: logger.error( @@ -420,6 +422,8 @@ def copy_image_set( version_id, destination_image_set_id=None, destination_version_id=None, + force=False, + subsets=[], ): """ Copy an image set. @@ -429,6 +433,8 @@ def copy_image_set( :param version_id: The ID of the image set version. :param destination_image_set_id: The ID of the optional destination image set. :param destination_version_id: The ID of the optional destination image set version. + :param force: Force the copy. + :param subsets: The optional subsets to copy. For example: ["12345678901234567890123456789012"]. :return: The copied image set ID. """ try: @@ -445,12 +451,29 @@ def copy_image_set( } # snippet-end:[python.example_code.medical-imaging.CopyImageSet2] # snippet-start:[python.example_code.medical-imaging.CopyImageSet3] + if len(subsets) > 0: + copySubsetsJson = { + "SchemaVersion": "1.1", + "Study": {"Series": {"imageSetId": {"Instances": {}}}}, + } + + for subset in subsets: + copySubsetsJson["Study"]["Series"]["imageSetId"]["Instances"][ + subset + ] = {} + + copy_image_set_information["sourceImageSet"]["DICOMCopies"] = { + "copiableAttributes": json.dumps(copySubsetsJson) + } + # snippet-end:[python.example_code.medical-imaging.CopyImageSet3] + # snippet-start:[python.example_code.medical-imaging.CopyImageSet4] copy_results = self.health_imaging_client.copy_image_set( datastoreId=datastore_id, sourceImageSetId=image_set_id, copyImageSetInformation=copy_image_set_information, + force=force, ) - # snippet-end:[python.example_code.medical-imaging.CopyImageSet3] + # snippet-end:[python.example_code.medical-imaging.CopyImageSet4] except ClientError as err: logger.error( "Couldn't copy image set. Here's why: %s: %s", @@ -833,7 +856,8 @@ def update_image_set_metadata_demo(self): data_store_id = "12345678901234567890123456789012" image_set_id = "12345678901234567890123456789012" version_id = "1" - update_type = "insert" # or "remove-attribute" or "remove_instance" + force = False + update_type = "insert" # or "remove-attribute" or "remove_instance" or "revert" if update_type == "insert": # Insert or update an attribute. # snippet-start:[python.example_code.medical-imaging.UpdateImageSetMetadata.insert_or_update_attributes] @@ -848,7 +872,7 @@ def update_image_set_metadata_demo(self): metadata = {"DICOMUpdates": {"updatableAttributes": attributes}} self.update_image_set_metadata( - data_store_id, image_set_id, version_id, metadata + data_store_id, image_set_id, version_id, metadata, force ) # snippet-end:[python.example_code.medical-imaging.UpdateImageSetMetadata.insert_or_update_attributes] elif update_type == "remove-attribute": @@ -866,7 +890,7 @@ def update_image_set_metadata_demo(self): metadata = {"DICOMUpdates": {"removableAttributes": attributes}} self.update_image_set_metadata( - data_store_id, image_set_id, version_id, metadata + data_store_id, image_set_id, version_id, metadata, force ) # snippet-end:[python.example_code.medical-imaging.UpdateImageSetMetadata.remove_attributes] elif update_type == "remove_instance": @@ -887,10 +911,20 @@ def update_image_set_metadata_demo(self): metadata = {"DICOMUpdates": {"removableAttributes": attributes}} self.update_image_set_metadata( - data_store_id, image_set_id, version_id, metadata + data_store_id, image_set_id, version_id, metadata, force ) # snippet-end:[python.example_code.medical-imaging.UpdateImageSetMetadata.remove_instance] + elif update_type == "revert": + # Revert to a previous version. + # snippet-start:[python.example_code.medical-imaging.UpdateImageSetMetadata.revert] + metadata = {"revertToVersionId": "1"} + + self.update_image_set_metadata( + data_store_id, image_set_id, version_id, metadata, force + ) + + # snippet-end:[python.example_code.medical-imaging.UpdateImageSetMetadata.revert] print(f"Updated with update type {update_type}") diff --git a/python/example_code/medical-imaging/requirements.txt b/python/example_code/medical-imaging/requirements.txt index 3ef6d7037a9..0fb8ea1f7d5 100644 --- a/python/example_code/medical-imaging/requirements.txt +++ b/python/example_code/medical-imaging/requirements.txt @@ -1,5 +1,5 @@ -boto3>=1.34.78 +boto3>=1.34.149 pytest>=7.2.1 requests>=2.28.2 openjphpy>=0.1.0 -botocore>=1.34.78 \ No newline at end of file +botocore>=1.34.149 \ No newline at end of file diff --git a/python/example_code/medical-imaging/test/test_medical_imaging_basics.py b/python/example_code/medical-imaging/test/test_medical_imaging_basics.py index 1dc069f1322..3f6a25e8303 100644 --- a/python/example_code/medical-imaging/test/test_medical_imaging_basics.py +++ b/python/example_code/medical-imaging/test/test_medical_imaging_basics.py @@ -5,10 +5,11 @@ Unit tests for medical_imaging_basics functions. """ +import os + import boto3 -from botocore.exceptions import ClientError import pytest -import os +from botocore.exceptions import ClientError from medical_imaging_basics import MedicalImagingWrapper @@ -295,6 +296,7 @@ def test_update_image_set_metadata(make_stubber, error_code): datastore_id = "abcdedf1234567890abcdef123456789" image_set_id = "cccccc1234567890abcdef123456789" version_id = "1" + force = False metadata = { "DICOMUpdates": { "updatableAttributes": '{"SchemaVersion":1.1,"Patient":{"DICOM":{"PatientName":"Garcia^Gloria"}}}' @@ -302,18 +304,18 @@ def test_update_image_set_metadata(make_stubber, error_code): } medical_imaging_stubber.stub_update_image_set_metadata( - datastore_id, image_set_id, version_id, metadata, error_code=error_code + datastore_id, image_set_id, version_id, metadata, force, error_code=error_code ) if error_code is None: wrapper.update_image_set_metadata( - datastore_id, image_set_id, version_id, metadata + datastore_id, image_set_id, version_id, metadata, force ) else: with pytest.raises(ClientError) as exc_info: wrapper.update_image_set_metadata( - datastore_id, image_set_id, version_id, metadata + datastore_id, image_set_id, version_id, metadata, force ) assert exc_info.value.response["Error"]["Code"] == error_code @@ -351,6 +353,8 @@ def test_copy_image_set_with_destination(make_stubber, error_code): version_id = "1" destination_image_set_id = "cccccc1234567890abcdef123456789" destination_version_id = "1" + force = True + subset_Id = "cccccc1234567890abcdef123456789" medical_imaging_stubber.stub_copy_image_set_with_destination( datastore_id, @@ -358,6 +362,8 @@ def test_copy_image_set_with_destination(make_stubber, error_code): version_id, destination_image_set_id, destination_version_id, + force, + subset_Id, error_code=error_code, ) @@ -368,6 +374,8 @@ def test_copy_image_set_with_destination(make_stubber, error_code): version_id, destination_image_set_id, destination_version_id, + force, + [subset_Id], ) else: @@ -378,6 +386,8 @@ def test_copy_image_set_with_destination(make_stubber, error_code): version_id, destination_image_set_id, destination_version_id, + force, + [subset_Id], ) assert exc_info.value.response["Error"]["Code"] == error_code diff --git a/python/test_tools/medical_imaging_stubber.py b/python/test_tools/medical_imaging_stubber.py index 031b2423d8e..29ca5887bab 100644 --- a/python/test_tools/medical_imaging_stubber.py +++ b/python/test_tools/medical_imaging_stubber.py @@ -9,6 +9,7 @@ import botocore import io import gzip +import json class MedicalImagingStubber(ExampleStubber): @@ -241,13 +242,14 @@ def stub_list_image_set_versions(self, datastore_id, image_set_id, error_code=No ) def stub_update_image_set_metadata( - self, datastore_id, image_set_id, version_id, metadata, error_code=None + self, datastore_id, image_set_id, version_id, metadata, force, error_code=None ): expected_params = { "datastoreId": datastore_id, "imageSetId": image_set_id, "latestVersionId": version_id, "updateImageSetMetadataUpdates": metadata, + "force": force, } response = { @@ -278,6 +280,7 @@ def stub_copy_image_set_without_destination( "copyImageSetInformation": { "sourceImageSet": {"latestVersionId": version_id} }, + "force": False, } response = { @@ -303,8 +306,14 @@ def stub_copy_image_set_with_destination( version_id, destination_image_set_id, destination_version_id, + force, + subset, error_code=None, ): + copiable_attributes = { + "SchemaVersion": "1.1", + "Study": {"Series": {"imageSetId": {"Instances": {subset: {}}}}}, + } expected_params = { "datastoreId": datastore_id, "sourceImageSetId": image_set_id, @@ -313,8 +322,14 @@ def stub_copy_image_set_with_destination( "imageSetId": destination_image_set_id, "latestVersionId": destination_version_id, }, - "sourceImageSet": {"latestVersionId": version_id}, + "sourceImageSet": { + "latestVersionId": version_id, + "DICOMCopies": { + "copiableAttributes": json.dumps(copiable_attributes) + }, + }, }, + "force": force, } response = { From 344dd498d22b50a063e1b760abb8e78cd0b5f558 Mon Sep 17 00:00:00 2001 From: Steven Meyer <108885656+meyertst-aws@users.noreply.github.com> Date: Fri, 2 Aug 2024 10:24:50 -0400 Subject: [PATCH 16/98] Cpp: code improvements EC2 (#6698) --- .doc_gen/metadata/ec2_metadata.yaml | 45 +++---- .doc_gen/validation.yaml | 1 + cpp/example_code/ec2/CMakeLists.txt | 12 +- cpp/example_code/ec2/README.md | 44 +++---- cpp/example_code/ec2/allocate_address.cpp | 31 +++-- cpp/example_code/ec2/associate_address.cpp | 87 +++++++++++++ .../ec2/authorize_security_group_ingress.cpp | 120 ++++++++++++++++++ cpp/example_code/ec2/create_key_pair.cpp | 35 +++-- .../ec2/create_security_group.cpp | 85 +------------ cpp/example_code/ec2/create_tags.cpp | 90 +++++++++++++ cpp/example_code/ec2/delete_key_pair.cpp | 12 +- .../ec2/delete_security_group.cpp | 13 +- cpp/example_code/ec2/describe_addresses.cpp | 15 +-- .../ec2/describe_availability_zones.cpp | 91 +++++++++++++ cpp/example_code/ec2/describe_instances.cpp | 18 ++- cpp/example_code/ec2/describe_key_pairs.cpp | 13 +- .../ec2/describe_regions_and_zones.cpp | 60 ++------- .../ec2/describe_security_groups.cpp | 13 +- cpp/example_code/ec2/ec2_samples.h | 106 ++++++++++------ cpp/example_code/ec2/hello_ec2/hello_ec2.cpp | 5 +- cpp/example_code/ec2/monitor_instance.cpp | 50 ++++---- cpp/example_code/ec2/reboot_instance.cpp | 20 ++- cpp/example_code/ec2/release_address.cpp | 13 +- ...{create_instance.cpp => run_instances.cpp} | 43 ++----- cpp/example_code/ec2/start_stop_instance.cpp | 64 +++++----- cpp/example_code/ec2/terminate_instances.cpp | 13 +- cpp/example_code/ec2/tests/CMakeLists.txt | 28 +--- cpp/example_code/ec2/tests/ec2_gtests.cpp | 58 ++++++--- cpp/example_code/ec2/tests/ec2_gtests.h | 7 +- .../ec2/tests/gtest_allocate_address.cpp | 5 +- .../ec2/tests/gtest_associate_address.cpp | 38 ++++++ ...gtest_authorize_security_group_ingress.cpp | 25 ++++ .../ec2/tests/gtest_create_key_pair.cpp | 2 +- .../ec2/tests/gtest_create_security_group.cpp | 2 +- .../ec2/tests/gtest_create_tags.cpp | 29 +++++ .../ec2/tests/gtest_delete_key_pair.cpp | 2 +- .../ec2/tests/gtest_delete_security_group.cpp | 2 +- .../ec2/tests/gtest_describe_addresses.cpp | 2 +- .../gtest_describe_availability_zones.cpp | 24 ++++ .../ec2/tests/gtest_describe_instances.cpp | 2 +- .../ec2/tests/gtest_describe_key_pairs.cpp | 2 +- .../gtest_describe_regions_and_zones.cpp | 2 +- .../tests/gtest_describe_security_groups.cpp | 2 +- .../ec2/tests/gtest_monitor_instance.cpp | 4 +- .../ec2/tests/gtest_reboot_instance.cpp | 2 +- .../ec2/tests/gtest_release_address.cpp | 2 +- ...e_instance.cpp => gtest_run_instances.cpp} | 2 +- .../ec2/tests/gtest_start_stop_instance.cpp | 4 +- .../ec2/tests/gtest_terminate_instances.cpp | 2 +- 49 files changed, 863 insertions(+), 484 deletions(-) create mode 100644 cpp/example_code/ec2/associate_address.cpp create mode 100644 cpp/example_code/ec2/authorize_security_group_ingress.cpp create mode 100644 cpp/example_code/ec2/create_tags.cpp create mode 100644 cpp/example_code/ec2/describe_availability_zones.cpp rename cpp/example_code/ec2/{create_instance.cpp => run_instances.cpp} (65%) create mode 100644 cpp/example_code/ec2/tests/gtest_associate_address.cpp create mode 100644 cpp/example_code/ec2/tests/gtest_authorize_security_group_ingress.cpp create mode 100644 cpp/example_code/ec2/tests/gtest_create_tags.cpp create mode 100644 cpp/example_code/ec2/tests/gtest_describe_availability_zones.cpp rename cpp/example_code/ec2/tests/{gtest_create_instance.cpp => gtest_run_instances.cpp} (93%) diff --git a/.doc_gen/metadata/ec2_metadata.yaml b/.doc_gen/metadata/ec2_metadata.yaml index e1568abd7ba..3b8880fda8b 100644 --- a/.doc_gen/metadata/ec2_metadata.yaml +++ b/.doc_gen/metadata/ec2_metadata.yaml @@ -155,7 +155,7 @@ ec2_CreateKeyPair: excerpts: - description: snippet_tags: - - ec2.cpp.create_key_pair.code + - cpp.example_code.ec2,CreateKeyPair Bash: versions: - sdk_version: 2 @@ -233,7 +233,7 @@ ec2_DescribeKeyPairs: excerpts: - description: snippet_tags: - - ec2.cpp.describe_key_pairs.code + - cpp.example_code.ec2.DescribeKeyPairs Bash: versions: - sdk_version: 2 @@ -322,7 +322,6 @@ ec2_CreateSecurityGroup: excerpts: - description: snippet_tags: - - cpp.example_code.ec2.create_security_group.client - cpp.example_code.ec2.CreateSecurityGroup Bash: versions: @@ -398,11 +397,9 @@ ec2_RunInstances: versions: - sdk_version: 1 github: cpp/example_code/ec2 - sdkguide: excerpts: - description: snippet_tags: - - cpp.example_code.ec2.create_instance.client - cpp.example_code.ec2.RunInstances Bash: versions: @@ -498,7 +495,7 @@ ec2_StartInstances: excerpts: - description: snippet_tags: - - ec2.cpp.start_instance.code + - cpp.example_code.ec2.StartInstances Bash: versions: - sdk_version: 2 @@ -593,7 +590,7 @@ ec2_StopInstances: excerpts: - description: snippet_tags: - - ec2.cpp.stop_instance.code + - cpp.example_code.ec2.StopInstances Bash: versions: - sdk_version: 2 @@ -680,8 +677,8 @@ ec2_AllocateAddress: excerpts: - description: snippet_tags: - - cpp.example_code.ec2.allocate_address.client - cpp.example_code.ec2.AllocateAddress + - cpp.example_code.ec2.AllocateAddress2 Bash: versions: - sdk_version: 2 @@ -768,7 +765,6 @@ ec2_AssociateAddress: excerpts: - description: snippet_tags: - - cpp.example_code.ec2.allocate_address.client - cpp.example_code.ec2.AssociateAddress Bash: versions: @@ -918,7 +914,7 @@ ec2_ReleaseAddress: excerpts: - description: snippet_tags: - - ec2.cpp.release_address.code + - cpp.example_code.ec2.ReleaseAddress Bash: versions: - sdk_version: 2 @@ -979,9 +975,10 @@ ec2_AuthorizeSecurityGroupIngress: excerpts: - description: snippet_tags: - - cpp.example_code.ec2.allocate_address.client - - ec2.cpp.configure_security_group02.code - - ec2.cpp.configure_security_group03.code + - cpp.example_code.ec2.AuthorizeSecurityGroupIngress + - description: Utility function to build an ingress rule. + snippet_tags: + - cpp.example_code.ec2.BuildSampleIngressRule JavaScript: versions: - sdk_version: 3 @@ -1068,7 +1065,7 @@ ec2_DeleteKeyPair: excerpts: - description: snippet_tags: - - ec2.cpp.delete_key_pair.code + - cpp.example_code.ec2.DeleteKeyPair Bash: versions: - sdk_version: 2 @@ -1146,7 +1143,7 @@ ec2_DescribeSecurityGroups: excerpts: - description: snippet_tags: - - ec2.cpp.describe_security_groups.code + - cpp.example_code.ec2.DescribeSecurityGroups Bash: versions: - sdk_version: 2 @@ -1224,7 +1221,7 @@ ec2_DeleteSecurityGroup: excerpts: - description: snippet_tags: - - ec2.cpp.delete_security_group.code + - cpp.example_code.ec2.DeleteSecurityGroup Bash: versions: - sdk_version: 2 @@ -1422,7 +1419,7 @@ ec2_DescribeInstances: excerpts: - description: snippet_tags: - - ec2.cpp.describe_instances.code + - cpp.example_code.ec2.DescribeInstances Bash: versions: - sdk_version: 2 @@ -1479,7 +1476,6 @@ ec2_DescribeRegions: excerpts: - description: snippet_tags: - - cpp.example_code.ec2.describe_regions.client - cpp.example_code.ec2.DescribeRegions services: ec2: {DescribeRegions} @@ -1521,7 +1517,7 @@ ec2_MonitorInstances: excerpts: - description: snippet_tags: - - ec2.cpp.enable_monitor_instance.code + - cpp.example_code.ec2.MonitorInstances services: ec2: {MonitorInstances} ec2_UnmonitorInstances: @@ -1533,7 +1529,7 @@ ec2_UnmonitorInstances: excerpts: - description: snippet_tags: - - ec2.cpp.disable_monitor_instance.code + - cpp.example_code.ec2.UnmonitorInstances JavaScript: versions: - sdk_version: 3 @@ -1591,7 +1587,7 @@ ec2_RebootInstances: excerpts: - description: snippet_tags: - - ec2.cpp.reboot_instance.code + - cpp.example_code.ec2.RebootInstances Python: versions: - sdk_version: 3 @@ -1734,7 +1730,7 @@ ec2_DescribeAddresses: excerpts: - description: snippet_tags: - - ec2.cpp.describe_addresses.code + - cpp.example_code.ec2.DescribeAddresses services: ec2: {DescribeAddresses} ec2_DescribeAvailabilityZones: @@ -1762,8 +1758,7 @@ ec2_DescribeAvailabilityZones: excerpts: - description: snippet_tags: - - cpp.example_code.ec2.describe_regions.client - - ec2.cpp.describe_zones.code + - cpp.example_code.ec2.DescribeAvailabilityZones Python: versions: - sdk_version: 3 @@ -1781,11 +1776,9 @@ ec2_CreateTags: versions: - sdk_version: 1 github: cpp/example_code/ec2 - sdkguide: excerpts: - description: snippet_tags: - - cpp.example_code.ec2.create_instance.client - cpp.example_code.ec2.CreateTags services: ec2: {CreateTags} diff --git a/.doc_gen/validation.yaml b/.doc_gen/validation.yaml index c368e7914a1..bbf7223f678 100644 --- a/.doc_gen/validation.yaml +++ b/.doc_gen/validation.yaml @@ -206,6 +206,7 @@ allow_list: - "com/pinterest/ktlint/releases/download/1" - "aws/s3/model/AbortMultipartUploadRequest" - "src/main/kotlin/com/example/ecr/HelloECR" + - "aws/ec2/model/DisassociateAddressRequest" sample_files: - "README.md" - "chat_sfn_state_machine.json" diff --git a/cpp/example_code/ec2/CMakeLists.txt b/cpp/example_code/ec2/CMakeLists.txt index d09da3d7317..d04e7f746f8 100644 --- a/cpp/example_code/ec2/CMakeLists.txt +++ b/cpp/example_code/ec2/CMakeLists.txt @@ -13,14 +13,6 @@ project("${SERVICE_NAME}-examples") # Set the C++ standard to use to build this target. set(CMAKE_CXX_STANDARD 11) -# Build shared libraries by default. -set(BUILD_SHARED_LIBS ON) - -# Enable CTest for testing these code examples. -if (BUILD_TESTS) - include(CTest) -endif () - # Use the MSVC variable to determine if this is a Windows build. set(WINDOWS_BUILD ${MSVC}) @@ -37,7 +29,7 @@ if (WINDOWS_BUILD AND AWSSDK_INSTALL_AS_SHARED_LIBS) # Copy relevant AWS SDK for C++ libraries into the current binary directory for running and debugging. # set(BIN_SUB_DIR "/Debug") # If you are building from the command line, you may need to uncomment this - # and set the proper subdirectory to the executables' location. + # and set the proper subdirectory to the executable's location. AWSSDK_CPY_DYN_LIBS(SERVICE_COMPONENTS "" ${CMAKE_CURRENT_BINARY_DIR}${BIN_SUB_DIR}) endif () @@ -47,7 +39,7 @@ endif () if (NOT DEFINED AWSDOC_SOURCE) file(GLOB AWSDOC_SOURCE "*.cpp" - ) + ) endif () foreach (file ${AWSDOC_SOURCE}) diff --git a/cpp/example_code/ec2/README.md b/cpp/example_code/ec2/README.md index 958699dfd2c..ca7d4b97265 100644 --- a/cpp/example_code/ec2/README.md +++ b/cpp/example_code/ec2/README.md @@ -46,28 +46,28 @@ Next, for information on code example structures and how to build and run the ex Code excerpts that show you how to call individual service functions. -- [AllocateAddress](allocate_address.cpp#L43) -- [AssociateAddress](allocate_address.cpp#L58) -- [AuthorizeSecurityGroupIngress](allocate_address.cpp#L39) -- [CreateKeyPair](create_key_pair.cpp#L33) -- [CreateSecurityGroup](create_security_group.cpp#L59) -- [CreateTags](create_instance.cpp#L72) -- [DeleteKeyPair](delete_key_pair.cpp#L34) -- [DeleteSecurityGroup](delete_security_group.cpp#L32) -- [DescribeAddresses](describe_addresses.cpp#L33) -- [DescribeAvailabilityZones](describe_regions_and_zones.cpp#L38) -- [DescribeInstances](describe_instances.cpp#L33) -- [DescribeKeyPairs](describe_key_pairs.cpp#L33) -- [DescribeRegions](describe_regions_and_zones.cpp#L41) -- [DescribeSecurityGroups](describe_security_groups.cpp#L34) -- [MonitorInstances](monitor_instance.cpp#L35) -- [RebootInstances](reboot_instance.cpp#L32) -- [ReleaseAddress](release_address.cpp#L31) -- [RunInstances](create_instance.cpp#L44) -- [StartInstances](start_stop_instance.cpp#L38) -- [StopInstances](start_stop_instance.cpp#L84) -- [TerminateInstances](terminate_instances.cpp#L30) -- [UnmonitorInstances](monitor_instance.cpp#L82) +- [AllocateAddress](allocate_address.cpp#L73) +- [AssociateAddress](associate_address.cpp#L20) +- [AuthorizeSecurityGroupIngress](authorize_security_group_ingress.cpp#L26) +- [CreateKeyPair](create_key_pair.cpp#L23) +- [CreateSecurityGroup](create_security_group.cpp#L22) +- [CreateTags](create_tags.cpp#L21) +- [DeleteKeyPair](delete_key_pair.cpp#L22) +- [DeleteSecurityGroup](delete_security_group.cpp#L22) +- [DescribeAddresses](describe_addresses.cpp#L24) +- [DescribeAvailabilityZones](describe_availability_zones.cpp#L23) +- [DescribeInstances](describe_instances.cpp#L24) +- [DescribeKeyPairs](describe_key_pairs.cpp#L24) +- [DescribeRegions](describe_regions_and_zones.cpp#L24) +- [DescribeSecurityGroups](describe_security_groups.cpp#L24) +- [MonitorInstances](monitor_instance.cpp#L23) +- [RebootInstances](reboot_instance.cpp#L22) +- [ReleaseAddress](release_address.cpp#L22) +- [RunInstances](run_instances.cpp#L23) +- [StartInstances](start_stop_instance.cpp#L27) +- [StopInstances](start_stop_instance.cpp#L72) +- [TerminateInstances](terminate_instances.cpp#L20) +- [UnmonitorInstances](monitor_instance.cpp#L70) diff --git a/cpp/example_code/ec2/allocate_address.cpp b/cpp/example_code/ec2/allocate_address.cpp index aca4a330986..2c4a2fa189b 100644 --- a/cpp/example_code/ec2/allocate_address.cpp +++ b/cpp/example_code/ec2/allocate_address.cpp @@ -13,34 +13,31 @@ **/ // snippet-start:[ec2.cpp.allocate_address.inc] -#include #include #include -#include #include -#include #include // snippet-end:[ec2.cpp.allocate_address.inc] #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.AllocateAddress] //! Allocate an Elastic IP address and associate it with an Amazon Elastic Compute Cloud //! (Amazon EC2) instance. /*! - \sa AllocateAndAssociateAddress() \param instanceID: An EC2 instance ID. - \param allocationId: String to return the allocation ID of the address. + \param[out] publicIPAddress: String to return the public IP address. + \param[out] allocationID: String to return the allocation ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::AllocateAndAssociateAddress(const Aws::String &instanceId, - Aws::String &allocationId, +bool AwsDoc::EC2::allocateAndAssociateAddress(const Aws::String &instanceId, Aws::String &publicIPAddress, + Aws::String &allocationID, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.allocate_address.code] // snippet-start:[cpp.example_code.ec2.allocate_address.client] Aws::EC2::EC2Client ec2Client(clientConfiguration); // snippet-end:[cpp.example_code.ec2.allocate_address.client] - // snippet-start:[cpp.example_code.ec2.AllocateAddress] Aws::EC2::Model::AllocateAddressRequest request; request.SetDomain(Aws::EC2::Model::DomainType::vpc); @@ -51,31 +48,32 @@ bool AwsDoc::EC2::AllocateAndAssociateAddress(const Aws::String &instanceId, outcome.GetError().GetMessage() << std::endl; return false; } + const Aws::EC2::Model::AllocateAddressResponse &response = outcome.GetResult(); + allocationID = response.GetAllocationId(); + publicIPAddress = response.GetPublicIp(); - allocationId = outcome.GetResult().GetAllocationId(); // snippet-end:[cpp.example_code.ec2.AllocateAddress] - // snippet-start:[cpp.example_code.ec2.AssociateAddress] Aws::EC2::Model::AssociateAddressRequest associate_request; associate_request.SetInstanceId(instanceId); - associate_request.SetAllocationId(allocationId); + associate_request.SetAllocationId(allocationID); const Aws::EC2::Model::AssociateAddressOutcome associate_outcome = ec2Client.AssociateAddress(associate_request); if (!associate_outcome.IsSuccess()) { - std::cerr << "Failed to associate Elastic IP address " << allocationId + std::cerr << "Failed to associate Elastic IP address " << allocationID << " with instance " << instanceId << ":" << associate_outcome.GetError().GetMessage() << std::endl; return false; } - std::cout << "Successfully associated Elastic IP address " << allocationId + std::cout << "Successfully associated Elastic IP address " << allocationID << " with instance " << instanceId << std::endl; - // snippet-end:[cpp.example_code.ec2.AssociateAddress] // snippet-end:[ec2.cpp.allocate_address.code] - +// snippet-start:[cpp.example_code.ec2.AllocateAddress2] return true; } +// snippet-end:[cpp.example_code.ec2.AllocateAddress2] /* * main function @@ -102,8 +100,9 @@ int main(int argc, char **argv) { // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; Aws::String instanceID = argv[1]; + Aws::String publicIPAddress; Aws::String allocationID; - AwsDoc::EC2::AllocateAndAssociateAddress(instanceID, allocationID, + AwsDoc::EC2::allocateAndAssociateAddress(instanceID, publicIPAddress, allocationID, clientConfig); } Aws::ShutdownAPI(options); diff --git a/cpp/example_code/ec2/associate_address.cpp b/cpp/example_code/ec2/associate_address.cpp new file mode 100644 index 00000000000..9006eb64a4b --- /dev/null +++ b/cpp/example_code/ec2/associate_address.cpp @@ -0,0 +1,87 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +/** + * Before running this C++ code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started.html + * + * For information on the structure of the code examples and how to build and run the examples, see + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started-code-examples.html. + * + **/ + +#include +#include +#include +#include "ec2_samples.h" + +// snippet-start:[cpp.example_code.ec2.AssociateAddress] +//! Associate an Elastic IP address with an EC2 instance. +/*! + \param instanceId: An EC2 instance ID. + \param allocationId: An Elastic IP allocation ID. + \param[out] associationID: String to receive the association ID. + \param clientConfiguration: AWS client configuration. + \return bool: True if the address was associated with the instance; otherwise, false. + */ +bool AwsDoc::EC2::associateAddress(const Aws::String &instanceId, const Aws::String &allocationId, + Aws::String &associationID, + const Aws::Client::ClientConfiguration &clientConfiguration) { + Aws::EC2::EC2Client ec2Client(clientConfiguration); + + Aws::EC2::Model::AssociateAddressRequest request; + request.SetInstanceId(instanceId); + request.SetAllocationId(allocationId); + + Aws::EC2::Model::AssociateAddressOutcome outcome = ec2Client.AssociateAddress(request); + + if (!outcome.IsSuccess()) { + std::cerr << "Failed to associate address " << allocationId << + " with instance " << instanceId << ": " << + outcome.GetError().GetMessage() << std::endl; + } else { + std::cout << "Successfully associated address " << allocationId << + " with instance " << instanceId << std::endl; + associationID = outcome.GetResult().GetAssociationId(); + } + + return outcome.IsSuccess(); +} +// snippet-end:[cpp.example_code.ec2.AssociateAddress] + +/* + * main function + * + * Usage: + * run_associate_address + * + */ + +#ifndef TESTING_BUILD + +int main(int argc, char **argv) { + if (argc != 3) { + std::cout << "Usage: run_associate_address " << std::endl; + return 1; + } + + Aws::SDKOptions options; + Aws::InitAPI(options); + { + Aws::String instanceId = argv[1]; + Aws::String allocationId = argv[2]; + + Aws::Client::ClientConfiguration clientConfig; + // Optional: Set to the AWS Region (overrides config file). + // clientConfig.region = "us-east-1"; + + Aws::String associationID; + AwsDoc::EC2::associateAddress(instanceId, allocationId, associationID, clientConfig); + } + Aws::ShutdownAPI(options); + return 0; +} + +#endif // TESTING_BUILD \ No newline at end of file diff --git a/cpp/example_code/ec2/authorize_security_group_ingress.cpp b/cpp/example_code/ec2/authorize_security_group_ingress.cpp new file mode 100644 index 00000000000..a5a594915dc --- /dev/null +++ b/cpp/example_code/ec2/authorize_security_group_ingress.cpp @@ -0,0 +1,120 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +/** + * Before running this C++ code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started.html + * + * For information on the structure of the code examples and how to build and run the examples, see + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started-code-examples.html. + * + **/ + +#include +#include +// snippet-start:[ec2.cpp.configure_security_group.inc] +#include +// snippet-end:[ec2.cpp.configure_security_group.inc] +#include +#include "ec2_samples.h" + +static void buildSampleIngressRule( + Aws::EC2::Model::AuthorizeSecurityGroupIngressRequest &authorize_request); + +// snippet-start:[cpp.example_code.ec2.AuthorizeSecurityGroupIngress] +//! Authorize ingress to an Amazon Elastic Compute Cloud (Amazon EC2) group. +/*! + \param groupID: The EC2 group ID. + \param clientConfiguration: The ClientConfiguration object. + \return bool: True if the operation was successful, false otherwise. + */ +bool +AwsDoc::EC2::authorizeSecurityGroupIngress(const Aws::String &groupID, + const Aws::Client::ClientConfiguration &clientConfiguration) { + Aws::EC2::EC2Client ec2Client(clientConfiguration); + // snippet-start:[ec2.cpp.configure_security_group01.code]' + Aws::EC2::Model::AuthorizeSecurityGroupIngressRequest authorizeSecurityGroupIngressRequest; + authorizeSecurityGroupIngressRequest.SetGroupId(groupID); + // snippet-end:[ec2.cpp.configure_security_group01.code] + buildSampleIngressRule(authorizeSecurityGroupIngressRequest); + + // snippet-start:[ec2.cpp.configure_security_group03.code] + Aws::EC2::Model::AuthorizeSecurityGroupIngressOutcome authorizeSecurityGroupIngressOutcome = + ec2Client.AuthorizeSecurityGroupIngress(authorizeSecurityGroupIngressRequest); + + if (authorizeSecurityGroupIngressOutcome.IsSuccess()) { + std::cout << "Successfully authorized security group ingress." << std::endl; + } else { + std::cerr << "Error authorizing security group ingress: " + << authorizeSecurityGroupIngressOutcome.GetError().GetMessage() << std::endl; + } + // snippet-end:[ec2.cpp.configure_security_group03.code] + + return authorizeSecurityGroupIngressOutcome.IsSuccess(); +} +// snippet-end:[cpp.example_code.ec2.AuthorizeSecurityGroupIngress] +// snippet-start:[cpp.example_code.ec2.BuildSampleIngressRule] +//! Build a sample ingress rule. +/*! + \param authorize_request: An 'AuthorizeSecurityGroupIngressRequest' instance. + \return void: + */ +void buildSampleIngressRule( + Aws::EC2::Model::AuthorizeSecurityGroupIngressRequest &authorize_request) { + // snippet-start:[ec2.cpp.configure_security_group02.code] + Aws::String ingressIPRange = "203.0.113.0/24"; // Configure this for your allowed IP range. + Aws::EC2::Model::IpRange ip_range; + ip_range.SetCidrIp(ingressIPRange); + + Aws::EC2::Model::IpPermission permission1; + permission1.SetIpProtocol("tcp"); + permission1.SetToPort(80); + permission1.SetFromPort(80); + permission1.AddIpRanges(ip_range); + + authorize_request.AddIpPermissions(permission1); + + Aws::EC2::Model::IpPermission permission2; + permission2.SetIpProtocol("tcp"); + permission2.SetToPort(22); + permission2.SetFromPort(22); + permission2.AddIpRanges(ip_range); + + authorize_request.AddIpPermissions(permission2); + // snippet-end:[ec2.cpp.configure_security_group02.code] +} +// snippet-end:[cpp.example_code.ec2.BuildSampleIngressRule] + +/* + * + * main function + * + * Usage: run_authorize_security_group_ingress + * + */ + +#ifndef TESTING_BUILD + +int main(int argc, char **argv) { + if (argc != 2) { + std::cout << "Usage: run_authorize_security_group_ingress " << std::endl; + return 1; + } + + Aws::SDKOptions options; + Aws::InitAPI(options); + { + Aws::String groupID = argv[1]; + Aws::Client::ClientConfiguration clientConfig; + // Optional: Set to the region where your resources reside. + clientConfig.region = "us-east-1"; + + AwsDoc::EC2::authorizeSecurityGroupIngress(groupID, clientConfig); + } + Aws::ShutdownAPI(options); + return 0; +} + +#endif // TESTING_BUILD \ No newline at end of file diff --git a/cpp/example_code/ec2/create_key_pair.cpp b/cpp/example_code/ec2/create_key_pair.cpp index cb0017eb464..9fb05c3d571 100644 --- a/cpp/example_code/ec2/create_key_pair.cpp +++ b/cpp/example_code/ec2/create_key_pair.cpp @@ -13,22 +13,22 @@ **/ // snippet-start:[ec2.cpp.create_key_pair.inc] -#include #include #include -#include #include +#include // snippet-end:[ec2.cpp.create_key_pair.inc] #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2,CreateKeyPair] //! Create an Amazon Elastic Compute Cloud (Amazon EC2) instance key pair. /*! - \sa CreateKeyPair() \param keyPairName: A name for a key pair. + \param keyFilePath: File path where the credentials are stored. Ignored if it is an empty string; \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::CreateKeyPair(const Aws::String &keyPairName, +bool AwsDoc::EC2::createKeyPair(const Aws::String &keyPairName, const Aws::String &keyFilePath, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.create_key_pair.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); @@ -37,31 +37,39 @@ bool AwsDoc::EC2::CreateKeyPair(const Aws::String &keyPairName, Aws::EC2::Model::CreateKeyPairOutcome outcome = ec2Client.CreateKeyPair(request); if (!outcome.IsSuccess()) { - std::cerr << "Failed to create key pair:" << + std::cerr << "Failed to create key pair - " << keyPairName << ". " << outcome.GetError().GetMessage() << std::endl; - } - else { + } else { std::cout << "Successfully created key pair named " << keyPairName << std::endl; + if (!keyFilePath.empty()) { + std::ofstream keyFile(keyFilePath.c_str()); + keyFile << outcome.GetResult().GetKeyMaterial(); + keyFile.close(); + std::cout << "Keys written to the file " << + keyFilePath << std::endl; + } + } // snippet-end:[ec2.cpp.create_key_pair.code] return outcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2,CreateKeyPair] /* * main function * -* Usage: 'run_create_key_pair ' +* Usage: 'run_create_key_pair [key_file_path]' * */ #ifndef TESTING_BUILD int main(int argc, char **argv) { - if (argc != 2) { - std::cout << "run_create_key_pair " + if (argc < 2) { + std::cout << "Usage: 'run_create_key_pair [key_file_path]" << std::endl; return 1; } @@ -73,7 +81,12 @@ int main(int argc, char **argv) { // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; Aws::String keyPairName = argv[1]; - AwsDoc::EC2::CreateKeyPair(keyPairName, clientConfig); + Aws::String keyFilePath; + if (argc > 2) { + keyFilePath = argv[2]; + } + + AwsDoc::EC2::createKeyPair(keyPairName, keyFilePath, clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/create_security_group.cpp b/cpp/example_code/ec2/create_security_group.cpp index 20d487e6f48..6a8f787fffc 100644 --- a/cpp/example_code/ec2/create_security_group.cpp +++ b/cpp/example_code/ec2/create_security_group.cpp @@ -13,50 +13,30 @@ **/ // snippet-start:[ec2.cpp.create_security_group.inc] -#include #include #include -#include // snippet-end:[ec2.cpp.create_security_group.inc] -// snippet-start:[ec2.cpp.configure_security_group.inc] -#include -// snippet-end:[ec2.cpp.configure_security_group.inc] #include #include "ec2_samples.h" -namespace AwsDoc { - namespace EC2 { - //! Build a sample ingress rule. - /*! - \sa BuildSampleIngressRule() - \param authorize_request: An 'AuthorizeSecurityGroupIngressRequest' instance. - \return void: - */ - void BuildSampleIngressRule( - Aws::EC2::Model::AuthorizeSecurityGroupIngressRequest &authorize_request); - } // EC2 { -} // AwsDoc - +// snippet-start:[cpp.example_code.ec2.CreateSecurityGroup] //! Create a security group. /*! - \sa CreateSecurityGroup() \param groupName: A security group name. \param description: A description. \param vpcID: A virtual private cloud (VPC) ID. - \param groupIDResult: A string to receive the group ID. + \param[out] groupIDResult: A string to receive the group ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::CreateSecurityGroup(const Aws::String &groupName, +bool AwsDoc::EC2::createSecurityGroup(const Aws::String &groupName, const Aws::String &description, const Aws::String &vpcID, Aws::String &groupIDResult, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.create_security_group.code] - // snippet-start:[cpp.example_code.ec2.create_security_group.client] Aws::EC2::EC2Client ec2Client(clientConfiguration); - // snippet-end:[cpp.example_code.ec2.create_security_group.client] - // snippet-start:[cpp.example_code.ec2.CreateSecurityGroup] + Aws::EC2::Model::CreateSecurityGroupRequest request; request.SetGroupName(groupName); @@ -75,65 +55,14 @@ bool AwsDoc::EC2::CreateSecurityGroup(const Aws::String &groupName, std::cout << "Successfully created security group named " << groupName << std::endl; // snippet-end:[ec2.cpp.create_security_group.code] - // snippet-end:[cpp.example_code.ec2.CreateSecurityGroup] - - groupIDResult = outcome.GetResult().GetGroupId(); - - // snippet-start:[ec2.cpp.configure_security_group01.code] - Aws::EC2::Model::AuthorizeSecurityGroupIngressRequest authorizeRequest; - - authorizeRequest.SetGroupId(groupIDResult); - // snippet-end:[ec2.cpp.configure_security_group01.code] - - BuildSampleIngressRule(authorizeRequest); - // snippet-start:[ec2.cpp.configure_security_group03.code] - const Aws::EC2::Model::AuthorizeSecurityGroupIngressOutcome authorizeOutcome = - ec2Client.AuthorizeSecurityGroupIngress(authorizeRequest); - if (!authorizeOutcome.IsSuccess()) { - std::cerr << "Failed to set ingress policy for security group " << - groupName << ":" << authorizeOutcome.GetError().GetMessage() << - std::endl; - return false; - } - - std::cout << "Successfully added ingress policy to security group " << - groupName << std::endl; - // snippet-end:[ec2.cpp.configure_security_group03.code] + groupIDResult = outcome.GetResult().GetGroupId(); return true; } +// snippet-end:[cpp.example_code.ec2.CreateSecurityGroup] -//! Build a sample ingress rule. -/*! - \sa BuildSampleIngressRule() - \param authorize_request: An 'AuthorizeSecurityGroupIngressRequest' instance. - \return void: - */ -void AwsDoc::EC2::BuildSampleIngressRule( - Aws::EC2::Model::AuthorizeSecurityGroupIngressRequest &authorize_request) { - // snippet-start:[ec2.cpp.configure_security_group02.code] - Aws::EC2::Model::IpRange ip_range; - ip_range.SetCidrIp("0.0.0.0/0"); - - Aws::EC2::Model::IpPermission permission1; - permission1.SetIpProtocol("tcp"); - permission1.SetToPort(80); - permission1.SetFromPort(80); - permission1.AddIpRanges(ip_range); - - authorize_request.AddIpPermissions(permission1); - - Aws::EC2::Model::IpPermission permission2; - permission2.SetIpProtocol("tcp"); - permission2.SetToPort(22); - permission2.SetFromPort(22); - permission2.AddIpRanges(ip_range); - - authorize_request.AddIpPermissions(permission2); - // snippet-end:[ec2.cpp.configure_security_group02.code] -} /* @@ -165,7 +94,7 @@ int main(int argc, char **argv) { // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; Aws::String groupIDResult; - AwsDoc::EC2::CreateSecurityGroup(group_name, group_desc, vpc_id, + AwsDoc::EC2::createSecurityGroup(group_name, group_desc, vpc_id, groupIDResult, clientConfig); } Aws::ShutdownAPI(options); diff --git a/cpp/example_code/ec2/create_tags.cpp b/cpp/example_code/ec2/create_tags.cpp new file mode 100644 index 00000000000..84d120ac150 --- /dev/null +++ b/cpp/example_code/ec2/create_tags.cpp @@ -0,0 +1,90 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +/** + * Before running this C++ code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started.html + * + * For information on the structure of the code examples and how to build and run the examples, see + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started-code-examples.html. + * + **/ + +#include +#include +#include +#include +#include "ec2_samples.h" + +// snippet-start:[cpp.example_code.ec2.CreateTags] +//! Add or overwrite only the specified tags for the specified Amazon Elastic Compute Cloud (Amazon EC2) resource or resources. +/*! + \param resources: The resources for the tags. + \param tags: Vector of tags. + \param clientConfiguration: AWS client configuration. + \return bool: Function succeeded. + */ +bool AwsDoc::EC2::createTags(const Aws::Vector &resources, + const Aws::Vector &tags, + const Aws::Client::ClientConfiguration &clientConfiguration) { + Aws::EC2::EC2Client ec2Client(clientConfiguration); + + Aws::EC2::Model::CreateTagsRequest createTagsRequest; + createTagsRequest.SetResources(resources); + createTagsRequest.SetTags(tags); + + Aws::EC2::Model::CreateTagsOutcome outcome = ec2Client.CreateTags(createTagsRequest); + + if (outcome.IsSuccess()) { + std::cout << "Successfully created tags for resources" << std::endl; + } else { + std::cerr << "Failed to create tags for resources, " << outcome.GetError().GetMessage() << std::endl; + } + + return outcome.IsSuccess(); +} +// snippet-end:[cpp.example_code.ec2.CreateTags] + +/* + * + * main function + * + * Usage: 'run_create_tags ' + * + */ + +#ifndef TESTING_BUILD + +int main(int argc, char **argv) { + if (argc != 3) { + std::cout << "Usage: run_create_tags " << std::endl; + return 1; + } + + Aws::SDKOptions options; + Aws::InitAPI(options); + + { + Aws::String instanceId = argv[1]; + Aws::String nameTag = argv[2]; + + Aws::Client::ClientConfiguration clientConfig; + // Optional: Set to the AWS Region (overrides config file). + // clientConfig.region = "us-east-1"; + + Aws::Vector resources; + resources.push_back(instanceId); + + Aws::Vector tags; + tags.push_back(Aws::EC2::Model::Tag().WithKey("Name").WithValue(nameTag)); + + AwsDoc::EC2::createTags(resources, tags, clientConfig); + } + + Aws::ShutdownAPI(options); + return 0; +} + +#endif // TESTING_BUILD \ No newline at end of file diff --git a/cpp/example_code/ec2/delete_key_pair.cpp b/cpp/example_code/ec2/delete_key_pair.cpp index 06b3c6f8518..2e1494b1887 100644 --- a/cpp/example_code/ec2/delete_key_pair.cpp +++ b/cpp/example_code/ec2/delete_key_pair.cpp @@ -13,23 +13,21 @@ * **/ // snippet-start:[ec2.cpp.delete_key_pair.inc] -#include #include #include #include // snippet-end:[ec2.cpp.delete_key_pair.inc] #include "ec2_samples.h" - +// snippet-start:[cpp.example_code.ec2.DeleteKeyPair] //! Delete an Amazon Elastic Compute Cloud (Amazon EC2) instance key pair. /*! - \sa DeleteKeyPair() \param keyPairName: A name for a key pair. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::DeleteKeyPair(const Aws::String &keyPairName, +bool AwsDoc::EC2::deleteKeyPair(const Aws::String &keyPairName, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.delete_key_pair.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); @@ -42,8 +40,7 @@ bool AwsDoc::EC2::DeleteKeyPair(const Aws::String &keyPairName, if (!outcome.IsSuccess()) { std::cerr << "Failed to delete key pair " << keyPairName << ":" << outcome.GetError().GetMessage() << std::endl; - } - else { + } else { std::cout << "Successfully deleted key pair named " << keyPairName << std::endl; } @@ -51,6 +48,7 @@ bool AwsDoc::EC2::DeleteKeyPair(const Aws::String &keyPairName, return outcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.DeleteKeyPair] /* * main function @@ -77,7 +75,7 @@ int main(int argc, char **argv) { // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; Aws::String keyPairName = argv[1]; - AwsDoc::EC2::DeleteKeyPair(keyPairName, clientConfig); + AwsDoc::EC2::deleteKeyPair(keyPairName, clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/delete_security_group.cpp b/cpp/example_code/ec2/delete_security_group.cpp index c3bdd1d49c0..9988efa8b1b 100644 --- a/cpp/example_code/ec2/delete_security_group.cpp +++ b/cpp/example_code/ec2/delete_security_group.cpp @@ -13,34 +13,32 @@ **/ // snippet-start:[ec2.cpp.delete_security_group.inc] -#include #include #include #include // snippet-end:[ec2.cpp.delete_security_group.inc] #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.DeleteSecurityGroup] //! Delete a security group. /*! - \sa DeleteSecurityGroup() \param securityGroupID: A security group ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::DeleteSecurityGroup(const Aws::String &securityGroupID, +bool AwsDoc::EC2::deleteSecurityGroup(const Aws::String &securityGroupID, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.delete_security_group.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); Aws::EC2::Model::DeleteSecurityGroupRequest request; request.SetGroupId(securityGroupID); - auto outcome = ec2Client.DeleteSecurityGroup(request); + Aws::EC2::Model::DeleteSecurityGroupOutcome outcome = ec2Client.DeleteSecurityGroup(request); if (!outcome.IsSuccess()) { std::cerr << "Failed to delete security group " << securityGroupID << ":" << outcome.GetError().GetMessage() << std::endl; - } - else { + } else { std::cout << "Successfully deleted security group " << securityGroupID << std::endl; } @@ -48,6 +46,7 @@ bool AwsDoc::EC2::DeleteSecurityGroup(const Aws::String &securityGroupID, return outcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.DeleteSecurityGroup] /* * main function @@ -74,7 +73,7 @@ int main(int argc, char **argv) { // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; Aws::String groupID = argv[1]; - AwsDoc::EC2::DeleteSecurityGroup(groupID, clientConfig); + AwsDoc::EC2::deleteSecurityGroup(groupID, clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/describe_addresses.cpp b/cpp/example_code/ec2/describe_addresses.cpp index f4955a4f953..6c75cc11ebd 100644 --- a/cpp/example_code/ec2/describe_addresses.cpp +++ b/cpp/example_code/ec2/describe_addresses.cpp @@ -13,7 +13,6 @@ **/ // snippet-start:[ec2.cpp.describe_addresses.inc] -#include #include #include #include @@ -22,25 +21,25 @@ // snippet-end:[ec2.cpp.describe_addresses.inc] #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.DescribeAddresses] //! Describe all Elastic IP addresses. /*! - \sa DescribeAddresses() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::DescribeAddresses( +bool AwsDoc::EC2::describeAddresses( const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.describe_addresses.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); Aws::EC2::Model::DescribeAddressesRequest request; - auto outcome = ec2Client.DescribeAddresses(request); + Aws::EC2::Model::DescribeAddressesOutcome outcome = ec2Client.DescribeAddresses(request); if (outcome.IsSuccess()) { std::cout << std::left << std::setw(20) << "InstanceId" << std::setw(15) << "Public IP" << std::setw(10) << "Domain" << std::setw(30) << "Allocation ID" << std::setw(25) << "NIC ID" << std::endl; - const auto &addresses = outcome.GetResult().GetAddresses(); + const Aws::Vector &addresses = outcome.GetResult().GetAddresses(); for (const auto &address: addresses) { Aws::String domainString = Aws::EC2::Model::DomainTypeMapper::GetNameForDomainType( @@ -52,8 +51,7 @@ bool AwsDoc::EC2::DescribeAddresses( std::setw(30) << address.GetAllocationId() << std::setw(25) << address.GetNetworkInterfaceId() << std::endl; } - } - else { + } else { std::cerr << "Failed to describe Elastic IP addresses:" << outcome.GetError().GetMessage() << std::endl; } @@ -61,6 +59,7 @@ bool AwsDoc::EC2::DescribeAddresses( return outcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.DescribeAddresses] /* * @@ -82,7 +81,7 @@ int main(int argc, char **argv) { Aws::Client::ClientConfiguration clientConfig; // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; - AwsDoc::EC2::DescribeAddresses(clientConfig); + AwsDoc::EC2::describeAddresses(clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/describe_availability_zones.cpp b/cpp/example_code/ec2/describe_availability_zones.cpp new file mode 100644 index 00000000000..0583a739f9e --- /dev/null +++ b/cpp/example_code/ec2/describe_availability_zones.cpp @@ -0,0 +1,91 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +/** + * Before running this C++ code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started.html + * + * For information on the structure of the code examples and how to build and run the examples, see + * https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/getting-started-code-examples.html. + * + **/ + +#include +// snippet-start:[ec2.cpp.describe_zones.inc] +#include +// snippet-end:[ec2.cpp.describe_zones.inc] +#include +#include +#include "ec2_samples.h" + +// snippet-start:[cpp.example_code.ec2.DescribeAvailabilityZones] + +//! DescribeAvailabilityZones +/*! + \param clientConfiguration: AWS client configuration. + \return bool: Function succeeded. +*/ +int AwsDoc::EC2::describeAvailabilityZones(const Aws::Client::ClientConfiguration &clientConfiguration) { + Aws::EC2::EC2Client ec2Client(clientConfiguration); + // snippet-start:[ec2.cpp.describe_zones.code] + Aws::EC2::Model::DescribeAvailabilityZonesRequest request; + Aws::EC2::Model::DescribeAvailabilityZonesOutcome outcome = ec2Client.DescribeAvailabilityZones(request); + + if (outcome.IsSuccess()) { + std::cout << std::left << + std::setw(32) << "ZoneName" << + std::setw(20) << "State" << + std::setw(32) << "Region" << std::endl; + + const auto &zones = + outcome.GetResult().GetAvailabilityZones(); + + for (const auto &zone: zones) { + Aws::String stateString = + Aws::EC2::Model::AvailabilityZoneStateMapper::GetNameForAvailabilityZoneState( + zone.GetState()); + std::cout << std::left << + std::setw(32) << zone.GetZoneName() << + std::setw(20) << stateString << + std::setw(32) << zone.GetRegionName() << std::endl; + } + } else { + std::cerr << "Failed to describe availability zones:" << + outcome.GetError().GetMessage() << std::endl; + + } + // snippet-end:[ec2.cpp.describe_zones.code] + + return outcome.IsSuccess(); +} +// snippet-end:[cpp.example_code.ec2.DescribeAvailabilityZones] + +/* + * main function + * + * Usage: + * describe_availability_zones + */ + +#ifndef TESTING_BUILD + +int main() { + Aws::SDKOptions options; + InitAPI(options); + + { + Aws::Client::ClientConfiguration clientConfig; + // Optional: Set to the AWS Region (overrides config file). + // clientConfig.region = "us-east-1"; + AwsDoc::EC2::describeAvailabilityZones(clientConfig); + } + + ShutdownAPI(options); + return 0; +} + +#endif // TESTING_BUILD + + diff --git a/cpp/example_code/ec2/describe_instances.cpp b/cpp/example_code/ec2/describe_instances.cpp index 23929659be6..053e23ceb43 100644 --- a/cpp/example_code/ec2/describe_instances.cpp +++ b/cpp/example_code/ec2/describe_instances.cpp @@ -13,7 +13,6 @@ **/ // snippet-start:[ec2.cpp.describe_instances.inc] -#include #include #include #include @@ -22,13 +21,13 @@ // snippet-end:[ec2.cpp.describe_instances.inc] #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.DescribeInstances] //! Describe all Amazon Elastic Compute Cloud (Amazon EC2) instances associated with an account. /*! - \sa DescribeInstances() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::DescribeInstances( +bool AwsDoc::EC2::describeInstances( const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.describe_instances.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); @@ -36,7 +35,7 @@ bool AwsDoc::EC2::DescribeInstances( bool header = false; bool done = false; while (!done) { - auto outcome = ec2Client.DescribeInstances(request); + Aws::EC2::Model::DescribeInstancesOutcome outcome = ec2Client.DescribeInstances(request); if (outcome.IsSuccess()) { if (!header) { std::cout << std::left << @@ -72,7 +71,7 @@ bool AwsDoc::EC2::DescribeInstances( const std::vector &tags = instance.GetTags(); auto nameIter = std::find_if(tags.cbegin(), tags.cend(), [](const Aws::EC2::Model::Tag &tag) { - return tag.GetKey() == "Name"; + return tag.GetKey() == "Name"; }); if (nameIter != tags.cend()) { name = nameIter->GetValue(); @@ -89,12 +88,10 @@ bool AwsDoc::EC2::DescribeInstances( if (!outcome.GetResult().GetNextToken().empty()) { request.SetNextToken(outcome.GetResult().GetNextToken()); - } - else { + } else { done = true; } - } - else { + } else { std::cerr << "Failed to describe EC2 instances:" << outcome.GetError().GetMessage() << std::endl; return false; @@ -104,6 +101,7 @@ bool AwsDoc::EC2::DescribeInstances( return true; } +// snippet-end:[cpp.example_code.ec2.DescribeInstances] /* * @@ -125,7 +123,7 @@ int main(int argc, char **argv) { Aws::Client::ClientConfiguration clientConfig; // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; - AwsDoc::EC2::DescribeInstances(clientConfig); + AwsDoc::EC2::describeInstances(clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/describe_key_pairs.cpp b/cpp/example_code/ec2/describe_key_pairs.cpp index 86b57104987..5a00a8cfd40 100644 --- a/cpp/example_code/ec2/describe_key_pairs.cpp +++ b/cpp/example_code/ec2/describe_key_pairs.cpp @@ -13,7 +13,6 @@ **/ // snippet-start:[ec2.cpp.describe_key_pairs.inc] -#include #include #include #include @@ -22,19 +21,19 @@ // snippet-end:[ec2.cpp.describe_key_pairs.inc] #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.DescribeKeyPairs] //! Describe all Amazon Elastic Compute Cloud (Amazon EC2) instance key pairs. /*! - \sa DescribeKeyPairs() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::DescribeKeyPairs( +bool AwsDoc::EC2::describeKeyPairs( const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.describe_key_pairs.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); Aws::EC2::Model::DescribeKeyPairsRequest request; - auto outcome = ec2Client.DescribeKeyPairs(request); + Aws::EC2::Model::DescribeKeyPairsOutcome outcome = ec2Client.DescribeKeyPairs(request); if (outcome.IsSuccess()) { std::cout << std::left << std::setw(32) << "Name" << @@ -47,8 +46,7 @@ bool AwsDoc::EC2::DescribeKeyPairs( std::setw(32) << key_pair.GetKeyName() << std::setw(64) << key_pair.GetKeyFingerprint() << std::endl; } - } - else { + } else { std::cerr << "Failed to describe key pairs:" << outcome.GetError().GetMessage() << std::endl; } @@ -56,6 +54,7 @@ bool AwsDoc::EC2::DescribeKeyPairs( return outcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.DescribeKeyPairs] /* * @@ -74,7 +73,7 @@ int main(int argc, char **argv) { Aws::Client::ClientConfiguration clientConfig; // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; - AwsDoc::EC2::DescribeKeyPairs(clientConfig); + AwsDoc::EC2::describeKeyPairs(clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/describe_regions_and_zones.cpp b/cpp/example_code/ec2/describe_regions_and_zones.cpp index 7eddebfc5b6..f0c38aedcfc 100644 --- a/cpp/example_code/ec2/describe_regions_and_zones.cpp +++ b/cpp/example_code/ec2/describe_regions_and_zones.cpp @@ -13,35 +13,27 @@ **/ // snippet-start:[ec2.cpp.describe_regions.inc] -#include #include #include -#include // snippet-end:[ec2.cpp.describe_regions.inc] -// snippet-start:[ec2.cpp.describe_zones.inc] -#include -#include -// snippet-end:[ec2.cpp.describe_zones.inc] #include #include #include "ec2_samples.h" -//! Describe all Amazon Elastic Compute Cloud (Amazon EC2) Regions and Availability Zones. + +// snippet-start:[cpp.example_code.ec2.DescribeRegions] +//! Describe all Amazon Elastic Compute Cloud (Amazon EC2) Regions. /*! - \sa DescribeRegionsAndZones() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::DescribeRegionsAndZones( +bool AwsDoc::EC2::describeRegions( const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.describe_regions.code] - // snippet-start:[cpp.example_code.ec2.describe_regions.client] Aws::EC2::EC2Client ec2Client(clientConfiguration); - // snippet-end:[cpp.example_code.ec2.describe_regions.client] - // snippet-start:[cpp.example_code.ec2.DescribeRegions] + Aws::EC2::Model::DescribeRegionsRequest request; - auto outcome = ec2Client.DescribeRegions(request); - bool result = true; + Aws::EC2::Model::DescribeRegionsOutcome outcome = ec2Client.DescribeRegions(request); if (outcome.IsSuccess()) { std::cout << std::left << std::setw(32) << "RegionName" << @@ -53,50 +45,18 @@ bool AwsDoc::EC2::DescribeRegionsAndZones( std::setw(32) << region.GetRegionName() << std::setw(64) << region.GetEndpoint() << std::endl; } - } - else { + } else { std::cerr << "Failed to describe regions:" << outcome.GetError().GetMessage() << std::endl; - result = false; } - // snippet-end:[cpp.example_code.ec2.DescribeRegions] // snippet-end:[ec2.cpp.describe_regions.code] std::cout << std::endl; - // snippet-start:[ec2.cpp.describe_zones.code] - Aws::EC2::Model::DescribeAvailabilityZonesRequest describe_request; - auto describe_outcome = ec2Client.DescribeAvailabilityZones(describe_request); - - if (describe_outcome.IsSuccess()) { - std::cout << std::left << - std::setw(32) << "ZoneName" << - std::setw(20) << "State" << - std::setw(32) << "Region" << std::endl; - - const auto &zones = - describe_outcome.GetResult().GetAvailabilityZones(); - - for (const auto &zone: zones) { - Aws::String stateString = - Aws::EC2::Model::AvailabilityZoneStateMapper::GetNameForAvailabilityZoneState( - zone.GetState()); - std::cout << std::left << - std::setw(32) << zone.GetZoneName() << - std::setw(20) << stateString << - std::setw(32) << zone.GetRegionName() << std::endl; - } - } - else { - std::cerr << "Failed to describe availability zones:" << - describe_outcome.GetError().GetMessage() << std::endl; - result = false; - } - // snippet-end:[ec2.cpp.describe_zones.code] - - return result; + return outcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.DescribeRegions] /* * @@ -118,7 +78,7 @@ int main(int argc, char **argv) { Aws::Client::ClientConfiguration clientConfig; // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; - AwsDoc::EC2::DescribeRegionsAndZones(clientConfig); + AwsDoc::EC2::describeRegions(clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/describe_security_groups.cpp b/cpp/example_code/ec2/describe_security_groups.cpp index 1ab08d5bb9f..440f5855103 100644 --- a/cpp/example_code/ec2/describe_security_groups.cpp +++ b/cpp/example_code/ec2/describe_security_groups.cpp @@ -13,7 +13,6 @@ **/ // snippet-start:[ec2.cpp.describe_security_groups.inc] -#include #include #include #include @@ -22,14 +21,14 @@ // snippet-end:[ec2.cpp.describe_security_groups.inc] #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.DescribeSecurityGroups] //! Describe all Amazon Elastic Compute Cloud (Amazon EC2) security groups, or a specific group. /*! - \sa DescribeSecurityGroups() \param groupID: A group ID, ignored if empty. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::DescribeSecurityGroups(const Aws::String &groupID, +bool AwsDoc::EC2::describeSecurityGroups(const Aws::String &groupID, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.describe_security_groups.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); @@ -45,7 +44,7 @@ bool AwsDoc::EC2::DescribeSecurityGroups(const Aws::String &groupID, request.SetNextToken(nextToken); } - auto outcome = ec2Client.DescribeSecurityGroups(request); + Aws::EC2::Model::DescribeSecurityGroupsOutcome outcome = ec2Client.DescribeSecurityGroups(request); if (outcome.IsSuccess()) { std::cout << std::left << std::setw(32) << "Name" << @@ -64,8 +63,7 @@ bool AwsDoc::EC2::DescribeSecurityGroups(const Aws::String &groupID, std::setw(64) << securityGroup.GetDescription() << std::endl; } - } - else { + } else { std::cerr << "Failed to describe security groups:" << outcome.GetError().GetMessage() << std::endl; return false; @@ -77,6 +75,7 @@ bool AwsDoc::EC2::DescribeSecurityGroups(const Aws::String &groupID, return true; } +// snippet-end:[cpp.example_code.ec2.DescribeSecurityGroups] /* * @@ -105,7 +104,7 @@ int main(int argc, char **argv) { Aws::Client::ClientConfiguration clientConfig; // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; - AwsDoc::EC2::DescribeSecurityGroups(groupID, clientConfig); + AwsDoc::EC2::describeSecurityGroups(groupID, clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/ec2_samples.h b/cpp/example_code/ec2/ec2_samples.h index 15b8a47b4b3..dd39d716c81 100644 --- a/cpp/example_code/ec2/ec2_samples.h +++ b/cpp/example_code/ec2/ec2_samples.h @@ -6,6 +6,7 @@ #define EC2_EXAMPLES_EC2_SAMPLES_H #include +#include namespace AwsDoc { @@ -13,190 +14,213 @@ namespace AwsDoc { //! Allocate an Elastic IP address and associate it with an Amazon Elastic Compute Cloud //! (Amazon EC2) instance. /*! - \sa AllocateAndAssociateAddress() \param instanceID: An EC2 instance ID. - \param allocationId: String to return the allocation ID of the address. + \param publicIPAddress[out]: String to return the public IP address. + \param[out] allocationID: String to return the allocation ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool AllocateAndAssociateAddress(const Aws::String &instanceId, - Aws::String &allocationId, + bool allocateAndAssociateAddress(const Aws::String &instanceId, Aws::String &publicIPAddress, + Aws::String &allocationID, const Aws::Client::ClientConfiguration &clientConfiguration); + //! Associate an Elastic IP address with an EC2 instance. + /*! + \param instanceId: An EC2 instance ID. + \param allocationId: An Elastic IP allocation ID. + \param[out] associationID: String to receive the association ID. + \param clientConfiguration: AWS client configuration. + \return bool: True if the address was associated with the instance; otherwise, false. + */ + bool + associateAddress(const Aws::String &instanceId, const Aws::String &allocationId, Aws::String &associationID, + const Aws::Client::ClientConfiguration &clientConfiguration); + + //! Authorize ingress to an Amazon Elastic Compute Cloud (Amazon EC2) group. + /*! + \param groupID: The EC2 group ID. + \param clientConfiguration: The ClientConfiguration object. + \return bool: True if the operation was successful, false otherwise. + */ + bool + authorizeSecurityGroupIngress(const Aws::String &groupID, + const Aws::Client::ClientConfiguration &clientConfiguration); + //! Create an EC2 instance key pair. /*! - \sa CreateKeyPair() \param keyPairName: A name for a key pair. + \param keyFilePath: File path where the credentials are stored. Ignored if it is an empty string; \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool CreateKeyPair(const Aws::String &keyPairName, + bool createKeyPair(const Aws::String &keyPairName, const Aws::String &keyFilePath, const Aws::Client::ClientConfiguration &clientConfiguration); //! Create a security group. /*! - \sa CreateSecurityGroup() \param groupName: A security group name. \param description: A description. \param vpcID: A virtual private cloud (VPC) ID. - \param groupIDResult: A string to receive the group ID. + \param[out] groupIDResult: A string to receive the group ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool CreateSecurityGroup(const Aws::String &groupName, + bool createSecurityGroup(const Aws::String &groupName, const Aws::String &description, const Aws::String &vpcID, Aws::String &groupIDResult, const Aws::Client::ClientConfiguration &clientConfiguration); + //! Add or overwrite only the specified tags for the specified Amazon Elastic Compute Cloud (Amazon EC2) resource or resources. + /*! + \param resources: The resources for the tags. + \param tags: Map of tag keys and values. + \param clientConfiguration: AWS client configuration. + \return bool: Function succeeded. + */ + bool createTags(const Aws::Vector &resources, + const Aws::Vector &tags, + const Aws::Client::ClientConfiguration &clientConfiguration); + //! Delete an Amazon EC2 key pair. /*! - \sa DeleteKeyPair() \param keyPairName: A name for a key pair. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool DeleteKeyPair(const Aws::String &keyPairName, + bool deleteKeyPair(const Aws::String &keyPairName, const Aws::Client::ClientConfiguration &clientConfiguration); //! Delete a security group. /*! - \sa DeleteSecurityGroup() \param securityGroupID: A security group ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool DeleteSecurityGroup(const Aws::String &securityGroupID, + bool deleteSecurityGroup(const Aws::String &securityGroupID, const Aws::Client::ClientConfiguration &clientConfiguration); //! Describe all Elastic IP addresses. /*! - \sa DescribeAddresses() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ bool - DescribeAddresses(const Aws::Client::ClientConfiguration &clientConfiguration); + describeAddresses(const Aws::Client::ClientConfiguration &clientConfiguration); + + //! DescribeAvailabilityZones + /*! + \param clientConfiguration: AWS client configuration. + \return bool: Function succeeded. + */ + int describeAvailabilityZones(const Aws::Client::ClientConfiguration &clientConfiguration); //! Describe all EC2 instances associated with an account. /*! - \sa DescribeInstances() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ bool - DescribeInstances(const Aws::Client::ClientConfiguration &clientConfiguration); + describeInstances(const Aws::Client::ClientConfiguration &clientConfiguration); //! Describe all EC2 instance key pairs. /*! - \sa DescribeKeyPairs() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ bool - DescribeKeyPairs(const Aws::Client::ClientConfiguration &clientConfiguration); + describeKeyPairs(const Aws::Client::ClientConfiguration &clientConfiguration); //! Describe all EC2 Regions and Availability Zones. /*! - \sa DescribeRegionsAndZones() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool DescribeRegionsAndZones( + bool describeRegions( const Aws::Client::ClientConfiguration &clientConfiguration); //! Describe all EC2 security groups, or a specific group. /*! - \sa DescribeSecurityGroups() \param groupID: A group name, ignored if empty. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool DescribeSecurityGroups(const Aws::String &groupID, + bool describeSecurityGroups(const Aws::String &groupID, const Aws::Client::ClientConfiguration &clientConfiguration); //! Enable detailed monitoring for an EC2 instance. /*! - \sa EnableMonitoring() \param instanceId: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool EnableMonitoring(const Aws::String &instanceId, + bool enableMonitoring(const Aws::String &instanceId, const Aws::Client::ClientConfiguration &clientConfiguration); //! Disable monitoring for an EC2 instance. /*! - \sa DisableMonitoring() \param instanceId: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool DisableMonitoring(const Aws::String &instanceId, + bool disableMonitoring(const Aws::String &instanceId, const Aws::Client::ClientConfiguration &clientConfiguration); //! Reboot an EC2 instance. /*! - \sa RebootInstance() \param instanceID: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool RebootInstance(const Aws::String &instanceId, + bool rebootInstance(const Aws::String &instanceId, const Aws::Client::ClientConfiguration &clientConfiguration); //! Release an Elastic IP address. /*! - \sa ReleaseAddress() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool ReleaseAddress(const Aws::String &allocationID, + bool releaseAddress(const Aws::String &allocationID, const Aws::Client::ClientConfiguration &clientConfiguration); //! Launch an EC2 instance. /*! - \sa RunInstance() \param instanceName: A name for the EC2 instance. \param amiId: An Amazon Machine Image (AMI) identifier. - \param instanceID: String to return the instance ID. + \param[out] instanceID: String to return the instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool RunInstance(const Aws::String &instanceName, + bool runInstance(const Aws::String &instanceName, const Aws::String &amiId, Aws::String &instanceID, const Aws::Client::ClientConfiguration &clientConfiguration); //! Start an EC2 instance. /*! - \sa StartInstance() \param instanceID: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool StartInstance(const Aws::String &instanceId, + bool startInstance(const Aws::String &instanceId, const Aws::Client::ClientConfiguration &clientConfiguration); //! Stop an EC2 instance. /*! - \sa StopInstance() \param instanceID: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - bool StopInstance(const Aws::String &instanceId, + bool stopInstance(const Aws::String &instanceId, const Aws::Client::ClientConfiguration &clientConfiguration); //! Terminate an EC2 instance. /*! - \sa TerminateInstances() \param instanceID: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - - bool TerminateInstances(const Aws::String &instanceID, + bool terminateInstances(const Aws::String &instanceID, const Aws::Client::ClientConfiguration &clientConfiguration); } // EC2 diff --git a/cpp/example_code/ec2/hello_ec2/hello_ec2.cpp b/cpp/example_code/ec2/hello_ec2/hello_ec2.cpp index bf0bf48200a..d1684faa6d0 100644 --- a/cpp/example_code/ec2/hello_ec2/hello_ec2.cpp +++ b/cpp/example_code/ec2/hello_ec2/hello_ec2.cpp @@ -27,6 +27,9 @@ */ int main(int argc, char **argv) { + (void)argc; + (void)argv; + Aws::SDKOptions options; // Optionally change the log level for debugging. // options.loggingOptions.logLevel = Utils::Logging::LogLevel::Debug; @@ -42,7 +45,7 @@ int main(int argc, char **argv) { bool header = false; bool done = false; while (!done) { - auto outcome = ec2Client.DescribeInstances(request); + Aws::EC2::Model::DescribeInstancesOutcome outcome = ec2Client.DescribeInstances(request); if (outcome.IsSuccess()) { if (!header) { std::cout << std::left << diff --git a/cpp/example_code/ec2/monitor_instance.cpp b/cpp/example_code/ec2/monitor_instance.cpp index f0e06773aab..f63afe49c81 100644 --- a/cpp/example_code/ec2/monitor_instance.cpp +++ b/cpp/example_code/ec2/monitor_instance.cpp @@ -13,24 +13,21 @@ **/ // snippet-start:[ec2.cpp.monitor_instance.inc] -#include #include #include #include -#include #include // snippet-end:[ec2.cpp.monitor_instance.inc] #include "ec2_samples.h" - +// snippet-start:[cpp.example_code.ec2.MonitorInstances] //! Enable detailed monitoring for an Amazon Elastic Compute Cloud (Amazon EC2) instance. /*! - \sa EnableMonitoring() \param instanceId: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::EnableMonitoring(const Aws::String &instanceId, +bool AwsDoc::EC2::enableMonitoring(const Aws::String &instanceId, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.enable_monitor_instance.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); @@ -38,30 +35,28 @@ bool AwsDoc::EC2::EnableMonitoring(const Aws::String &instanceId, request.AddInstanceIds(instanceId); request.SetDryRun(true); - auto dry_run_outcome = ec2Client.MonitorInstances(request); - if (dry_run_outcome.IsSuccess()) { + Aws::EC2::Model::MonitorInstancesOutcome dryRunOutcome = ec2Client.MonitorInstances(request); + if (dryRunOutcome.IsSuccess()) { std::cerr << "Failed dry run to enable monitoring on instance. A dry run should trigger an error." << std::endl; return false; - } - else if (dry_run_outcome.GetError().GetErrorType() - != Aws::EC2::EC2Errors::DRY_RUN_OPERATION) { + } else if (dryRunOutcome.GetError().GetErrorType() + != Aws::EC2::EC2Errors::DRY_RUN_OPERATION) { std::cerr << "Failed dry run to enable monitoring on instance " << - instanceId << ": " << dry_run_outcome.GetError().GetMessage() << + instanceId << ": " << dryRunOutcome.GetError().GetMessage() << std::endl; return false; } request.SetDryRun(false); - auto monitorInstancesOutcome = ec2Client.MonitorInstances(request); + Aws::EC2::Model::MonitorInstancesOutcome monitorInstancesOutcome = ec2Client.MonitorInstances(request); if (!monitorInstancesOutcome.IsSuccess()) { std::cerr << "Failed to enable monitoring on instance " << instanceId << ": " << monitorInstancesOutcome.GetError().GetMessage() << std::endl; - } - else { + } else { std::cout << "Successfully enabled monitoring on instance " << instanceId << std::endl; } @@ -69,15 +64,17 @@ bool AwsDoc::EC2::EnableMonitoring(const Aws::String &instanceId, return monitorInstancesOutcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.MonitorInstances] + +// snippet-start:[cpp.example_code.ec2.UnmonitorInstances] //! Disable monitoring for an EC2 instance. /*! - \sa DisableMonitoring() \param instanceId: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::DisableMonitoring(const Aws::String &instanceId, +bool AwsDoc::EC2::disableMonitoring(const Aws::String &instanceId, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.disable_monitor_instance.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); @@ -85,30 +82,28 @@ bool AwsDoc::EC2::DisableMonitoring(const Aws::String &instanceId, unrequest.AddInstanceIds(instanceId); unrequest.SetDryRun(true); - auto undryRunOutcome = ec2Client.UnmonitorInstances(unrequest); - if (undryRunOutcome.IsSuccess()) { + Aws::EC2::Model::UnmonitorInstancesOutcome dryRunOutcome = ec2Client.UnmonitorInstances(unrequest); + if (dryRunOutcome.IsSuccess()) { std::cerr << "Failed dry run to disable monitoring on instance. A dry run should trigger an error." << std::endl; return false; - } - else if (undryRunOutcome.GetError().GetErrorType() != - Aws::EC2::EC2Errors::DRY_RUN_OPERATION) { + } else if (dryRunOutcome.GetError().GetErrorType() != + Aws::EC2::EC2Errors::DRY_RUN_OPERATION) { std::cout << "Failed dry run to disable monitoring on instance " << - instanceId << ": " << undryRunOutcome.GetError().GetMessage() << + instanceId << ": " << dryRunOutcome.GetError().GetMessage() << std::endl; return false; } unrequest.SetDryRun(false); - auto unmonitorInstancesOutcome = ec2Client.UnmonitorInstances(unrequest); + Aws::EC2::Model::UnmonitorInstancesOutcome unmonitorInstancesOutcome = ec2Client.UnmonitorInstances(unrequest); if (!unmonitorInstancesOutcome.IsSuccess()) { std::cout << "Failed to disable monitoring on instance " << instanceId << ": " << unmonitorInstancesOutcome.GetError().GetMessage() << std::endl; - } - else { + } else { std::cout << "Successfully disable monitoring on instance " << instanceId << std::endl; } @@ -116,6 +111,7 @@ bool AwsDoc::EC2::DisableMonitoring(const Aws::String &instanceId, return unmonitorInstancesOutcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.UnmonitorInstances] /* * @@ -150,10 +146,10 @@ int main(int argc, char **argv) { // clientConfig.region = "us-east-1"; if (enableMonitoring) { - AwsDoc::EC2::EnableMonitoring(instance_id, clientConfig); + AwsDoc::EC2::enableMonitoring(instance_id, clientConfig); } else { - AwsDoc::EC2::DisableMonitoring(instance_id, clientConfig); + AwsDoc::EC2::disableMonitoring(instance_id, clientConfig); } } Aws::ShutdownAPI(options); diff --git a/cpp/example_code/ec2/reboot_instance.cpp b/cpp/example_code/ec2/reboot_instance.cpp index cd1ab5db3c1..1080a892dfd 100644 --- a/cpp/example_code/ec2/reboot_instance.cpp +++ b/cpp/example_code/ec2/reboot_instance.cpp @@ -13,21 +13,20 @@ **/ // snippet-start:[ec2.cpp.reboot_instance.inc] -#include #include #include #include // snippet-end:[ec2.cpp.reboot_instance.inc] #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.RebootInstances] //! Reboot an Amazon Elastic Compute Cloud (Amazon EC2) instance. /*! - \sa RebootInstance() \param instanceID: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::RebootInstance(const Aws::String &instanceId, +bool AwsDoc::EC2::rebootInstance(const Aws::String &instanceId, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.reboot_instance.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); @@ -36,28 +35,26 @@ bool AwsDoc::EC2::RebootInstance(const Aws::String &instanceId, request.AddInstanceIds(instanceId); request.SetDryRun(true); - auto dry_run_outcome = ec2Client.RebootInstances(request); + Aws::EC2::Model::RebootInstancesOutcome dry_run_outcome = ec2Client.RebootInstances(request); if (dry_run_outcome.IsSuccess()) { std::cerr << "Failed dry run to reboot on instance. A dry run should trigger an error." << std::endl; return false; - } - else if (dry_run_outcome.GetError().GetErrorType() - != Aws::EC2::EC2Errors::DRY_RUN_OPERATION) { + } else if (dry_run_outcome.GetError().GetErrorType() + != Aws::EC2::EC2Errors::DRY_RUN_OPERATION) { std::cout << "Failed dry run to reboot instance " << instanceId << ": " << dry_run_outcome.GetError().GetMessage() << std::endl; return false; } request.SetDryRun(false); - auto outcome = ec2Client.RebootInstances(request); + Aws::EC2::Model::RebootInstancesOutcome outcome = ec2Client.RebootInstances(request); if (!outcome.IsSuccess()) { std::cout << "Failed to reboot instance " << instanceId << ": " << outcome.GetError().GetMessage() << std::endl; - } - else { + } else { std::cout << "Successfully rebooted instance " << instanceId << std::endl; } @@ -65,6 +62,7 @@ bool AwsDoc::EC2::RebootInstance(const Aws::String &instanceId, return outcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.RebootInstances] /* * @@ -92,7 +90,7 @@ int main(int argc, char **argv) { Aws::Client::ClientConfiguration clientConfig; // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; - AwsDoc::EC2::RebootInstance(instanceId, clientConfig); + AwsDoc::EC2::rebootInstance(instanceId, clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/release_address.cpp b/cpp/example_code/ec2/release_address.cpp index 2c41ce318fe..b510980fd43 100644 --- a/cpp/example_code/ec2/release_address.cpp +++ b/cpp/example_code/ec2/release_address.cpp @@ -13,20 +13,19 @@ **/ // snippet-start:[ec2.cpp.release_address.inc] -#include #include #include #include // snippet-end:[ec2.cpp.release_address.inc] #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.ReleaseAddress] //! Release an Elastic IP address. /*! - \sa ReleaseAddress() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::ReleaseAddress(const Aws::String &allocationID, +bool AwsDoc::EC2::releaseAddress(const Aws::String &allocationID, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.release_address.code] Aws::EC2::EC2Client ec2(clientConfiguration); @@ -34,13 +33,12 @@ bool AwsDoc::EC2::ReleaseAddress(const Aws::String &allocationID, Aws::EC2::Model::ReleaseAddressRequest request; request.SetAllocationId(allocationID); - auto outcome = ec2.ReleaseAddress(request); + Aws::EC2::Model::ReleaseAddressOutcome outcome = ec2.ReleaseAddress(request); if (!outcome.IsSuccess()) { std::cerr << "Failed to release Elastic IP address " << allocationID << ":" << outcome.GetError().GetMessage() << std::endl; - } - else { + } else { std::cout << "Successfully released Elastic IP address " << allocationID << std::endl; } @@ -48,6 +46,7 @@ bool AwsDoc::EC2::ReleaseAddress(const Aws::String &allocationID, return outcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.ReleaseAddress] /* * @@ -75,7 +74,7 @@ int main(int argc, char **argv) { Aws::Client::ClientConfiguration clientConfig; // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; - AwsDoc::EC2::ReleaseAddress(allocationID, clientConfig); + AwsDoc::EC2::releaseAddress(allocationID, clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/create_instance.cpp b/cpp/example_code/ec2/run_instances.cpp similarity index 65% rename from cpp/example_code/ec2/create_instance.cpp rename to cpp/example_code/ec2/run_instances.cpp index 2ae4c9dc4c1..13fe5a7e535 100644 --- a/cpp/example_code/ec2/create_instance.cpp +++ b/cpp/example_code/ec2/run_instances.cpp @@ -15,33 +15,27 @@ // snippet-start:[ec2.cpp.create_instance.inc] #include #include -#include #include -#include #include // snippet-end:[ec2.cpp.create_instance.inc] #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.RunInstances] //! Launch an Amazon Elastic Compute Cloud (Amazon EC2) instance. /*! - \sa RunInstance() \param instanceName: A name for the EC2 instance. \param amiId: An Amazon Machine Image (AMI) identifier. - \param instanceID: String to return the instance ID. + \param[out] instanceID: String to return the instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ - -bool AwsDoc::EC2::RunInstance(const Aws::String &instanceName, +bool AwsDoc::EC2::runInstance(const Aws::String &instanceName, const Aws::String &amiId, Aws::String &instanceID, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.create_instance.code] - // snippet-start:[cpp.example_code.ec2.create_instance.client] Aws::EC2::EC2Client ec2Client(clientConfiguration); - // snippet-end:[cpp.example_code.ec2.create_instance.client] - // snippet-start:[cpp.example_code.ec2.RunInstances] Aws::EC2::Model::RunInstancesRequest runRequest; runRequest.SetImageId(amiId); runRequest.SetInstanceType(Aws::EC2::Model::InstanceType::t1_micro); @@ -64,41 +58,20 @@ bool AwsDoc::EC2::RunInstance(const Aws::String &instanceName, runOutcome.GetError().GetMessage() << std::endl; return false; } - // snippet-end:[ec2.cpp.create_instance.code] + // snippet-end:[ec2.cpp.create_instance.code] instanceID = instances[0].GetInstanceId(); - // snippet-end:[cpp.example_code.ec2.RunInstances] - - // snippet-start:[cpp.example_code.ec2.CreateTags] - Aws::EC2::Model::Tag nameTag; - nameTag.SetKey("Name"); - nameTag.SetValue(instanceName); - - Aws::EC2::Model::CreateTagsRequest createRequest; - createRequest.AddResources(instanceID); - createRequest.AddTags(nameTag); - - Aws::EC2::Model::CreateTagsOutcome createOutcome = ec2Client.CreateTags( - createRequest); - if (!createOutcome.IsSuccess()) { - std::cerr << "Failed to tag ec2 instance " << instanceID << - " with name " << instanceName << ":" << - createOutcome.GetError().GetMessage() << std::endl; - return false; - } - // snippet-end:[cpp.example_code.ec2.CreateTags] - std::cout << "Successfully launched ec2 instance " << instanceName << - " based on ami " << amiId << std::endl; return true; } +// snippet-end:[cpp.example_code.ec2.RunInstances] /* * * main function * - * Usage: 'run_create_instance ' + * Usage: 'run_run_instances ' * */ @@ -106,7 +79,7 @@ bool AwsDoc::EC2::RunInstance(const Aws::String &instanceName, int main(int argc, char **argv) { if (argc != 3) { - std::cout << "Usage: run_create_instance " + std::cout << "Usage: run_run_instances " << std::endl; return 1; } @@ -120,7 +93,7 @@ int main(int argc, char **argv) { Aws::String instanceName = argv[1]; Aws::String amiId = argv[2]; Aws::String instanceID; - AwsDoc::EC2::RunInstance(instanceName, amiId, instanceID, clientConfig); + AwsDoc::EC2::runInstance(instanceName, amiId, instanceID, clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/start_stop_instance.cpp b/cpp/example_code/ec2/start_stop_instance.cpp index 2a3aeb07b7e..761fb1f4221 100644 --- a/cpp/example_code/ec2/start_stop_instance.cpp +++ b/cpp/example_code/ec2/start_stop_instance.cpp @@ -14,72 +14,69 @@ **/ // snippet-start:[ec2.cpp.start_instance.inc] -#include + #include #include -#include // snippet-end:[ec2.cpp.start_instance.inc] // snippet-start:[ec2.cpp.stop_instance.inc] #include -#include // snippet-end:[ec2.cpp.stop_instance.inc] #include #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.StartInstances] //! Start an Amazon Elastic Compute Cloud (Amazon EC2) instance. /*! - \sa StartInstance() \param instanceID: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::StartInstance(const Aws::String &instanceId, +bool AwsDoc::EC2::startInstance(const Aws::String &instanceId, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.start_instance.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); - Aws::EC2::Model::StartInstancesRequest start_request; - start_request.AddInstanceIds(instanceId); - start_request.SetDryRun(true); + Aws::EC2::Model::StartInstancesRequest startRequest; + startRequest.AddInstanceIds(instanceId); + startRequest.SetDryRun(true); - auto dry_run_outcome = ec2Client.StartInstances(start_request); - if (dry_run_outcome.IsSuccess()) { + Aws::EC2::Model::StartInstancesOutcome dryRunOutcome = ec2Client.StartInstances(startRequest); + if (dryRunOutcome.IsSuccess()) { std::cerr << "Failed dry run to start instance. A dry run should trigger an error." << std::endl; return false; - } - else if (dry_run_outcome.GetError().GetErrorType() != - Aws::EC2::EC2Errors::DRY_RUN_OPERATION) { + } else if (dryRunOutcome.GetError().GetErrorType() != + Aws::EC2::EC2Errors::DRY_RUN_OPERATION) { std::cout << "Failed dry run to start instance " << instanceId << ": " - << dry_run_outcome.GetError().GetMessage() << std::endl; + << dryRunOutcome.GetError().GetMessage() << std::endl; return false; } - start_request.SetDryRun(false); - auto start_instancesOutcome = ec2Client.StartInstances(start_request); + startRequest.SetDryRun(false); + Aws::EC2::Model::StartInstancesOutcome startInstancesOutcome = ec2Client.StartInstances(startRequest); - if (!start_instancesOutcome.IsSuccess()) { + if (!startInstancesOutcome.IsSuccess()) { std::cout << "Failed to start instance " << instanceId << ": " << - start_instancesOutcome.GetError().GetMessage() << std::endl; - } - else { + startInstancesOutcome.GetError().GetMessage() << std::endl; + } else { std::cout << "Successfully started instance " << instanceId << std::endl; } // snippet-end:[ec2.cpp.start_instance.code] - return start_instancesOutcome.IsSuccess(); + return startInstancesOutcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.StartInstances] +// snippet-start:[cpp.example_code.ec2.StopInstances] //! Stop an EC2 instance. /*! - \sa StopInstance() \param instanceID: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::StopInstance(const Aws::String &instanceId, +bool AwsDoc::EC2::stopInstance(const Aws::String &instanceId, const Aws::Client::ClientConfiguration &clientConfiguration) { // snippet-start:[ec2.cpp.stop_instance.code] Aws::EC2::EC2Client ec2Client(clientConfiguration); @@ -87,27 +84,25 @@ bool AwsDoc::EC2::StopInstance(const Aws::String &instanceId, request.AddInstanceIds(instanceId); request.SetDryRun(true); - auto dry_run_outcome = ec2Client.StopInstances(request); - if (dry_run_outcome.IsSuccess()) { + Aws::EC2::Model::StopInstancesOutcome dryRunOutcome = ec2Client.StopInstances(request); + if (dryRunOutcome.IsSuccess()) { std::cerr << "Failed dry run to stop instance. A dry run should trigger an error." << std::endl; return false; - } - else if (dry_run_outcome.GetError().GetErrorType() != - Aws::EC2::EC2Errors::DRY_RUN_OPERATION) { + } else if (dryRunOutcome.GetError().GetErrorType() != + Aws::EC2::EC2Errors::DRY_RUN_OPERATION) { std::cout << "Failed dry run to stop instance " << instanceId << ": " - << dry_run_outcome.GetError().GetMessage() << std::endl; + << dryRunOutcome.GetError().GetMessage() << std::endl; return false; } request.SetDryRun(false); - auto outcome = ec2Client.StopInstances(request); + Aws::EC2::Model::StopInstancesOutcome outcome = ec2Client.StopInstances(request); if (!outcome.IsSuccess()) { std::cout << "Failed to stop instance " << instanceId << ": " << outcome.GetError().GetMessage() << std::endl; - } - else { + } else { std::cout << "Successfully stopped instance " << instanceId << std::endl; } @@ -120,6 +115,7 @@ void PrintUsage() { std::cout << "Usage: run_start_stop_instance " << std::endl; } +// snippet-end:[cpp.example_code.ec2.StopInstances] /* * @@ -160,10 +156,10 @@ int main(int argc, char **argv) { // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; if (start_instance) { - AwsDoc::EC2::StartInstance(instance_id, clientConfig); + AwsDoc::EC2::startInstance(instance_id, clientConfig); } else { - AwsDoc::EC2::StopInstance(instance_id, clientConfig); + AwsDoc::EC2::stopInstance(instance_id, clientConfig); } } Aws::ShutdownAPI(options); diff --git a/cpp/example_code/ec2/terminate_instances.cpp b/cpp/example_code/ec2/terminate_instances.cpp index eeccf54d55a..d594681f65e 100644 --- a/cpp/example_code/ec2/terminate_instances.cpp +++ b/cpp/example_code/ec2/terminate_instances.cpp @@ -12,22 +12,20 @@ * **/ -#include #include #include #include #include "ec2_samples.h" +// snippet-start:[cpp.example_code.ec2.TerminateInstances] //! Terminate an Amazon Elastic Compute Cloud (Amazon EC2) instance. /*! - \sa TerminateInstances() \param instanceID: An EC2 instance ID. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ -bool AwsDoc::EC2::TerminateInstances(const Aws::String &instanceID, +bool AwsDoc::EC2::terminateInstances(const Aws::String &instanceID, const Aws::Client::ClientConfiguration &clientConfiguration) { -// snippet-start:[cpp.example_code.ec2.TerminateInstances] Aws::EC2::EC2Client ec2Client(clientConfiguration); Aws::EC2::Model::TerminateInstancesRequest request; @@ -38,17 +36,16 @@ bool AwsDoc::EC2::TerminateInstances(const Aws::String &instanceID, if (outcome.IsSuccess()) { std::cout << "Ec2 instance '" << instanceID << "' was terminated." << std::endl; - } - else { + } else { std::cerr << "Failed to terminate ec2 instance " << instanceID << ", " << outcome.GetError().GetMessage() << std::endl; return false; } -// snippet-end:[cpp.example_code.ec2.TerminateInstances] return outcome.IsSuccess(); } +// snippet-end:[cpp.example_code.ec2.TerminateInstances] /* * @@ -76,7 +73,7 @@ int main(int argc, char **argv) { // Optional: Set to the AWS Region (overrides config file). // clientConfig.region = "us-east-1"; Aws::String instanceID = argv[1]; - AwsDoc::EC2::TerminateInstances(instanceID, clientConfig); + AwsDoc::EC2::terminateInstances(instanceID, clientConfig); } Aws::ShutdownAPI(options); return 0; diff --git a/cpp/example_code/ec2/tests/CMakeLists.txt b/cpp/example_code/ec2/tests/CMakeLists.txt index e93b0060196..bd88a655680 100644 --- a/cpp/example_code/ec2/tests/CMakeLists.txt +++ b/cpp/example_code/ec2/tests/CMakeLists.txt @@ -14,10 +14,6 @@ project("${EXAMPLE_SERVICE_NAME}-examples-gtests" ) # Set the C++ standard to use to build this target. set(CMAKE_CXX_STANDARD 14) -# Build shared libraries by default. -set(BUILD_SHARED_LIBS ON) - - if(NOT GTest_FOUND) include(FetchContent) FetchContent_Declare( @@ -47,25 +43,13 @@ add_executable( ${CURRENT_TARGET} ) -if (WINDOWS_BUILD) +if (WINDOWS_BUILD AND AWSSDK_INSTALL_AS_SHARED_LIBS) # set(BIN_SUB_DIR "/Debug") # If you are building from the command line, you may need to uncomment this - # and set the proper subdirectory to the executables' location. - - if (AWSSDK_INSTALL_AS_SHARED_LIBS) - # Copy relevant AWS SDK for C++ libraries into the current binary directory for running and debugging. - AWSSDK_CPY_DYN_LIBS( - CURRENT_TARGET_AWS_DEPENDENCIES - "" - ${CMAKE_CURRENT_BINARY_DIR}${BIN_SUB_DIR} - ) - endif () - - add_custom_command( - TARGET - ${CURRENT_TARGET} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}${BIN_SUB_DIR}/gtest.dll + # and set the proper subdirectory to the executable's location. + # Copy relevant AWS SDK for C++ libraries into the current binary directory for running and debugging. + AWSSDK_CPY_DYN_LIBS( + CURRENT_TARGET_AWS_DEPENDENCIES + "" ${CMAKE_CURRENT_BINARY_DIR}${BIN_SUB_DIR} ) endif () diff --git a/cpp/example_code/ec2/tests/ec2_gtests.cpp b/cpp/example_code/ec2/tests/ec2_gtests.cpp index d2dab9633e8..25ae6288afb 100644 --- a/cpp/example_code/ec2/tests/ec2_gtests.cpp +++ b/cpp/example_code/ec2/tests/ec2_gtests.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -23,6 +24,7 @@ Aws::SDKOptions AwsDocTest::EC2_GTests::s_options; std::unique_ptr AwsDocTest::EC2_GTests::s_clientConfig; Aws::String AwsDocTest::EC2_GTests::s_instanceID; Aws::String AwsDocTest::EC2_GTests::s_vpcID; +Aws::String AwsDocTest::EC2_GTests::s_securityGroupID; void AwsDocTest::EC2_GTests::SetUpTestSuite() { @@ -39,6 +41,11 @@ void AwsDocTest::EC2_GTests::TearDownTestSuite() { s_instanceID.clear(); } + if (!s_securityGroupID.empty()) { + deleteSecurityGroup(s_securityGroupID); + s_securityGroupID.clear(); + } + ShutdownAPI(s_options); } @@ -101,7 +108,7 @@ bool AwsDocTest::EC2_GTests::releaseIPAddress(const Aws::String &allocationID) { auto outcome = ec2Client.ReleaseAddress(request); if (!outcome.IsSuccess()) { - std::cerr << "Failed to release Elastic IP address " << + std::cerr << "AwsDocTest::EC2_GTests Failed to release Elastic IP address " << allocationID << ":" << outcome.GetError().GetMessage() << std::endl; } @@ -131,8 +138,7 @@ Aws::String AwsDocTest::EC2_GTests::getAmiID() { if (s_clientConfig->region == "us-east-1") { result = "ami-0dfcb1ef8550277af"; - } - else { + } else { std::cerr << "EC2_GTests::getAmiID no amiID specified for the region " << s_clientConfig->region << std::endl; } @@ -155,15 +161,13 @@ Aws::String AwsDocTest::EC2_GTests::createInstance() { if (!runOutcome.IsSuccess()) { std::cerr << "Failed to launch ec2 instance based on ami " << amiID << ":" << runOutcome.GetError().GetMessage() << std::endl; - } - else { + } else { const Aws::Vector &instances = runOutcome.GetResult().GetInstances(); if (instances.empty()) { std::cerr << "Failed to launch ec2 instance based on ami " << amiID << ":" << runOutcome.GetError().GetMessage() << std::endl; - } - else { + } else { instanceID = instances[0].GetInstanceId(); } } @@ -181,8 +185,7 @@ Aws::String AwsDocTest::EC2_GTests::getCachedInstanceID() { if (instanceStateName == Aws::EC2::Model::InstanceStateName::running) { s_instanceID = instanceID; - } - else { + } else { std::cerr << "Error starting instance, instanceStateName '" << Aws::EC2::Model::InstanceStateNameMapper::GetNameForInstanceStateName( instanceStateName) @@ -222,13 +225,11 @@ AwsDocTest::EC2_GTests::getInstanceState(const Aws::String &instanceID) { if (!outcome.GetResult().GetReservations().empty() && !outcome.GetResult().GetReservations()[0].GetInstances().empty()) { instanceState = outcome.GetResult().GetReservations()[0].GetInstances()[0].GetState().GetName(); - } - else { + } else { std::cerr << "EC2_GTests::getInstanceState no instance returned." << std::endl; } - } - else { + } else { std::cerr << "EC2_GTests::getInstanceState error " << outcome.GetError().GetMessage() << std::endl; @@ -283,8 +284,7 @@ Aws::String AwsDocTest::EC2_GTests::createSecurityGroup(const Aws::String &group if (!outcome.IsSuccess()) { std::cerr << "Failed to create security group:" << outcome.GetError().GetMessage() << std::endl; - } - else { + } else { groupID = outcome.GetResult().GetGroupId(); } @@ -333,8 +333,7 @@ Aws::String AwsDocTest::EC2_GTests::getVpcID() { break; } } - } - else { + } else { std::cerr << "Failed to describe security groups:" << outcome.GetError().GetMessage() << std::endl; done = true; @@ -362,14 +361,35 @@ Aws::String AwsDocTest::EC2_GTests::allocateIPAddress() { std::cerr << "EC2_GTests::allocateIPAddress: failed to allocate Elastic IP address:" << outcome.GetError().GetMessage() << std::endl; - } - else { + } else { allocationID = outcome.GetResult().GetAllocationId(); } return allocationID; } +Aws::String AwsDocTest::EC2_GTests::getCachedSecurityGroupID() { + if (s_securityGroupID.empty()) { + s_securityGroupID = createSecurityGroup("cpp-test-group"); + } + + return s_securityGroupID; +} + +bool AwsDocTest::EC2_GTests::dissociateAddress(const Aws::String &associationID) { + Aws::EC2::EC2Client ec2Client(*s_clientConfig); + Aws::EC2::Model::DisassociateAddressRequest request; + request.SetAssociationId(associationID); + const Aws::EC2::Model::DisassociateAddressOutcome outcome = + ec2Client.DisassociateAddress(request); + if (!outcome.IsSuccess()) { + std::cerr << "EC2_GTests::dissociateAddress error: " << + outcome.GetError().GetMessage() << std::endl; + } + + return outcome.IsSuccess(); +} + int AwsDocTest::MyStringBuffer::underflow() { int result = basic_stringbuf::underflow(); if (result == EOF) { diff --git a/cpp/example_code/ec2/tests/ec2_gtests.h b/cpp/example_code/ec2/tests/ec2_gtests.h index 6ad702b0053..29c4d964514 100644 --- a/cpp/example_code/ec2/tests/ec2_gtests.h +++ b/cpp/example_code/ec2/tests/ec2_gtests.h @@ -60,15 +60,19 @@ namespace AwsDocTest { static bool deleteSecurityGroup(const Aws::String &groupID); + static bool dissociateAddress(const Aws::String &associationID); + static Aws::String getVpcID(); + static Aws::String getCachedSecurityGroupID(); + // s_clientConfig must be a pointer because the client config must be initialized // after InitAPI. static std::unique_ptr s_clientConfig; private: - bool suppressStdOut(); + static bool suppressStdOut(); static Aws::SDKOptions s_options; @@ -80,6 +84,7 @@ namespace AwsDocTest { static Aws::String s_instanceID; static Aws::String s_vpcID; + static Aws::String s_securityGroupID; }; // EC2_GTests } // AwsDocTest diff --git a/cpp/example_code/ec2/tests/gtest_allocate_address.cpp b/cpp/example_code/ec2/tests/gtest_allocate_address.cpp index bec76c3c114..5c57c53a29f 100644 --- a/cpp/example_code/ec2/tests/gtest_allocate_address.cpp +++ b/cpp/example_code/ec2/tests/gtest_allocate_address.cpp @@ -21,8 +21,9 @@ namespace AwsDocTest { ASSERT_FALSE(instanceID.empty()) << preconditionError() << std::endl; Aws::String allocationID; - auto result = AwsDoc::EC2::AllocateAndAssociateAddress(instanceID, - allocationID, + Aws::String publicIpAddress; + auto result = AwsDoc::EC2::allocateAndAssociateAddress(instanceID, + publicIpAddress, allocationID, *s_clientConfig); ASSERT_TRUE(result); diff --git a/cpp/example_code/ec2/tests/gtest_associate_address.cpp b/cpp/example_code/ec2/tests/gtest_associate_address.cpp new file mode 100644 index 00000000000..1e23833a668 --- /dev/null +++ b/cpp/example_code/ec2/tests/gtest_associate_address.cpp @@ -0,0 +1,38 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +/* + * Test types are indicated by the test label ending. + * + * _1_ Requires credentials, permissions, and AWS resources. + * _2_ Requires credentials and permissions. + * _3_ Does not require credentials. + * + */ + +#include +#include "ec2_samples.h" +#include "ec2_gtests.h" + +namespace AwsDocTest { + // NOLINTNEXTLINE(readability-named-parameter) + TEST_F(EC2_GTests, associate_address_2_) { + Aws::String allocationID = allocateIPAddress(); + ASSERT_FALSE(allocationID.empty()) << preconditionError() << std::endl; + + Aws::String instanceID = getCachedInstanceID(); + ASSERT_FALSE(instanceID.empty()) << preconditionError() << std::endl; + + Aws::String associationID; + + bool result = AwsDoc::EC2::associateAddress(instanceID, allocationID, associationID, *s_clientConfig); + EXPECT_TRUE(result); + + if (result) { + result = dissociateAddress(associationID); + EXPECT_TRUE(result); + } + + result = releaseIPAddress(allocationID); + EXPECT_TRUE(result); + } +} // namespace AwsDocTest diff --git a/cpp/example_code/ec2/tests/gtest_authorize_security_group_ingress.cpp b/cpp/example_code/ec2/tests/gtest_authorize_security_group_ingress.cpp new file mode 100644 index 00000000000..a11417c5109 --- /dev/null +++ b/cpp/example_code/ec2/tests/gtest_authorize_security_group_ingress.cpp @@ -0,0 +1,25 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +/* + * Test types are indicated by the test label ending. + * + * _1_ Requires credentials, permissions, and AWS resources. + * _2_ Requires credentials and permissions. + * _3_ Does not require credentials. + * + */ + +#include +#include "ec2_samples.h" +#include "ec2_gtests.h" + +namespace AwsDocTest { + // NOLINTNEXTLINE(readability-named-parameter) + TEST_F(EC2_GTests, authorize_security_group_ingress_2_) { + Aws::String groupID = getCachedSecurityGroupID(); + ASSERT_FALSE(groupID.empty()) << preconditionError() << std::endl; + + bool result = AwsDoc::EC2::authorizeSecurityGroupIngress(groupID, *s_clientConfig); + ASSERT_TRUE(result); + } +} // namespace AwsDocTest diff --git a/cpp/example_code/ec2/tests/gtest_create_key_pair.cpp b/cpp/example_code/ec2/tests/gtest_create_key_pair.cpp index f6594f84a14..91def26d9f6 100644 --- a/cpp/example_code/ec2/tests/gtest_create_key_pair.cpp +++ b/cpp/example_code/ec2/tests/gtest_create_key_pair.cpp @@ -17,7 +17,7 @@ namespace AwsDocTest { // NOLINTNEXTLINE(readability-named-parameter) TEST_F(EC2_GTests, create_key_pair_2_) { auto keyPairName = uuidName("test-create"); - auto result = AwsDoc::EC2::CreateKeyPair(keyPairName, *s_clientConfig); + auto result = AwsDoc::EC2::createKeyPair(keyPairName, "", *s_clientConfig); ASSERT_TRUE(result); deleteKeyPair(keyPairName); diff --git a/cpp/example_code/ec2/tests/gtest_create_security_group.cpp b/cpp/example_code/ec2/tests/gtest_create_security_group.cpp index 8b0e073ce5d..3d980fbe77a 100644 --- a/cpp/example_code/ec2/tests/gtest_create_security_group.cpp +++ b/cpp/example_code/ec2/tests/gtest_create_security_group.cpp @@ -21,7 +21,7 @@ namespace AwsDocTest { auto groupName = uuidName("test-create"); Aws::String groupID; - auto result = AwsDoc::EC2::CreateSecurityGroup(groupName, "description", + auto result = AwsDoc::EC2::createSecurityGroup(groupName, "description", vpcID, groupID, *s_clientConfig); EXPECT_TRUE(result); diff --git a/cpp/example_code/ec2/tests/gtest_create_tags.cpp b/cpp/example_code/ec2/tests/gtest_create_tags.cpp new file mode 100644 index 00000000000..6755adae613 --- /dev/null +++ b/cpp/example_code/ec2/tests/gtest_create_tags.cpp @@ -0,0 +1,29 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +/* + * Test types are indicated by the test label ending. + * + * _1_ Requires credentials, permissions, and AWS resources. + * _2_ Requires credentials and permissions. + * _3_ Does not require credentials. + * + */ + +#include +#include "ec2_samples.h" +#include "ec2_gtests.h" + +namespace AwsDocTest { + // NOLINTNEXTLINE(readability-named-parameter) + TEST_F(EC2_GTests, create_tags_2_) { + Aws::String instanceID = getCachedInstanceID(); + ASSERT_FALSE(instanceID.empty()) << preconditionError() << std::endl; + Aws::Vector resources; + resources.push_back(instanceID); + + Aws::Vector tags; + tags.push_back(Aws::EC2::Model::Tag().WithKey("Name").WithValue("Test")); + bool result = AwsDoc::EC2::createTags(resources, tags, *s_clientConfig); + ASSERT_TRUE(result); + } +} // namespace AwsDocTest diff --git a/cpp/example_code/ec2/tests/gtest_delete_key_pair.cpp b/cpp/example_code/ec2/tests/gtest_delete_key_pair.cpp index 856162138be..cfbc161909f 100644 --- a/cpp/example_code/ec2/tests/gtest_delete_key_pair.cpp +++ b/cpp/example_code/ec2/tests/gtest_delete_key_pair.cpp @@ -20,7 +20,7 @@ namespace AwsDocTest { bool result = createKeyPair(keyPairName); ASSERT_TRUE(result) << preconditionError() << std::endl; - result = AwsDoc::EC2::DeleteKeyPair(keyPairName, *s_clientConfig); + result = AwsDoc::EC2::deleteKeyPair(keyPairName, *s_clientConfig); ASSERT_TRUE(result); } diff --git a/cpp/example_code/ec2/tests/gtest_delete_security_group.cpp b/cpp/example_code/ec2/tests/gtest_delete_security_group.cpp index 5c3aa0e0384..ce32ef0a037 100644 --- a/cpp/example_code/ec2/tests/gtest_delete_security_group.cpp +++ b/cpp/example_code/ec2/tests/gtest_delete_security_group.cpp @@ -19,7 +19,7 @@ namespace AwsDocTest { Aws::String groupID = createSecurityGroup(uuidName("test-delete")); ASSERT_FALSE(groupID.empty()); - auto result = AwsDoc::EC2::DeleteSecurityGroup(groupID, *s_clientConfig); + auto result = AwsDoc::EC2::deleteSecurityGroup(groupID, *s_clientConfig); ASSERT_TRUE(result); } diff --git a/cpp/example_code/ec2/tests/gtest_describe_addresses.cpp b/cpp/example_code/ec2/tests/gtest_describe_addresses.cpp index 68f4a576b65..d738981d5d0 100644 --- a/cpp/example_code/ec2/tests/gtest_describe_addresses.cpp +++ b/cpp/example_code/ec2/tests/gtest_describe_addresses.cpp @@ -17,7 +17,7 @@ namespace AwsDocTest { // NOLINTNEXTLINE(readability-named-parameter) TEST_F(EC2_GTests, describe_Addresses_2_) { - auto result = AwsDoc::EC2::DescribeAddresses(*s_clientConfig); + auto result = AwsDoc::EC2::describeAddresses(*s_clientConfig); ASSERT_TRUE(result); } diff --git a/cpp/example_code/ec2/tests/gtest_describe_availability_zones.cpp b/cpp/example_code/ec2/tests/gtest_describe_availability_zones.cpp new file mode 100644 index 00000000000..bae41066a85 --- /dev/null +++ b/cpp/example_code/ec2/tests/gtest_describe_availability_zones.cpp @@ -0,0 +1,24 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +/* + * Test types are indicated by the test label ending. + * + * _1_ Requires credentials, permissions, and AWS resources. + * _2_ Requires credentials and permissions. + * _3_ Does not require credentials. + * + */ + +#include +#include "ec2_samples.h" +#include "ec2_gtests.h" + +namespace AwsDocTest { + // NOLINTNEXTLINE(readability-named-parameter) + TEST_F(EC2_GTests, describe_availability_zones_2_) { + + + bool result = AwsDoc::EC2::describeAvailabilityZones(*s_clientConfig); + ASSERT_TRUE(result); + } +} // namespace AwsDocTest diff --git a/cpp/example_code/ec2/tests/gtest_describe_instances.cpp b/cpp/example_code/ec2/tests/gtest_describe_instances.cpp index 390ecf77c45..8b0365f6b20 100644 --- a/cpp/example_code/ec2/tests/gtest_describe_instances.cpp +++ b/cpp/example_code/ec2/tests/gtest_describe_instances.cpp @@ -17,7 +17,7 @@ namespace AwsDocTest { // NOLINTNEXTLINE(readability-named-parameter) TEST_F(EC2_GTests, describe_instances_2_) { - auto result = AwsDoc::EC2::DescribeInstances(*s_clientConfig); + auto result = AwsDoc::EC2::describeInstances(*s_clientConfig); ASSERT_TRUE(result); } diff --git a/cpp/example_code/ec2/tests/gtest_describe_key_pairs.cpp b/cpp/example_code/ec2/tests/gtest_describe_key_pairs.cpp index fc9fc49e6ba..0c719324681 100644 --- a/cpp/example_code/ec2/tests/gtest_describe_key_pairs.cpp +++ b/cpp/example_code/ec2/tests/gtest_describe_key_pairs.cpp @@ -17,7 +17,7 @@ namespace AwsDocTest { // NOLINTNEXTLINE(readability-named-parameter) TEST_F(EC2_GTests, describe_key_pairs_2_) { - auto result = AwsDoc::EC2::DescribeKeyPairs(*s_clientConfig); + auto result = AwsDoc::EC2::describeKeyPairs(*s_clientConfig); ASSERT_TRUE(result); } diff --git a/cpp/example_code/ec2/tests/gtest_describe_regions_and_zones.cpp b/cpp/example_code/ec2/tests/gtest_describe_regions_and_zones.cpp index d4e400824fc..72132aef243 100644 --- a/cpp/example_code/ec2/tests/gtest_describe_regions_and_zones.cpp +++ b/cpp/example_code/ec2/tests/gtest_describe_regions_and_zones.cpp @@ -17,7 +17,7 @@ namespace AwsDocTest { // NOLINTNEXTLINE(readability-named-parameter) TEST_F(EC2_GTests, describe_regions_and_zones_2_) { - auto result = AwsDoc::EC2::DescribeRegionsAndZones(*s_clientConfig); + auto result = AwsDoc::EC2::describeRegions(*s_clientConfig); ASSERT_TRUE(result); } diff --git a/cpp/example_code/ec2/tests/gtest_describe_security_groups.cpp b/cpp/example_code/ec2/tests/gtest_describe_security_groups.cpp index 7a82acbdc11..e56c9df1574 100644 --- a/cpp/example_code/ec2/tests/gtest_describe_security_groups.cpp +++ b/cpp/example_code/ec2/tests/gtest_describe_security_groups.cpp @@ -17,7 +17,7 @@ namespace AwsDocTest { // NOLINTNEXTLINE(readability-named-parameter) TEST_F(EC2_GTests, describe_security_groups_2_) { - auto result = AwsDoc::EC2::DescribeSecurityGroups("", *s_clientConfig); + auto result = AwsDoc::EC2::describeSecurityGroups("", *s_clientConfig); ASSERT_TRUE(result); } diff --git a/cpp/example_code/ec2/tests/gtest_monitor_instance.cpp b/cpp/example_code/ec2/tests/gtest_monitor_instance.cpp index 36612154263..be1a8c84999 100644 --- a/cpp/example_code/ec2/tests/gtest_monitor_instance.cpp +++ b/cpp/example_code/ec2/tests/gtest_monitor_instance.cpp @@ -19,10 +19,10 @@ namespace AwsDocTest { auto instanceID = getCachedInstanceID(); ASSERT_FALSE(instanceID.empty()) << preconditionError << std::endl; - auto result = AwsDoc::EC2::EnableMonitoring(instanceID, *s_clientConfig); + auto result = AwsDoc::EC2::enableMonitoring(instanceID, *s_clientConfig); ASSERT_TRUE(result); - result = AwsDoc::EC2::DisableMonitoring(instanceID, *s_clientConfig); + result = AwsDoc::EC2::disableMonitoring(instanceID, *s_clientConfig); ASSERT_TRUE(result); } diff --git a/cpp/example_code/ec2/tests/gtest_reboot_instance.cpp b/cpp/example_code/ec2/tests/gtest_reboot_instance.cpp index 6b6b91b0497..1b18aacf46e 100644 --- a/cpp/example_code/ec2/tests/gtest_reboot_instance.cpp +++ b/cpp/example_code/ec2/tests/gtest_reboot_instance.cpp @@ -19,7 +19,7 @@ namespace AwsDocTest { auto instanceID = getCachedInstanceID(); ASSERT_FALSE(instanceID.empty()) << preconditionError << std::endl; - auto result = AwsDoc::EC2::RebootInstance(instanceID, *s_clientConfig); + auto result = AwsDoc::EC2::rebootInstance(instanceID, *s_clientConfig); ASSERT_TRUE(result); } diff --git a/cpp/example_code/ec2/tests/gtest_release_address.cpp b/cpp/example_code/ec2/tests/gtest_release_address.cpp index 1634fe20aee..5ace7fdc370 100644 --- a/cpp/example_code/ec2/tests/gtest_release_address.cpp +++ b/cpp/example_code/ec2/tests/gtest_release_address.cpp @@ -19,7 +19,7 @@ namespace AwsDocTest { Aws::String allocationID = allocateIPAddress(); ASSERT_FALSE(allocationID.empty()) << preconditionError() << std::endl; - auto result = AwsDoc::EC2::ReleaseAddress(allocationID, *s_clientConfig); + auto result = AwsDoc::EC2::releaseAddress(allocationID, *s_clientConfig); ASSERT_TRUE(result); } diff --git a/cpp/example_code/ec2/tests/gtest_create_instance.cpp b/cpp/example_code/ec2/tests/gtest_run_instances.cpp similarity index 93% rename from cpp/example_code/ec2/tests/gtest_create_instance.cpp rename to cpp/example_code/ec2/tests/gtest_run_instances.cpp index 3725ff0423e..106db04a6d2 100644 --- a/cpp/example_code/ec2/tests/gtest_create_instance.cpp +++ b/cpp/example_code/ec2/tests/gtest_run_instances.cpp @@ -22,7 +22,7 @@ namespace AwsDocTest { auto instanceName = uuidName("test-create"); Aws::String instanceID; - auto result = AwsDoc::EC2::RunInstance(instanceName, amiID, + auto result = AwsDoc::EC2::runInstance(instanceName, amiID, instanceID, *s_clientConfig); ASSERT_TRUE(result); diff --git a/cpp/example_code/ec2/tests/gtest_start_stop_instance.cpp b/cpp/example_code/ec2/tests/gtest_start_stop_instance.cpp index 0e394574f8b..d8e50416a10 100644 --- a/cpp/example_code/ec2/tests/gtest_start_stop_instance.cpp +++ b/cpp/example_code/ec2/tests/gtest_start_stop_instance.cpp @@ -19,12 +19,12 @@ namespace AwsDocTest { auto instanceID = getCachedInstanceID(); ASSERT_FALSE(instanceID.empty()) << preconditionError << std::endl; - auto result = AwsDoc::EC2::StopInstance(instanceID, *s_clientConfig); + auto result = AwsDoc::EC2::stopInstance(instanceID, *s_clientConfig); ASSERT_TRUE(result); waitWhileInstanceInState(instanceID, Aws::EC2::Model::InstanceStateName::stopping); - result = AwsDoc::EC2::StartInstance(instanceID, *s_clientConfig); + result = AwsDoc::EC2::startInstance(instanceID, *s_clientConfig); ASSERT_TRUE(result); waitWhileInstanceInState(instanceID, diff --git a/cpp/example_code/ec2/tests/gtest_terminate_instances.cpp b/cpp/example_code/ec2/tests/gtest_terminate_instances.cpp index e56accbebe9..37a4f855b14 100644 --- a/cpp/example_code/ec2/tests/gtest_terminate_instances.cpp +++ b/cpp/example_code/ec2/tests/gtest_terminate_instances.cpp @@ -19,7 +19,7 @@ namespace AwsDocTest { auto instanceID = getCachedInstanceID(); ASSERT_FALSE(instanceID.empty()) << preconditionError << std::endl; - auto result = AwsDoc::EC2::TerminateInstances(instanceID, *s_clientConfig); + auto result = AwsDoc::EC2::terminateInstances(instanceID, *s_clientConfig); ASSERT_TRUE(result); } From 32dd8c0fd0d3fbad2d720255116eadf882732e79 Mon Sep 17 00:00:00 2001 From: Scott Macdonald <57190223+scmacdon@users.noreply.github.com> Date: Fri, 2 Aug 2024 11:44:51 -0400 Subject: [PATCH 17/98] Java V2 Refactored SSM scenario (#6650) --- .doc_gen/metadata/ssm_metadata.yaml | 3 + javav2/example_code/ssm/README.md | 18 +- javav2/example_code/ssm/pom.xml | 6 +- .../java/com/example/scenario/SSMActions.java | 641 +++++++++++++++++ .../com/example/scenario/SSMScenario.java | 642 +++++------------- .../ssm/src/test/java/AWSSSMTest.java | 41 +- 6 files changed, 852 insertions(+), 499 deletions(-) create mode 100644 javav2/example_code/ssm/src/main/java/com/example/scenario/SSMActions.java diff --git a/.doc_gen/metadata/ssm_metadata.yaml b/.doc_gen/metadata/ssm_metadata.yaml index 6adf74badd9..ae6d398a2cd 100644 --- a/.doc_gen/metadata/ssm_metadata.yaml +++ b/.doc_gen/metadata/ssm_metadata.yaml @@ -316,6 +316,9 @@ ssm_Scenario: - description: snippet_tags: - ssm.java2.scenario.main + - description: A wrapper class for &SYS; SDK methods. + snippet_tags: + - ssm.java2.actions.main Python: versions: - sdk_version: 3 diff --git a/javav2/example_code/ssm/README.md b/javav2/example_code/ssm/README.md index 1848633de8d..596fff26656 100644 --- a/javav2/example_code/ssm/README.md +++ b/javav2/example_code/ssm/README.md @@ -38,17 +38,17 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav Code excerpts that show you how to call individual service functions. -- [CreateDocument](src/main/java/com/example/scenario/SSMScenario.java#L475) -- [CreateMaintenanceWindow](src/main/java/com/example/scenario/SSMScenario.java#L429) -- [CreateOpsItem](src/main/java/com/example/scenario/SSMScenario.java#L227) -- [DeleteDocument](src/main/java/com/example/scenario/SSMScenario.java#L371) -- [DeleteMaintenanceWindow](src/main/java/com/example/scenario/SSMScenario.java#L389) -- [DescribeOpsItems](src/main/java/com/example/scenario/SSMScenario.java#L517) +- [CreateDocument](src/main/java/com/example/scenario/SSMActions.java#L481) +- [CreateMaintenanceWindow](src/main/java/com/example/scenario/SSMActions.java#L569) +- [CreateOpsItem](src/main/java/com/example/scenario/SSMActions.java#L314) +- [DeleteDocument](src/main/java/com/example/scenario/SSMActions.java#L92) +- [DeleteMaintenanceWindow](src/main/java/com/example/scenario/SSMActions.java#L131) +- [DescribeOpsItems](src/main/java/com/example/scenario/SSMActions.java#L210) - [DescribeParameters](src/main/java/com/example/ssm/GetParameter.java#L6) - [PutParameter](src/main/java/com/example/ssm/PutParameter.java#L6) -- [SendCommand](src/main/java/com/example/scenario/SSMScenario.java#L311) -- [UpdateMaintenanceWindow](src/main/java/com/example/scenario/SSMScenario.java#L406) -- [UpdateOpsItem](src/main/java/com/example/scenario/SSMScenario.java#L275) +- [SendCommand](src/main/java/com/example/scenario/SSMActions.java#L385) +- [UpdateMaintenanceWindow](src/main/java/com/example/scenario/SSMActions.java#L532) +- [UpdateOpsItem](src/main/java/com/example/scenario/SSMActions.java#L170) ### Scenarios diff --git a/javav2/example_code/ssm/pom.xml b/javav2/example_code/ssm/pom.xml index fe126b1586b..a73fdc3ba7e 100644 --- a/javav2/example_code/ssm/pom.xml +++ b/javav2/example_code/ssm/pom.xml @@ -38,7 +38,7 @@ software.amazon.awssdk bom - 2.21.20 + 2.25.56 pom import @@ -59,6 +59,10 @@ software.amazon.awssdk secretsmanager + + software.amazon.awssdk + netty-nio-client + com.google.code.gson gson diff --git a/javav2/example_code/ssm/src/main/java/com/example/scenario/SSMActions.java b/javav2/example_code/ssm/src/main/java/com/example/scenario/SSMActions.java new file mode 100644 index 00000000000..8a4056b880b --- /dev/null +++ b/javav2/example_code/ssm/src/main/java/com/example/scenario/SSMActions.java @@ -0,0 +1,641 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.scenario; + +import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; +import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; +import software.amazon.awssdk.core.retry.RetryPolicy; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.ssm.SsmAsyncClient; +import software.amazon.awssdk.services.ssm.model.CommandInvocation; +import software.amazon.awssdk.services.ssm.model.CommandInvocationStatus; +import software.amazon.awssdk.services.ssm.model.CreateDocumentRequest; +import software.amazon.awssdk.services.ssm.model.CreateDocumentResponse; +import software.amazon.awssdk.services.ssm.model.CreateMaintenanceWindowRequest; +import software.amazon.awssdk.services.ssm.model.CreateMaintenanceWindowResponse; +import software.amazon.awssdk.services.ssm.model.CreateOpsItemRequest; +import software.amazon.awssdk.services.ssm.model.DeleteDocumentRequest; +import software.amazon.awssdk.services.ssm.model.DeleteMaintenanceWindowRequest; +import software.amazon.awssdk.services.ssm.model.DescribeDocumentRequest; +import software.amazon.awssdk.services.ssm.model.DescribeDocumentResponse; +import software.amazon.awssdk.services.ssm.model.DescribeMaintenanceWindowsRequest; +import software.amazon.awssdk.services.ssm.model.DescribeMaintenanceWindowsResponse; +import software.amazon.awssdk.services.ssm.model.DescribeOpsItemsRequest; +import software.amazon.awssdk.services.ssm.model.DocumentAlreadyExistsException; +import software.amazon.awssdk.services.ssm.model.DocumentType; +import software.amazon.awssdk.services.ssm.model.GetCommandInvocationRequest; +import software.amazon.awssdk.services.ssm.model.GetCommandInvocationResponse; +import software.amazon.awssdk.services.ssm.model.ListCommandInvocationsRequest; +import software.amazon.awssdk.services.ssm.model.ListCommandInvocationsResponse; +import software.amazon.awssdk.services.ssm.model.MaintenanceWindowFilter; +import software.amazon.awssdk.services.ssm.model.MaintenanceWindowIdentity; +import software.amazon.awssdk.services.ssm.model.OpsItem; +import software.amazon.awssdk.services.ssm.model.OpsItemDataValue; +import software.amazon.awssdk.services.ssm.model.OpsItemFilter; +import software.amazon.awssdk.services.ssm.model.OpsItemFilterKey; +import software.amazon.awssdk.services.ssm.model.OpsItemFilterOperator; +import software.amazon.awssdk.services.ssm.model.OpsItemStatus; +import software.amazon.awssdk.services.ssm.model.OpsItemSummary; +import software.amazon.awssdk.services.ssm.model.SendCommandRequest; +import software.amazon.awssdk.services.ssm.model.SendCommandResponse; +import software.amazon.awssdk.services.ssm.model.SsmException; +import software.amazon.awssdk.services.ssm.model.UpdateMaintenanceWindowRequest; +import software.amazon.awssdk.services.ssm.model.UpdateMaintenanceWindowResponse; +import software.amazon.awssdk.services.ssm.model.CreateOpsItemResponse; +import software.amazon.awssdk.services.ssm.model.UpdateOpsItemRequest; +import software.amazon.awssdk.services.ssm.model.GetOpsItemRequest; +import software.amazon.awssdk.services.ssm.model.GetOpsItemResponse; +import java.time.Duration; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.concurrent.TimeUnit; +// snippet-start:[ssm.java2.actions.main] +public class SSMActions { + + private static SsmAsyncClient ssmAsyncClient; + + private static SsmAsyncClient getAsyncClient() { + if (ssmAsyncClient == null) { + SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() + .maxConcurrency(100) + .connectionTimeout(Duration.ofSeconds(60)) + .readTimeout(Duration.ofSeconds(60)) + .writeTimeout(Duration.ofSeconds(60)) + .build(); + + ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() + .apiCallTimeout(Duration.ofMinutes(2)) + .apiCallAttemptTimeout(Duration.ofSeconds(90)) + .retryPolicy(RetryPolicy.builder() + .numRetries(3) + .build()) + .build(); + + ssmAsyncClient = SsmAsyncClient.builder() + .region(Region.US_EAST_1) + .httpClient(httpClient) + .overrideConfiguration(overrideConfig) + .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) + .build(); + } + return ssmAsyncClient; + } + + // snippet-start:[ssm.Java2.delete_doc.main] + /** + * Deletes an AWS SSM document asynchronously. + * + * @param documentName The name of the document to delete. + *

+ * This method initiates an asynchronous request to delete an SSM document. + * If an exception occurs, it handles the error appropriately. + */ + public void deleteDoc(String documentName) { + DeleteDocumentRequest documentRequest = DeleteDocumentRequest.builder() + .name(documentName) + .build(); + + CompletableFuture future = CompletableFuture.runAsync(() -> { + getAsyncClient().deleteDocument(documentRequest) + .thenAccept(response -> { + System.out.println("The SSM document was successfully deleted."); + }) + .exceptionally(ex -> { + throw new CompletionException(ex); + }).join(); + }).exceptionally(ex -> { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof SsmException) { + throw new RuntimeException("SSM error: " + cause.getMessage(), cause); + } else { + throw new RuntimeException("Unexpected error: " + cause.getMessage(), cause); + } + }); + + try { + future.join(); + } catch (CompletionException ex) { + throw ex.getCause() instanceof RuntimeException ? (RuntimeException) ex.getCause() : ex; + } + } + // snippet-end:[ssm.Java2.delete_doc.main] + + // snippet-start:[ssm.java2.delete_window.main] + /** + * Deletes an AWS SSM Maintenance Window asynchronously. + * + * @param winId The ID of the Maintenance Window to delete. + *

+ * This method initiates an asynchronous request to delete an SSM Maintenance Window. + * If an exception occurs, it handles the error appropriately. + */ + public void deleteMaintenanceWindow(String winId) { + DeleteMaintenanceWindowRequest windowRequest = DeleteMaintenanceWindowRequest.builder() + .windowId(winId) + .build(); + + CompletableFuture future = CompletableFuture.runAsync(() -> { + getAsyncClient().deleteMaintenanceWindow(windowRequest) + .thenAccept(response -> { + System.out.println("The maintenance window was successfully deleted."); + }) + .exceptionally(ex -> { + throw new CompletionException(ex); + }).join(); + }).exceptionally(ex -> { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof SsmException) { + throw new RuntimeException("SSM error: " + cause.getMessage(), cause); + } else { + throw new RuntimeException("Unexpected error: " + cause.getMessage(), cause); + } + }); + + try { + future.join(); + } catch (CompletionException ex) { + throw ex.getCause() instanceof RuntimeException ? (RuntimeException) ex.getCause() : ex; + } + } + // snippet-end:[ssm.java2.delete_window.main] + + // snippet-start:[ssm.Java2.resolve_ops.main] + /** + * Resolves an AWS SSM OpsItem asynchronously. + * + * @param opsID The ID of the OpsItem to resolve. + *

+ * This method initiates an asynchronous request to resolve an SSM OpsItem. + * If an exception occurs, it handles the error appropriately. + */ + public void resolveOpsItem(String opsID) { + UpdateOpsItemRequest opsItemRequest = UpdateOpsItemRequest.builder() + .opsItemId(opsID) + .status(OpsItemStatus.RESOLVED) + .build(); + + CompletableFuture future = CompletableFuture.runAsync(() -> { + getAsyncClient().updateOpsItem(opsItemRequest) + .thenAccept(response -> { + System.out.println("OpsItem resolved successfully."); + }) + .exceptionally(ex -> { + throw new CompletionException(ex); + }).join(); + }).exceptionally(ex -> { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof SsmException) { + throw new RuntimeException("SSM error: " + cause.getMessage(), cause); + } else { + throw new RuntimeException("Unexpected error: " + cause.getMessage(), cause); + } + }); + + try { + future.join(); + } catch (CompletionException ex) { + throw ex.getCause() instanceof RuntimeException ? (RuntimeException) ex.getCause() : ex; + } + } + // snippet-end:[ssm.Java2.resolve_ops.main] + + // snippet-start:[ssm.java2.describe_ops.main] + /** + * Describes AWS SSM OpsItems asynchronously. + * + * @param key The key to filter OpsItems by (e.g., OPS_ITEM_ID). + * + * This method initiates an asynchronous request to describe SSM OpsItems. + * If the request is successful, it prints the title and status of each OpsItem. + * If an exception occurs, it handles the error appropriately. + */ + public void describeOpsItems(String key) { + OpsItemFilter filter = OpsItemFilter.builder() + .key(OpsItemFilterKey.OPS_ITEM_ID) + .values(key) + .operator(OpsItemFilterOperator.EQUAL) + .build(); + + DescribeOpsItemsRequest itemsRequest = DescribeOpsItemsRequest.builder() + .maxResults(10) + .opsItemFilters(filter) + .build(); + + CompletableFuture future = CompletableFuture.runAsync(() -> { + getAsyncClient().describeOpsItems(itemsRequest) + .thenAccept(itemsResponse -> { + List items = itemsResponse.opsItemSummaries(); + for (OpsItemSummary item : items) { + System.out.println("The item title is " + item.title() + " and the status is " + item.status().toString()); + } + }) + .exceptionally(ex -> { + throw new CompletionException(ex); + }).join(); + }).exceptionally(ex -> { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof SsmException) { + throw new RuntimeException("SSM error: " + cause.getMessage(), cause); + } else { + throw new RuntimeException("Unexpected error: " + cause.getMessage(), cause); + } + }); + + try { + future.join(); + } catch (CompletionException ex) { + throw ex.getCause() instanceof RuntimeException ? (RuntimeException) ex.getCause() : ex; + } + } + // snippet-end:[ssm.java2.describe_ops.main] + + // snippet-start:[ssm.java2.update_ops.main] + /** + * Updates the AWS SSM OpsItem asynchronously. + * + * @param opsItemId The ID of the OpsItem to update. + * @param title The new title of the OpsItem. + * @param description The new description of the OpsItem. + *

+ * This method initiates an asynchronous request to update an SSM OpsItem. + * If the request is successful, it completes without returning a value. + * If an exception occurs, it handles the error appropriately. + */ + public void updateOpsItem(String opsItemId, String title, String description) { + Map operationalData = new HashMap<>(); + operationalData.put("key1", OpsItemDataValue.builder().value("value1").build()); + operationalData.put("key2", OpsItemDataValue.builder().value("value2").build()); + + CompletableFuture future = getOpsItem(opsItemId).thenCompose(opsItem -> { + UpdateOpsItemRequest request = UpdateOpsItemRequest.builder() + .opsItemId(opsItemId) + .title(title) + .operationalData(operationalData) + .status(opsItem.statusAsString()) + .description(description) + .build(); + + return getAsyncClient().updateOpsItem(request).thenAccept(response -> { + System.out.println(opsItemId + " updated successfully."); + }).exceptionally(ex -> { + throw new CompletionException(ex); + }); + }).exceptionally(ex -> { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof SsmException) { + throw new RuntimeException("SSM error: " + cause.getMessage(), cause); + } else { + throw new RuntimeException("Unexpected error: " + cause.getMessage(), cause); + } + }); + + try { + future.join(); + } catch (CompletionException ex) { + throw ex.getCause() instanceof RuntimeException ? (RuntimeException) ex.getCause() : ex; + } + } + + + private static CompletableFuture getOpsItem(String opsItemId) { + GetOpsItemRequest request = GetOpsItemRequest.builder().opsItemId(opsItemId).build(); + return getAsyncClient().getOpsItem(request).thenApply(GetOpsItemResponse::opsItem); + } + // snippet-end:[ssm.java2.update_ops.main] + + // snippet-start:[ssm.java2.create_ops.main] + /** + * Creates an SSM OpsItem asynchronously. + * + * @param title The title of the OpsItem. + * @param source The source of the OpsItem. + * @param category The category of the OpsItem. + * @param severity The severity of the OpsItem. + * @return The ID of the created OpsItem. + *

+ * This method initiates an asynchronous request to create an SSM OpsItem. + * If the request is successful, it returns the OpsItem ID. + * If an exception occurs, it handles the error appropriately. + */ + public String createSSMOpsItem(String title, String source, String category, String severity) { + CreateOpsItemRequest opsItemRequest = CreateOpsItemRequest.builder() + .description("Created by the SSM Java API") + .title(title) + .source(source) + .category(category) + .severity(severity) + .build(); + + CompletableFuture future = getAsyncClient().createOpsItem(opsItemRequest); + + try { + CreateOpsItemResponse response = future.join(); + return response.opsItemId(); + } catch (CompletionException e) { + Throwable cause = e.getCause(); + if (cause instanceof SsmException) { + throw (SsmException) cause; + } else { + throw new RuntimeException(cause); + } + } + } + // snippet-end:[ssm.java2.create_ops.main] + + // snippet-start:[ssm.java2.describe_command.main] + /** + * Displays the date and time when the specific command was invoked. + * + * @param commandId The ID of the command to describe. + *

+ * This method initiates an asynchronous request to list command invocations and prints the date and time of each command invocation. + * If an exception occurs, it handles the error appropriately. + */ + public void displayCommands(String commandId) { + ListCommandInvocationsRequest commandInvocationsRequest = ListCommandInvocationsRequest.builder() + .commandId(commandId) + .build(); + + CompletableFuture future = getAsyncClient().listCommandInvocations(commandInvocationsRequest); + future.thenAccept(response -> { + List commandList = response.commandInvocations(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()); + for (CommandInvocation invocation : commandList) { + System.out.println("The time of the command invocation is " + formatter.format(invocation.requestedDateTime())); + } + }).exceptionally(ex -> { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof SsmException) { + throw (SsmException) cause; + } else { + throw new RuntimeException(cause); + } + }).join(); + } + // snippet-end:[ssm.java2.describe_command.main] + + // snippet-start:[ssm.Java2.send_command.main] + /** + * Sends a SSM command to a managed node asynchronously. + * + * @param documentName The name of the document to use. + * @param instanceId The ID of the instance to send the command to. + * @return The command ID. + *

+ * This method initiates asynchronous requests to send a SSM command to a managed node. + * It waits until the document is active, sends the command, and checks the command execution status. + */ + public String sendSSMCommand(String documentName, String instanceId) throws InterruptedException, SsmException { + // Before we use Document to send a command - make sure it is active. + CompletableFuture documentActiveFuture = CompletableFuture.runAsync(() -> { + boolean isDocumentActive = false; + DescribeDocumentRequest request = DescribeDocumentRequest.builder() + .name(documentName) + .build(); + + while (!isDocumentActive) { + CompletableFuture response = getAsyncClient().describeDocument(request); + String documentStatus = response.join().document().statusAsString(); + if (documentStatus.equals("Active")) { + System.out.println("The SSM document is active and ready to use."); + isDocumentActive = true; + } else { + System.out.println("The SSM document is not active. Status: " + documentStatus); + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + }); + + documentActiveFuture.join(); + + // Create the SendCommandRequest. + SendCommandRequest commandRequest = SendCommandRequest.builder() + .documentName(documentName) + .instanceIds(instanceId) + .build(); + + // Send the command. + CompletableFuture commandFuture = getAsyncClient().sendCommand(commandRequest); + final String[] commandId = {null}; + + commandFuture.whenComplete((commandResponse, ex) -> { + if (commandResponse != null) { + commandId[0] = commandResponse.command().commandId(); + System.out.println("Command ID: " + commandId[0]); + + // Wait for the command execution to complete. + GetCommandInvocationRequest invocationRequest = GetCommandInvocationRequest.builder() + .commandId(commandId[0]) + .instanceId(instanceId) + .build(); + + try { + System.out.println("Wait 5 secs"); + TimeUnit.SECONDS.sleep(5); + + // Retrieve the command execution details. + CompletableFuture invocationFuture = getAsyncClient().getCommandInvocation(invocationRequest); + invocationFuture.whenComplete((commandInvocationResponse, invocationEx) -> { + if (commandInvocationResponse != null) { + // Check the status of the command execution. + CommandInvocationStatus status = commandInvocationResponse.status(); + if (status == CommandInvocationStatus.SUCCESS) { + System.out.println("Command execution successful"); + } else { + System.out.println("Command execution failed. Status: " + status); + } + } else { + Throwable invocationCause = (invocationEx instanceof CompletionException) ? invocationEx.getCause() : invocationEx; + throw new CompletionException(invocationCause); + } + }).join(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } else { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof SsmException) { + throw (SsmException) cause; + } else { + throw new RuntimeException(cause); + } + } + }).join(); + + return commandId[0]; + } + // snippet-end:[ssm.Java2.send_command.main] + + // snippet-start:[ssm.java2.create_doc.main] + /** + * Creates an AWS SSM document asynchronously. + * + * @param docName The name of the document to create. + *

+ * This method initiates an asynchronous request to create an SSM document. + * If the request is successful, it prints the document status. + * If an exception occurs, it handles the error appropriately. + */ + public void createSSMDoc(String docName) throws SsmException { + String jsonData = """ + { + "schemaVersion": "2.2", + "description": "Run a simple shell command", + "mainSteps": [ + { + "action": "aws:runShellScript", + "name": "runEchoCommand", + "inputs": { + "runCommand": [ + "echo 'Hello, world!'" + ] + } + } + ] + } + """; + + CreateDocumentRequest request = CreateDocumentRequest.builder() + .content(jsonData) + .name(docName) + .documentType(DocumentType.COMMAND) + .build(); + + CompletableFuture future = getAsyncClient().createDocument(request); + future.thenAccept(response -> { + System.out.println("The status of the SSM document is " + response.documentDescription().status()); + }).exceptionally(ex -> { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof DocumentAlreadyExistsException) { + throw new CompletionException(cause); + } else if (cause instanceof SsmException) { + throw new CompletionException(cause); + } else { + throw new RuntimeException(cause); + } + }).join(); + } + // snippet-end:[ssm.java2.create_doc.main] + + // snippet-start:[ssm.java2.update_window.main] + /** + * Updates an SSM maintenance window asynchronously. + * + * @param id The ID of the maintenance window to update. + * @param name The new name for the maintenance window. + *

+ * This method initiates an asynchronous request to update an SSM maintenance window. + * If the request is successful, it prints a success message. + * If an exception occurs, it handles the error appropriately. + */ + public void updateSSMMaintenanceWindow(String id, String name) throws SsmException { + UpdateMaintenanceWindowRequest updateRequest = UpdateMaintenanceWindowRequest.builder() + .windowId(id) + .allowUnassociatedTargets(true) + .duration(24) + .enabled(true) + .name(name) + .schedule("cron(0 0 ? * MON *)") + .build(); + + CompletableFuture future = getAsyncClient().updateMaintenanceWindow(updateRequest); + future.whenComplete((response, ex) -> { + if (response != null) { + System.out.println("The SSM maintenance window was successfully updated"); + } else { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof SsmException) { + throw new CompletionException(cause); + } else { + throw new RuntimeException(cause); + } + } + }).join(); + } + // snippet-end:[ssm.java2.update_window.main] + + // snippet-start:[ssm.java2.create_window.main] + /** + * Creates an SSM maintenance window asynchronously. + * + * @param winName The name of the maintenance window. + * @return The ID of the created or existing maintenance window. + *

+ * This method initiates an asynchronous request to create an SSM maintenance window. + * If the request is successful, it prints the maintenance window ID. + * If an exception occurs, it handles the error appropriately. + */ + public String createMaintenanceWindow(String winName) throws SsmException, DocumentAlreadyExistsException { + CreateMaintenanceWindowRequest request = CreateMaintenanceWindowRequest.builder() + .name(winName) + .description("This is my maintenance window") + .allowUnassociatedTargets(true) + .duration(2) + .cutoff(1) + .schedule("cron(0 10 ? * MON-FRI *)") + .build(); + + CompletableFuture future = getAsyncClient().createMaintenanceWindow(request); + final String[] windowId = {null}; + future.whenComplete((response, ex) -> { + if (response != null) { + String maintenanceWindowId = response.windowId(); + System.out.println("The maintenance window id is " + maintenanceWindowId); + windowId[0] = maintenanceWindowId; + } else { + Throwable cause = (ex instanceof CompletionException) ? ex.getCause() : ex; + if (cause instanceof DocumentAlreadyExistsException) { + throw new CompletionException(cause); + } else if (cause instanceof SsmException) { + throw new CompletionException(cause); + } else { + throw new RuntimeException(cause); + } + } + }).join(); + + if (windowId[0] == null) { + MaintenanceWindowFilter filter = MaintenanceWindowFilter.builder() + .key("name") + .values(winName) + .build(); + + DescribeMaintenanceWindowsRequest winRequest = DescribeMaintenanceWindowsRequest.builder() + .filters(filter) + .build(); + + CompletableFuture describeFuture = getAsyncClient().describeMaintenanceWindows(winRequest); + describeFuture.whenComplete((describeResponse, describeEx) -> { + if (describeResponse != null) { + List windows = describeResponse.windowIdentities(); + if (!windows.isEmpty()) { + windowId[0] = windows.get(0).windowId(); + System.out.println("Window ID: " + windowId[0]); + } else { + System.out.println("Window not found."); + windowId[0] = ""; + } + } else { + Throwable describeCause = (describeEx instanceof CompletionException) ? describeEx.getCause() : describeEx; + throw new RuntimeException("Error describing maintenance windows: " + describeCause.getMessage(), describeCause); + } + }).join(); + } + + return windowId[0]; + } + // snippet-end:[ssm.java2.create_window.main] +} +// snippet-end:[ssm.java2.actions.main] \ No newline at end of file diff --git a/javav2/example_code/ssm/src/main/java/com/example/scenario/SSMScenario.java b/javav2/example_code/ssm/src/main/java/com/example/scenario/SSMScenario.java index 6a1ec33f079..9476ba0a45f 100644 --- a/javav2/example_code/ssm/src/main/java/com/example/scenario/SSMScenario.java +++ b/javav2/example_code/ssm/src/main/java/com/example/scenario/SSMScenario.java @@ -4,76 +4,14 @@ package com.example.scenario; // snippet-start:[ssm.java2.scenario.main] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ssm.SsmClient; -import software.amazon.awssdk.services.ssm.model.CommandInvocation; -import software.amazon.awssdk.services.ssm.model.CommandInvocationStatus; -import software.amazon.awssdk.services.ssm.model.CreateDocumentRequest; -import software.amazon.awssdk.services.ssm.model.CreateDocumentResponse; -import software.amazon.awssdk.services.ssm.model.CreateMaintenanceWindowRequest; -import software.amazon.awssdk.services.ssm.model.CreateMaintenanceWindowResponse; -import software.amazon.awssdk.services.ssm.model.CreateOpsItemRequest; -import software.amazon.awssdk.services.ssm.model.CreateOpsItemResponse; -import software.amazon.awssdk.services.ssm.model.DeleteDocumentRequest; -import software.amazon.awssdk.services.ssm.model.DeleteMaintenanceWindowRequest; -import software.amazon.awssdk.services.ssm.model.DeleteOpsItemRequest; -import software.amazon.awssdk.services.ssm.model.DescribeDocumentRequest; -import software.amazon.awssdk.services.ssm.model.DescribeDocumentResponse; -import software.amazon.awssdk.services.ssm.model.DescribeMaintenanceWindowsRequest; -import software.amazon.awssdk.services.ssm.model.DescribeMaintenanceWindowsResponse; -import software.amazon.awssdk.services.ssm.model.DescribeOpsItemsRequest; -import software.amazon.awssdk.services.ssm.model.DescribeOpsItemsResponse; import software.amazon.awssdk.services.ssm.model.DocumentAlreadyExistsException; -import software.amazon.awssdk.services.ssm.model.DocumentType; -import software.amazon.awssdk.services.ssm.model.GetCommandInvocationRequest; -import software.amazon.awssdk.services.ssm.model.GetCommandInvocationResponse; -import software.amazon.awssdk.services.ssm.model.GetOpsItemRequest; -import software.amazon.awssdk.services.ssm.model.GetOpsItemResponse; -import software.amazon.awssdk.services.ssm.model.ListCommandInvocationsRequest; -import software.amazon.awssdk.services.ssm.model.ListCommandInvocationsResponse; -import software.amazon.awssdk.services.ssm.model.MaintenanceWindowFilter; -import software.amazon.awssdk.services.ssm.model.MaintenanceWindowIdentity; -import software.amazon.awssdk.services.ssm.model.OpsItemDataValue; -import software.amazon.awssdk.services.ssm.model.OpsItemFilter; -import software.amazon.awssdk.services.ssm.model.OpsItemFilterKey; -import software.amazon.awssdk.services.ssm.model.OpsItemFilterOperator; -import software.amazon.awssdk.services.ssm.model.OpsItemStatus; -import software.amazon.awssdk.services.ssm.model.OpsItemSummary; -import software.amazon.awssdk.services.ssm.model.SendCommandRequest; -import software.amazon.awssdk.services.ssm.model.SendCommandResponse; import software.amazon.awssdk.services.ssm.model.SsmException; -import software.amazon.awssdk.services.ssm.model.UpdateMaintenanceWindowRequest; -import software.amazon.awssdk.services.ssm.model.UpdateOpsItemRequest; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Scanner; -import java.util.concurrent.TimeUnit; - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup.html - * - * - * This Java program performs these tasks: - * 1. Creates an AWS Systems Manager maintenance window with a default name or a user-provided name. - * 2. Modifies the maintenance window schedule. - * 3. Creates a Systems Manager document with a default name or a user-provided name. - * 4. Sends a command to a specified EC2 instance using the created Systems Manager document and displays the time when the command was invoked. - * 5. Creates a Systems Manager OpsItem with a predefined title, source, category, and severity. - * 6. Updates and resolves the created OpsItem. - * 7. Deletes the Systems Manager maintenance window, OpsItem, and document. - */ +import java.util.Scanner; public class SSMScenario { public static final String DASHES = new String(new char[80]).replace("\0", "-"); - public static void main(String[] args) throws InterruptedException { + + public static void main(String[] args) { String usage = """ Usage: <source> <category> <severity> @@ -86,74 +24,129 @@ public static void main(String[] args) throws InterruptedException { severity - The severity of the parameter. Severity should be a number from 1 to 4 (default is 2). """; - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } + if (args.length != 1) { + System.out.println(usage); + System.exit(1); + } Scanner scanner = new Scanner(System.in); + SSMActions actions = new SSMActions(); String documentName; String windowName; String instanceId = args[0]; - String title = "Disk Space Alert" ; - String source = "EC2" ; - String category = "Performance" ; - String severity = "2" ; - - Region region = Region.US_EAST_1; - SsmClient ssmClient = SsmClient.builder() - .region(region) - .build(); + String title = args[1]; + String source = args[2]; + String category = args[3]; + String severity = args[4]; System.out.println(DASHES); System.out.println(""" - Welcome to the AWS Systems Manager SDK Getting Started scenario. - This program demonstrates how to interact with Systems Manager using the AWS SDK for Java (v2). - Systems Manager is the operations hub for your AWS applications and resources and a secure end-to-end management solution. - The program's primary functions include creating a maintenance window, creating a document, sending a command to a document, - listing documents, listing commands, creating an OpsItem, modifying an OpsItem, and deleting Systems Manager resources. - Upon completion of the program, all AWS resources are cleaned up. - Let's get started... - Please hit Enter - """); - scanner.nextLine(); + Welcome to the AWS Systems Manager SDK Basics scenario. + This Java program demonstrates how to interact with AWS Systems Manager using the AWS SDK for Java (v2). + AWS Systems Manager is the operations hub for your AWS applications and resources and a secure end-to-end management solution. + The program's primary functionalities include creating a maintenance window, creating a document, sending a command to a document, + listing documents, listing commands, creating an OpsItem, modifying an OpsItem, and deleting AWS SSM resources. + Upon completion of the program, all AWS resources are cleaned up. + Let's get started... + + """); + waitForInputToContinue(scanner); System.out.println(DASHES); - System.out.println("Create a Systems Manager maintenance window."); + System.out.println("1. Create an SSM maintenance window."); System.out.println("Please enter the maintenance window name (default is ssm-maintenance-window):"); String win = scanner.nextLine(); windowName = win.isEmpty() ? "ssm-maintenance-window" : win; - String winId = createMaintenanceWindow(ssmClient, windowName); + String winId = null; + try { + winId = actions.createMaintenanceWindow(windowName); + waitForInputToContinue(scanner); + System.out.println("The maintenance window ID is: " + winId); + } catch (DocumentAlreadyExistsException e) { + System.err.println("The SSM maintenance window already exists. Retrieving existing window ID..."); + String existingWinId = actions.createMaintenanceWindow(windowName); + System.out.println("Existing window ID: " + existingWinId); + } catch (SsmException e) { + System.err.println("SSM error: " + e.getMessage()); + return; + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + return; + } + waitForInputToContinue(scanner); System.out.println(DASHES); - System.out.println("Modify the maintenance window by changing the schedule"); - System.out.println("Please hit Enter"); - scanner.nextLine(); - updateSSMMaintenanceWindow(ssmClient, winId, windowName); + System.out.println("2. Modify the maintenance window by changing the schedule"); + waitForInputToContinue(scanner); + try { + actions.updateSSMMaintenanceWindow(winId, windowName); + waitForInputToContinue(scanner); + System.out.println("The SSM maintenance window was successfully updated"); + } catch (SsmException e) { + System.err.println("SSM error: " + e.getMessage()); + return; + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + return; + } + waitForInputToContinue(scanner); System.out.println(DASHES); - System.out.println("Create a document that defines the actions that Systems Manager performs on your EC2 instance."); + System.out.println("3. Create an SSM document that defines the actions that Systems Manager performs on your managed nodes."); System.out.println("Please enter the document name (default is ssmdocument):"); String doc = scanner.nextLine(); documentName = doc.isEmpty() ? "ssmdocument" : doc; - createSSMDoc(ssmClient, documentName); + try { + actions.createSSMDoc(documentName); + waitForInputToContinue(scanner); + System.out.println("The SSM document was successfully created"); + } catch (DocumentAlreadyExistsException e) { + System.err.println("The SSM document already exists. Moving on"); + } catch (SsmException e) { + System.err.println("SSM error: " + e.getMessage()); + return; + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + } + waitForInputToContinue(scanner); + System.out.println(DASHES); - System.out.println("Now we are going to run a command on an EC2 instance that echoes 'Hello, world!'"); - System.out.println("Please hit Enter"); - scanner.nextLine(); - String commandId = sendSSMCommand(ssmClient, documentName, instanceId); + System.out.println("4. Now we are going to run a command on an EC2 instance"); + waitForInputToContinue(scanner); + String commandId=""; + try { + commandId = actions.sendSSMCommand(documentName, instanceId); + waitForInputToContinue(scanner); + System.out.println("The command was successfully sent. Command ID: " + commandId); + } catch (SsmException e) { + System.err.println("SSM error: " + e.getMessage()); + } catch (InterruptedException e) { + System.err.println("Thread was interrupted: " + e.getMessage()); + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + } + waitForInputToContinue(scanner); System.out.println(DASHES); - System.out.println("Lets get the time when the specific command was sent to the specific managed node"); - System.out.println("Please hit Enter"); - scanner.nextLine(); - displayCommands(ssmClient, commandId); + System.out.println("5. Lets get the time when the specific command was sent to the specific managed node"); + waitForInputToContinue(scanner); + try { + actions.displayCommands(commandId); + System.out.println("The command invocations were successfully displayed."); + } catch (SsmException e) { + System.err.println("SSM error: " + e.getMessage()); + return; + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + return; + } + waitForInputToContinue(scanner); System.out.println(DASHES); System.out.println(DASHES); System.out.println(""" - Now we will create a Systems Manager OpsItem. - An OpsItem is a feature provided by the Systems Manager service. + 6. Now we will create an SSM OpsItem. + A SSM OpsItem is a feature provided by Amazon's Systems Manager (SSM) service. It is a type of operational data item that allows you to manage and track various operational issues, events, or tasks within your AWS environment. @@ -162,397 +155,100 @@ This program demonstrates how to interact with Systems Manager using the AWS SDK or an anomaly in your infrastructure. """); - System.out.println("Please hit Enter"); - scanner.nextLine(); - String opsItemId = createSSMOpsItem(ssmClient, title, source, category, severity); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("Now we will update the OpsItem "+opsItemId); - System.out.println("Please hit Enter"); - scanner.nextLine(); - String description = "An update to "+opsItemId ; - updateOpsItem(ssmClient, opsItemId, title, description); - System.out.println("Now we will get the status of the OpsItem "+opsItemId); - System.out.println("Please hit Enter"); - scanner.nextLine(); - describeOpsItems(ssmClient, opsItemId); - System.out.println("Now we will resolve the OpsItem "+opsItemId); - System.out.println("Please hit Enter"); - scanner.nextLine(); - resolveOpsItem(ssmClient, opsItemId); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("Would you like to delete the Systems Manager resources? (y/n)"); - String delAns = scanner.nextLine().trim(); - if (delAns.equalsIgnoreCase("y")) { - System.out.println("You selected to delete the resources."); - System.out.print("Press Enter to continue..."); - scanner.nextLine(); - deleteOpsItem(ssmClient, opsItemId); - deleteMaintenanceWindow(ssmClient, winId); - deleteDoc(ssmClient, documentName); - } else { - System.out.println("The Systems Manager resources will not be deleted"); - } - System.out.println(DASHES); - - System.out.println("This concludes the Systems Manager SDK Getting Started scenario."); - System.out.println(DASHES); - } - - // snippet-start:[ssm.java2.describe_command.main] - // Displays the date and time when the specific command was invoked. - public static void displayCommands(SsmClient ssmClient, String commandId) { + waitForInputToContinue(scanner); + String opsItemId; try { - ListCommandInvocationsRequest commandInvocationsRequest = ListCommandInvocationsRequest.builder() - .commandId(commandId) - .build(); - - ListCommandInvocationsResponse response = ssmClient.listCommandInvocations(commandInvocationsRequest); - List<CommandInvocation> commandList = response.commandInvocations(); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()); - for (CommandInvocation invocation : commandList) { - System.out.println("The time of the command invocation is " + formatter.format(invocation.requestedDateTime())); - } - + opsItemId = actions.createSSMOpsItem(title, source, category, severity); + System.out.println(opsItemId + " was created"); } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); + System.err.println("SSM error: " + e.getMessage()); + return; + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + return; } - } - // snippet-end:[ssm.java2.describe_command.main] - - // snippet-start:[ssm.java2.create_ops.main] - // Create an SSM OpsItem - public static String createSSMOpsItem(SsmClient ssmClient, String title, String source, String category, String severity) { - try { - CreateOpsItemRequest opsItemRequest = CreateOpsItemRequest.builder() - .description("Created by the Systems Manager Java API") - .title(title) - .source(source) - .category(category) - .severity(severity) - .build(); - - CreateOpsItemResponse itemResponse = ssmClient.createOpsItem(opsItemRequest); - return itemResponse.opsItemId(); - - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - return ""; - } - // snippet-end:[ssm.java2.create_ops.main] - - // snippet-start:[ssm.java2.update_ops.main] - // Update the AWS SSM OpsItem. - public static void updateOpsItem(SsmClient ssmClient, String opsItemId, String title, String description) { - Map<String, OpsItemDataValue> operationalData = new HashMap<>(); - operationalData.put("key1", OpsItemDataValue.builder().value("value1").build()); - operationalData.put("key2", OpsItemDataValue.builder().value("value2").build()); + waitForInputToContinue(scanner); + System.out.println(DASHES); + System.out.println(DASHES); + System.out.println("7. Now we will update the SSM OpsItem "+opsItemId); + waitForInputToContinue(scanner); + String description = "An update to "+opsItemId ; try { - UpdateOpsItemRequest request = UpdateOpsItemRequest.builder() - .opsItemId(opsItemId) - .title(title) - .operationalData(operationalData) - .status(getOpsItem(ssmClient, opsItemId)) - .description(description) - .build(); - - ssmClient.updateOpsItem(request); - + actions.updateOpsItem(opsItemId, title, description); } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); + System.err.println("SSM error: " + e.getMessage()); + return; + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + return; } - } - // snippet-end:[ssm.java2.update_ops.main] - // snippet-start:[ssm.Java2.resolve_ops.main] - public static void resolveOpsItem(SsmClient ssmClient, String opsID) { + System.out.println(DASHES); + System.out.println("8. Now we will get the status of the SSM OpsItem "+opsItemId); + waitForInputToContinue(scanner); try { - UpdateOpsItemRequest opsItemRequest = UpdateOpsItemRequest.builder() - .opsItemId(opsID) - .status(OpsItemStatus.RESOLVED) - .build(); - - ssmClient.updateOpsItem(opsItemRequest); - + actions.describeOpsItems(opsItemId); } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); + System.err.println("SSM error: " + e.getMessage()); + return; + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + return; } - } - // snippet-end:[ssm.Java2.resolve_ops.main] - - // snippet-start:[ssm.Java2.get_ops.main] - // Gets a specific OpsItem. - private static OpsItemStatus getOpsItem(SsmClient ssmClient, String opsItemId) { - GetOpsItemRequest itemRequest = GetOpsItemRequest.builder() - .opsItemId(opsItemId) - .build(); + System.out.println(DASHES); + System.out.println("9. Now we will resolve the SSM OpsItem "+opsItemId); + waitForInputToContinue(scanner); try { - GetOpsItemResponse response = ssmClient.getOpsItem(itemRequest); - return response.opsItem().status(); - + actions.resolveOpsItem(opsItemId); } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); + System.err.println("SSM error: " + e.getMessage()); + return; + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + return; } - return null; - } - // snippet-end:[ssm.Java2.get_ops.main] - - // snippet-start:[ssm.Java2.send_command.main] - // Sends a SSM command to a managed node. - public static String sendSSMCommand(SsmClient ssmClient, String documentName, String instanceId) throws InterruptedException { - // Before we use Document to send a command - make sure it is active. - boolean isDocumentActive = false; - DescribeDocumentRequest request = DescribeDocumentRequest.builder() - .name(documentName) - .build(); - while (!isDocumentActive) { - DescribeDocumentResponse response = ssmClient.describeDocument(request); - String documentStatus = response.document().statusAsString(); - if (documentStatus.equals("Active")) { - System.out.println("The Systems Manager document is active and ready to use."); - isDocumentActive = true; - } else { - System.out.println("The Systems Manager document is not active. Status: " + documentStatus); - try { - // Add a delay to avoid making too many requests. - Thread.sleep(5000); // Wait for 5 seconds before checking again - } catch (InterruptedException e) { - e.printStackTrace(); - } + System.out.println(DASHES); + System.out.println("10. Would you like to delete the AWS Systems Manager resources? (y/n)"); + String delAns = scanner.nextLine().trim(); + if (delAns.equalsIgnoreCase("y")) { + System.out.println("You selected to delete the resources."); + waitForInputToContinue(scanner); + try { + actions.deleteMaintenanceWindow(winId); + actions.deleteDoc(documentName); + } catch (SsmException e) { + System.err.println("SSM error: " + e.getMessage()); + return; + } catch (RuntimeException e) { + System.err.println("Unexpected error: " + e.getMessage()); + return; } - } - - // Create the SendCommandRequest. - SendCommandRequest commandRequest = SendCommandRequest.builder() - .documentName(documentName) - .instanceIds(instanceId) - .build(); - - // Send the command. - SendCommandResponse commandResponse = ssmClient.sendCommand(commandRequest); - String commandId = commandResponse.command().commandId(); - System.out.println("The command Id is " + commandId); - - // Wait for the command execution to complete. - GetCommandInvocationRequest invocationRequest = GetCommandInvocationRequest.builder() - .commandId(commandId) - .instanceId(instanceId) - .build(); - - System.out.println("Wait 5 secs"); - TimeUnit.SECONDS.sleep(5); - - // Retrieve the command execution details. - GetCommandInvocationResponse commandInvocationResponse = ssmClient.getCommandInvocation(invocationRequest); - - // Check the status of the command execution. - CommandInvocationStatus status = commandInvocationResponse.status(); - if (status == CommandInvocationStatus.SUCCESS) { - System.out.println("Command execution successful."); } else { - System.out.println("Command execution failed. Status: " + status); - } - return commandId; - } - // snippet-end:[ssm.Java2.send_command.main] - - // snippet-start:[ssm.Java2.delete_doc.main] - // Deletes an AWS Systems Manager document. - public static void deleteDoc(SsmClient ssmClient, String documentName) { - try { - DeleteDocumentRequest documentRequest = DeleteDocumentRequest.builder() - .name(documentName) - .build(); - - ssmClient.deleteDocument(documentRequest); - System.out.println("The Systems Manager document was successfully deleted."); - - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[ssm.Java2.delete_doc.main] - - // snippet-start:[ssm.java2.delete_window.main] - public static void deleteMaintenanceWindow(SsmClient ssmClient, String winId) { - try { - DeleteMaintenanceWindowRequest windowRequest = DeleteMaintenanceWindowRequest.builder() - .windowId(winId) - .build(); - - ssmClient.deleteMaintenanceWindow(windowRequest); - System.out.println("The maintenance window was successfully deleted."); - - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); + System.out.println("The AWS Systems Manager resources will not be deleted"); } - } - // snippet-end:[ssm.java2.delete_window.main] - - // snippet-start:[ssm.java2.update_window.main] - // Update the maintenance window schedule - public static void updateSSMMaintenanceWindow(SsmClient ssmClient, String id, String name) { - try { - UpdateMaintenanceWindowRequest updateRequest = UpdateMaintenanceWindowRequest.builder() - .windowId(id) - .allowUnassociatedTargets(true) - .duration(24) - .enabled(true) - .name(name) - .schedule("cron(0 0 ? * MON *)") - .build(); - - ssmClient.updateMaintenanceWindow(updateRequest); - System.out.println("The Systems Manager maintenance window was successfully updated."); - - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[ssm.java2.update_window.main] - - // snippet-start:[ssm.java2.create_window.main] - public static String createMaintenanceWindow(SsmClient ssmClient, String winName) { - CreateMaintenanceWindowRequest request = CreateMaintenanceWindowRequest.builder() - .name(winName) - .description("This is my maintenance window") - .allowUnassociatedTargets(true) - .duration(2) - .cutoff(1) - .schedule("cron(0 10 ? * MON-FRI *)") - .build(); - - try { - CreateMaintenanceWindowResponse response = ssmClient.createMaintenanceWindow(request); - String maintenanceWindowId = response.windowId(); - System.out.println("The maintenance window id is " + maintenanceWindowId); - return maintenanceWindowId; - - } catch (DocumentAlreadyExistsException e) { - System.err.println("The maintenance window already exists. Moving on."); - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - - MaintenanceWindowFilter filter = MaintenanceWindowFilter.builder() - .key("name") - .values(winName) - .build(); - - DescribeMaintenanceWindowsRequest winRequest = DescribeMaintenanceWindowsRequest.builder() - .filters(filter) - .build(); - - String windowId = ""; - DescribeMaintenanceWindowsResponse response = ssmClient.describeMaintenanceWindows(winRequest); - List<MaintenanceWindowIdentity> windows = response.windowIdentities(); - if (!windows.isEmpty()) { - windowId = windows.get(0).windowId(); - System.out.println("Window ID: " + windowId); - } else { - System.out.println("Window not found."); - } - return windowId; - } - // snippet-end:[ssm.java2.create_window.main] - - // snippet-start:[ssm.java2.create_doc.main] - // Create an AWS SSM document to use in this scenario. - public static void createSSMDoc(SsmClient ssmClient, String docName) { - // Create JSON for the content - String jsonData = """ - { - "schemaVersion": "2.2", - "description": "Run a simple shell command", - "mainSteps": [ - { - "action": "aws:runShellScript", - "name": "runEchoCommand", - "inputs": { - "runCommand": [ - "echo 'Hello, world!'" - ] - } - } - ] - } - """; - - try { - CreateDocumentRequest request = CreateDocumentRequest.builder() - .content(jsonData) - .name(docName) - .documentType(DocumentType.COMMAND) - .build(); - - // Create the document. - CreateDocumentResponse response = ssmClient.createDocument(request); - System.out.println("The status of the document is " + response.documentDescription().status()); + System.out.println(DASHES); - } catch (DocumentAlreadyExistsException e) { - System.err.println("The document already exists. Moving on." ); - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } + System.out.println("This concludes the AWS Systems Manager SDK Basics scenario."); + System.out.println(DASHES); } - // snippet-end:[ssm.java2.create_doc.main] - // snippet-start:[ssm.java2.describe_ops.main] - public static void describeOpsItems(SsmClient ssmClient, String key) { - try { - OpsItemFilter filter = OpsItemFilter.builder() - .key(OpsItemFilterKey.OPS_ITEM_ID) - .values(key) - .operator(OpsItemFilterOperator.EQUAL) - .build(); + private static void waitForInputToContinue(Scanner scanner) { + while (true) { + System.out.println(""); + System.out.println("Enter 'c' followed by <ENTER> to continue:"); + String input = scanner.nextLine(); - DescribeOpsItemsRequest itemsRequest = DescribeOpsItemsRequest.builder() - .maxResults(10) - .opsItemFilters(filter) - .build(); - - DescribeOpsItemsResponse itemsResponse = ssmClient.describeOpsItems(itemsRequest); - List<OpsItemSummary> items = itemsResponse.opsItemSummaries(); - for (OpsItemSummary item : items) { - System.out.println("The item title is " + item.title() +" and the status is "+item.status().toString()); + if (input.trim().equalsIgnoreCase("c")) { + System.out.println("Continuing with the program..."); + System.out.println(""); + break; + } else { + // Handle invalid input. + System.out.println("Invalid input. Please try again."); } - - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[ssm.java2.describe_ops.main] - - public static void deleteOpsItem(SsmClient ssmClient, String opsId) { - try { - DeleteOpsItemRequest deleteOpsItemRequest = DeleteOpsItemRequest.builder() - .opsItemId(opsId) - .build(); - - ssmClient.deleteOpsItem(deleteOpsItemRequest); - System.out.println(opsId +" Opsitem was deleted"); - - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); } } } diff --git a/javav2/example_code/ssm/src/test/java/AWSSSMTest.java b/javav2/example_code/ssm/src/test/java/AWSSSMTest.java index a17b739102e..085fcbc428d 100644 --- a/javav2/example_code/ssm/src/test/java/AWSSSMTest.java +++ b/javav2/example_code/ssm/src/test/java/AWSSSMTest.java @@ -1,6 +1,8 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +import com.example.scenario.SSMActions; +import com.example.scenario.SSMScenario; import com.example.ssm.*; import com.google.gson.Gson; import org.junit.jupiter.api.*; @@ -100,25 +102,32 @@ public void GetParameter() { @Test @Tag("IntegrationTest") @Order(3) - public void InvokeScenario() throws InterruptedException { + public void InvokeScenario() { + SSMActions actions = new SSMActions(); String currentDateTime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); String maintenanceWindowName = "windowmain_" + currentDateTime; - String title = "Disk Space Alert" ; + String title = "Disk Space Alert"; String documentName = "doc_" + currentDateTime; - String maintenanceWindowId = assertDoesNotThrow(() -> com.example.scenario.SSMScenario.createMaintenanceWindow(ssmClient, maintenanceWindowName)); - assertDoesNotThrow(() -> com.example.scenario.SSMScenario.updateSSMMaintenanceWindow(ssmClient, maintenanceWindowId, maintenanceWindowName)); - assertDoesNotThrow(() -> com.example.scenario.SSMScenario.createSSMDoc(ssmClient, documentName)); - String commandId = assertDoesNotThrow(() -> com.example.scenario.SSMScenario.sendSSMCommand(ssmClient, documentName, instance)); - - assertDoesNotThrow(() -> com.example.scenario.SSMScenario.displayCommands(ssmClient, commandId)); - String opsItemId = assertDoesNotThrow(() ->com.example.scenario.SSMScenario.createSSMOpsItem(ssmClient, title, source, category, severity)); - String description = "An update to "+opsItemId ; - assertDoesNotThrow(() ->com.example.scenario.SSMScenario.updateOpsItem(ssmClient, opsItemId, title, description)); - assertDoesNotThrow(() -> com.example.scenario.SSMScenario.describeOpsItems(ssmClient, opsItemId)); - assertDoesNotThrow(() -> com.example.scenario.SSMScenario.resolveOpsItem(ssmClient, opsItemId)); - assertDoesNotThrow(() -> com.example.scenario.SSMScenario.deleteDoc(ssmClient, documentName)); - assertDoesNotThrow(() -> com.example.scenario.SSMScenario.deleteMaintenanceWindow(ssmClient, maintenanceWindowId)); - System.out.println("Test 3 passed"); + + // Assuming the createMaintenanceWindow method exists and is implemented correctly in SSMActions + String maintenanceWindowId = assertDoesNotThrow(() -> actions.createMaintenanceWindow(maintenanceWindowName)); + assertDoesNotThrow(() -> actions.updateSSMMaintenanceWindow(maintenanceWindowId, maintenanceWindowName)); + assertDoesNotThrow(() -> actions.createSSMDoc(documentName)); + + // Assuming 'instance' is defined and accessible + String commandId = assertDoesNotThrow(() -> actions.sendSSMCommand(documentName, instance)); + assertDoesNotThrow(() -> actions.displayCommands(commandId)); + + // Assuming 'source', 'category', and 'severity' are defined and accessible + String opsItemId = assertDoesNotThrow(() -> actions.createSSMOpsItem(title, source, category, severity)); + String description = "An update to " + opsItemId; + assertDoesNotThrow(() -> actions.updateOpsItem(opsItemId, title, description)); + assertDoesNotThrow(() -> actions.describeOpsItems(opsItemId)); + assertDoesNotThrow(() -> actions.resolveOpsItem(opsItemId)); + assertDoesNotThrow(() -> actions.deleteDoc(documentName)); + assertDoesNotThrow(() -> actions.deleteMaintenanceWindow(maintenanceWindowId)); + + System.out.println("Test passed"); } private static String getSecretValues() { From 75660fde47d26ccbe86276ffadbe54b13597b740 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 11:48:27 -0400 Subject: [PATCH 18/98] Bump fast-xml-parser and @aws-sdk/client-cloudformation in /applications/photo-asset-manager/cdk (#6699) --- .../photo-asset-manager/cdk/package-lock.json | 1649 +++++++++-------- .../photo-asset-manager/cdk/package.json | 2 +- 2 files changed, 883 insertions(+), 768 deletions(-) diff --git a/applications/photo-asset-manager/cdk/package-lock.json b/applications/photo-asset-manager/cdk/package-lock.json index 018bd71e053..bb25e68274e 100644 --- a/applications/photo-asset-manager/cdk/package-lock.json +++ b/applications/photo-asset-manager/cdk/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@aws-cdk/aws-cloudformation": "^1.196.0", - "@aws-sdk/client-cloudformation": "^3.360.0", + "@aws-sdk/client-cloudformation": "^3.621.0", "aws-cdk-lib": "^2.82.0", "constructs": "^10.0.0" }, @@ -972,1080 +972,1191 @@ "node": ">= 14.15.0" } }, - "node_modules/@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "dependencies": { - "@aws-crypto/util": "^3.0.0", + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dependencies": { - "tslib": "^1.11.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dependencies": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "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-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } }, "node_modules/@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "dependencies": { - "@aws-crypto/util": "^3.0.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "dependencies": { - "tslib": "^1.11.1" + "tslib": "^2.6.2" } }, - "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-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "dependencies": { "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/util/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.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.357.0.tgz", - "integrity": "sha512-nQYDJon87quPwt2JZJwUN2GFKJnvE5kWb6tZP4xb5biSGUKBqDQo06oYed7yokatCuCMouIXV462aN0fWODtOw==", + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.360.0.tgz", - "integrity": "sha512-1/IPXrwA34ea9uo31YAj4yCwKi6gbJBbVqkjF+saFxX4xKYwH7edrnf5U9k0a4Vfm+CjmkIYV1nqpOjUI0ZlsQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.360.0", - "@aws-sdk/config-resolver": "3.357.0", - "@aws-sdk/credential-provider-node": "3.360.0", - "@aws-sdk/fetch-http-handler": "3.357.0", - "@aws-sdk/hash-node": "3.357.0", - "@aws-sdk/invalid-dependency": "3.357.0", - "@aws-sdk/middleware-content-length": "3.357.0", - "@aws-sdk/middleware-endpoint": "3.357.0", - "@aws-sdk/middleware-host-header": "3.357.0", - "@aws-sdk/middleware-logger": "3.357.0", - "@aws-sdk/middleware-recursion-detection": "3.357.0", - "@aws-sdk/middleware-retry": "3.357.0", - "@aws-sdk/middleware-serde": "3.357.0", - "@aws-sdk/middleware-signing": "3.357.0", - "@aws-sdk/middleware-stack": "3.357.0", - "@aws-sdk/middleware-user-agent": "3.357.0", - "@aws-sdk/node-config-provider": "3.357.0", - "@aws-sdk/node-http-handler": "3.360.0", - "@aws-sdk/smithy-client": "3.360.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/url-parser": "3.357.0", - "@aws-sdk/util-base64": "3.310.0", - "@aws-sdk/util-body-length-browser": "3.310.0", - "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.360.0", - "@aws-sdk/util-defaults-mode-node": "3.360.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-retry": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.357.0", - "@aws-sdk/util-user-agent-node": "3.357.0", - "@aws-sdk/util-utf8": "3.310.0", - "@aws-sdk/util-waiter": "3.357.0", - "@smithy/protocol-http": "^1.0.1", - "@smithy/types": "^1.0.0", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.360.0.tgz", - "integrity": "sha512-0f6eG+6XFbDxrma5xxNGg/FJxh/OHC6h8AkfNms9Lv1gBoQSagpcTor+ax0z9F6lypOjaelX6k4DpeKAp4PZeA==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.357.0", - "@aws-sdk/fetch-http-handler": "3.357.0", - "@aws-sdk/hash-node": "3.357.0", - "@aws-sdk/invalid-dependency": "3.357.0", - "@aws-sdk/middleware-content-length": "3.357.0", - "@aws-sdk/middleware-endpoint": "3.357.0", - "@aws-sdk/middleware-host-header": "3.357.0", - "@aws-sdk/middleware-logger": "3.357.0", - "@aws-sdk/middleware-recursion-detection": "3.357.0", - "@aws-sdk/middleware-retry": "3.357.0", - "@aws-sdk/middleware-serde": "3.357.0", - "@aws-sdk/middleware-stack": "3.357.0", - "@aws-sdk/middleware-user-agent": "3.357.0", - "@aws-sdk/node-config-provider": "3.357.0", - "@aws-sdk/node-http-handler": "3.360.0", - "@aws-sdk/smithy-client": "3.360.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/url-parser": "3.357.0", - "@aws-sdk/util-base64": "3.310.0", - "@aws-sdk/util-body-length-browser": "3.310.0", - "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.360.0", - "@aws-sdk/util-defaults-mode-node": "3.360.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-retry": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.357.0", - "@aws-sdk/util-user-agent-node": "3.357.0", - "@aws-sdk/util-utf8": "3.310.0", - "@smithy/protocol-http": "^1.0.1", - "@smithy/types": "^1.0.0", - "tslib": "^2.5.0" + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.360.0.tgz", - "integrity": "sha512-czIpPt75fS3gH3vgFz76+WTaKcvPxC/DnPuqVyHdihMmP0UuwGPU9jn+Xx9RdUw7Yay3+rJRe3AYgBn4Xb220g==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.357.0", - "@aws-sdk/fetch-http-handler": "3.357.0", - "@aws-sdk/hash-node": "3.357.0", - "@aws-sdk/invalid-dependency": "3.357.0", - "@aws-sdk/middleware-content-length": "3.357.0", - "@aws-sdk/middleware-endpoint": "3.357.0", - "@aws-sdk/middleware-host-header": "3.357.0", - "@aws-sdk/middleware-logger": "3.357.0", - "@aws-sdk/middleware-recursion-detection": "3.357.0", - "@aws-sdk/middleware-retry": "3.357.0", - "@aws-sdk/middleware-serde": "3.357.0", - "@aws-sdk/middleware-stack": "3.357.0", - "@aws-sdk/middleware-user-agent": "3.357.0", - "@aws-sdk/node-config-provider": "3.357.0", - "@aws-sdk/node-http-handler": "3.360.0", - "@aws-sdk/smithy-client": "3.360.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/url-parser": "3.357.0", - "@aws-sdk/util-base64": "3.310.0", - "@aws-sdk/util-body-length-browser": "3.310.0", - "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.360.0", - "@aws-sdk/util-defaults-mode-node": "3.360.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-retry": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.357.0", - "@aws-sdk/util-user-agent-node": "3.357.0", - "@aws-sdk/util-utf8": "3.310.0", - "@smithy/protocol-http": "^1.0.1", - "@smithy/types": "^1.0.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "node_modules/@aws-sdk/client-cloudformation": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.621.0.tgz", + "integrity": "sha512-GqFpLV5l/zxLuxtOa3lOr9TCObIei+CLLYoTVrO1z+q/+wvJGV/NgV0K3iYuG8+HXnTjb0WetUKPeFyOmL6dPw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/client-sts": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.360.0.tgz", - "integrity": "sha512-ORRwSdwlSYGHfhQCXKtr1eJeTjI14l5IZRJbRDgXs46y4/GQj/rt/2Q6WGjVMfM1ZRRiEII2/vK7mU7IJcWkFw==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.357.0", - "@aws-sdk/credential-provider-node": "3.360.0", - "@aws-sdk/fetch-http-handler": "3.357.0", - "@aws-sdk/hash-node": "3.357.0", - "@aws-sdk/invalid-dependency": "3.357.0", - "@aws-sdk/middleware-content-length": "3.357.0", - "@aws-sdk/middleware-endpoint": "3.357.0", - "@aws-sdk/middleware-host-header": "3.357.0", - "@aws-sdk/middleware-logger": "3.357.0", - "@aws-sdk/middleware-recursion-detection": "3.357.0", - "@aws-sdk/middleware-retry": "3.357.0", - "@aws-sdk/middleware-sdk-sts": "3.357.0", - "@aws-sdk/middleware-serde": "3.357.0", - "@aws-sdk/middleware-signing": "3.357.0", - "@aws-sdk/middleware-stack": "3.357.0", - "@aws-sdk/middleware-user-agent": "3.357.0", - "@aws-sdk/node-config-provider": "3.357.0", - "@aws-sdk/node-http-handler": "3.360.0", - "@aws-sdk/smithy-client": "3.360.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/url-parser": "3.357.0", - "@aws-sdk/util-base64": "3.310.0", - "@aws-sdk/util-body-length-browser": "3.310.0", - "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.360.0", - "@aws-sdk/util-defaults-mode-node": "3.360.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-retry": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.357.0", - "@aws-sdk/util-user-agent-node": "3.357.0", - "@aws-sdk/util-utf8": "3.310.0", - "@smithy/protocol-http": "^1.0.1", - "@smithy/types": "^1.0.0", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "node_modules/@aws-sdk/client-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", + "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/config-resolver": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.357.0.tgz", - "integrity": "sha512-cukfg0nX7Tzx/xFyH5F4Eyb8DA1ITCGtSQv4vnEjgUop+bkzckuGLKEeBcBhyZY+aw+2C9CVwIHwIMhRm0ul5w==", - "dependencies": { - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-config-provider": "3.310.0", - "@aws-sdk/util-middleware": "3.357.0", - "tslib": "^2.5.0" + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.621.0.tgz", + "integrity": "sha512-mMjk3mFUwV2Y68POf1BQMTF+F6qxt5tPu6daEUCNGC9Cenk3h2YXQQoS4/eSyYzuBiYk3vx49VgleRvdvkg8rg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" }, - "engines": { - "node": ">=14.0.0" + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.621.0.tgz", + "integrity": "sha512-707uiuReSt+nAx6d0c21xLjLm2lxeKc7padxjv92CIrIocnQSlJPxSCM7r5zBhwiahJA6MNQwmTl2xznU67KgA==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.621.0.tgz", + "integrity": "sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==", + "dependencies": { + "@smithy/core": "^2.3.1", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.357.0.tgz", - "integrity": "sha512-UOecwfqvXgJVqhfWSZ2S44v2Nq2oceW0PQVQp0JAa9opc2rxSVIfyOhPr0yMoPmpyNcP22rgeg6ce70KULYwiA==", + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", "dependencies": { - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.357.0.tgz", - "integrity": "sha512-upw/bfsl7/WydT6gM0lBuR4Ipp4fzYm/E3ObFr0Mg5OkgVPt5ZJE+eeFTvwCpDdBSTKs4JfrK6/iEK8A23Q1jQ==", + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.621.0.tgz", + "integrity": "sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==", "dependencies": { - "@aws-sdk/node-config-provider": "3.357.0", - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/url-parser": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.360.0.tgz", - "integrity": "sha512-pWuLTq+yjSFssPGhDJ8oxvZsu7/F1KissGRt65G4qrfxHhoiMRcLF1GtFJueDQpitZ1i3mZXHVn/OSv4LPQ1Lw==", + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", + "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.357.0", - "@aws-sdk/credential-provider-imds": "3.357.0", - "@aws-sdk/credential-provider-process": "3.357.0", - "@aws-sdk/credential-provider-sso": "3.360.0", - "@aws-sdk/credential-provider-web-identity": "3.357.0", - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/shared-ini-file-loader": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.360.0.tgz", - "integrity": "sha512-j4Lu5vXkdzz/L6fGKKxnL0vcwAGHlwFHjTg9nRagMn1lvaVjtktXeM30duHTBQq9i+ejdFxpVNWYrmHGaWPNdg==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.357.0", - "@aws-sdk/credential-provider-imds": "3.357.0", - "@aws-sdk/credential-provider-ini": "3.360.0", - "@aws-sdk/credential-provider-process": "3.357.0", - "@aws-sdk/credential-provider-sso": "3.360.0", - "@aws-sdk/credential-provider-web-identity": "3.357.0", - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/shared-ini-file-loader": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", + "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-ini": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.357.0.tgz", - "integrity": "sha512-qFWWilFPsc2hR7O0KIhwcE78w+pVIK+uQR6MQMfdRyxUndgiuCorJwVjedc3yZtmnoELHF34j+m8whTBXv9E7Q==", + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", "dependencies": { - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/shared-ini-file-loader": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.360.0.tgz", - "integrity": "sha512-kW0FR8AbMQrJxADxIqYSjHVN2RXwHmA5DzogYm1AjOkYRMN9JHDVOMQP2K2M6FCynZqTYsKW5lzjPOjS0fu8Dw==", + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", + "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", "dependencies": { - "@aws-sdk/client-sso": "3.360.0", - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/shared-ini-file-loader": "3.357.0", - "@aws-sdk/token-providers": "3.360.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/client-sso": "3.621.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.357.0.tgz", - "integrity": "sha512-0KRRAFrXy5HJe2vqnCWCoCS+fQw7IoIj3KQsuURJMW4F+ifisxCgEsh3brJ2LQlN4ElWTRJhlrDHNZ/pd61D4w==", + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", "dependencies": { - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" } }, - "node_modules/@aws-sdk/eventstream-codec": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.357.0.tgz", - "integrity": "sha512-bqenTHG6GH6aCk/Il+ooWXVVAZuc8lOgVEy9bE2hI49oVqT8zSuXxQB+w1WWyZoAOPcelsjayB1wfPub8VDBxQ==", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-hex-encoding": "3.310.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.357.0.tgz", - "integrity": "sha512-5sPloTO8y8fAnS/6/Sfp/aVoL9zuhzkLdWBORNzMazdynVNEzWKWCPZ27RQpgkaCDHiXjqUY4kfuFXAGkvFfDQ==", + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", "dependencies": { - "@aws-sdk/protocol-http": "3.357.0", - "@aws-sdk/querystring-builder": "3.357.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-base64": "3.310.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/hash-node": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.357.0.tgz", - "integrity": "sha512-fq3LS9AxHKb7dTZkm6iM1TrGk6XOTZz96iEZPME1+vjiSEXGWuebHt87q92n+KozVGRypn9MId3lHOPBBjygNQ==", + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-buffer-from": "3.310.0", - "@aws-sdk/util-utf8": "3.310.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.357.0.tgz", - "integrity": "sha512-HnCYZczf0VdyxMVMMxmA3QJAyyPSFbcMtZzgKbxVTWTG7GKpQe0psWZu/7O2Nk31mKg6vEUdiP1FylqLBsgMOA==", + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", + "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", - "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", "dependencies": { - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.357.0.tgz", - "integrity": "sha512-zQOFEyzOXAgN4M54tYNWGxKxnyzY0WwYDTFzh9riJRmxN1hTEKHUKmze4nILIf5rkQmOG4kTf1qmfazjkvZAhw==", + "node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", "dependencies": { - "@aws-sdk/protocol-http": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" } }, - "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.357.0.tgz", - "integrity": "sha512-ScJi0SL8X/Lyi0Fp5blg0QN/Z6PoRwV/ZJXd8dQkXSznkbSvJHfqPP0xk/w3GcQ1TKsu5YEPfeYy8ejcq+7Pgg==", + "node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", "dependencies": { - "@aws-sdk/middleware-serde": "3.357.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/url-parser": "3.357.0", - "@aws-sdk/util-middleware": "3.357.0", - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.357.0.tgz", - "integrity": "sha512-HuGLcP7JP1qJ5wGT9GSlEknDaTSnOzHY4T6IPFuvFjAy3PvY5siQNm6+VRqdVS+n6/kzpL3JP5sAVM3aoxHT6Q==", + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", "dependencies": { - "@aws-sdk/protocol-http": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.357.0.tgz", - "integrity": "sha512-dncT3tr+lZ9+duZo52rASgO6AKVwRcsc2/T93gmaYVrJqI6WWAwQ7yML5s72l9ZjQ5LZ+4jjrgtlufavAS0eCg==", + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", + "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.357.0.tgz", - "integrity": "sha512-AXC54IeDS3jC1dbbkYHML4STvBPcKZ4IJTWdjEK1RCOgqXd0Ze1cE1e21wyj1tM6prF03zLyvpBd+3TS++nqfA==", + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", "dependencies": { - "@aws-sdk/protocol-http": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/middleware-retry": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.357.0.tgz", - "integrity": "sha512-ZCbXCYv3nglQqwREYxxpclrnR9MYPAnHlLcC8e9PbApqxGnaZdhoywxoqbgqT3hf/RM7kput4vEHDl1fyymcRQ==", + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", "dependencies": { - "@aws-sdk/protocol-http": "3.357.0", - "@aws-sdk/service-error-classification": "3.357.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-middleware": "3.357.0", - "@aws-sdk/util-retry": "3.357.0", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.357.0.tgz", - "integrity": "sha512-Ng2VjLrPiL02QOcs1qs9jG2boO4Gn+v3VIbOJLG4zXcfbSq55iIWtlmr2ljfw9vP5aLhWtcODfmKHS5Bp+019Q==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/middleware-serde": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.357.0.tgz", - "integrity": "sha512-bGI4kYuuEsFjlANbyJLyy4AovETnyf/SukgLOG7Qjbua+ZGuzvRhMsk21mBKKGrnsTO4PmtieJo6xClThGAN8g==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" - }, + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">=6.0.0" } }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.357.0.tgz", - "integrity": "sha512-yB9ewEqI6Fw1OrmKFrUypbCqN5ijk06UGPochybamMuPxxkwMT3bnrm7eezsCA+TZbJyKhpffpyobwuv+xGNrA==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@smithy/abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", "dependencies": { - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/protocol-http": "3.357.0", - "@aws-sdk/signature-v4": "3.357.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-middleware": "3.357.0", - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-stack": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.357.0.tgz", - "integrity": "sha512-nNV+jfwGwmbOGZujAY/U8AW3EbVlxa9DJDLz3TPp/39o6Vu5KEzHJyDDNreo2k9V/TMvV+nOzHafufgPdagv7w==", + "node_modules/@smithy/config-resolver": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", + "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", "dependencies": { - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.357.0.tgz", - "integrity": "sha512-M/CsAXjGblZS4rEbMb0Dn9IXbfq4EjVaTHBfvuILU/dKRppWvjnm2lRtqCZ+LIT3ATbAjA3/dY7dWsjxQWwijA==", + "node_modules/@smithy/core": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.1.tgz", + "integrity": "sha512-BC7VMXx/1BCmRPCVzzn4HGWAtsrb7/0758EtwOGFJQrlSwJBEjCcDLNZLFoL/68JexYa2s+KmgL/UfmXdG6v1w==", "dependencies": { - "@aws-sdk/protocol-http": "3.357.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "tslib": "^2.5.0" + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/node-config-provider": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.357.0.tgz", - "integrity": "sha512-kwBIzKCaW3UWqLdELhy7TcN8itNMOjbzga530nalFILMvn2IxrkdKQhNgxGBXy6QK6kCOtH6OmcrG3/oZkLwig==", + "node_modules/@smithy/credential-provider-imds": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", + "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", "dependencies": { - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/shared-ini-file-loader": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/node-http-handler": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.360.0.tgz", - "integrity": "sha512-oMsXdMmNwHpUbebETO44bq0N4SocEMGfPjYNUTRs8md7ita5fuFd2qFuvf+ZRt6iVcGWluIqmF8DidD+b7d+TA==", + "node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", + "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", "dependencies": { - "@aws-sdk/abort-controller": "3.357.0", - "@aws-sdk/protocol-http": "3.357.0", - "@aws-sdk/querystring-builder": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/property-provider": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.357.0.tgz", - "integrity": "sha512-im4W0u8WaYxG7J7ko4Xl3OEzK3Mrm1Rz6/txTGe6hTIHlyUISu1ekOQJXK6XYPqNMn8v1G3BiQREoRXUEJFbHg==", + "node_modules/@smithy/hash-node": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", + "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/protocol-http": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.357.0.tgz", - "integrity": "sha512-w1JHiI50VEea7duDeAspUiKJmmdIQblvRyjVMOqWA6FIQAyDVuEiPX7/MdQr0ScxhtRQxHbP0I4MFyl7ctRQvA==", + "node_modules/@smithy/invalid-dependency": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", + "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/querystring-builder": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.357.0.tgz", - "integrity": "sha512-aQcicqB6Y2cNaXPPwunz612a01SMiQQPsdz632F/3Lzn0ua82BJKobHOtaiTUlmVJ5Q4/EAeNfwZgL7tTUNtDQ==", + "node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-uri-escape": "3.310.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/querystring-parser": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.357.0.tgz", - "integrity": "sha512-Svvq+atRNP9s2VxiklcUNgCzmt3T5kfs7X2C+yjmxHvOQTPjLNaNGbfC/vhjOK7aoXw0h+lBac48r5ymx1PbQA==", + "node_modules/@smithy/middleware-content-length": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", + "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/service-error-classification": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.357.0.tgz", - "integrity": "sha512-VuXeL4g5vKO9HjgCZlxmH8Uv1FcqUSjmbPpQkbNtYIDck6u0qzM0rG+n0/1EjyQbPSr3MhW/pkWs5nx2Nljlyg==", + "node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", + "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "dependencies": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.357.0.tgz", - "integrity": "sha512-ceyqM4XxQe0Plb/oQAD2t1UOV2Iy4PFe1oAGM8dfJzYrRKu7zvMwru7/WaB3NYq+/mIY6RU+jjhRmjQ3GySVqA==", + "node_modules/@smithy/middleware-retry": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.13.tgz", + "integrity": "sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/signature-v4": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.357.0.tgz", - "integrity": "sha512-itt4/Jh9FqnzK30qIjXFBvM4J7zN4S/AAqsRMnaX7U4f/MV+1YxQHmzimpdMnsCXXs2jqFqKVRu6DewxJ3nbxg==", + "node_modules/@smithy/middleware-serde": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", "dependencies": { - "@aws-sdk/eventstream-codec": "3.357.0", - "@aws-sdk/is-array-buffer": "3.310.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-hex-encoding": "3.310.0", - "@aws-sdk/util-middleware": "3.357.0", - "@aws-sdk/util-uri-escape": "3.310.0", - "@aws-sdk/util-utf8": "3.310.0", - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/smithy-client": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.360.0.tgz", - "integrity": "sha512-R7wbT2SkgWNEAxMekOTNcPcvBszabW2+qHjrcelbbVJNjx/2yK+MbpZI4WRSncByQMeeoW+aSUP+JgsbpiOWfw==", + "node_modules/@smithy/middleware-stack": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", "dependencies": { - "@aws-sdk/middleware-stack": "3.357.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-stream": "3.360.0", - "@smithy/types": "^1.0.0", - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.360.0.tgz", - "integrity": "sha512-gtnCmn2NL7uSwadqQPeU74Wo7Wf1NMJtui+KSWPYpc3joRZqIYj0kL5w0IT2S9tPQwCFerWVfhkvRkSGJ4nZ/g==", + "node_modules/@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.360.0", - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/shared-ini-file-loader": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@smithy/node-http-handler": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", + "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", "dependencies": { - "tslib": "^2.5.0" + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/url-parser": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.357.0.tgz", - "integrity": "sha512-fAaU6cFsaAba01lCRsRJiYR/LfXvX2wudyEyutBVglE4dWSoSeu3QJNxImIzTBULfbiFhz59++NQ1JUVx88IVg==", + "node_modules/@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", "dependencies": { - "@aws-sdk/querystring-parser": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-base64": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz", - "integrity": "sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==", + "node_modules/@smithy/protocol-http": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", + "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", "dependencies": { - "@aws-sdk/util-buffer-from": "3.310.0", - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-body-length-browser": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz", - "integrity": "sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==", + "node_modules/@smithy/querystring-builder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-body-length-node": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz", - "integrity": "sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==", + "node_modules/@smithy/querystring-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz", - "integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==", + "node_modules/@smithy/service-error-classification": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", + "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", "dependencies": { - "@aws-sdk/is-array-buffer": "3.310.0", - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-config-provider": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz", - "integrity": "sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==", + "node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.360.0.tgz", - "integrity": "sha512-/GR8VlK9xo1Q5WbVYuNaZ+XfoCFdWNb4z4mpoEgvEgBH4R0GjqiAqLftUA8Ykq1tJuDAKPYVzUNzK8DC0pt7/g==", + "node_modules/@smithy/signature-v4": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", + "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", "dependencies": { - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/types": "3.357.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.360.0.tgz", - "integrity": "sha512-gR3Ctqpyl7SgStDJ1Jlq6qQDuw/rS9AgbAXx+s3wsmm3fm8lHKkXkDPYVvNDqd6dVXRO6q8MRx00lwkGI4qrpQ==", + "node_modules/@smithy/smithy-client": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", + "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", "dependencies": { - "@aws-sdk/config-resolver": "3.357.0", - "@aws-sdk/credential-provider-imds": "3.357.0", - "@aws-sdk/node-config-provider": "3.357.0", - "@aws-sdk/property-provider": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.357.0.tgz", - "integrity": "sha512-XHKyS5JClT9su9hDif715jpZiWHQF9gKZXER8tW0gOizU3R9cyWc9EsJ2BRhFNhi7nt/JF/CLUEc5qDx3ETbUw==", + "node_modules/@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz", - "integrity": "sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==", + "node_modules/@smithy/url-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", - "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", "dependencies": { - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-middleware": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.357.0.tgz", - "integrity": "sha512-pV1krjZs7BdahZBfsCJMatE8kcor7GFsBOWrQgQDm9T0We5b5xPpOO2vxAD0RytBpY8Ky2ELs/+qXMv7l5fWIA==", + "node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/util-retry": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.357.0.tgz", - "integrity": "sha512-SUqYJE9msbuOVq+vnUy+t0LH7XuYNFz66dSF8q6tedsbJK4j8tgya0I1Ct3m06ynGrXDJMaj39I7AXCyW9bjtw==", + "node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", "dependencies": { - "@aws-sdk/service-error-classification": "3.357.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-stream": { - "version": "3.360.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream/-/util-stream-3.360.0.tgz", - "integrity": "sha512-t3naBfNesXwLis29pzSfLx2ifCn2180GiPjRaIsQP14IiVCBOeT1xaU6Dpyk7WeR/jW4cu7wGl+kbeyfNF6QmQ==", + "node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "dependencies": { - "@aws-sdk/fetch-http-handler": "3.357.0", - "@aws-sdk/node-http-handler": "3.360.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-base64": "3.310.0", - "@aws-sdk/util-buffer-from": "3.310.0", - "@aws-sdk/util-hex-encoding": "3.310.0", - "@aws-sdk/util-utf8": "3.310.0", - "tslib": "^2.5.0" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-uri-escape": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz", - "integrity": "sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==", + "node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.357.0.tgz", - "integrity": "sha512-JHaWlNIUkPNvXkqeDOrqFzAlAgdwZK5mZw7FQnCRvf8tdSogpGZSkuyb9Z6rLD9gC40Srbc2nepO1cFpeMsDkA==", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.13.tgz", + "integrity": "sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==", "dependencies": { - "@aws-sdk/types": "3.357.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", "bowser": "^2.11.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.357.0.tgz", - "integrity": "sha512-RdpQoaJWQvcS99TVgSbT451iGrlH4qpWUWFA9U1IRhxOSsmC1hz8ME7xc8nci9SREx/ZlfT3ai6LpoAzAtIEMA==", + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.13.tgz", + "integrity": "sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==", "dependencies": { - "@aws-sdk/node-config-provider": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@smithy/config-resolver": "^3.0.5", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">= 10.0.0" } }, - "node_modules/@aws-sdk/util-utf8": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", - "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", + "node_modules/@smithy/util-endpoints": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", + "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", "dependencies": { - "@aws-sdk/util-buffer-from": "3.310.0", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-waiter": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.357.0.tgz", - "integrity": "sha512-jQQGA5G8bm0JP5C4U85VzMpkFHdeeT7fOSUncXLG9Sh8Ambzi4XTud8m5/dA7aNJkvPwZeIF9QdgWCOzpkp1xA==", + "node_modules/@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", "dependencies": { - "@aws-sdk/abort-controller": "3.357.0", - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "node_modules/@smithy/util-retry": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", + "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@smithy/service-error-classification": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=12" + "node": ">=16.0.0" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "node_modules/@smithy/util-stream": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", + "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, + "node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@smithy/protocol-http": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.1.0.tgz", - "integrity": "sha512-H5y/kZOqfJSqRkwtcAoVbqONmhdXwSgYNJ1Glk5Ry8qlhVVy5qUzD9EklaCH8/XLnoCsLO/F/Giee8MIvaBRkg==", + "node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "dependencies": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.1.0.tgz", - "integrity": "sha512-KzmvisMmuwD2jZXuC9e65JrgsZM97y5NpDU7g347oB+Q+xQLU6hQZ5zFNNbEfwwOJHoOvEVTna+dk1h/lW7alw==", + "node_modules/@smithy/util-waiter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", + "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", "dependencies": { - "tslib": "^2.5.0" + "@smithy/abort-controller": "^3.1.1", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@tsconfig/node10": { @@ -2489,17 +2600,17 @@ } }, "node_modules/fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" } ], "dependencies": { @@ -2578,9 +2689,9 @@ } }, "node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/typescript": { "version": "4.9.5", @@ -2596,9 +2707,13 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } diff --git a/applications/photo-asset-manager/cdk/package.json b/applications/photo-asset-manager/cdk/package.json index a9f4cf8999b..c0903aacfd2 100644 --- a/applications/photo-asset-manager/cdk/package.json +++ b/applications/photo-asset-manager/cdk/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "@aws-cdk/aws-cloudformation": "^1.196.0", - "@aws-sdk/client-cloudformation": "^3.360.0", + "@aws-sdk/client-cloudformation": "^3.621.0", "aws-cdk-lib": "^2.82.0", "constructs": "^10.0.0" } From 18857f51fb1f7fa1f3b56995d49f5fd74dbbeb34 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 12:18:13 -0400 Subject: [PATCH 19/98] Bump fast-xml-parser, @aws-sdk/client-bedrock and @aws-sdk/client-bedrock-runtime in /.tools/ailly (#6700) --- .tools/ailly/package-lock.json | 1531 ++++++++++++++++---------------- 1 file changed, 781 insertions(+), 750 deletions(-) diff --git a/.tools/ailly/package-lock.json b/.tools/ailly/package-lock.json index 261d996f4a2..ce7ae4c9b12 100644 --- a/.tools/ailly/package-lock.json +++ b/.tools/ailly/package-lock.json @@ -43,640 +43,687 @@ } }, "node_modules/@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", "dependencies": { - "@aws-crypto/util": "^3.0.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "dependencies": { - "tslib": "^1.11.1" + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "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/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dependencies": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "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-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } }, "node_modules/@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "dependencies": { - "@aws-crypto/util": "^3.0.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "dependencies": { - "tslib": "^1.11.1" + "tslib": "^2.6.2" } }, - "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-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "dependencies": { "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/util/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/client-bedrock": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock/-/client-bedrock-3.535.0.tgz", - "integrity": "sha512-5j8nBp9hLd0kwjCQ8TXJ5ijHdKPNJRnrfl3XsGCTrKSBwKYd/wEwYq/nLQVJyqX19GnmrtvBQGL2MBgmWuBBmA==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.535.0", - "@aws-sdk/core": "3.535.0", - "@aws-sdk/credential-provider-node": "3.535.0", - "@aws-sdk/middleware-host-header": "3.535.0", - "@aws-sdk/middleware-logger": "3.535.0", - "@aws-sdk/middleware-recursion-detection": "3.535.0", - "@aws-sdk/middleware-user-agent": "3.535.0", - "@aws-sdk/region-config-resolver": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.535.0", - "@aws-sdk/util-user-agent-browser": "3.535.0", - "@aws-sdk/util-user-agent-node": "3.535.0", - "@smithy/config-resolver": "^2.2.0", - "@smithy/core": "^1.4.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/hash-node": "^2.2.0", - "@smithy/invalid-dependency": "^2.2.0", - "@smithy/middleware-content-length": "^2.2.0", - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-retry": "^2.2.0", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-body-length-browser": "^2.2.0", - "@smithy/util-body-length-node": "^2.3.0", - "@smithy/util-defaults-mode-browser": "^2.2.0", - "@smithy/util-defaults-mode-node": "^2.3.0", - "@smithy/util-endpoints": "^1.2.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dependencies": { + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-bedrock-runtime": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.535.0.tgz", - "integrity": "sha512-Yq8rPB2SQol3TQa9kmjIuD9Nd5/ikCqozoV6wHvO+VViJzm+lPglZVsp7vwIMdE1ey/JokOwApowf7oAI98JwQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.535.0", - "@aws-sdk/core": "3.535.0", - "@aws-sdk/credential-provider-node": "3.535.0", - "@aws-sdk/middleware-host-header": "3.535.0", - "@aws-sdk/middleware-logger": "3.535.0", - "@aws-sdk/middleware-recursion-detection": "3.535.0", - "@aws-sdk/middleware-user-agent": "3.535.0", - "@aws-sdk/region-config-resolver": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.535.0", - "@aws-sdk/util-user-agent-browser": "3.535.0", - "@aws-sdk/util-user-agent-node": "3.535.0", - "@smithy/config-resolver": "^2.2.0", - "@smithy/core": "^1.4.0", - "@smithy/eventstream-serde-browser": "^2.2.0", - "@smithy/eventstream-serde-config-resolver": "^2.2.0", - "@smithy/eventstream-serde-node": "^2.2.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/hash-node": "^2.2.0", - "@smithy/invalid-dependency": "^2.2.0", - "@smithy/middleware-content-length": "^2.2.0", - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-retry": "^2.2.0", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-body-length-browser": "^2.2.0", - "@smithy/util-body-length-node": "^2.3.0", - "@smithy/util-defaults-mode-browser": "^2.2.0", - "@smithy/util-defaults-mode-node": "^2.3.0", - "@smithy/util-endpoints": "^1.2.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", - "@smithy/util-stream": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.535.0.tgz", - "integrity": "sha512-h9eQRdFnjDRVBnPJIKXuX7D+isSAioIfZPC4PQwsL5BscTRlk4c90DX0R0uk64YUtp7LZu8TNtrosFZ/1HtTrQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.535.0", - "@aws-sdk/middleware-host-header": "3.535.0", - "@aws-sdk/middleware-logger": "3.535.0", - "@aws-sdk/middleware-recursion-detection": "3.535.0", - "@aws-sdk/middleware-user-agent": "3.535.0", - "@aws-sdk/region-config-resolver": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.535.0", - "@aws-sdk/util-user-agent-browser": "3.535.0", - "@aws-sdk/util-user-agent-node": "3.535.0", - "@smithy/config-resolver": "^2.2.0", - "@smithy/core": "^1.4.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/hash-node": "^2.2.0", - "@smithy/invalid-dependency": "^2.2.0", - "@smithy/middleware-content-length": "^2.2.0", - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-retry": "^2.2.0", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-body-length-browser": "^2.2.0", - "@smithy/util-body-length-node": "^2.3.0", - "@smithy/util-defaults-mode-browser": "^2.2.0", - "@smithy/util-defaults-mode-node": "^2.3.0", - "@smithy/util-endpoints": "^1.2.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.535.0.tgz", - "integrity": "sha512-M2cG4EQXDpAJQyq33ORIr6abmdX9p9zX0ssVy8XwFNB7lrgoIKxuVoGL+fX+XMgecl24x7ELz6b4QlILOevbCw==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.535.0", - "@aws-sdk/core": "3.535.0", - "@aws-sdk/middleware-host-header": "3.535.0", - "@aws-sdk/middleware-logger": "3.535.0", - "@aws-sdk/middleware-recursion-detection": "3.535.0", - "@aws-sdk/middleware-user-agent": "3.535.0", - "@aws-sdk/region-config-resolver": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.535.0", - "@aws-sdk/util-user-agent-browser": "3.535.0", - "@aws-sdk/util-user-agent-node": "3.535.0", - "@smithy/config-resolver": "^2.2.0", - "@smithy/core": "^1.4.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/hash-node": "^2.2.0", - "@smithy/invalid-dependency": "^2.2.0", - "@smithy/middleware-content-length": "^2.2.0", - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-retry": "^2.2.0", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-body-length-browser": "^2.2.0", - "@smithy/util-body-length-node": "^2.3.0", - "@smithy/util-defaults-mode-browser": "^2.2.0", - "@smithy/util-defaults-mode-node": "^2.3.0", - "@smithy/util-endpoints": "^1.2.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", - "tslib": "^2.6.2" + "node_modules/@aws-sdk/client-bedrock": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock/-/client-bedrock-3.621.0.tgz", + "integrity": "sha512-ZMKydLr8dDLMU7Wi+ZK8y0ZF4ghS1DwrLP1Ih+GKcHED0K8Wo6eRWFCfhO75wnSLUrYTavNZo7VatF+g956TIg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/client-sts": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-bedrock-runtime": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.621.0.tgz", + "integrity": "sha512-08QQhvnY3WQvIKX3rdzPcOwq13rD16jL63U2itpciNPVAlsDdw/4cUnbVSW+h9V/Lhb9LmlmbbbYdI3ZvGW+7A==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/client-sts": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/eventstream-serde-browser": "^3.0.5", + "@smithy/eventstream-serde-config-resolver": "^3.0.3", + "@smithy/eventstream-serde-node": "^3.0.4", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-stream": "^3.1.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", + "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.621.0.tgz", + "integrity": "sha512-mMjk3mFUwV2Y68POf1BQMTF+F6qxt5tPu6daEUCNGC9Cenk3h2YXQQoS4/eSyYzuBiYk3vx49VgleRvdvkg8rg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.535.0" + "@aws-sdk/client-sts": "^3.621.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.535.0.tgz", - "integrity": "sha512-ii9OOm3TJwP3JmO1IVJXKWIShVKPl0VtdlgROc/SkDglO/kuAw9eDdlROgc+qbFl+gm6bBTguOVTUXt3tS3flw==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.535.0", - "@aws-sdk/middleware-host-header": "3.535.0", - "@aws-sdk/middleware-logger": "3.535.0", - "@aws-sdk/middleware-recursion-detection": "3.535.0", - "@aws-sdk/middleware-user-agent": "3.535.0", - "@aws-sdk/region-config-resolver": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.535.0", - "@aws-sdk/util-user-agent-browser": "3.535.0", - "@aws-sdk/util-user-agent-node": "3.535.0", - "@smithy/config-resolver": "^2.2.0", - "@smithy/core": "^1.4.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/hash-node": "^2.2.0", - "@smithy/invalid-dependency": "^2.2.0", - "@smithy/middleware-content-length": "^2.2.0", - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-retry": "^2.2.0", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-body-length-browser": "^2.2.0", - "@smithy/util-body-length-node": "^2.3.0", - "@smithy/util-defaults-mode-browser": "^2.2.0", - "@smithy/util-defaults-mode-node": "^2.3.0", - "@smithy/util-endpoints": "^1.2.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.535.0" + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.621.0.tgz", + "integrity": "sha512-707uiuReSt+nAx6d0c21xLjLm2lxeKc7padxjv92CIrIocnQSlJPxSCM7r5zBhwiahJA6MNQwmTl2xznU67KgA==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/core": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.535.0.tgz", - "integrity": "sha512-+Yusa9HziuaEDta1UaLEtMAtmgvxdxhPn7jgfRY6PplqAqgsfa5FR83sxy5qr2q7xjQTwHtV4MjQVuOjG9JsLw==", + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.621.0.tgz", + "integrity": "sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==", "dependencies": { - "@smithy/core": "^1.4.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/signature-v4": "^2.2.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "fast-xml-parser": "4.2.5", + "@smithy/core": "^2.3.1", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.535.0.tgz", - "integrity": "sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==", + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz", - "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==", + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.621.0.tgz", + "integrity": "sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/util-stream": "^2.2.0", + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.535.0.tgz", - "integrity": "sha512-bm3XOYlyCjtAb8eeHXLrxqRxYVRw2Iqv9IufdJb4gM13TbNSYniUT1WKaHxGIZ5p+FuNlXVhvk1OpHFM13+gXA==", + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", + "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", "dependencies": { - "@aws-sdk/client-sts": "3.535.0", - "@aws-sdk/credential-provider-env": "3.535.0", - "@aws-sdk/credential-provider-process": "3.535.0", - "@aws-sdk/credential-provider-sso": "3.535.0", - "@aws-sdk/credential-provider-web-identity": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@smithy/credential-provider-imds": "^2.3.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.535.0.tgz", - "integrity": "sha512-6JXp/EuL6euUkH5k4d+lQFF6gBwukrcCOWfNHCmq14mNJf/cqT3HAX1VMtWFRSK20am0IxfYQGccb0/nZykdKg==", + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", + "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.535.0", - "@aws-sdk/credential-provider-http": "3.535.0", - "@aws-sdk/credential-provider-ini": "3.535.0", - "@aws-sdk/credential-provider-process": "3.535.0", - "@aws-sdk/credential-provider-sso": "3.535.0", - "@aws-sdk/credential-provider-web-identity": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@smithy/credential-provider-imds": "^2.3.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-ini": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.535.0.tgz", - "integrity": "sha512-9O1OaprGCnlb/kYl8RwmH7Mlg8JREZctB8r9sa1KhSsWFq/SWO0AuJTyowxD7zL5PkeS4eTvzFFHWCa3OO5epA==", + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.535.0.tgz", - "integrity": "sha512-2Dw0YIr8ETdFpq65CC4zK8ZIEbX78rXoNRZXUGNQW3oSKfL0tj8O8ErY6kg1IdEnYbGnEQ35q6luZ5GGNKLgDg==", + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", + "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", "dependencies": { - "@aws-sdk/client-sso": "3.535.0", - "@aws-sdk/token-providers": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/client-sso": "3.621.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.535.0.tgz", - "integrity": "sha512-t2/JWrKY0H66A7JW7CqX06/DG2YkJddikt5ymdQvx/Q7dRMJ3d+o/vgjoKr7RvEx/pNruCeyM1599HCvwrVMrg==", + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", "dependencies": { - "@aws-sdk/client-sts": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.535.0.tgz", - "integrity": "sha512-0h6TWjBWtDaYwHMQJI9ulafeS4lLaw1vIxRjbpH0svFRt6Eve+Sy8NlVhECfTU2hNz/fLubvrUxsXoThaLBIew==", + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.535.0.tgz", - "integrity": "sha512-huNHpONOrEDrdRTvSQr1cJiRMNf0S52NDXtaPzdxiubTkP+vni2MohmZANMOai/qT0olmEVX01LhZ0ZAOgmg6A==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.535.0.tgz", - "integrity": "sha512-am2qgGs+gwqmR4wHLWpzlZ8PWhm4ktj5bYSgDrsOfjhdBlWNxvPoID9/pDAz5RWL48+oH7I6SQzMqxXsFDikrw==", + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.535.0.tgz", - "integrity": "sha512-Uvb2WJ+zdHdCOtsWVPI/M0BcfNrjOYsicDZWtaljucRJKLclY5gNWwD+RwIC+8b5TvfnVOlH+N5jhvpi5Impog==", + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", + "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.535.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.535.0.tgz", - "integrity": "sha512-IXOznDiaItBjsQy4Fil0kzX/J3HxIOknEphqHbOfUf+LpA5ugcsxuQQONrbEQusCBnfJyymrldBvBhFmtlU9Wg==", + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/types": "^2.12.0", - "@smithy/util-config-provider": "^2.3.0", - "@smithy/util-middleware": "^2.2.0", + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.535.0.tgz", - "integrity": "sha512-4g+l/B9h1H/SiDtFRosW3pMwc+3PTXljZit+5NUBcET2XqcdUyHmgj3lBdu+CJ9CHdIMggRalYMAFXnRFe3Psg==", + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.535.0.tgz", - "integrity": "sha512-aY4MYfduNj+sRR37U7XxYR8wemfbKP6lx00ze2M2uubn7mZotuVrWYAafbMSXrdEMSToE5JDhr28vArSOoLcSg==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.535.0.tgz", - "integrity": "sha512-c8TlaQsiPchOOmTTR6qvHCO2O7L7NJwlKWAoQJ2GqWDZuC5es/fyuF2rp1h+ZRrUVraUomS0YdGkAmaDC7hJQg==", + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/types": "^2.12.0", - "@smithy/util-endpoints": "^1.2.0", + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.535.0.tgz", - "integrity": "sha512-PHJ3SL6d2jpcgbqdgiPxkXpu7Drc2PYViwxSIqvvMKhDwzSB1W3mMvtpzwKM4IE7zLFodZo0GKjJ9AsoXndXhA==", + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", + "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.535.0.tgz", - "integrity": "sha512-RWMcF/xV5n+nhaA/Ff5P3yNP3Kur/I+VNZngog4TEs92oB/nwOdAg/2JL8bVAhUbMrjTjpwm7PItziYFQoqyig==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.535.0.tgz", - "integrity": "sha512-dRek0zUuIT25wOWJlsRm97nTkUlh1NDcLsQZIN2Y8KxhwoXXWtJs5vaDPT+qAg+OpcNj80i1zLR/CirqlFg/TQ==", + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -687,14 +734,6 @@ } } }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "dependencies": { - "tslib": "^2.3.1" - } - }, "node_modules/@davidsouther/jiffies": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/@davidsouther/jiffies/-/jiffies-2.1.9.tgz", @@ -713,473 +752,465 @@ "integrity": "sha512-941kjlHjfI97l6NuH/AwuXV4mHuVnRooDcHNSlzi98hz+4ug3wT4gJcWjSwSZHqeGAEn90lC9sFD+8a9d5Jvxg==" }, "node_modules/@smithy/abort-controller": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz", - "integrity": "sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/config-resolver": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.2.0.tgz", - "integrity": "sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", + "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", "dependencies": { - "@smithy/node-config-provider": "^2.3.0", - "@smithy/types": "^2.12.0", - "@smithy/util-config-provider": "^2.3.0", - "@smithy/util-middleware": "^2.2.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/core": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.4.0.tgz", - "integrity": "sha512-uu9ZDI95Uij4qk+L6kyFjdk11zqBkcJ3Lv0sc6jZrqHvLyr0+oeekD3CnqMafBn/5PRI6uv6ulW3kNLRBUHeVw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.1.tgz", + "integrity": "sha512-BC7VMXx/1BCmRPCVzzn4HGWAtsrb7/0758EtwOGFJQrlSwJBEjCcDLNZLFoL/68JexYa2s+KmgL/UfmXdG6v1w==", "dependencies": { - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-retry": "^2.2.0", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/util-middleware": "^2.2.0", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.3.0.tgz", - "integrity": "sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", + "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", "dependencies": { - "@smithy/node-config-provider": "^2.3.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.2.0.tgz", - "integrity": "sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz", + "integrity": "sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==", "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.12.0", - "@smithy/util-hex-encoding": "^2.2.0", + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.2.0.tgz", - "integrity": "sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.5.tgz", + "integrity": "sha512-dEyiUYL/ekDfk+2Ra4GxV+xNnFoCmk1nuIXg+fMChFTrM2uI/1r9AdiTYzPqgb72yIv/NtAj6C3dG//1wwgakQ==", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.2.0", - "@smithy/types": "^2.12.0", + "@smithy/eventstream-serde-universal": "^3.0.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.2.0.tgz", - "integrity": "sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz", + "integrity": "sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.2.0.tgz", - "integrity": "sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.4.tgz", + "integrity": "sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg==", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.2.0", - "@smithy/types": "^2.12.0", + "@smithy/eventstream-serde-universal": "^3.0.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.2.0.tgz", - "integrity": "sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.4.tgz", + "integrity": "sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A==", "dependencies": { - "@smithy/eventstream-codec": "^2.2.0", - "@smithy/types": "^2.12.0", + "@smithy/eventstream-codec": "^3.1.2", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz", - "integrity": "sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", + "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", "dependencies": { - "@smithy/protocol-http": "^3.3.0", - "@smithy/querystring-builder": "^2.2.0", - "@smithy/types": "^2.12.0", - "@smithy/util-base64": "^2.3.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/hash-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.2.0.tgz", - "integrity": "sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", + "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", "dependencies": { - "@smithy/types": "^2.12.0", - "@smithy/util-buffer-from": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", + "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.2.0.tgz", - "integrity": "sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", + "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.2.0.tgz", - "integrity": "sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", + "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", "dependencies": { - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.0.tgz", - "integrity": "sha512-OBhI9ZEAG8Xen0xsFJwwNOt44WE2CWkfYIxTognC8x42Lfsdf0VN/wCMqpdkySMDio/vts10BiovAxQp0T0faA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", + "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", "dependencies": { - "@smithy/middleware-serde": "^2.3.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-middleware": "^2.2.0", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-retry": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.2.0.tgz", - "integrity": "sha512-PsjDOLpbevgn37yJbawmfVoanru40qVA8UEf2+YA1lvOefmhuhL6ZbKtGsLAWDRnE1OlAmedsbA/htH6iSZjNA==", - "dependencies": { - "@smithy/node-config-provider": "^2.3.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/service-error-classification": "^2.1.5", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.13.tgz", + "integrity": "sha512-zvCLfaRYCaUmjbF2yxShGZdolSHft7NNCTA28HVN9hKcEbOH+g5irr1X9s+in8EpambclGnevZY4A3lYpvDCFw==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", "tslib": "^2.6.2", - "uuid": "^8.3.2" + "uuid": "^9.0.1" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-retry/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-serde": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz", - "integrity": "sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.2.0.tgz", - "integrity": "sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/node-config-provider": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.3.0.tgz", - "integrity": "sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", "dependencies": { - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/node-http-handler": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz", - "integrity": "sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", + "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", "dependencies": { - "@smithy/abort-controller": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/querystring-builder": "^2.2.0", - "@smithy/types": "^2.12.0", + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/property-provider": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz", - "integrity": "sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/protocol-http": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz", - "integrity": "sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", + "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/querystring-builder": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz", - "integrity": "sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", "dependencies": { - "@smithy/types": "^2.12.0", - "@smithy/util-uri-escape": "^2.2.0", + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/querystring-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.2.0.tgz", - "integrity": "sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/service-error-classification": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz", - "integrity": "sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", + "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", "dependencies": { - "@smithy/types": "^2.12.0" + "@smithy/types": "^3.3.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.4.0.tgz", - "integrity": "sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/signature-v4": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.2.0.tgz", - "integrity": "sha512-+B5TNzj/fRZzVW3z8UUJOkNx15+4E0CLuvJmJUA1JUIZFp3rdJ/M2H5r2SqltaVPXL0oIxv/6YK92T9TsFGbFg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", + "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", "dependencies": { - "@smithy/eventstream-codec": "^2.2.0", - "@smithy/is-array-buffer": "^2.2.0", - "@smithy/types": "^2.12.0", - "@smithy/util-hex-encoding": "^2.2.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-uri-escape": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/smithy-client": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.0.tgz", - "integrity": "sha512-DDXWHWdimtS3y/Kw1Jo46KQ0ZYsDKcldFynQERUGBPDpkW1lXOTHy491ALHjwfiBQvzsVKVxl5+ocXNIgJuX4g==", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.11.tgz", + "integrity": "sha512-l0BpyYkciNyMaS+PnFFz4aO5sBcXvGLoJd7mX9xrMBIm2nIQBVvYgp2ZpPDMzwjKCavsXu06iuCm0F6ZJZc6yQ==", "dependencies": { - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", - "@smithy/util-stream": "^2.2.0", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/types": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", - "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/url-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.2.0.tgz", - "integrity": "sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", "dependencies": { - "@smithy/querystring-parser": "^2.2.0", - "@smithy/types": "^2.12.0", + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/util-base64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.3.0.tgz", - "integrity": "sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-body-length-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.2.0.tgz", - "integrity": "sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", "dependencies": { "tslib": "^2.6.2" } }, "node_modules/@smithy/util-body-length-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.3.0.tgz", - "integrity": "sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-config-provider": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.3.0.tgz", - "integrity": "sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.0.tgz", - "integrity": "sha512-2okTdZaCBvOJszAPU/KSvlimMe35zLOKbQpHhamFJmR7t95HSe0K3C92jQPjKY3PmDBD+7iMkOnuW05F5OlF4g==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.13.tgz", + "integrity": "sha512-ZIRSUsnnMRStOP6OKtW+gCSiVFkwnfQF2xtf32QKAbHR6ACjhbAybDvry+3L5qQYdh3H6+7yD/AiUE45n8mTTw==", "dependencies": { - "@smithy/property-provider": "^2.2.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -1188,16 +1219,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.0.tgz", - "integrity": "sha512-hfKXnNLmsW9cmLb/JXKIvtuO6Cf4SuqN5PN1C2Ru/TBIws+m1wSgb+A53vo0r66xzB6E82inKG2J7qtwdi+Kkw==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.13.tgz", + "integrity": "sha512-voUa8TFJGfD+U12tlNNLCDlXibt9vRdNzRX45Onk/WxZe7TS+hTOZouEZRa7oARGicdgeXvt1A0W45qLGYdy+g==", "dependencies": { - "@smithy/config-resolver": "^2.2.0", - "@smithy/credential-provider-imds": "^2.3.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { @@ -1205,93 +1236,93 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.2.0.tgz", - "integrity": "sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", + "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", "dependencies": { - "@smithy/node-config-provider": "^2.3.0", - "@smithy/types": "^2.12.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-hex-encoding": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz", - "integrity": "sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-middleware": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.2.0.tgz", - "integrity": "sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-retry": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.2.0.tgz", - "integrity": "sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", + "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", "dependencies": { - "@smithy/service-error-classification": "^2.1.5", - "@smithy/types": "^2.12.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.2.0.tgz", - "integrity": "sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", + "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", "dependencies": { - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-buffer-from": "^2.2.0", - "@smithy/util-hex-encoding": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-uri-escape": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz", - "integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@types/node": { @@ -1717,17 +1748,17 @@ } }, "node_modules/fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" } ], "dependencies": { From c55e38e1916e950c08e46b18dae004ac387309be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 15:24:55 -0700 Subject: [PATCH 20/98] Bump rexml from 3.3.2 to 3.3.3 in /ruby (#6702) Bumps [rexml](https://github.com/ruby/rexml) from 3.3.2 to 3.3.3. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.3.2...v3.3.3) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ruby/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock index 7b50371f144..9b99149cfdf 100644 --- a/ruby/Gemfile.lock +++ b/ruby/Gemfile.lock @@ -1443,7 +1443,7 @@ GEM rainbow (3.1.1) rake (13.0.6) regexp_parser (2.8.0) - rexml (3.3.2) + rexml (3.3.3) strscan rspec (3.12.0) rspec-core (~> 3.12.0) From 6a97b3e7c96393a2f641ce4408a3b6da2bb23429 Mon Sep 17 00:00:00 2001 From: Jon Friesen <86265883+frij-aws@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:01:04 -0400 Subject: [PATCH 21/98] Add ABAP example for Claude v3 (#6703) --- .../metadata/bedrock-runtime_metadata.yaml | 3 + sap-abap/services/bdr/README.md | 4 +- .../bdr/zcl_aws1_bdr_actions.clas.abap | 102 ++++++++++++------ ...zcl_aws1_bdr_actions.clas.testclasses.abap | 7 ++ .../bdr/zcl_aws1_bdr_actions.clas.xml | 45 +++++++- 5 files changed, 126 insertions(+), 35 deletions(-) diff --git a/.doc_gen/metadata/bedrock-runtime_metadata.yaml b/.doc_gen/metadata/bedrock-runtime_metadata.yaml index 136a70cef54..b4fa169574d 100644 --- a/.doc_gen/metadata/bedrock-runtime_metadata.yaml +++ b/.doc_gen/metadata/bedrock-runtime_metadata.yaml @@ -690,6 +690,9 @@ bedrock-runtime_InvokeModel_AnthropicClaude: - description: Invoke the Anthropic Claude 2 foundation model to generate text using L2 high level client. snippet_tags: - bdr.abapv1.invokemodel_l2_claude_v2 + - description: Invoke the Anthropic Claude 3 foundation model to generate text using L2 high level client. + snippet_tags: + - bdr.abapv1.invokemodel_l2_claude_v3 services: bedrock-runtime: {InvokeModel} diff --git a/sap-abap/services/bdr/README.md b/sap-abap/services/bdr/README.md index f9656f3361b..9d2a24a2961 100644 --- a/sap-abap/services/bdr/README.md +++ b/sap-abap/services/bdr/README.md @@ -30,11 +30,11 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `sap-a <!--custom.prerequisites.end--> ### Anthropic Claude -- [InvokeModel](zcl_aws1_bdr_actions.clas.abap#L109) +- [InvokeModel](zcl_aws1_bdr_actions.clas.abap#L149) ### Stable Diffusion -- [InvokeModel](zcl_aws1_bdr_actions.clas.abap#L179) +- [InvokeModel](zcl_aws1_bdr_actions.clas.abap#L219) <!--custom.examples.start--> diff --git a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.abap b/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.abap index 00025f7a70d..2ae18dfadf8 100644 --- a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.abap +++ b/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.abap @@ -11,48 +11,60 @@ CLASS zcl_aws1_bdr_actions DEFINITION METHODS prompt_claude_v2 IMPORTING - !iv_prompt TYPE string + !iv_prompt TYPE string RETURNING - VALUE(ov_answer) TYPE string + VALUE(ov_answer) TYPE string RAISING - /aws1/cx_bdrserverexc - /aws1/cx_bdrclientexc - /aws1/cx_rt_technical_generic - /aws1/cx_rt_service_generic - /aws1/cx_rt_no_auth_generic . + /aws1/cx_bdrserverexc + /aws1/cx_bdrclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic . METHODS prompt_stable_diffusion IMPORTING - !iv_prompt TYPE string + !iv_prompt TYPE string RETURNING - VALUE(ov_image) TYPE xstring + VALUE(ov_image) TYPE xstring RAISING - /aws1/cx_bdrserverexc - /aws1/cx_bdrclientexc - /aws1/cx_rt_technical_generic - /aws1/cx_rt_service_generic - /aws1/cx_rt_no_auth_generic . + /aws1/cx_bdrserverexc + /aws1/cx_bdrclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic . METHODS l2_prompt_claude_v2 IMPORTING - !iv_prompt TYPE string + !iv_prompt TYPE string RETURNING - VALUE(ov_answer) TYPE string + VALUE(ov_answer) TYPE string RAISING - /aws1/cx_bdrserverexc - /aws1/cx_bdrclientexc - /aws1/cx_rt_technical_generic - /aws1/cx_rt_service_generic - /aws1/cx_rt_no_auth_generic . + /aws1/cx_bdrserverexc + /aws1/cx_bdrclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic . METHODS l2_prompt_stable_diffusion IMPORTING - !iv_prompt TYPE string + !iv_prompt TYPE string RETURNING - VALUE(ov_image) TYPE xstring + VALUE(ov_image) TYPE xstring RAISING - /aws1/cx_bdrserverexc - /aws1/cx_bdrclientexc - /aws1/cx_rt_technical_generic - /aws1/cx_rt_service_generic - /aws1/cx_rt_no_auth_generic . + /aws1/cx_bdrserverexc + /aws1/cx_bdrclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic . + METHODS l2_prompt_claude_v3 + IMPORTING + !iv_prompt TYPE string + RETURNING + VALUE(ov_answer) TYPE string + RAISING + /aws1/cx_bdrserverexc + /aws1/cx_bdrclientexc + /aws1/cx_rt_technical_generic + /aws1/cx_rt_service_generic + /aws1/cx_rt_no_auth_generic + /aws1/cx_bdr_l2_generic . ENDCLASS. @@ -80,6 +92,34 @@ CLASS ZCL_AWS1_BDR_ACTIONS IMPLEMENTATION. ENDMETHOD. + METHOD l2_prompt_claude_v3. + CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. + + DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). + DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). + "snippet-start:[bdr.abapv1.invokemodel_l2_claude_v3] + TRY. + " Choose a model ID from Anthropic that supports the Messages API - currently this is + " Claude v2, Claude v3 and v3.5. For the list of model ID, see: + " https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html + + " for the list of models that support the Messages API see: + " https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html + DATA(lo_bdr_l2_claude) = /aws1/cl_bdr_l2_factory=>create_anthropic_msg_api( + io_bdr = lo_bdr + iv_model_id = 'anthropic.claude-3-sonnet-20240229-v1:0' ). " choosing Claude v3 Sonnet + " iv_prompt can contain a prompt like 'tell me a joke about Java programmers'. + DATA(lv_answer) = lo_bdr_l2_claude->prompt_for_text( iv_prompt = iv_prompt iv_max_tokens = 100 ). + CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). + WRITE / lo_ex->get_text( ). + WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|. + + ENDTRY. + "snippet-end:[bdr.abapv1.invokemodel_l2_claude_v3] + ov_answer = lv_answer. + ENDMETHOD. + + METHOD l2_prompt_stable_diffusion. CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. @@ -87,8 +127,8 @@ CLASS ZCL_AWS1_BDR_ACTIONS IMPLEMENTATION. DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ). "snippet-start:[bdr.abapv1.invokemodel_l2_stable_diffusion] TRY. - DATA(lo_bdr_l2_sd) = /aws1/cl_bdr_l2_factory=>create_stable_diffusion_10( lo_bdr ). - " iv_prompt contains a prompt like 'Show me a picture of a unicorn reading an enterprise financial report'. + DATA(lo_bdr_l2_sd) = /aws1/cl_bdr_l2_factory=>create_stable_diffusion_xl_1( lo_bdr ). + " iv_prompt contains a prompt like 'Show me a picture of a unicorn reading an enterprise financial report'. DATA(lv_image) = lo_bdr_l2_sd->text_to_image( iv_prompt ). CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex). WRITE / lo_ex->get_text( ). @@ -210,7 +250,7 @@ CLASS ZCL_AWS1_BDR_ACTIONS IMPLEMENTATION. TRY. DATA(lo_response) = lo_bdr->invokemodel( iv_body = /aws1/cl_rt_util=>string_to_xstring( lv_json ) - iv_modelid = 'stability.stable-diffusion-xl-v0' + iv_modelid = 'stability.stable-diffusion-xl-v1' iv_accept = 'application/json' iv_contenttype = 'application/json' ). diff --git a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.testclasses.abap b/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.testclasses.abap index 0678a053a47..eaa0ea3e67f 100644 --- a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.testclasses.abap +++ b/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.testclasses.abap @@ -17,6 +17,7 @@ CLASS ltc_zcl_aws1_bdr_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL H METHODS test_stable_diffusion FOR TESTING RAISING /aws1/cx_rt_generic. METHODS test_l2_claude_v2 FOR TESTING RAISING /aws1/cx_rt_generic. + METHODS test_l2_claude_v3 FOR TESTING RAISING /aws1/cx_rt_generic. METHODS test_l2_stable_diffusion FOR TESTING RAISING /aws1/cx_rt_generic. METHODS setup RAISING /aws1/cx_rt_generic. @@ -46,6 +47,12 @@ CLASS ltc_zcl_aws1_bdr_actions IMPLEMENTATION. cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). ENDMETHOD. + METHOD test_l2_claude_v3. + DATA(lv_joke) = ao_bdr_actions->l2_prompt_claude_v3( + 'Tell me a joke about ABAP programmers and Java programmers walking into a bar' ). + cl_abap_unit_assert=>assert_not_initial( act = lv_joke ). + ENDMETHOD. + METHOD test_l2_stable_diffusion. DATA(lv_joke) = ao_bdr_actions->l2_prompt_stable_diffusion( 'Show me a picture of a kitten coding in ABAP on an SAP system' ). diff --git a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.xml b/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.xml index e3d629ab4a9..2c453ff56e9 100644 --- a/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.xml +++ b/sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.xml @@ -16,12 +16,17 @@ <SEOCOMPOTX> <CMPNAME>L2_PROMPT_CLAUDE_V2</CMPNAME> <LANGU>E</LANGU> - <DESCRIPT>Prompt Claude V2</DESCRIPT> + <DESCRIPT>L2 Prompt Claude V2</DESCRIPT> + </SEOCOMPOTX> + <SEOCOMPOTX> + <CMPNAME>L2_PROMPT_CLAUDE_V3</CMPNAME> + <LANGU>E</LANGU> + <DESCRIPT>L2 Prompt Claude V3</DESCRIPT> </SEOCOMPOTX> <SEOCOMPOTX> <CMPNAME>L2_PROMPT_STABLE_DIFFUSION</CMPNAME> <LANGU>E</LANGU> - <DESCRIPT>Prompt Stable Diffusion 1.0 with L2 client</DESCRIPT> + <DESCRIPT>L2 Prompt Stable Diffusion 1.0 with L2 client</DESCRIPT> </SEOCOMPOTX> <SEOCOMPOTX> <CMPNAME>PROMPT_CLAUDE_V2</CMPNAME> @@ -65,6 +70,42 @@ <LANGU>E</LANGU> <DESCRIPT>Technical errors</DESCRIPT> </SEOSUBCOTX> + <SEOSUBCOTX> + <CMPNAME>L2_PROMPT_CLAUDE_V3</CMPNAME> + <SCONAME>/AWS1/CX_BDRCLIENTEXC</SCONAME> + <LANGU>E</LANGU> + <DESCRIPT>Exception /AWS1/CX_BDRCLIENTEXC</DESCRIPT> + </SEOSUBCOTX> + <SEOSUBCOTX> + <CMPNAME>L2_PROMPT_CLAUDE_V3</CMPNAME> + <SCONAME>/AWS1/CX_BDRSERVEREXC</SCONAME> + <LANGU>E</LANGU> + <DESCRIPT>Exception /AWS1/CX_BDRSERVEREXC</DESCRIPT> + </SEOSUBCOTX> + <SEOSUBCOTX> + <CMPNAME>L2_PROMPT_CLAUDE_V3</CMPNAME> + <SCONAME>/AWS1/CX_BDR_L2_GENERIC</SCONAME> + <LANGU>E</LANGU> + <DESCRIPT>Generic Bedrock L2 exception</DESCRIPT> + </SEOSUBCOTX> + <SEOSUBCOTX> + <CMPNAME>L2_PROMPT_CLAUDE_V3</CMPNAME> + <SCONAME>/AWS1/CX_RT_NO_AUTH_GENERIC</SCONAME> + <LANGU>E</LANGU> + <DESCRIPT>Generic lack of authorization</DESCRIPT> + </SEOSUBCOTX> + <SEOSUBCOTX> + <CMPNAME>L2_PROMPT_CLAUDE_V3</CMPNAME> + <SCONAME>/AWS1/CX_RT_SERVICE_GENERIC</SCONAME> + <LANGU>E</LANGU> + <DESCRIPT>Generic Service call error</DESCRIPT> + </SEOSUBCOTX> + <SEOSUBCOTX> + <CMPNAME>L2_PROMPT_CLAUDE_V3</CMPNAME> + <SCONAME>/AWS1/CX_RT_TECHNICAL_GENERIC</SCONAME> + <LANGU>E</LANGU> + <DESCRIPT>Technical errors</DESCRIPT> + </SEOSUBCOTX> <SEOSUBCOTX> <CMPNAME>L2_PROMPT_STABLE_DIFFUSION</CMPNAME> <SCONAME>/AWS1/CX_BDRCLIENTEXC</SCONAME> From 2a2289f6d8836d5cf1f5aaa8ee91925dc857142b Mon Sep 17 00:00:00 2001 From: Sangmin Park <70051888+smartandhandsome@users.noreply.github.com> Date: Wed, 7 Aug 2024 02:21:30 +0900 Subject: [PATCH 22/98] Javav2: S3 Fix incorrect paths in presigned URL links (#6713) --- javav2/example_code/s3/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javav2/example_code/s3/README.md b/javav2/example_code/s3/README.md index 5aabc564946..fcbe5fda7dc 100644 --- a/javav2/example_code/s3/README.md +++ b/javav2/example_code/s3/README.md @@ -88,8 +88,8 @@ functions within the same service. <!--custom.examples.start--> -- [Create a presigned URL for download](s3/src/main/java/com/example/s3/GeneratePresignedGetUrlAndRetrieve.java) -- [Create a presigned URL for upload](s3/src/main/java/com/example/s3/GeneratePresignedUrlAndPutFileWithMetadata.java) +- [Create a presigned URL for download](src/main/java/com/example/s3/GeneratePresignedGetUrlAndRetrieve.java) +- [Create a presigned URL for upload](src/main/java/com/example/s3/GeneratePresignedUrlAndPutFileWithMetadata.java) <!--custom.examples.end--> ## Run the examples From 3bd4107474f9fdeac4e54e250506e59f2cc3701f Mon Sep 17 00:00:00 2001 From: David Souther <davidsouther+github@gmail.com> Date: Wed, 7 Aug 2024 16:23:19 -0400 Subject: [PATCH 23/98] Rust: EC2 Getting Started scenario (#6704) Rework Rust EC2 examples to follow the EC2 Scenario format. - Structure and key pairs. - Security group. - Instance creation - Elastic ip manager - doc_gen metadata for Rust EC2 updates - READMEs for Rust EC2 Updates - Describe regions example - Add specific mocked tests. - Formatting changes --- .doc_gen/metadata/ec2_metadata.yaml | 214 +++++- .doc_gen/metadata/ssm_metadata.yaml | 11 + rustv1/examples/ec2/Cargo.toml | 5 + rustv1/examples/ec2/README.md | 60 +- .../examples/ec2/src/bin/describe-regions.rs | 65 ++ rustv1/examples/ec2/src/bin/ec2-helloworld.rs | 36 +- .../examples/ec2/src/bin/getting-started.rs | 22 + rustv1/examples/ec2/src/ec2.rs | 530 +++++++++++++++ .../ec2/src/getting_started/elastic_ip.rs | 64 ++ .../ec2/src/getting_started/instance.rs | 151 +++++ .../ec2/src/getting_started/key_pair.rs | 93 +++ .../examples/ec2/src/getting_started/mod.rs | 13 + .../ec2/src/getting_started/scenario.rs | 358 +++++++++++ .../ec2/src/getting_started/security_group.rs | 98 +++ .../ec2/src/getting_started/tests/mod.rs | 5 + .../tests/scenario_with_mocks.rs | 607 ++++++++++++++++++ .../examples/ec2/src/getting_started/util.rs | 164 +++++ rustv1/examples/ec2/src/lib.rs | 6 + rustv1/examples/ec2/src/ssm.rs | 47 ++ rustv1/examples/ssm/README.md | 1 + 20 files changed, 2520 insertions(+), 30 deletions(-) create mode 100644 rustv1/examples/ec2/src/bin/describe-regions.rs create mode 100644 rustv1/examples/ec2/src/bin/getting-started.rs create mode 100644 rustv1/examples/ec2/src/ec2.rs create mode 100644 rustv1/examples/ec2/src/getting_started/elastic_ip.rs create mode 100644 rustv1/examples/ec2/src/getting_started/instance.rs create mode 100644 rustv1/examples/ec2/src/getting_started/key_pair.rs create mode 100644 rustv1/examples/ec2/src/getting_started/mod.rs create mode 100644 rustv1/examples/ec2/src/getting_started/scenario.rs create mode 100644 rustv1/examples/ec2/src/getting_started/security_group.rs create mode 100644 rustv1/examples/ec2/src/getting_started/tests/mod.rs create mode 100644 rustv1/examples/ec2/src/getting_started/tests/scenario_with_mocks.rs create mode 100644 rustv1/examples/ec2/src/getting_started/util.rs create mode 100644 rustv1/examples/ec2/src/lib.rs create mode 100644 rustv1/examples/ec2/src/ssm.rs diff --git a/.doc_gen/metadata/ec2_metadata.yaml b/.doc_gen/metadata/ec2_metadata.yaml index 3b8880fda8b..bba488fb8c4 100644 --- a/.doc_gen/metadata/ec2_metadata.yaml +++ b/.doc_gen/metadata/ec2_metadata.yaml @@ -68,6 +68,13 @@ ec2_Hello: - description: snippet_tags: - ec2.ruby.hello_ec2 + Rust: + versions: + - sdk_version: 1 + github: rust/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.ec2-helloworld services: ec2: {DescribeSecurityGroups} ec2_GetPasswordData: @@ -168,6 +175,17 @@ ec2_CreateKeyPair: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - description: Rust implementation that calls the EC2 Client's create_key_pair and extracts the returned material. + snippet_tags: + - ec2.rust.create_key.impl + - description: A function that calls the create_key impl and securely saves the PEM private key. + snippet_tags: + - ec2.rust.create_key.wrapper services: ec2: {CreateKeyPair} ec2_DescribeKeyPairs: @@ -246,6 +264,13 @@ ec2_DescribeKeyPairs: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.list_keys.impl services: ec2: {DescribeKeyPairs} @@ -297,7 +322,6 @@ ec2_CreateSecurityGroup: - description: snippet_tags: - ec2.Ruby.exampleSecurityGroup - JavaScript: versions: - sdk_version: 3 @@ -335,6 +359,13 @@ ec2_CreateSecurityGroup: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.create_security_group.impl services: ec2: {CreateSecurityGroup} ec2_RunInstances: @@ -397,6 +428,7 @@ ec2_RunInstances: versions: - sdk_version: 1 github: cpp/example_code/ec2 + sdkguide: excerpts: - description: snippet_tags: @@ -413,6 +445,13 @@ ec2_RunInstances: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.create_instance.impl services: ec2: {RunInstances} ec2_StartInstances: @@ -477,9 +516,12 @@ ec2_StartInstances: - sdk_version: 1 github: rustv1/examples/ec2 excerpts: - - description: + - description: Start an EC2 Instance by instance ID. + snippet_tags: + - ec2.rust.start_instance.impl + - description: Wait for an instance to be in the ready and status ok states, using the Waiters API. Using the Waiters API requires `use aws_sdk_ec2::client::Waiters` in the rust file. snippet_tags: - - ec2.rust.start-instance + - ec2.rust.wait_for_instance_ready.impl SAP ABAP: versions: - sdk_version: 1 @@ -572,9 +614,11 @@ ec2_StopInstances: - sdk_version: 1 github: rustv1/examples/ec2 excerpts: - - description: + - snippet_tags: + - ec2.rust.stop_instance.impl + - description: Wait for an instance to be in the stopped state, using the Waiters API. Using the Waiters API requires `use aws_sdk_ec2::client::Waiters` in the rust file. snippet_tags: - - ec2.rust.stop-instance + - ec2.rust.stop_instance.impl SAP ABAP: versions: - sdk_version: 1 @@ -691,6 +735,13 @@ ec2_AllocateAddress: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.allocate_address.impl services: ec2: {AllocateAddress} ec2_AssociateAddress: @@ -765,6 +816,7 @@ ec2_AssociateAddress: excerpts: - description: snippet_tags: + - cpp.example_code.ec2.allocate_address.client - cpp.example_code.ec2.AssociateAddress Bash: versions: @@ -778,6 +830,13 @@ ec2_AssociateAddress: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.associate_address.impl services: ec2: {AssociateAddress} ec2_DisassociateAddress: @@ -840,6 +899,13 @@ ec2_DisassociateAddress: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.disassociate_address.impl services: ec2: {DisassociateAddress} ec2_ReleaseAddress: @@ -927,6 +993,13 @@ ec2_ReleaseAddress: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.deallocate_address.impl services: ec2: {ReleaseAddress} ec2_AuthorizeSecurityGroupIngress: @@ -1000,6 +1073,13 @@ ec2_AuthorizeSecurityGroupIngress: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.authorize_security_group_ssh_ingress.impl services: ec2: {AuthorizeSecurityGroupIngress} ec2_DeleteKeyPair: @@ -1078,6 +1158,16 @@ ec2_DeleteKeyPair: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - description: Wrapper around delete_key that also removes the backing private PEM key. + snippet_tags: + - ec2.rust.delete_key.wrapper + - snippet_tags: + - ec2.rust.delete_key.impl services: ec2: {DeleteKeyPair} ec2_DescribeSecurityGroups: @@ -1156,6 +1246,13 @@ ec2_DescribeSecurityGroups: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rust/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.ec2-helloworld services: ec2: {DescribeSecurityGroups} ec2_DeleteSecurityGroup: @@ -1234,6 +1331,13 @@ ec2_DeleteSecurityGroup: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rust/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.delete_security_group.impl services: ec2: {DeleteSecurityGroup} ec2_DeleteSnapshot: @@ -1340,6 +1444,16 @@ ec2_TerminateInstances: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rust/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.delete_instance.impl + - description: Wait for an instance to be in the terminted state, using the Waiters API. Using the Waiters API requires `use aws_sdk_ec2::client::Waiters` in the rust file. + snippet_tags: + - ec2.rust.wait_for_instance_terminated.impl services: ec2: {TerminateInstances} ec2_DescribeInstances: @@ -1401,9 +1515,12 @@ ec2_DescribeInstances: - sdk_version: 1 github: rustv1/examples/ec2 excerpts: - - description: + - description: Retrieve details for an EC2 Instance. + snippet_tags: + - ec2.rust.describe_instance.impl + - description: After creating an EC2 instance, retrieve and store its details. snippet_tags: - - ec2.rust.describe-instances + - ec2.rust.create_instance.wrapper SAP ABAP: versions: - sdk_version: 1 @@ -1443,7 +1560,7 @@ ec2_DescribeRegions: excerpts: - description: snippet_tags: - - ec2.rust.ec2-helloworld + - ec2.rust.describe-regions JavaScript: versions: - sdk_version: 3 @@ -1560,9 +1677,14 @@ ec2_RebootInstances: - sdk_version: 1 github: rustv1/examples/ec2 excerpts: - - description: + - snippet_tags: + - ec2.rust.reboot_instance.wrapper + - snippet_tags: + - ec2.rust.reboot_instance.impl + - description: Waiters for instance to be in the stopped and ready states, using the Waiters API. Using the Waiters API requires `use aws_sdk_ec2::client::Waiters` in the rust file. snippet_tags: - - ec2.rust.reboot-instance + - ec2.rust.wait_for_instance_ready.impl + - ec2.rust.wait_for_instance_stopped.impl JavaScript: versions: - sdk_version: 3 @@ -1625,9 +1747,11 @@ ec2_DescribeImages: - sdk_version: 1 github: rustv1/examples/ec2 excerpts: - - genai: some + - snippet_tags: + - ec2.rust.list_images.impl + - description: Using the list_images function with &SSM; to limit based on your environment. For more details on SSM, see https://docs.aws.amazon.com/systems-manager/latest/userguide/example_ssm_GetParameters_section.html. snippet_tags: - - ec2.rust.describe-images + - ec2.rust.find_image.scenario Bash: versions: - sdk_version: 2 @@ -1702,6 +1826,13 @@ ec2_DescribeInstanceTypes: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - snippet_tags: + - ec2.rust.list_instance_types.impl services: ec2: {DescribeInstanceTypes} ec2_DescribeAddresses: @@ -1780,6 +1911,14 @@ ec2_CreateTags: - description: snippet_tags: - cpp.example_code.ec2.CreateTags + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - description: This example applies the Name tag After creating an instance. + snippet_tags: + - ec2.rust.create_instance.impl services: ec2: {CreateTags} ec2_CreateRouteTable: @@ -1868,7 +2007,8 @@ ec2_ReplaceIamInstanceProfileAssociation: github: python/example_code/ec2 sdkguide: excerpts: - - description: This example replaces the instance profile of a running instance, reboots the instance, and sends + - description: + This example replaces the instance profile of a running instance, reboots the instance, and sends a command to the instance after it starts. snippet_tags: - python.cross_service.resilient_service.AutoScaler.decl @@ -2112,7 +2252,49 @@ ec2_Scenario_GetStartedInstances: snippet_tags: - aws-cli.bash-linux.ec2.errecho - aws-cli.bash-linux.ec2.aws_cli_error_log + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/ec2 + excerpts: + - description: The EC2InstanceScenario implementation contains logic to run the example as a whole. + snippet_files: + - rustv1/examples/ec2/src/getting_started/scenario.rs + - description: The EC2Impl struct serves as a an automock point for testing, and its functions wrap the EC2 SDK calls. + snippet_files: + - rustv1/examples/ec2/src/ec2.rs + - description: The SSM struct serves as a an automock point for testing, and its functions wraps SSM SDK calls. + snippet_files: + - rustv1/examples/ec2/src/ssm.rs + - description: The scenario uses several "Manager"-style structs to handle access to resources that are created and deleted throughout the scenario. + snippet_files: + - rustv1/examples/ec2/src/getting_started/elastic_ip.rs + - rustv1/examples/ec2/src/getting_started/instance.rs + - rustv1/examples/ec2/src/getting_started/key_pair.rs + - rustv1/examples/ec2/src/getting_started/security_group.rs + - description: The main entry point for the scenario. + snippet_files: + - rustv1/examples/ec2/src/bin/getting-started.rs services: - ec2: {AllocateAddress, AssociateAddress, AuthorizeSecurityGroupIngress, CreateKeyPair, CreateSecurityGroup, DeleteKeyPair, - DeleteSecurityGroup, DescribeImages, DescribeInstanceTypes, DescribeInstances, DescribeKeyPairs, DescribeSecurityGroups, - DisassociateAddress, ReleaseAddress, RunInstances, StartInstances, StopInstances, TerminateInstances, UnmonitorInstances} + ec2: + { + AllocateAddress, + AssociateAddress, + AuthorizeSecurityGroupIngress, + CreateKeyPair, + CreateSecurityGroup, + DeleteKeyPair, + DeleteSecurityGroup, + DescribeImages, + DescribeInstanceTypes, + DescribeInstances, + DescribeKeyPairs, + DescribeSecurityGroups, + DisassociateAddress, + ReleaseAddress, + RunInstances, + StartInstances, + StopInstances, + TerminateInstances, + UnmonitorInstances, + } diff --git a/.doc_gen/metadata/ssm_metadata.yaml b/.doc_gen/metadata/ssm_metadata.yaml index ae6d398a2cd..c50ec9cf74c 100644 --- a/.doc_gen/metadata/ssm_metadata.yaml +++ b/.doc_gen/metadata/ssm_metadata.yaml @@ -45,6 +45,17 @@ ssm_DescribeParameters: - ssm.rust.describe-parameters services: ssm: {DescribeParameters} +ssm_GetParameter: + languages: + Rust: + versions: + - sdk_version: 1 + github: rustv1/example_code/ssm + excerpts: + - snippet_tags: + - ec2.rust.ssm_list_path.impl + services: + ssm: {GetParameter} ssm_PutParameter: languages: Java: diff --git a/rustv1/examples/ec2/Cargo.toml b/rustv1/examples/ec2/Cargo.toml index 184753dafc6..a0a205cb4f6 100644 --- a/rustv1/examples/ec2/Cargo.toml +++ b/rustv1/examples/ec2/Cargo.toml @@ -19,3 +19,8 @@ clap = { version = "~4.4", features = ["derive"] } tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } tracing = "0.1.40" aws-smithy-runtime-api = "1.6.2" +mockall = "0.13.0" +inquire = "0.7.5" +reqwest = "0.12.5" +aws-sdk-ssm = "1.40.0" +aws-smithy-async = "1.2.1" diff --git a/rustv1/examples/ec2/README.md b/rustv1/examples/ec2/README.md index a04612df711..e716552b307 100644 --- a/rustv1/examples/ec2/README.md +++ b/rustv1/examples/ec2/README.md @@ -29,19 +29,46 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv <!--custom.prerequisites.start--> <!--custom.prerequisites.end--> +### Get started + +- [Hello Amazon EC2](src/bin/ec2-helloworld.rs#L22) (`DescribeSecurityGroups`) + + ### Single actions Code excerpts that show you how to call individual service functions. +- [AllocateAddress](src/ec2.rs#L443) +- [AssociateAddress](src/ec2.rs#L465) +- [AuthorizeSecurityGroupIngress](src/ec2.rs#L136) +- [CreateKeyPair](src/ec2.rs#L41) +- [CreateSecurityGroup](src/ec2.rs#L77) +- [CreateTags](src/ec2.rs#L233) +- [DeleteKeyPair](src/getting_started/key_pair.rs#L66) +- [DeleteSecurityGroup](src/ec2.rs#L167) - [DeleteSnapshot](../ebs/src/bin/delete-snapshot.rs#L26) -- [DescribeImages](src/bin/describe-images.rs#L6) +- [DescribeImages](src/ec2.rs#L179) - [DescribeInstanceStatus](src/bin/list-all-instance-events.rs#L22) -- [DescribeInstances](src/bin/describe-instance.rs#L26) -- [DescribeRegions](src/bin/ec2-helloworld.rs#L22) +- [DescribeInstanceTypes](src/ec2.rs#L198) +- [DescribeInstances](src/ec2.rs#L317) +- [DescribeKeyPairs](src/ec2.rs#L57) +- [DescribeRegions](src/bin/describe-regions.rs#L22) +- [DescribeSecurityGroups](src/bin/ec2-helloworld.rs#L22) - [DescribeSnapshots](../ebs/src/bin/get-snapshot-state.rs#L27) -- [RebootInstances](src/bin/reboot-instance.rs#L28) -- [StartInstances](src/bin/start-instance.rs#L29) -- [StopInstances](src/bin/stop-instance.rs#L29) +- [DisassociateAddress](src/ec2.rs#L482) +- [RebootInstances](src/getting_started/instance.rs#L86) +- [ReleaseAddress](src/ec2.rs#L454) +- [RunInstances](src/ec2.rs#L233) +- [StartInstances](src/ec2.rs#L340) +- [StopInstances](src/ec2.rs#L356) +- [TerminateInstances](src/ec2.rs#L410) + +### Scenarios + +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. + +- [Get started with instances](src/getting_started/scenario.rs) <!--custom.examples.start--> @@ -55,7 +82,28 @@ Code excerpts that show you how to call individual service functions. <!--custom.instructions.start--> <!--custom.instructions.end--> +#### Hello Amazon EC2 + +This example shows you how to get started using Amazon EC2. + + + +#### Get started with instances + +This example shows you how to do the following: + +- Create a key pair and security group. +- Select an Amazon Machine Image (AMI) and compatible instance type, then create an instance. +- Stop and restart the instance. +- Associate an Elastic IP address with your instance. +- Connect to your instance with SSH, then clean up resources. + +<!--custom.scenario_prereqs.ec2_Scenario_GetStartedInstances.start--> +<!--custom.scenario_prereqs.ec2_Scenario_GetStartedInstances.end--> + +<!--custom.scenarios.ec2_Scenario_GetStartedInstances.start--> +<!--custom.scenarios.ec2_Scenario_GetStartedInstances.end--> ### Tests diff --git a/rustv1/examples/ec2/src/bin/describe-regions.rs b/rustv1/examples/ec2/src/bin/describe-regions.rs new file mode 100644 index 00000000000..301ffc0865f --- /dev/null +++ b/rustv1/examples/ec2/src/bin/describe-regions.rs @@ -0,0 +1,65 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +#![allow(clippy::result_large_err)] + +use aws_config::meta::region::RegionProviderChain; +use aws_sdk_ec2::{config::Region, meta::PKG_VERSION, Client, Error}; +use clap::Parser; + +#[derive(Debug, Parser)] +struct Opt { + /// The AWS Region. + #[structopt(short, long)] + region: Option<String>, + + /// Whether to display additional information. + #[structopt(short, long)] + verbose: bool, +} + +// Describes the regions. +// snippet-start:[ec2.rust.describe-regions] +async fn show_regions(client: &Client) -> Result<(), Error> { + let rsp = client.describe_regions().send().await?; + + println!("Regions:"); + for region in rsp.regions() { + println!(" {}", region.region_name().unwrap()); + } + + Ok(()) +} +// snippet-end:[ec2.rust.describe-regions] + +/// Describes the AWS Regions that are enabled for your account. +/// # Arguments +/// +/// * `[-r REGION]` - The Region in which the client is created. +/// If not supplied, uses the value of the **AWS_REGION** environment variable. +/// If the environment variable is not set, defaults to **us-west-2**. +/// * `[-v]` - Whether to display additional information. +#[tokio::main] +async fn main() -> Result<(), Error> { + tracing_subscriber::fmt::init(); + let Opt { region, verbose } = Opt::parse(); + + let region_provider = RegionProviderChain::first_try(region.map(Region::new)) + .or_default_provider() + .or_else(Region::new("us-west-2")); + println!(); + + if verbose { + println!("EC2 client version: {}", PKG_VERSION); + println!( + "Region: {}", + region_provider.region().await.unwrap().as_ref() + ); + println!(); + } + + let shared_config = aws_config::from_env().region(region_provider).load().await; + let client = Client::new(&shared_config); + + show_regions(&client).await +} diff --git a/rustv1/examples/ec2/src/bin/ec2-helloworld.rs b/rustv1/examples/ec2/src/bin/ec2-helloworld.rs index b0eb56d0d03..7ae96b50c6a 100644 --- a/rustv1/examples/ec2/src/bin/ec2-helloworld.rs +++ b/rustv1/examples/ec2/src/bin/ec2-helloworld.rs @@ -20,15 +20,33 @@ struct Opt { // Describes the regions. // snippet-start:[ec2.rust.ec2-helloworld] -async fn show_regions(client: &Client) -> Result<(), Error> { - let rsp = client.describe_regions().send().await?; +async fn show_security_groups(client: &aws_sdk_ec2::Client, group_ids: Vec<String>) { + let response = client + .describe_security_groups() + .set_group_ids(Some(group_ids)) + .send() + .await; - println!("Regions:"); - for region in rsp.regions() { - println!(" {}", region.region_name().unwrap()); + match response { + Ok(output) => { + for group in output.security_groups() { + println!( + "Found Security Group {} ({}), vpc id {} and description {}", + group.group_name().unwrap_or("unknown"), + group.group_id().unwrap_or("id-unknown"), + group.vpc_id().unwrap_or("vpcid-unknown"), + group.description().unwrap_or("(none)") + ); + } + } + Err(err) => { + let err = err.into_service_error(); + let meta = err.meta(); + let message = meta.message().unwrap_or("unknown"); + let code = meta.code().unwrap_or("unknown"); + eprintln!("Error listing EC2 Security Groups: ({code}) {message}"); + } } - - Ok(()) } // snippet-end:[ec2.rust.ec2-helloworld] @@ -61,5 +79,7 @@ async fn main() -> Result<(), Error> { let shared_config = aws_config::from_env().region(region_provider).load().await; let client = Client::new(&shared_config); - show_regions(&client).await + show_security_groups(&client, vec![]).await; + + Ok(()) } diff --git a/rustv1/examples/ec2/src/bin/getting-started.rs b/rustv1/examples/ec2/src/bin/getting-started.rs new file mode 100644 index 00000000000..5579a3cab06 --- /dev/null +++ b/rustv1/examples/ec2/src/bin/getting-started.rs @@ -0,0 +1,22 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use ec2_code_examples::{ + ec2::EC2, + getting_started::{ + scenario::{run, Ec2InstanceScenario}, + util::UtilImpl, + }, + ssm::SSM, +}; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + let sdk_config = aws_config::load_from_env().await; + let ec2 = EC2::new(aws_sdk_ec2::Client::new(&sdk_config)); + let ssm = SSM::new(aws_sdk_ssm::Client::new(&sdk_config)); + let util = UtilImpl {}; + let scenario = Ec2InstanceScenario::new(ec2, ssm, util); + run(scenario).await; +} diff --git a/rustv1/examples/ec2/src/ec2.rs b/rustv1/examples/ec2/src/ec2.rs new file mode 100644 index 00000000000..a9aa0e6c1bb --- /dev/null +++ b/rustv1/examples/ec2/src/ec2.rs @@ -0,0 +1,530 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::{net::Ipv4Addr, time::Duration}; + +use aws_sdk_ec2::{ + client::Waiters, + error::ProvideErrorMetadata, + operation::{ + allocate_address::AllocateAddressOutput, associate_address::AssociateAddressOutput, + }, + types::{ + DomainType, Filter, Image, Instance, InstanceType, IpPermission, IpRange, KeyPairInfo, + SecurityGroup, Tag, + }, + Client as EC2Client, +}; +use aws_sdk_ssm::types::Parameter; +use aws_smithy_runtime_api::client::waiters::error::WaiterError; + +#[cfg(test)] +use mockall::automock; + +#[cfg(not(test))] +pub use EC2Impl as EC2; + +#[cfg(test)] +pub use MockEC2Impl as EC2; + +#[derive(Clone)] +pub struct EC2Impl { + pub client: EC2Client, +} + +#[cfg_attr(test, automock)] +impl EC2Impl { + pub fn new(client: EC2Client) -> Self { + EC2Impl { client } + } + + // snippet-start:[ec2.rust.create_key.impl] + pub async fn create_key_pair(&self, name: String) -> Result<(KeyPairInfo, String), EC2Error> { + tracing::info!("Creating key pair {name}"); + let output = self.client.create_key_pair().key_name(name).send().await?; + let info = KeyPairInfo::builder() + .set_key_name(output.key_name) + .set_key_fingerprint(output.key_fingerprint) + .set_key_pair_id(output.key_pair_id) + .build(); + let material = output + .key_material + .ok_or_else(|| EC2Error::new("Create Key Pair has no key material"))?; + Ok((info, material)) + } + // snippet-end:[ec2.rust.create_key.impl] + + // snippet-start:[ec2.rust.list_keys.impl] + pub async fn list_key_pair(&self) -> Result<Vec<KeyPairInfo>, EC2Error> { + let output = self.client.describe_key_pairs().send().await?; + Ok(output.key_pairs.unwrap_or_default()) + } + // snippet-end:[ec2.rust.list_keys.impl] + + // snippet-start:[ec2.rust.delete_key.impl] + pub async fn delete_key_pair(&self, key_pair_id: &str) -> Result<(), EC2Error> { + let key_pair_id: String = key_pair_id.into(); + tracing::info!("Deleting key pair {key_pair_id}"); + self.client + .delete_key_pair() + .key_pair_id(key_pair_id) + .send() + .await?; + Ok(()) + } + // snippet-end:[ec2.rust.delete_key.impl] + + // snippet-start:[ec2.rust.create_security_group.impl] + pub async fn create_security_group( + &self, + name: &str, + description: &str, + ) -> Result<SecurityGroup, EC2Error> { + tracing::info!("Creating security group {name}"); + let create_output = self + .client + .create_security_group() + .group_name(name) + .description(description) + .send() + .await + .map_err(EC2Error::from)?; + + let group_id = create_output + .group_id + .ok_or_else(|| EC2Error::new("Missing security group id after creation"))?; + + let group = self + .describe_security_group(&group_id) + .await? + .ok_or_else(|| { + EC2Error::new(format!("Could not find security group with id {group_id}")) + })?; + + tracing::info!("Created security group {name} as {group_id}"); + + Ok(group) + } + // snippet-end:[ec2.rust.create_security_group.impl] + + // snippet-start:[ec2.rust.describe_security_group.impl] + /// Find a single security group, by ID. Returns Err if multiple groups are found. + pub async fn describe_security_group( + &self, + group_id: &str, + ) -> Result<Option<SecurityGroup>, EC2Error> { + let group_id: String = group_id.into(); + let describe_output = self + .client + .describe_security_groups() + .group_ids(&group_id) + .send() + .await?; + + let mut groups = describe_output.security_groups.unwrap_or_default(); + + match groups.len() { + 0 => Ok(None), + 1 => Ok(Some(groups.remove(0))), + _ => Err(EC2Error::new(format!( + "Expected single group for {group_id}" + ))), + } + } + // snippet-end:[ec2.rust.describe_security_group.impl] + + // snippet-start:[ec2.rust.authorize_security_group_ssh_ingress.impl] + /// Add an ingress rule to a security group explicitly allowing IPv4 address + /// as {ip}/32 over TCP port 22. + pub async fn authorize_security_group_ssh_ingress( + &self, + group_id: &str, + ingress_ips: Vec<Ipv4Addr>, + ) -> Result<(), EC2Error> { + tracing::info!("Authorizing ingress for security group {group_id}"); + self.client + .authorize_security_group_ingress() + .group_id(group_id) + .set_ip_permissions(Some( + ingress_ips + .into_iter() + .map(|ip| { + IpPermission::builder() + .ip_protocol("tcp") + .from_port(22) + .to_port(22) + .ip_ranges(IpRange::builder().cidr_ip(format!("{ip}/32")).build()) + .build() + }) + .collect(), + )) + .send() + .await?; + Ok(()) + } + // snippet-end:[ec2.rust.authorize_security_group_ssh_ingress.impl] + + // snippet-start:[ec2.rust.delete_security_group.impl] + pub async fn delete_security_group(&self, group_id: &str) -> Result<(), EC2Error> { + tracing::info!("Deleting security group {group_id}"); + self.client + .delete_security_group() + .group_id(group_id) + .send() + .await?; + Ok(()) + } + // snippet-end:[ec2.rust.delete_security_group.impl] + + // snippet-start:[ec2.rust.list_images.impl] + pub async fn list_images(&self, ids: Vec<Parameter>) -> Result<Vec<Image>, EC2Error> { + let image_ids = ids.into_iter().filter_map(|p| p.value).collect(); + let output = self + .client + .describe_images() + .set_image_ids(Some(image_ids)) + .send() + .await?; + + let images = output.images.unwrap_or_default(); + if images.is_empty() { + Err(EC2Error::new("No images for selected AMIs")) + } else { + Ok(images) + } + } + // snippet-end:[ec2.rust.list_images.impl] + + // snippet-start:[ec2.rust.list_instance_types.impl] + /// List instance types that match an image's architecture and are free tier eligible. + pub async fn list_instance_types(&self, image: &Image) -> Result<Vec<InstanceType>, EC2Error> { + let architecture = format!( + "{}", + image.architecture().ok_or_else(|| EC2Error::new(format!( + "Image {:?} does not have a listed architecture", + image.image_id() + )))? + ); + let free_tier_eligible_filter = Filter::builder() + .name("free-tier-eligible") + .values("false") + .build(); + let supported_architecture_filter = Filter::builder() + .name("processor-info.supported-architecture") + .values(architecture) + .build(); + let response = self + .client + .describe_instance_types() + .filters(free_tier_eligible_filter) + .filters(supported_architecture_filter) + .send() + .await?; + + Ok(response + .instance_types + .unwrap_or_default() + .into_iter() + .filter_map(|iti| iti.instance_type) + .collect()) + } + // snippet-end:[ec2.rust.list_instance_types.impl] + + // snippet-start:[ec2.rust.create_instance.impl] + pub async fn create_instance<'a>( + &self, + image_id: &'a str, + instance_type: InstanceType, + key_pair: &'a KeyPairInfo, + security_groups: Vec<&'a SecurityGroup>, + ) -> Result<String, EC2Error> { + let run_instances = self + .client + .run_instances() + .image_id(image_id) + .instance_type(instance_type) + .key_name( + key_pair + .key_name() + .ok_or_else(|| EC2Error::new("Missing key name when launching instance"))?, + ) + .set_security_group_ids(Some( + security_groups + .iter() + .filter_map(|sg| sg.group_id.clone()) + .collect(), + )) + .min_count(1) + .max_count(1) + .send() + .await?; + + if run_instances.instances().is_empty() { + return Err(EC2Error::new("Failed to create instance")); + } + + let instance_id = run_instances.instances()[0].instance_id().unwrap(); + let response = self + .client + .create_tags() + .resources(instance_id) + .tags( + Tag::builder() + .key("Name") + .value("From SDK Examples") + .build(), + ) + .send() + .await; + + match response { + Ok(_) => tracing::info!("Created {instance_id} and applied tags."), + Err(err) => { + tracing::info!("Error applying tags to {instance_id}: {err:?}"); + return Err(err.into()); + } + } + + tracing::info!("Instance is created."); + + Ok(instance_id.to_string()) + } + // snippet-end:[ec2.rust.create_instance.impl] + + // snippet-start:[ec2.rust.wait_for_instance_ready.impl] + /// Wait for an instance to be ready and status ok (default wait 60 seconds) + pub async fn wait_for_instance_ready( + &self, + instance_id: &str, + duration: Option<Duration>, + ) -> Result<(), EC2Error> { + self.client + .wait_until_instance_status_ok() + .instance_ids(instance_id) + .wait(duration.unwrap_or(Duration::from_secs(60))) + .await + .map_err(|err| match err { + WaiterError::ExceededMaxWait(exceeded) => EC2Error(format!( + "Exceeded max time ({}s) waiting for instance to start.", + exceeded.max_wait().as_secs() + )), + _ => EC2Error::from(err), + })?; + Ok(()) + } + // snippet-end:[ec2.rust.wait_for_instance_ready.impl] + + // snippet-start:[ec2.rust.describe_instance.impl] + pub async fn describe_instance(&self, instance_id: &str) -> Result<Instance, EC2Error> { + let response = self + .client + .describe_instances() + .instance_ids(instance_id) + .send() + .await?; + + let instance = response + .reservations() + .first() + .ok_or_else(|| EC2Error::new(format!("No instance reservations for {instance_id}")))? + .instances() + .first() + .ok_or_else(|| { + EC2Error::new(format!("No instances in reservation for {instance_id}")) + })?; + + Ok(instance.clone()) + } + // snippet-end:[ec2.rust.describe_instance.impl] + + // snippet-start:[ec2.rust.start_instance.impl] + pub async fn start_instance(&self, instance_id: &str) -> Result<(), EC2Error> { + tracing::info!("Starting instance {instance_id}"); + + self.client + .start_instances() + .instance_ids(instance_id) + .send() + .await?; + + tracing::info!("Started instance."); + + Ok(()) + } + // snippet-end:[ec2.rust.start_instance.impl] + + // snippet-start:[ec2.rust.stop_instance.impl] + pub async fn stop_instance(&self, instance_id: &str) -> Result<(), EC2Error> { + tracing::info!("Stopping instance {instance_id}"); + + self.client + .stop_instances() + .instance_ids(instance_id) + .send() + .await?; + + self.wait_for_instance_stopped(instance_id, None).await?; + + tracing::info!("Stopped instance."); + + Ok(()) + } + // snippet-end:[ec2.rust.stop_instance.impl] + + // snippet-start:[ec2.rust.reboot_instance.impl] + pub async fn reboot_instance(&self, instance_id: &str) -> Result<(), EC2Error> { + tracing::info!("Rebooting instance {instance_id}"); + + self.client + .reboot_instances() + .instance_ids(instance_id) + .send() + .await?; + + Ok(()) + } + // snippet-end:[ec2.rust.reboot_instance.impl] + + // snippet-start:[ec2.rust.wait_for_instance_stopped.impl] + pub async fn wait_for_instance_stopped( + &self, + instance_id: &str, + duration: Option<Duration>, + ) -> Result<(), EC2Error> { + self.client + .wait_until_instance_stopped() + .instance_ids(instance_id) + .wait(duration.unwrap_or(Duration::from_secs(60))) + .await + .map_err(|err| match err { + WaiterError::ExceededMaxWait(exceeded) => EC2Error(format!( + "Exceeded max time ({}s) waiting for instance to stop.", + exceeded.max_wait().as_secs(), + )), + _ => EC2Error::from(err), + })?; + Ok(()) + } + // snippet-end:[ec2.rust.wait_for_instance_stopped.impl] + + // snippet-start:[ec2.rust.delete_instance.impl] + pub async fn delete_instance(&self, instance_id: &str) -> Result<(), EC2Error> { + tracing::info!("Deleting instance with id {instance_id}"); + self.stop_instance(instance_id).await?; + self.client + .terminate_instances() + .instance_ids(instance_id) + .send() + .await?; + self.wait_for_instance_terminated(instance_id).await?; + tracing::info!("Terminated instance with id {instance_id}"); + Ok(()) + } + // snippet-end:[ec2.rust.delete_instance.impl] + + // snippet-start:[ec2.rust.wait_for_instance_terminated.impl] + async fn wait_for_instance_terminated(&self, instance_id: &str) -> Result<(), EC2Error> { + self.client + .wait_until_instance_terminated() + .instance_ids(instance_id) + .wait(Duration::from_secs(60)) + .await + .map_err(|err| match err { + WaiterError::ExceededMaxWait(exceeded) => EC2Error(format!( + "Exceeded max time ({}s) waiting for instance to terminate.", + exceeded.max_wait().as_secs(), + )), + _ => EC2Error::from(err), + })?; + Ok(()) + } + // snippet-end:[ec2.rust.wait_for_instance_terminated.impl] + + // snippet-start:[ec2.rust.allocate_address.impl] + pub async fn allocate_ip_address(&self) -> Result<AllocateAddressOutput, EC2Error> { + self.client + .allocate_address() + .domain(DomainType::Vpc) + .send() + .await + .map_err(EC2Error::from) + } + // snippet-end:[ec2.rust.allocate_address.impl] + + // snippet-start:[ec2.rust.deallocate_address.impl] + pub async fn deallocate_ip_address(&self, allocation_id: &str) -> Result<(), EC2Error> { + self.client + .release_address() + .allocation_id(allocation_id) + .send() + .await?; + Ok(()) + } + // snippet-end:[ec2.rust.deallocate_address.impl] + + // snippet-start:[ec2.rust.associate_address.impl] + pub async fn associate_ip_address( + &self, + allocation_id: &str, + instance_id: &str, + ) -> Result<AssociateAddressOutput, EC2Error> { + let response = self + .client + .associate_address() + .allocation_id(allocation_id) + .instance_id(instance_id) + .send() + .await?; + Ok(response) + } + // snippet-end:[ec2.rust.associate_address.impl] + + // snippet-start:[ec2.rust.disassociate_address.impl] + pub async fn disassociate_ip_address(&self, association_id: &str) -> Result<(), EC2Error> { + self.client + .disassociate_address() + .association_id(association_id) + .send() + .await?; + Ok(()) + } + // snippet-end:[ec2.rust.disassociate_address.impl] +} + +// snippet-start:[ec2.rust.ec2error.impl] +#[derive(Debug)] +pub struct EC2Error(String); +impl EC2Error { + pub fn new(value: impl Into<String>) -> Self { + EC2Error(value.into()) + } + + pub fn add_message(self, message: impl Into<String>) -> Self { + EC2Error(format!("{}: {}", message.into(), self.0)) + } +} + +impl<T: ProvideErrorMetadata> From<T> for EC2Error { + fn from(value: T) -> Self { + EC2Error(format!( + "{}: {}", + value + .code() + .map(String::from) + .unwrap_or("unknown code".into()), + value + .message() + .map(String::from) + .unwrap_or("missing reason".into()), + )) + } +} + +impl std::error::Error for EC2Error {} + +impl std::fmt::Display for EC2Error { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} +// snippet-end:[ec2.rust.ec2error.impl] diff --git a/rustv1/examples/ec2/src/getting_started/elastic_ip.rs b/rustv1/examples/ec2/src/getting_started/elastic_ip.rs new file mode 100644 index 00000000000..0040a92f628 --- /dev/null +++ b/rustv1/examples/ec2/src/getting_started/elastic_ip.rs @@ -0,0 +1,64 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use aws_sdk_ec2::operation::{ + allocate_address::AllocateAddressOutput, associate_address::AssociateAddressOutput, +}; + +use crate::ec2::{EC2Error, EC2}; + +/// ElasticIpManager tracks the lifecycle of a public IP address, including its +/// allocation from the global pool and association with a specific instance. +#[derive(Debug, Default)] +pub struct ElasticIpManager { + elastic_ip: Option<AllocateAddressOutput>, + association: Option<AssociateAddressOutput>, +} + +impl ElasticIpManager { + pub fn has_allocation(&self) -> bool { + self.elastic_ip.is_some() + } + + pub fn public_ip(&self) -> &str { + if let Some(allocation) = &self.elastic_ip { + if let Some(addr) = allocation.public_ip() { + return addr; + } + } + "0.0.0.0" + } + + pub async fn allocate(&mut self, ec2: &EC2) -> Result<(), EC2Error> { + let allocation = ec2.allocate_ip_address().await?; + self.elastic_ip = Some(allocation); + Ok(()) + } + + pub async fn associate(&mut self, ec2: &EC2, instance_id: &str) -> Result<(), EC2Error> { + if let Some(allocation) = &self.elastic_ip { + if let Some(allocation_id) = allocation.allocation_id() { + let association = ec2.associate_ip_address(allocation_id, instance_id).await?; + self.association = Some(association); + return Ok(()); + } + } + Err(EC2Error::new("No ip address allocation to associate")) + } + + pub async fn remove(mut self, ec2: &EC2) -> Result<(), EC2Error> { + if let Some(association) = &self.association { + if let Some(association_id) = association.association_id() { + ec2.disassociate_ip_address(association_id).await?; + } + } + self.association = None; + if let Some(allocation) = &self.elastic_ip { + if let Some(allocation_id) = allocation.allocation_id() { + ec2.deallocate_ip_address(allocation_id).await?; + } + } + self.elastic_ip = None; + Ok(()) + } +} diff --git a/rustv1/examples/ec2/src/getting_started/instance.rs b/rustv1/examples/ec2/src/getting_started/instance.rs new file mode 100644 index 00000000000..37f54ccc440 --- /dev/null +++ b/rustv1/examples/ec2/src/getting_started/instance.rs @@ -0,0 +1,151 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::fmt::Display; + +use aws_sdk_ec2::types::{Instance, InstanceType, KeyPairInfo, SecurityGroup}; + +use crate::ec2::{EC2Error, EC2}; + +/// InstanceManager wraps the lifecycle of an EC2 Instance. +#[derive(Debug, Default)] +pub struct InstanceManager { + instance: Option<Instance>, +} + +impl InstanceManager { + pub fn instance_id(&self) -> &str { + if let Some(instance) = &self.instance { + if let Some(id) = instance.instance_id() { + return id; + } + } + "Unknown" + } + + pub fn instance_name(&self) -> &str { + if let Some(instance) = &self.instance { + if let Some(tag) = instance.tags().iter().find(|e| e.key() == Some("Name")) { + if let Some(value) = tag.value() { + return value; + } + } + } + "Unknown" + } + + pub fn instance_ip(&self) -> &str { + if let Some(instance) = &self.instance { + if let Some(public_ip_address) = instance.public_ip_address() { + return public_ip_address; + } + } + "0.0.0.0" + } + + pub fn instance_display_name(&self) -> String { + format!("{} ({})", self.instance_name(), self.instance_id()) + } + + // snippet-start:[ec2.rust.create_instance.wrapper] + /// Create an EC2 instance with the given ID on a given type, using a + /// generated KeyPair and applying a list of security groups. + pub async fn create( + &mut self, + ec2: &EC2, + image_id: &str, + instance_type: InstanceType, + key_pair: &KeyPairInfo, + security_groups: Vec<&SecurityGroup>, + ) -> Result<(), EC2Error> { + let instance_id = ec2 + .create_instance(image_id, instance_type, key_pair, security_groups) + .await?; + let instance = ec2.describe_instance(&instance_id).await?; + self.instance = Some(instance); + Ok(()) + } + // snippet-end:[ec2.rust.create_instance.wrapper] + + /// Start the managed EC2 instance, if present. + pub async fn start(&self, ec2: &EC2) -> Result<(), EC2Error> { + if self.instance.is_some() { + ec2.start_instance(self.instance_id()).await?; + } + Ok(()) + } + + /// Stop the managed EC2 instance, if present. + pub async fn stop(&self, ec2: &EC2) -> Result<(), EC2Error> { + if self.instance.is_some() { + ec2.stop_instance(self.instance_id()).await?; + } + Ok(()) + } + + // snippet-start:[ec2.rust.reboot_instance.wrapper] + pub async fn reboot(&self, ec2: &EC2) -> Result<(), EC2Error> { + if self.instance.is_some() { + ec2.reboot_instance(self.instance_id()).await?; + ec2.wait_for_instance_stopped(self.instance_id(), None) + .await?; + ec2.wait_for_instance_ready(self.instance_id(), None) + .await?; + } + Ok(()) + } + // snippet-end:[ec2.rust.reboot_instance.wrapper] + + /// Terminate and delete the managed EC2 instance, if present. + pub async fn delete(self, ec2: &EC2) -> Result<(), EC2Error> { + if self.instance.is_some() { + ec2.delete_instance(self.instance_id()).await?; + } + Ok(()) + } +} + +impl Display for InstanceManager { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if let Some(instance) = &self.instance { + writeln!(f, "\tID: {}", instance.instance_id().unwrap_or("(Unknown)"))?; + writeln!( + f, + "\tImage ID: {}", + instance.image_id().unwrap_or("(Unknown)") + )?; + writeln!( + f, + "\tInstance type: {}", + instance + .instance_type() + .map(|it| format!("{it}")) + .unwrap_or("(Unknown)".to_string()) + )?; + writeln!( + f, + "\tKey name: {}", + instance.key_name().unwrap_or("(Unknown)") + )?; + writeln!(f, "\tVPC ID: {}", instance.vpc_id().unwrap_or("(Unknown)"))?; + writeln!( + f, + "\tPublic IP: {}", + instance.public_ip_address().unwrap_or("(Unknown)") + )?; + let instance_state = instance + .state + .as_ref() + .map(|is| { + is.name() + .map(|isn| format!("{isn}")) + .unwrap_or("(Unknown)".to_string()) + }) + .unwrap_or("(Unknown)".to_string()); + writeln!(f, "\tState: {instance_state}")?; + } else { + writeln!(f, "\tNo loaded instance")?; + } + Ok(()) + } +} diff --git a/rustv1/examples/ec2/src/getting_started/key_pair.rs b/rustv1/examples/ec2/src/getting_started/key_pair.rs new file mode 100644 index 00000000000..4528e555605 --- /dev/null +++ b/rustv1/examples/ec2/src/getting_started/key_pair.rs @@ -0,0 +1,93 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::{env, path::PathBuf}; + +use aws_sdk_ec2::types::KeyPairInfo; + +use crate::ec2::{EC2Error, EC2}; + +use super::util::Util; + +/// KeyPairManager tracks a KeyPairInfo and the path the private key has been +/// written to, if it's been created. +#[derive(Debug)] +pub struct KeyPairManager { + key_pair: KeyPairInfo, + key_file_path: Option<PathBuf>, + key_file_dir: PathBuf, +} + +impl KeyPairManager { + pub fn new() -> Self { + Self::default() + } + + pub fn key_pair(&self) -> &KeyPairInfo { + &self.key_pair + } + + pub fn key_file_path(&self) -> Option<&PathBuf> { + self.key_file_path.as_ref() + } + + pub fn key_file_dir(&self) -> &PathBuf { + &self.key_file_dir + } + + // snippet-start:[ec2.rust.create_key.wrapper] + /// Creates a key pair that can be used to securely connect to an EC2 instance. + /// The returned key pair contains private key information that cannot be retrieved + /// again. The private key data is stored as a .pem file. + /// + /// :param key_name: The name of the key pair to create. + pub async fn create( + &mut self, + ec2: &EC2, + util: &Util, + key_name: String, + ) -> Result<KeyPairInfo, EC2Error> { + let (key_pair, material) = ec2 + .create_key_pair(key_name.clone()) + .await + .map_err(|e| e.add_message(format!("Couldn't create key {key_name}")))?; + + let path = self.key_file_dir.join(format!("{key_name}.pem")); + + util.write_secure(&key_name, &path, material)?; + + self.key_file_path = Some(path); + self.key_pair = key_pair.clone(); + + Ok(key_pair) + } + // snippet-end:[ec2.rust.create_key.wrapper] + + // snippet-start:[ec2.rust.delete_key.wrapper] + pub async fn delete(self, ec2: &EC2, util: &Util) -> Result<(), EC2Error> { + if let Some(key_pair_id) = self.key_pair.key_pair_id() { + ec2.delete_key_pair(key_pair_id).await?; + if let Some(key_path) = self.key_file_path() { + if let Err(err) = util.remove(key_path) { + eprintln!("Failed to remove {key_path:?} ({err:?})"); + } + } + } + Ok(()) + } + // snippet-end:[ec2.rust.delete_key.wrapper] + + pub async fn list(&self, ec2: &EC2) -> Result<Vec<KeyPairInfo>, EC2Error> { + ec2.list_key_pair().await + } +} + +impl Default for KeyPairManager { + fn default() -> Self { + KeyPairManager { + key_pair: KeyPairInfo::builder().build(), + key_file_path: Default::default(), + key_file_dir: env::temp_dir(), + } + } +} diff --git a/rustv1/examples/ec2/src/getting_started/mod.rs b/rustv1/examples/ec2/src/getting_started/mod.rs new file mode 100644 index 00000000000..c107f27688c --- /dev/null +++ b/rustv1/examples/ec2/src/getting_started/mod.rs @@ -0,0 +1,13 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +pub mod elastic_ip; +pub mod instance; +pub mod key_pair; +pub mod scenario; +pub mod security_group; + +pub mod util; + +#[cfg(test)] +pub mod tests; diff --git a/rustv1/examples/ec2/src/getting_started/scenario.rs b/rustv1/examples/ec2/src/getting_started/scenario.rs new file mode 100644 index 00000000000..48ced2f9f3b --- /dev/null +++ b/rustv1/examples/ec2/src/getting_started/scenario.rs @@ -0,0 +1,358 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! Scenario that uses the AWS SDK for Rust (the SDK) with Amazon Elastic Compute Cloud +//! (Amazon EC2) to do the following: +//! +//! * Create a key pair that is used to secure SSH communication between your computer and +//! an EC2 instance. +//! * Create a security group that acts as a virtual firewall for your EC2 instances to +//! control incoming and outgoing traffic. +//! * Find an Amazon Machine Image (AMI) and a compatible instance type. +//! * Create an instance that is created from the instance type and AMI you select, and +//! is configured to use the security group and key pair created in this example. +//! * Stop and restart the instance. +//! * Create an Elastic IP address and associate it as a consistent IP address for your instance. +//! * Connect to your instance with SSH, using both its public IP address and your Elastic IP +//! address. +//! * Clean up all of the resources created by this example. + +use std::net::Ipv4Addr; + +use crate::{ + ec2::{EC2Error, EC2}, + getting_started::{key_pair::KeyPairManager, util::Util}, + ssm::SSM, +}; +use aws_sdk_ssm::types::Parameter; + +use super::{ + elastic_ip::ElasticIpManager, instance::InstanceManager, security_group::SecurityGroupManager, + util::ScenarioImage, +}; + +pub struct Ec2InstanceScenario { + ec2: EC2, + ssm: SSM, + util: Util, + key_pair_manager: KeyPairManager, + security_group_manager: SecurityGroupManager, + instance_manager: InstanceManager, + elastic_ip_manager: ElasticIpManager, +} + +impl Ec2InstanceScenario { + pub fn new(ec2: EC2, ssm: SSM, util: Util) -> Self { + Ec2InstanceScenario { + ec2, + ssm, + util, + key_pair_manager: Default::default(), + security_group_manager: Default::default(), + instance_manager: Default::default(), + elastic_ip_manager: Default::default(), + } + } + + pub async fn run(&mut self) -> Result<(), EC2Error> { + self.create_and_list_key_pairs().await?; + self.create_security_group().await?; + self.create_instance().await?; + self.stop_and_start_instance().await?; + self.associate_elastic_ip().await?; + self.stop_and_start_instance().await?; + Ok(()) + } + + /// 1. Creates an RSA key pair and saves its private key data as a .pem file in secure + /// temporary storage. The private key data is deleted after the example completes. + /// 2. Optionally, lists the first five key pairs for the current account. + pub async fn create_and_list_key_pairs(&mut self) -> Result<(), EC2Error> { + println!( "Let's create an RSA key pair that you can be use to securely connect to your EC2 instance."); + + let key_name = self.util.prompt_key_name()?; + + self.key_pair_manager + .create(&self.ec2, &self.util, key_name) + .await?; + + println!( + "Created a key pair {} and saved the private key to {:?}.", + self.key_pair_manager + .key_pair() + .key_name() + .ok_or_else(|| EC2Error::new("No key name after creating key"))?, + self.key_pair_manager + .key_file_path() + .ok_or_else(|| EC2Error::new("No key file after creating key"))? + ); + + if self.util.should_list_key_pairs()? { + for pair in self.key_pair_manager.list(&self.ec2).await? { + println!( + "Found {:?} key {} with fingerprint:\t{:?}", + pair.key_type(), + pair.key_name().unwrap_or("Unknown"), + pair.key_fingerprint() + ); + } + } + + Ok(()) + } + + /// 1. Creates a security group for the default VPC. + /// 2. Adds an inbound rule to allow SSH. The SSH rule allows only + /// inbound traffic from the current computer’s public IPv4 address. + /// 3. Displays information about the security group. + /// + /// This function uses <http://checkip.amazonaws.com> to get the current public IP + /// address of the computer that is running the example. This method works in most + /// cases. However, depending on how your computer connects to the internet, you + /// might have to manually add your public IP address to the security group by using + /// the AWS Management Console. + pub async fn create_security_group(&mut self) -> Result<(), EC2Error> { + println!("Let's create a security group to manage access to your instance."); + let group_name = self.util.prompt_security_group_name()?; + + self.security_group_manager + .create( + &self.ec2, + &group_name, + "Security group for example: get started with instances.", + ) + .await?; + + println!( + "Created security group {} in your default VPC {}.", + self.security_group_manager.group_name(), + self.security_group_manager + .vpc_id() + .unwrap_or("(unknown vpc)") + ); + + let check_ip = self.util.do_get("https://checkip.amazonaws.com").await?; + let current_ip_address: Ipv4Addr = check_ip.trim().parse().map_err(|e| { + EC2Error::new(format!( + "Failed to convert response {} to IP Address: {e:?}", + check_ip + )) + })?; + + println!("Your public IP address seems to be {current_ip_address}"); + if self.util.should_add_to_security_group() { + match self + .security_group_manager + .authorize_ingress(&self.ec2, current_ip_address) + .await + { + Ok(_) => println!("Security group rules updated"), + Err(err) => eprintln!("Couldn't update security group rules: {err:?}"), + } + } + println!("{}", self.security_group_manager); + + Ok(()) + } + + // snippet-start:[ec2.rust.create_instance.scenario] + /// 1. Gets a list of Amazon Linux 2 AMIs from AWS Systems Manager. Specifying the + /// '/aws/service/ami-amazon-linux-latest' path returns only the latest AMIs. + /// 2. Gets and displays information about the available AMIs and lets you select one. + /// 3. Gets a list of instance types that are compatible with the selected AMI and + /// lets you select one. + /// 4. Creates an instance with the previously created key pair and security group, + /// and the selected AMI and instance type. + /// 5. Waits for the instance to be running and then displays its information. + pub async fn create_instance(&mut self) -> Result<(), EC2Error> { + let ami = self.find_image().await?; + + let instance_types = self + .ec2 + .list_instance_types(&ami.0) + .await + .map_err(|e| e.add_message("Could not find instance types"))?; + println!( + "There are several instance types that support the {} architecture of the image.", + ami.0 + .architecture + .as_ref() + .ok_or_else(|| EC2Error::new(format!("Missing architecture in {:?}", ami.0)))? + ); + let instance_type = self.util.select_instance_type(instance_types)?; + + println!("Creating your instance and waiting for it to start..."); + self.instance_manager + .create( + &self.ec2, + ami.0 + .image_id() + .ok_or_else(|| EC2Error::new("Could not find image ID"))?, + instance_type, + self.key_pair_manager.key_pair(), + self.security_group_manager + .security_group() + .map(|sg| vec![sg]) + .ok_or_else(|| EC2Error::new("Could not find security group"))?, + ) + .await + .map_err(|e| e.add_message("Scenario failed to create instance"))?; + + while let Err(err) = self + .ec2 + .wait_for_instance_ready(self.instance_manager.instance_id(), None) + .await + { + println!("{err}"); + if !self.util.should_continue_waiting() { + return Err(err); + } + } + + println!("Your instance is ready:\n{}", self.instance_manager); + + self.display_ssh_info(); + + Ok(()) + } + // snippet-end:[ec2.rust.create_instance.scenario] + + // snippet-start:[ec2.rust.find_image.scenario] + async fn find_image(&mut self) -> Result<ScenarioImage, EC2Error> { + let params: Vec<Parameter> = self + .ssm + .list_path("/aws/service/ami-amazon-linux-latest") + .await + .map_err(|e| e.add_message("Could not find parameters for available images"))? + .into_iter() + .filter(|param| param.name().is_some_and(|name| name.contains("amzn2"))) + .collect(); + let amzn2_images: Vec<ScenarioImage> = self + .ec2 + .list_images(params) + .await + .map_err(|e| e.add_message("Could not find images"))? + .into_iter() + .map(ScenarioImage::from) + .collect(); + println!("We will now create an instance from an Amazon Linux 2 AMI"); + let ami = self.util.select_scenario_image(amzn2_images)?; + Ok(ami) + } + // snippet-end:[ec2.rust.find_image.scenario] + + // 1. Stops the instance and waits for it to stop. + // 2. Starts the instance and waits for it to start. + // 3. Displays information about the instance. + // 4. Displays an SSH connection string. When an Elastic IP address is associated + // with the instance, the IP address stays consistent when the instance stops + // and starts. + pub async fn stop_and_start_instance(&self) -> Result<(), EC2Error> { + println!("Let's stop and start your instance to see what changes."); + println!("Stopping your instance and waiting until it's stopped..."); + self.instance_manager.stop(&self.ec2).await?; + println!("Your instance is stopped. Restarting..."); + self.instance_manager.start(&self.ec2).await?; + println!("Your instance is running."); + println!("{}", self.instance_manager); + if self.elastic_ip_manager.public_ip() == "0.0.0.0" { + println!("Every time your instance is restarted, its public IP address changes."); + } else { + println!( + "Because you have associated an Elastic IP with your instance, you can connect by using a consistent IP address after the instance restarts." + ); + } + self.display_ssh_info(); + Ok(()) + } + + /// 1. Allocates an Elastic IP address and associates it with the instance. + /// 2. Displays an SSH connection string that uses the Elastic IP address. + async fn associate_elastic_ip(&mut self) -> Result<(), EC2Error> { + self.elastic_ip_manager.allocate(&self.ec2).await?; + println!( + "Allocated static Elastic IP address: {}", + self.elastic_ip_manager.public_ip() + ); + + self.elastic_ip_manager + .associate(&self.ec2, self.instance_manager.instance_id()) + .await?; + println!("Associated your Elastic IP with your instance."); + println!("You can now use SSH to connect to your instance by using the Elastic IP."); + self.display_ssh_info(); + Ok(()) + } + + /// Displays an SSH connection string that can be used to connect to a running + /// instance. + fn display_ssh_info(&self) { + let ip_addr = if self.elastic_ip_manager.has_allocation() { + self.elastic_ip_manager.public_ip() + } else { + self.instance_manager.instance_ip() + }; + let key_file_path = self.key_pair_manager.key_file_path().unwrap(); + println!("To connect, open another command prompt and run the following command:"); + println!("\nssh -i {} ec2-user@{ip_addr}\n", key_file_path.display()); + let _ = self.util.enter_to_continue(); + } + + /// 1. Disassociate and delete the previously created Elastic IP. + /// 2. Terminate the previously created instance. + /// 3. Delete the previously created security group. + /// 4. Delete the previously created key pair. + pub async fn clean_up(self) { + println!("Let's clean everything up. This example created these resources:"); + println!( + "\tKey pair: {}", + self.key_pair_manager + .key_pair() + .key_name() + .unwrap_or("(unknown key pair)") + ); + println!( + "\tSecurity group: {}", + self.security_group_manager.group_name() + ); + println!( + "\tInstance: {}", + self.instance_manager.instance_display_name() + ); + if self.util.should_clean_resources() { + if let Err(err) = self.elastic_ip_manager.remove(&self.ec2).await { + eprintln!("{err}") + } + if let Err(err) = self.instance_manager.delete(&self.ec2).await { + eprintln!("{err}") + } + if let Err(err) = self.security_group_manager.delete(&self.ec2).await { + eprintln!("{err}"); + } + if let Err(err) = self.key_pair_manager.delete(&self.ec2, &self.util).await { + eprintln!("{err}"); + } + } else { + println!("Ok, not cleaning up any resources!"); + } + } +} + +pub async fn run(mut scenario: Ec2InstanceScenario) { + println!("--------------------------------------------------------------------------------"); + println!( + "Welcome to the Amazon Elastic Compute Cloud (Amazon EC2) get started with instances demo." + ); + println!("--------------------------------------------------------------------------------"); + + if let Err(err) = scenario.run().await { + eprintln!("There was an error running the scenario: {err}") + } + + println!("--------------------------------------------------------------------------------"); + + scenario.clean_up().await; + + println!("Thanks for running!"); + println!("--------------------------------------------------------------------------------"); +} diff --git a/rustv1/examples/ec2/src/getting_started/security_group.rs b/rustv1/examples/ec2/src/getting_started/security_group.rs new file mode 100644 index 00000000000..e22fb471112 --- /dev/null +++ b/rustv1/examples/ec2/src/getting_started/security_group.rs @@ -0,0 +1,98 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::net::Ipv4Addr; + +use aws_sdk_ec2::types::SecurityGroup; + +use crate::ec2::{EC2Error, EC2}; + +/// SecurityGroupManager tracks the lifecycle of a SecurityGroup for an instance, +/// including adding a rule to allow SSH from a public IP address. +#[derive(Debug, Default)] +pub struct SecurityGroupManager { + group_name: String, + group_description: String, + security_group: Option<SecurityGroup>, +} + +impl SecurityGroupManager { + pub async fn create( + &mut self, + ec2: &EC2, + group_name: &str, + group_description: &str, + ) -> Result<(), EC2Error> { + self.group_name = group_name.into(); + self.group_description = group_description.into(); + + self.security_group = Some( + ec2.create_security_group(group_name, group_description) + .await + .map_err(|e| e.add_message("Couldn't create security group"))?, + ); + + Ok(()) + } + + pub async fn authorize_ingress(&self, ec2: &EC2, ip_address: Ipv4Addr) -> Result<(), EC2Error> { + if let Some(sg) = &self.security_group { + ec2.authorize_security_group_ssh_ingress( + sg.group_id() + .ok_or_else(|| EC2Error::new("Missing security group ID"))?, + vec![ip_address], + ) + .await?; + }; + + Ok(()) + } + + pub async fn delete(self, ec2: &EC2) -> Result<(), EC2Error> { + if let Some(sg) = &self.security_group { + ec2.delete_security_group( + sg.group_id() + .ok_or_else(|| EC2Error::new("Missing security group ID"))?, + ) + .await?; + }; + + Ok(()) + } + + pub fn group_name(&self) -> &str { + &self.group_name + } + + pub fn vpc_id(&self) -> Option<&str> { + self.security_group.as_ref().and_then(|sg| sg.vpc_id()) + } + + pub fn security_group(&self) -> Option<&SecurityGroup> { + self.security_group.as_ref() + } +} + +impl std::fmt::Display for SecurityGroupManager { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match &self.security_group { + Some(sg) => { + writeln!( + f, + "Security group: {}", + sg.group_name().unwrap_or("(unknown group)") + )?; + writeln!(f, "\tID: {}", sg.group_id().unwrap_or("(unknown group id)"))?; + writeln!(f, "\tVPC: {}", sg.vpc_id().unwrap_or("(unknown group vpc)"))?; + if !sg.ip_permissions().is_empty() { + writeln!(f, "\tInbound Permissions:")?; + for permission in sg.ip_permissions() { + writeln!(f, "\t\t{permission:?}")?; + } + } + Ok(()) + } + None => writeln!(f, "No security group loaded."), + } + } +} diff --git a/rustv1/examples/ec2/src/getting_started/tests/mod.rs b/rustv1/examples/ec2/src/getting_started/tests/mod.rs new file mode 100644 index 00000000000..3b6a54fcaa3 --- /dev/null +++ b/rustv1/examples/ec2/src/getting_started/tests/mod.rs @@ -0,0 +1,5 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// List test modules here. This mod.rs is gated by #[cfg(test)] in the crate mod.rs. +pub mod scenario_with_mocks; diff --git a/rustv1/examples/ec2/src/getting_started/tests/scenario_with_mocks.rs b/rustv1/examples/ec2/src/getting_started/tests/scenario_with_mocks.rs new file mode 100644 index 00000000000..308c40036ae --- /dev/null +++ b/rustv1/examples/ec2/src/getting_started/tests/scenario_with_mocks.rs @@ -0,0 +1,607 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::{net::Ipv4Addr, path::PathBuf}; + +use aws_sdk_ec2::{ + operation::{ + allocate_address::AllocateAddressOutput, associate_address::AssociateAddressOutput, + }, + types::{ArchitectureValues, Image, Instance, InstanceType, KeyPairInfo, SecurityGroup}, +}; +use aws_sdk_ssm::types::Parameter; +use mockall::predicate::{self, eq}; + +use crate::{ + ec2::{EC2Error, MockEC2Impl}, + getting_started::{ + scenario::{run, Ec2InstanceScenario}, + util::MockUtilImpl, + }, + ssm::MockSSMImpl, +}; + +#[tokio::test] +async fn test_happy_path() { + let mut mock_ec2 = MockEC2Impl::default(); + let mut mock_ssm = MockSSMImpl::default(); + let mut mock_util = MockUtilImpl::default(); + + // create_and_list_key_pairs + { + mock_util + .expect_prompt_key_name() + .returning(|| Ok("test_key".into())); + + // create + { + mock_ec2 + .expect_create_key_pair() + .with(eq("test_key".to_string())) + .returning(|_| { + Ok(( + KeyPairInfo::builder() + .key_name("test_key") + .key_pair_id("kp-12345") + .build(), + "PEM MATERIAL".into(), + )) + }); + + mock_util + .expect_write_secure() + .with( + eq("test_key"), + predicate::function(|path: &PathBuf| path.ends_with("test_key.pem")), + eq("PEM MATERIAL".to_string()), + ) + .returning(|_, _, _| Ok(())); + } + + mock_util + .expect_should_list_key_pairs() + .returning(|| Ok(false)); + } + // create_security_group + { + mock_util + .expect_prompt_security_group_name() + .returning(|| Ok("test_group".into())); + + // security_group_manager.create + { + mock_ec2 + .expect_create_security_group() + .with( + eq("test_group"), + eq("Security group for example: get started with instances."), + ) + .returning(|_, _| { + Ok(SecurityGroup::builder() + .group_id("sg-0123") + .group_name("test_group") + .build()) + }); + } + + mock_util + .expect_do_get() + .with(eq("https://checkip.amazonaws.com")) + .returning(|_| Ok("192.168.0.1".into())); + + mock_util + .expect_should_add_to_security_group() + .returning(|| true); + + // security_group_manager.authorize_ingress + { + mock_ec2 + .expect_authorize_security_group_ssh_ingress() + .with(eq("sg-0123"), eq(vec![Ipv4Addr::new(192, 168, 0, 1)])) + .returning(|_, _| Ok(())); + } + } + + // create_instance + { + // find_image + { + mock_ssm + .expect_list_path() + .with(eq("/aws/service/ami-amazon-linux-latest")) + .returning(|_| { + Ok(vec![ + Parameter::builder() + .name("amzn2-ami1") + .value("amzn2-ami1") + .build(), + Parameter::builder() + .name("amzn2-ami2") + .value("amzn2-ami2") + .build(), + ]) + }); + mock_ec2 + .expect_list_images() + .with(eq(vec![ + Parameter::builder() + .name("amzn2-ami1") + .value("amzn2-ami1") + .build(), + Parameter::builder() + .name("amzn2-ami2") + .value("amzn2-ami2") + .build(), + ])) + .returning(|_| { + Ok(vec![ + aws_sdk_ec2::types::Image::builder() + .architecture(ArchitectureValues::X8664) + .image_id("img-1234_x64") + .build(), + aws_sdk_ec2::types::Image::builder() + .architecture(ArchitectureValues::Arm64) + .image_id("img-1234_arm") + .build(), + ]) + }); + + mock_util + .expect_select_scenario_image() + .with(eq(vec![ + Image::builder() + .architecture(ArchitectureValues::X8664) + .image_id("img-1234_x64") + .build() + .into(), + Image::builder() + .architecture(ArchitectureValues::Arm64) + .image_id("img-1234_arm") + .build() + .into(), + ])) + .returning(|_| { + Ok(Image::builder() + .architecture(ArchitectureValues::Arm64) + .image_id("img-1234_arm") + .build() + .into()) + }); + } + + mock_ec2 + .expect_list_instance_types() + .withf(|image| { + image.architecture == Some(ArchitectureValues::Arm64) + && image.image_id() == Some("img-1234_arm") + }) + .returning(|_| Ok(vec![InstanceType::T1Micro, InstanceType::A1Medium])); + + mock_util + .expect_select_instance_type() + .with(eq(vec![InstanceType::T1Micro, InstanceType::A1Medium])) + .returning(|_| Ok(InstanceType::T1Micro)); + + // instance_manager.create + { + mock_ec2 + .expect_create_instance() + .withf(|image_id, instance_type, keypair_info, sgs| { + image_id == "img-1234_arm" + && *instance_type == InstanceType::T1Micro + && keypair_info.key_name() == Some("test_key") + && sgs[0].group_id() == Some("sg-0123") + }) + .returning(|_, _, _, _| Ok("i-01234567".into())); + + mock_ec2 + .expect_describe_instance() + .with(eq("i-01234567")) + .returning(|_| { + Ok(Instance::builder() + .architecture(ArchitectureValues::Arm64) + .instance_id("i-01234567") + .build()) + }); + } + + mock_ec2 + .expect_wait_for_instance_ready() + .times(1) + .with(eq("i-01234567"), eq(None)) + .returning(|_, _| { + Err(EC2Error::new( + "Exceeded max time (60s) waiting for instance to start.", + )) + }); + + mock_util + .expect_should_continue_waiting() + .returning(|| true); + + mock_ec2 + .expect_wait_for_instance_ready() + .times(1) + .with(eq("i-01234567"), eq(None)) + .returning(|_, _| Ok(())); + + // display_ssh_info + { + mock_util + .expect_enter_to_continue() + .returning(|| Ok("".into())); + } + } + + // stop_and_start_instance 1 + { + // stop + { + mock_ec2 + .expect_stop_instance() + .with(eq("i-01234567")) + .returning(|_| Ok(())); + } + + // start + { + mock_ec2 + .expect_start_instance() + .with(eq("i-01234567")) + .returning(|_| Ok(())); + } + + // display_ssh_info + { + mock_util + .expect_enter_to_continue() + .returning(|| Ok("".into())); + } + } + + // associate_elastic_ip + { + // elastic_ip_manager.allocate + { + mock_ec2.expect_allocate_ip_address().returning(|| { + Ok(AllocateAddressOutput::builder() + .allocation_id("eip-1234567") + .build()) + }); + } + + // elastic_ip_manager.associate + { + mock_ec2 + .expect_associate_ip_address() + .with(eq("eip-1234567"), eq("i-01234567")) + .returning(|_, _| { + Ok(AssociateAddressOutput::builder() + .association_id("aid-01234567") + .build()) + }); + } + + // display_ssh_info + { + mock_util + .expect_enter_to_continue() + .returning(|| Ok("".into())); + } + } + + // stop_and_start_instance 2 + { + // stop + { + mock_ec2 + .expect_stop_instance() + .with(eq("i-01234567")) + .returning(|_| Ok(())); + } + + // start + { + mock_ec2 + .expect_start_instance() + .with(eq("i-01234567")) + .returning(|_| Ok(())); + } + + // display_ssh_info + { + mock_util + .expect_enter_to_continue() + .returning(|| Ok("".into())); + } + } + + // clean_up + { + mock_util.expect_should_clean_resources().returning(|| true); + + // elastic_ip_manager.remove + { + mock_ec2 + .expect_disassociate_ip_address() + .with(eq("aid-01234567")) + .returning(|_| Ok(())); + + mock_ec2 + .expect_deallocate_ip_address() + .with(eq("eip-1234567")) + .returning(|_| Ok(())); + } + + // instance_manager.delete + { + mock_ec2 + .expect_delete_instance() + .with(eq("i-01234567")) + .returning(|_| Ok(())); + } + + // security_group_manager.delete + { + mock_ec2 + .expect_delete_security_group() + .with(eq("sg-0123")) + .returning(|_| Ok(())); + } + + // key_pair_manager.delete + { + mock_ec2 + .expect_delete_key_pair() + .with(eq("kp-12345")) + .returning(|_| Ok(())); + + mock_util + .expect_remove() + .withf(|p| format!("{p:?}").contains("test_key.pem")) + .returning(|_| Ok(())); + } + } + + let scenario = Ec2InstanceScenario::new(mock_ec2, mock_ssm, mock_util); + + run(scenario).await; +} + +#[tokio::test] +async fn test_unhappy_path_instance_takes_too_long() { + let mut mock_ec2 = MockEC2Impl::default(); + let mut mock_ssm = MockSSMImpl::default(); + let mut mock_util = MockUtilImpl::default(); + + // create_and_list_key_pairs + { + mock_util + .expect_prompt_key_name() + .returning(|| Ok("test_key".into())); + + // create + { + mock_ec2 + .expect_create_key_pair() + .with(eq("test_key".to_string())) + .returning(|_| { + Ok(( + KeyPairInfo::builder() + .key_name("test_key") + .key_pair_id("kp-12345") + .build(), + "PEM MATERIAL".into(), + )) + }); + + mock_util + .expect_write_secure() + .with( + eq("test_key"), + predicate::function(|path: &PathBuf| path.ends_with("test_key.pem")), + eq("PEM MATERIAL".to_string()), + ) + .returning(|_, _, _| Ok(())); + } + + mock_util + .expect_should_list_key_pairs() + .returning(|| Ok(false)); + } + // create_security_group + { + mock_util + .expect_prompt_security_group_name() + .returning(|| Ok("test_group".into())); + + // security_group_manager.create + { + mock_ec2 + .expect_create_security_group() + .with( + eq("test_group"), + eq("Security group for example: get started with instances."), + ) + .returning(|_, _| { + Ok(SecurityGroup::builder() + .group_id("sg-0123") + .group_name("test_group") + .build()) + }); + } + + mock_util + .expect_do_get() + .with(eq("https://checkip.amazonaws.com")) + .returning(|_| Ok("192.168.0.1".into())); + + mock_util + .expect_should_add_to_security_group() + .returning(|| true); + + // security_group_manager.authorize_ingress + { + mock_ec2 + .expect_authorize_security_group_ssh_ingress() + .with(eq("sg-0123"), eq(vec![Ipv4Addr::new(192, 168, 0, 1)])) + .returning(|_, _| Ok(())); + } + } + + // create_instance + { + // find_image + { + mock_ssm + .expect_list_path() + .with(eq("/aws/service/ami-amazon-linux-latest")) + .returning(|_| { + Ok(vec![ + Parameter::builder() + .name("amzn2-ami1") + .value("amzn2-ami1") + .build(), + Parameter::builder() + .name("amzn2-ami2") + .value("amzn2-ami2") + .build(), + ]) + }); + mock_ec2 + .expect_list_images() + .with(eq(vec![ + Parameter::builder() + .name("amzn2-ami1") + .value("amzn2-ami1") + .build(), + Parameter::builder() + .name("amzn2-ami2") + .value("amzn2-ami2") + .build(), + ])) + .returning(|_| { + Ok(vec![ + aws_sdk_ec2::types::Image::builder() + .architecture(ArchitectureValues::X8664) + .image_id("img-1234_x64") + .build(), + aws_sdk_ec2::types::Image::builder() + .architecture(ArchitectureValues::Arm64) + .image_id("img-1234_arm") + .build(), + ]) + }); + + mock_util + .expect_select_scenario_image() + .with(eq(vec![ + Image::builder() + .architecture(ArchitectureValues::X8664) + .image_id("img-1234_x64") + .build() + .into(), + Image::builder() + .architecture(ArchitectureValues::Arm64) + .image_id("img-1234_arm") + .build() + .into(), + ])) + .returning(|_| { + Ok(Image::builder() + .architecture(ArchitectureValues::Arm64) + .image_id("img-1234_arm") + .build() + .into()) + }); + } + + mock_ec2 + .expect_list_instance_types() + .withf(|image| { + image.architecture == Some(ArchitectureValues::Arm64) + && image.image_id() == Some("img-1234_arm") + }) + .returning(|_| Ok(vec![InstanceType::T1Micro, InstanceType::A1Medium])); + + mock_util + .expect_select_instance_type() + .with(eq(vec![InstanceType::T1Micro, InstanceType::A1Medium])) + .returning(|_| Ok(InstanceType::T1Micro)); + + // instance_manager.create + { + mock_ec2 + .expect_create_instance() + .withf(|image_id, instance_type, keypair_info, sgs| { + image_id == "img-1234_arm" + && *instance_type == InstanceType::T1Micro + && keypair_info.key_name() == Some("test_key") + && sgs[0].group_id() == Some("sg-0123") + }) + .returning(|_, _, _, _| Ok("i-01234567".into())); + + mock_ec2 + .expect_describe_instance() + .with(eq("i-01234567")) + .returning(|_| { + Ok(Instance::builder() + .architecture(ArchitectureValues::Arm64) + .instance_id("i-01234567") + .build()) + }); + } + + mock_ec2 + .expect_wait_for_instance_ready() + .times(1) + .with(eq("i-01234567"), eq(None)) + .returning(|_, _| { + Err(EC2Error::new( + "Exceeded max time (60s) waiting for instance to start.", + )) + }); + + mock_util + .expect_should_continue_waiting() + .returning(|| false); + } + + // clean_up + { + mock_util.expect_should_clean_resources().returning(|| true); + + // instance_manager.delete + { + mock_ec2 + .expect_delete_instance() + .with(eq("i-01234567")) + .returning(|_| Ok(())); + } + + // security_group_manager.delete + { + mock_ec2 + .expect_delete_security_group() + .with(eq("sg-0123")) + .returning(|_| Ok(())); + } + + // key_pair_manager.delete + { + mock_ec2 + .expect_delete_key_pair() + .with(eq("kp-12345")) + .returning(|_| Ok(())); + + mock_util + .expect_remove() + .withf(|p| format!("{p:?}").contains("test_key.pem")) + .returning(|_| Ok(())); + } + } + + let scenario = Ec2InstanceScenario::new(mock_ec2, mock_ssm, mock_util); + + run(scenario).await; +} diff --git a/rustv1/examples/ec2/src/getting_started/util.rs b/rustv1/examples/ec2/src/getting_started/util.rs new file mode 100644 index 00000000000..c6155857e91 --- /dev/null +++ b/rustv1/examples/ec2/src/getting_started/util.rs @@ -0,0 +1,164 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! IO Utilities wrapper to allow automock for requests and user input prompts. + +use std::{fmt::Display, io::Write, path::PathBuf}; + +use inquire::{validator::ValueRequiredValidator, InquireError}; + +use aws_sdk_ec2::types::Image; + +use crate::ec2::EC2Error; + +#[cfg(test)] +use mockall::automock; + +#[cfg(not(test))] +pub use UtilImpl as Util; + +#[cfg(test)] +pub use MockUtilImpl as Util; + +#[derive(Default)] +pub struct UtilImpl; + +#[cfg_attr(test, automock)] +impl UtilImpl { + pub fn prompt_key_name(&self) -> Result<String, EC2Error> { + inquire::Text::new("Enter a unique name for your key: ") + .with_validator(ValueRequiredValidator::default()) + .with_default("my_key") + .prompt() + .map_err(|e| EC2Error::new(format!("Failed to get name for key pair. {e:?}"))) + } + pub fn should_clean_resources(&self) -> bool { + inquire::Confirm::new("Clean up resources?") + .with_default(true) + .prompt() + .unwrap_or(false) + } + + pub fn enter_to_continue(&self) -> Result<String, InquireError> { + inquire::Text::new("Press Enter when you're ready to continue the demo.").prompt() + } + + pub fn select_scenario_image( + &self, + amzn2_images: Vec<ScenarioImage>, + ) -> Result<ScenarioImage, EC2Error> { + inquire::Select::new( + "Select an Amazon Linux 2 AMI for this instance", + amzn2_images, + ) + .prompt() + .map_err(|e| EC2Error::new(format!("Could not determine desired AMI ({e:?})"))) + } + + pub fn should_continue_waiting(&self) -> bool { + inquire::Confirm::new("Continue waiting?") + .with_default(true) + .prompt() + .unwrap_or(false) + } + + pub fn select_instance_type( + &self, + instance_types: Vec<aws_sdk_ec2::types::InstanceType>, + ) -> Result<aws_sdk_ec2::types::InstanceType, EC2Error> { + inquire::Select::new("Select an instance type for this instance:", instance_types) + .prompt() + .map_err(|e| { + EC2Error::new(format!( + "Could not determine the desired instance type ({e:?})" + )) + }) + } + + pub fn should_add_to_security_group(&self) -> bool { + inquire::Confirm::new("Add this rule to your security group?") + .with_default(true) + .prompt() + .unwrap_or(true) + } + + pub fn prompt_security_group_name(&self) -> Result<String, EC2Error> { + inquire::Text::new("Enter a unique name for your security group: ") + .with_validator(ValueRequiredValidator::default()) + .with_default("my_group") + .prompt() + .map_err(|e| EC2Error::new(format!("Failed to get name for security group! {e:?}"))) + } + + pub fn should_list_key_pairs(&self) -> Result<bool, EC2Error> { + inquire::Confirm::new("Do you want to list some of your key pairs?") + .with_default(false) + .prompt() + .or(Ok(false)) + .map_err(|e: InquireError| EC2Error::new(format!("Failed to ask question. {e:?}"))) + } + + /// Utility to perform a GET request and return the body as UTF-8, or an appropriate EC2Error. + pub async fn do_get(&self, url: &str) -> Result<String, EC2Error> { + reqwest::get(url) + .await + .map_err(|e| EC2Error::new(format!("Could not request ip from {url}: {e:?}")))? + .error_for_status() + .map_err(|e| EC2Error::new(format!("Failure status from {url}: {e:?}")))? + .text_with_charset("utf-8") + .await + .map_err(|e| EC2Error::new(format!("Failed to read response from {url}: {e:?}"))) + } + + pub fn write_secure( + &self, + key_name: &str, + path: &PathBuf, + material: String, + ) -> Result<(), EC2Error> { + let mut file = open_file_0600(path)?; + file.write(material.as_bytes()).map_err(|e| { + EC2Error::new(format!("Failed to write {key_name} to {path:?} ({e:?})")) + })?; + Ok(()) + } + + pub fn remove(&self, path: &PathBuf) -> std::io::Result<()> { + std::fs::remove_file(path) + } +} + +#[cfg(unix)] +fn open_file_0600(path: &PathBuf) -> Result<std::fs::File, EC2Error> { + use std::os::unix::fs::OpenOptionsExt; + std::fs::OpenOptions::new() + .mode(0o600) + .open(path.clone()) + .map_err(|e| EC2Error::new(format!("Failed to create {path:?} ({e:?})"))) +} + +#[cfg(not(unix))] +fn open_file(path: &PathBuf) -> Result<File, EC2Error> { + fs::File::create(path.clone()) + .map_err(|e| EC2Error::new(format!("Failed to create {path:?} ({e:?})")))? +} + +/// Image doesn't impl Display, which is necessary for inquire to use it in a Select. +/// This wraps Image and provides a Display impl. +#[derive(PartialEq, Debug)] +pub struct ScenarioImage(pub Image); +impl From<Image> for ScenarioImage { + fn from(value: Image) -> Self { + ScenarioImage(value) + } +} +impl Display for ScenarioImage { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}: {}", + self.0.name().unwrap_or("(unknown)"), + self.0.description().unwrap_or("unknown") + ) + } +} diff --git a/rustv1/examples/ec2/src/lib.rs b/rustv1/examples/ec2/src/lib.rs new file mode 100644 index 00000000000..563ba936864 --- /dev/null +++ b/rustv1/examples/ec2/src/lib.rs @@ -0,0 +1,6 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +pub mod ec2; +pub mod getting_started; +pub mod ssm; diff --git a/rustv1/examples/ec2/src/ssm.rs b/rustv1/examples/ec2/src/ssm.rs new file mode 100644 index 00000000000..ce306d6e9d8 --- /dev/null +++ b/rustv1/examples/ec2/src/ssm.rs @@ -0,0 +1,47 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +use aws_sdk_ssm::{types::Parameter, Client}; +use aws_smithy_async::future::pagination_stream::TryFlatMap; + +use crate::ec2::EC2Error; + +#[cfg(test)] +use mockall::automock; + +#[cfg(not(test))] +pub use SSMImpl as SSM; + +#[cfg(test)] +pub use MockSSMImpl as SSM; + +pub struct SSMImpl { + inner: Client, +} + +#[cfg_attr(test, automock)] +impl SSMImpl { + pub fn new(inner: Client) -> Self { + SSMImpl { inner } + } + + // snippet-start:[ec2.rust.ssm_list_path.impl] + pub async fn list_path(&self, path: &str) -> Result<Vec<Parameter>, EC2Error> { + let maybe_params: Vec<Result<Parameter, _>> = TryFlatMap::new( + self.inner + .get_parameters_by_path() + .path(path) + .into_paginator() + .send(), + ) + .flat_map(|item| item.parameters.unwrap_or_default()) + .collect() + .await; + // Fail on the first error + let params = maybe_params + .into_iter() + .collect::<Result<Vec<Parameter>, _>>()?; + Ok(params) + } + // snippet-end:[ec2.rust.ssm_list_path.impl] +} diff --git a/rustv1/examples/ssm/README.md b/rustv1/examples/ssm/README.md index 276729cece6..9a1886562f5 100644 --- a/rustv1/examples/ssm/README.md +++ b/rustv1/examples/ssm/README.md @@ -34,6 +34,7 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv Code excerpts that show you how to call individual service functions. - [DescribeParameters](src/bin/describe-parameters.rs#L22) +- [GetParameter](../ec2/src/ssm.rs#L28) - [PutParameter](src/bin/create-parameter.rs#L35) From e2c0e4be967f2bbe13ccb6c80f1ef2dd4f2a1249 Mon Sep 17 00:00:00 2001 From: Laren-AWS <57545972+Laren-AWS@users.noreply.github.com> Date: Fri, 9 Aug 2024 14:14:14 -0700 Subject: [PATCH 24/98] SOS: Bundle personalize services (#6721) --- .doc_gen/metadata/services.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.doc_gen/metadata/services.yaml b/.doc_gen/metadata/services.yaml index f885bf96ee2..f3358ce1dfa 100644 --- a/.doc_gen/metadata/services.yaml +++ b/.doc_gen/metadata/services.yaml @@ -2325,6 +2325,7 @@ payment-cryptography-data: product_categories: {} version: '2022-02-03' personalize: + bundle: personalize long: "&PERSlong;" short: "&PERS;" sort: Personalize @@ -2340,6 +2341,7 @@ personalize: product_categories: {'Machine Learning & AI'} version: personalize-2018-05-22 personalize-runtime: + bundle: personalize long: "&PERSRlong;" short: "&PERSR;" sort: Personalize Runtime @@ -2355,6 +2357,7 @@ personalize-runtime: product_categories: {'Machine Learning & AI'} version: personalize-runtime-2018-05-22 personalize-events: + bundle: personalize long: "&PERSElong;" short: "&PERSE;" sort: Personalize Events From ffc84c8d8a9178b0dfb4daca0a83f5f1d4685e5f Mon Sep 17 00:00:00 2001 From: Corey Pyle <corepyle@amazon.com> Date: Mon, 12 Aug 2024 14:09:19 -0400 Subject: [PATCH 25/98] JavaScript (v3): Libs - Add more common steps, allow for default values, and refactor. (#6720) --- .../example_code/libs/scenario/index.js | 8 + .../example_code/libs/scenario/scenario.js | 166 +++++++++++++++--- .../libs/scenario/steps-common.js | 19 +- .../health-image-sets/import-steps.js | 1 + .../health-image-sets/verify-steps.js | 1 + .../tests/hlth-img-deploy.unit.test.js | 1 + .../tests/hlth-img-image-frame.unit.test.js | 1 + .../tests/hlth-img-import.unit.test.js | 1 + .../tests/hlth-img-verify.unit.test.js | 1 + .../tests/htl-img-image-set.unit.test.js | 1 + 10 files changed, 168 insertions(+), 32 deletions(-) diff --git a/javascriptv3/example_code/libs/scenario/index.js b/javascriptv3/example_code/libs/scenario/index.js index eaa95d7ac30..04450e02d34 100644 --- a/javascriptv3/example_code/libs/scenario/index.js +++ b/javascriptv3/example_code/libs/scenario/index.js @@ -1,4 +1,12 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +import * as scenario from "./scenario.js"; +import * as scenarioParser from "./scenario-parser.js"; + export * from "./scenario.js"; export * from "./scenario-parser.js"; + +export default { + ...scenario, + ...scenarioParser, +}; diff --git a/javascriptv3/example_code/libs/scenario/scenario.js b/javascriptv3/example_code/libs/scenario/scenario.js index 3853ebd9457..a90867d951d 100644 --- a/javascriptv3/example_code/libs/scenario/scenario.js +++ b/javascriptv3/example_code/libs/scenario/scenario.js @@ -110,7 +110,8 @@ export class ScenarioOutput extends Step { /** * @typedef {{ * type: "confirm" | "input" | "multi-select" | "select", - * choices: (string | { name: string, value: string })[] } + * choices: (string | { name: string, value: string })[], + * default: string | string[] | boolean } * } ScenarioInputOptions */ @@ -133,52 +134,154 @@ export class ScenarioInput extends Step { * @param {Record<string, any>} state * @param {StepHandlerOptions} [stepHandlerOptions] */ - async handle(state, stepHandlerOptions) { + async handle(state, stepHandlerOptions = {}) { if (this.stepOptions.skipWhen(state)) { console.log(`Skipping step: ${this.name}`); return; } super.handle(state, stepHandlerOptions); - const message = + + if (stepHandlerOptions.confirmAll && this.stepOptions.default) { + state[this.name] = this.stepOptions.default; + return state[this.name]; + } else if (stepHandlerOptions.confirmAll && !this.stepOptions.default) { + if (this.stepOptions?.type === "confirm") { + state[this.name] = true; + return true; + } + throw new Error( + `Error handling ScenarioInput. confirmAll was selected for ${this.name} but no default was provided.`, + ); + } + + const message = this._getPrompt(state); + + switch (this.stepOptions?.type) { + case "multi-select": + await this._handleMultiSelect(state, message); + break; + case "select": + await this._handleSelect(state, message); + break; + case "input": + await this._handleInput(state, message); + break; + case "confirm": + await this._handleConfirm(state, message); + break; + default: + throw new Error( + `Error handling ScenarioInput, ${this.stepOptions?.type} is not supported.`, + ); + } + + return state[this.name]; + } + + /** + * @param {Record<string, any>} state + */ + _getPrompt(state) { + const prompt = typeof this.prompt === "function" ? this.prompt(state) : this.prompt; + const message = + this.stepOptions.type !== "confirm" && this.stepOptions.default + ? `${prompt} (${this.stepOptions.default})` + : prompt; + if (!message) { - return; + throw new Error(`Error handling ScenarioInput. Missing prompt.`); + } + + return message; + } + + _getChoices() { + if (this.choices) { + return this.choices; } - const choices = + this.choices = this.stepOptions?.choices && typeof this.stepOptions?.choices[0] === "string" ? this.stepOptions?.choices.map((s) => ({ name: s, value: s })) : this.stepOptions?.choices; - if (this.stepOptions?.type === "multi-select") { - state[this.name] = await this.prompter.checkbox({ - message, - choices, - }); - } else if (this.stepOptions?.type === "select") { - state[this.name] = await this.prompter.select({ + return this.choices; + } + + /** + * @param {Record<string, any>} state + * @param {string} message + */ + async _handleMultiSelect(state, message) { + const result = await this.prompter.checkbox({ + message, + choices: this._getChoices(), + }); + + if (!result.length && this.stepOptions.default) { + state[this.name] = this.stepOptions.default; + } else if (!result.length) { + throw new Error( + `Error handing ScenarioInput. Result of ${this.name} was empty.`, + ); + } else { + state[this.name] = result; + } + } + + /** + * @param {Record<string, any>} state + * @param {string} message + */ + async _handleSelect(state, message) { + if (this.stepOptions?.type === "select") { + const result = await this.prompter.select({ message, - choices, + choices: this._getChoices(), }); - } else if (this.stepOptions?.type === "input") { - state[this.name] = await this.prompter.input({ message }); - } else if (this.stepOptions?.type === "confirm") { - if (stepHandlerOptions?.confirmAll) { - state[this.name] = true; - return true; + + if (!result && this.stepOptions.default) { + state[this.name] = this.stepOptions.default; + } else if (!result) { + throw new Error( + `Error handing ScenarioInput. Result of ${this.name} was empty.`, + ); + } else { + state[this.name] = result; } + } + } - state[this.name] = await this.prompter.confirm({ - message, - }); - } else { + /** + * @param {Record<string, any>} state + * @param {string} message + */ + async _handleInput(state, message) { + const result = await this.prompter.input({ message }); + + if (!result && this.stepOptions.default) { + state[this.name] = this.stepOptions.default; + } else if (!result) { throw new Error( - `Error handling ScenarioInput, ${this.stepOptions?.type} is not supported.`, + `Error handing ScenarioInput. Result of ${this.name} was empty.`, ); + } else { + state[this.name] = result; } + } - return state[this.name]; + /** + * @param {Record<string, any>} state + * @param {string} message + */ + async _handleConfirm(state, message) { + const result = await this.prompter.confirm({ + message, + }); + + state[this.name] = result; } } @@ -240,9 +343,9 @@ export class ScenarioAction extends Step { export class Scenario { /** - * @type {Record<string, any>} + * @type { { earlyExit: boolean } & Record<string, any>} */ - state = {}; + state; /** * @type {(ScenarioOutput | ScenarioInput | ScenarioAction | Scenario)[]} @@ -257,7 +360,7 @@ export class Scenario { constructor(name, stepsOrScenarios = [], initialState = {}) { this.name = name; this.stepsOrScenarios = stepsOrScenarios.filter((s) => !!s); - this.state = { ...initialState, name }; + this.state = { ...initialState, name, earlyExit: false }; } /** @@ -265,6 +368,13 @@ export class Scenario { */ async run(stepHandlerOptions) { for (const stepOrScenario of this.stepsOrScenarios) { + /** + * Add an escape hatch for actions that terminate the scenario early. + */ + if (this.state.earlyExit) { + return; + } + if (stepOrScenario instanceof Scenario) { await stepOrScenario.run(stepHandlerOptions); } else { diff --git a/javascriptv3/example_code/libs/scenario/steps-common.js b/javascriptv3/example_code/libs/scenario/steps-common.js index 49e07c8e47e..c4ce4e268eb 100644 --- a/javascriptv3/example_code/libs/scenario/steps-common.js +++ b/javascriptv3/example_code/libs/scenario/steps-common.js @@ -39,8 +39,19 @@ export const loadState = new Scenarios.ScenarioAction( * @param {string} stateKey */ export const exitOnFalse = (scenarios, stateKey) => - new scenarios.ScenarioAction(`exitOn${stateKey}False`, (state) => { - if (!state[stateKey]) { - process.exit(0); - } + new scenarios.ScenarioAction( + `exitOn${stateKey}False`, + (/** @type { { earlyExit: boolean } & Record<string, any>} */ state) => { + if (!state[stateKey]) { + state.earlyExit = true; + } + }, + ); + +/** + * @param {Scenarios} scenarios + */ +export const confirm = (scenarios) => + new scenarios.ScenarioInput("confirmContinue", "Continue?", { + type: "confirm", }); diff --git a/javascriptv3/example_code/medical-imaging/scenarios/health-image-sets/import-steps.js b/javascriptv3/example_code/medical-imaging/scenarios/health-image-sets/import-steps.js index 7c519b53fca..f3129f14f0f 100644 --- a/javascriptv3/example_code/medical-imaging/scenarios/health-image-sets/import-steps.js +++ b/javascriptv3/example_code/medical-imaging/scenarios/health-image-sets/import-steps.js @@ -26,6 +26,7 @@ export const doImport = new ScenarioInput( "Do you want to import DICOM images into your datastore?", { type: "confirm", + default: true, }, ); diff --git a/javascriptv3/example_code/medical-imaging/scenarios/health-image-sets/verify-steps.js b/javascriptv3/example_code/medical-imaging/scenarios/health-image-sets/verify-steps.js index fc8d4711cd3..a408d368d7c 100644 --- a/javascriptv3/example_code/medical-imaging/scenarios/health-image-sets/verify-steps.js +++ b/javascriptv3/example_code/medical-imaging/scenarios/health-image-sets/verify-steps.js @@ -69,6 +69,7 @@ export const doVerify = new ScenarioInput( "Do you want to verify the imported images?", { type: "confirm", + default: true, }, ); diff --git a/javascriptv3/example_code/medical-imaging/tests/hlth-img-deploy.unit.test.js b/javascriptv3/example_code/medical-imaging/tests/hlth-img-deploy.unit.test.js index 31ffeb45f24..2b4c35d254d 100644 --- a/javascriptv3/example_code/medical-imaging/tests/hlth-img-deploy.unit.test.js +++ b/javascriptv3/example_code/medical-imaging/tests/hlth-img-deploy.unit.test.js @@ -242,6 +242,7 @@ describe("deploy-steps", () => { stateFilePath, JSON.stringify({ name: deploySteps.name, + earlyExit: false, deployStack: true, getStackName: stackName, getDatastoreName: datastoreName, diff --git a/javascriptv3/example_code/medical-imaging/tests/hlth-img-image-frame.unit.test.js b/javascriptv3/example_code/medical-imaging/tests/hlth-img-image-frame.unit.test.js index 23f4e58d3a2..c84d7a82909 100644 --- a/javascriptv3/example_code/medical-imaging/tests/hlth-img-image-frame.unit.test.js +++ b/javascriptv3/example_code/medical-imaging/tests/hlth-img-image-frame.unit.test.js @@ -25,6 +25,7 @@ const { getImageSetMetadata, outputImageFrameIds } = await import( describe("image-frame-steps", () => { const mockState = { + earlyExit: false, stackOutputs: { BucketName: "input-bucket", DatastoreID: "datastore-123", diff --git a/javascriptv3/example_code/medical-imaging/tests/hlth-img-import.unit.test.js b/javascriptv3/example_code/medical-imaging/tests/hlth-img-import.unit.test.js index c71fa601410..41729925720 100644 --- a/javascriptv3/example_code/medical-imaging/tests/hlth-img-import.unit.test.js +++ b/javascriptv3/example_code/medical-imaging/tests/hlth-img-import.unit.test.js @@ -30,6 +30,7 @@ const { describe("importSteps", () => { const mockState = { name: "import-steps", + earlyExit: false, stackOutputs: { BucketName: "input-bucket", DatastoreID: "datastore-123", diff --git a/javascriptv3/example_code/medical-imaging/tests/hlth-img-verify.unit.test.js b/javascriptv3/example_code/medical-imaging/tests/hlth-img-verify.unit.test.js index 37e05dcb2e4..a569900f9f0 100644 --- a/javascriptv3/example_code/medical-imaging/tests/hlth-img-verify.unit.test.js +++ b/javascriptv3/example_code/medical-imaging/tests/hlth-img-verify.unit.test.js @@ -22,6 +22,7 @@ const { doVerify, decodeAndVerifyImages } = await import( describe("verifySteps", () => { const mockState = { + earlyExit: false, stackOutputs: { BucketName: "input-bucket", DatastoreID: "datastore-123", diff --git a/javascriptv3/example_code/medical-imaging/tests/htl-img-image-set.unit.test.js b/javascriptv3/example_code/medical-imaging/tests/htl-img-image-set.unit.test.js index e869cb90475..5a35f9c76ec 100644 --- a/javascriptv3/example_code/medical-imaging/tests/htl-img-image-set.unit.test.js +++ b/javascriptv3/example_code/medical-imaging/tests/htl-img-image-set.unit.test.js @@ -20,6 +20,7 @@ const { getManifestFile, parseManifestFile, outputImageSetIds } = await import( describe("image-set-steps", () => { const mockState = { + earlyExit: false, stackOutputs: { BucketName: "input-bucket", DatastoreID: "datastore-123", From dc20e7d44f9a8d2527c9f9f0a809f3d261f564e0 Mon Sep 17 00:00:00 2001 From: David Souther <davidsouther+github@gmail.com> Date: Mon, 12 Aug 2024 15:02:16 -0400 Subject: [PATCH 26/98] Rust: Fix github link (#6723) --- .doc_gen/metadata/ssm_metadata.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.doc_gen/metadata/ssm_metadata.yaml b/.doc_gen/metadata/ssm_metadata.yaml index c50ec9cf74c..8de1d8e474c 100644 --- a/.doc_gen/metadata/ssm_metadata.yaml +++ b/.doc_gen/metadata/ssm_metadata.yaml @@ -50,7 +50,7 @@ ssm_GetParameter: Rust: versions: - sdk_version: 1 - github: rustv1/example_code/ssm + github: rustv1/examples/ssm excerpts: - snippet_tags: - ec2.rust.ssm_list_path.impl From 56d9bd392431d7e1bd66c3bf95e7b5f6e4827b96 Mon Sep 17 00:00:00 2001 From: ford prior <108086978+ford-at-aws@users.noreply.github.com> Date: Tue, 13 Aug 2024 13:05:27 -0400 Subject: [PATCH 27/98] Tools - WRITEME: Fix logging (#6729) Currently, the logging doesn't tell you which errors are coming back through doc_gen. This writes out the errors from DocGen --- .tools/readmes/writeme.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.tools/readmes/writeme.py b/.tools/readmes/writeme.py index a158ed54cef..7a8bcc2938d 100644 --- a/.tools/readmes/writeme.py +++ b/.tools/readmes/writeme.py @@ -28,8 +28,9 @@ def prepare_scanner(doc_gen: DocGen) -> Optional[Scanner]: doc_gen.collect_snippets() doc_gen.validate() if doc_gen.errors: - logging.error("There were errors loading metadata") - logging.info(doc_gen.errors) + error_strings = [str(error) for error in doc_gen.errors] + failed_list = "\n\t".join(error_strings) + logging.error(f"Metadata errors encountered:\n\t{failed_list}") return None scanner = Scanner(doc_gen) From 7a22a0314672afe7c6818fcff083c724c40f4d47 Mon Sep 17 00:00:00 2001 From: David Souther <davidsouther+github@gmail.com> Date: Tue, 13 Aug 2024 14:51:32 -0400 Subject: [PATCH 28/98] Rust: Webassembly update to latest aws-wasm API. (#6732) --- rustv1/webassembly/src/lib.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/rustv1/webassembly/src/lib.rs b/rustv1/webassembly/src/lib.rs index 65ffe27f3f4..fe46bc6587f 100644 --- a/rustv1/webassembly/src/lib.rs +++ b/rustv1/webassembly/src/lib.rs @@ -152,14 +152,15 @@ impl MakeRequestBrowser for BrowserHttpClient { use js_sys::{Array, ArrayBuffer, Reflect, Uint8Array}; use wasm_bindgen_futures::JsFuture; - let mut opts = web_sys::RequestInit::new(); - opts.method(req.method()); - opts.mode(web_sys::RequestMode::Cors); - - let body_pinned = std::pin::Pin::new(req.body().bytes().unwrap()); - if body_pinned.len() > 0 { - let uint_8_array = unsafe { Uint8Array::view(&body_pinned) }; - opts.body(Some(&uint_8_array)); + let opts = web_sys::RequestInit::new(); + opts.set_method(req.method()); + opts.set_mode(web_sys::RequestMode::Cors); + + if let Some(body) = req.body().bytes() { + let body_str = + String::from_utf8(body.into()).map_err(|e| JsValue::from_str(&format!("{e:?}")))?; + let js_body = JsValue::from_str(&body_str); + opts.set_body(&js_body); } let request = web_sys::Request::new_with_str_and_init(req.uri(), &opts)?; From 8b85d21c42a234118d048df6905d03dbe82775a8 Mon Sep 17 00:00:00 2001 From: ford prior <108086978+ford-at-aws@users.noreply.github.com> Date: Tue, 13 Aug 2024 14:53:06 -0400 Subject: [PATCH 29/98] Ruby - DynamoDB: Fix broken test (#6730) * Update scenario_partiql_single_spec.rb --- .github/linters/.ruby-lint.yml | 2 + .../spec/scenario_partiql_single_spec.rb | 54 +++++++++---------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/linters/.ruby-lint.yml b/.github/linters/.ruby-lint.yml index 7f58c80ee94..4c15abe289d 100644 --- a/.github/linters/.ruby-lint.yml +++ b/.github/linters/.ruby-lint.yml @@ -4,6 +4,8 @@ ####################### Metrics/MethodLength: Max: 25 +Metrics/BlockLength: + Max: 75 Metrics/AbcSize: Max: 20 Style/FrozenStringLiteralComment: diff --git a/ruby/example_code/dynamodb/partiql/spec/scenario_partiql_single_spec.rb b/ruby/example_code/dynamodb/partiql/spec/scenario_partiql_single_spec.rb index 291f7814529..9474b0e4c29 100644 --- a/ruby/example_code/dynamodb/partiql/spec/scenario_partiql_single_spec.rb +++ b/ruby/example_code/dynamodb/partiql/spec/scenario_partiql_single_spec.rb @@ -3,46 +3,46 @@ # frozen_string_literal: true -require "json" -require "rspec" -require_relative("../partiql_single") -require_relative("../../scaffold") +require 'json' +require 'rspec' +require_relative('../partiql_single') +require_relative('../../scaffold') describe DynamoDBPartiQLSingle do - context "DynamoDBPartiQLWrapper" do + context 'DynamoDBPartiQLWrapper' do table_name = "doc-example-table-movies-partiql-#{rand(10**4)}" scaffold = Scaffold.new(table_name) sdk = DynamoDBPartiQLSingle.new(table_name) - it "Create a new DynamoDB table", integ: true do + it 'Create a new DynamoDB table', integ: true do scaffold.create_table(table_name) expect(scaffold.exists?(table_name)).to be_truthy end - it "Write a batch of famous movies into the DynamoDB table", integ: true do - movie_data = scaffold.fetch_movie_data("moviedata.json") + it 'Write a batch of famous movies into the DynamoDB table', integ: true do + movie_data = scaffold.fetch_movie_data('moviedata.json') scaffold.write_batch(movie_data) expect(movie_data.length).to be > 200 end - it "should return items with given title", integ: true do - response = sdk.select_item_by_title("Star Wars") + it 'should return items with given title', integ: true do + response = sdk.select_item_by_title('Star Wars') expect(response.items.length).to be >= 1 - expect(response.items.first["title"]).to eq("Star Wars") + expect(response.items.first['title']).to eq('Star Wars') end - it "should update the rating for the given title and year", integ: true do - title = "The Big Lebowski" + it 'should update the rating for the given title and year', integ: true do + title = 'The Big Lebowski' year = 1998 rating = 10.0 sdk.update_rating_by_title(title, year, rating) response = sdk.select_item_by_title(title) - updated_item = response.items.find { |item| item["year"] == year } - expect(updated_item["info"]["rating"]["N"].to_i).to eq(rating) + updated_item = response.items.find { |item| item['year'] == year } + expect(updated_item['info']['rating']['N'].to_f).to eq(rating) end - it "should delete the item with the given title and year", integ: true do - title = "The Silence of the Lambs" + it 'should delete the item with the given title and year', integ: true do + title = 'The Silence of the Lambs' year = 1991 sdk.delete_item_by_title(title, year) response = sdk.select_item_by_title(title) @@ -50,24 +50,22 @@ expect(deleted_item).to be_nil end - it "should add a new item with the given details", integ: true do - title = "The Prancing of the Lambs" + it 'should add a new item with the given details', integ: true do + title = 'The Prancing of the Lambs' year = 2005 - description = "A movie about happy livestock." + description = 'A movie about happy livestock.' rating = 5.0 sdk.insert_item(title, year, description, rating) response = sdk.select_item_by_title(title) - new_item = response.items.find { |item| item["year"] == year } + new_item = response.items.find { |item| item['year'] == year } expect(new_item).not_to be_nil - expect(new_item["title"]).to eq(title) - expect(new_item["year"]).to eq(year) - expect(new_item["info"]).not_to be_nil + expect(new_item['title']).to eq(title) + expect(new_item['year']).to eq(year) + expect(new_item['info']).not_to be_nil end - it "deletes DynamoDB table", integ: true do - if scaffold.exists?(table_name) - scaffold.delete_table - end + it 'deletes DynamoDB table', integ: true do + scaffold.delete_table if scaffold.exists?(table_name) end end end From 3ebda05c8fb84e5b5789bd17c7eb41efc065aa0e Mon Sep 17 00:00:00 2001 From: David Souther <davidsouther+github@gmail.com> Date: Tue, 13 Aug 2024 15:36:01 -0400 Subject: [PATCH 30/98] DocGen: Correct ec2 github links (#6735) --- .doc_gen/metadata/ec2_metadata.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.doc_gen/metadata/ec2_metadata.yaml b/.doc_gen/metadata/ec2_metadata.yaml index bba488fb8c4..90dae3c3b4f 100644 --- a/.doc_gen/metadata/ec2_metadata.yaml +++ b/.doc_gen/metadata/ec2_metadata.yaml @@ -71,7 +71,7 @@ ec2_Hello: Rust: versions: - sdk_version: 1 - github: rust/examples/ec2 + github: rustv1/examples/ec2 excerpts: - snippet_tags: - ec2.rust.ec2-helloworld @@ -1249,7 +1249,7 @@ ec2_DescribeSecurityGroups: Rust: versions: - sdk_version: 1 - github: rust/examples/ec2 + github: rustv1/examples/ec2 excerpts: - snippet_tags: - ec2.rust.ec2-helloworld @@ -1334,7 +1334,7 @@ ec2_DeleteSecurityGroup: Rust: versions: - sdk_version: 1 - github: rust/examples/ec2 + github: rustv1/examples/ec2 excerpts: - snippet_tags: - ec2.rust.delete_security_group.impl @@ -1447,7 +1447,7 @@ ec2_TerminateInstances: Rust: versions: - sdk_version: 1 - github: rust/examples/ec2 + github: rustv1/examples/ec2 excerpts: - snippet_tags: - ec2.rust.delete_instance.impl From cdc5d0fe40259104a8e7456db9b3ebd5b548c9a4 Mon Sep 17 00:00:00 2001 From: David Souther <davidsouther+github@gmail.com> Date: Fri, 16 Aug 2024 11:24:23 -0400 Subject: [PATCH 31/98] Tools: writeme handles missing readmes (#6739) * Revamp render to return a status enum, and lots of clean up related to that. * Treat missing files as empty during render check() --- .tools/readmes/render.py | 49 ++++++++++++++----- .tools/readmes/writeme.py | 100 ++++++++++++++++++++++---------------- 2 files changed, 94 insertions(+), 55 deletions(-) diff --git a/.tools/readmes/render.py b/.tools/readmes/render.py index 854a9ed3415..3a68fdf6451 100644 --- a/.tools/readmes/render.py +++ b/.tools/readmes/render.py @@ -7,10 +7,11 @@ import os import re from dataclasses import asdict +from enum import Enum from jinja2 import Environment, FileSystemLoader, select_autoescape from operator import itemgetter from pathlib import Path -from typing import Dict, List, Optional, Tuple +from typing import Dict, List, Tuple from aws_doc_sdk_examples_tools.metadata import Example from aws_doc_sdk_examples_tools.sdks import Sdk @@ -22,6 +23,15 @@ logger = logging.getLogger(__name__) +class RenderStatus(Enum): + UNCHANGED = 0 + NO_EXAMPLES = 1 + UNIMPLEMENTED = 2 + UPDATED = 3 + UNMANAGED = 4 + NO_FOLDER = 5 + + class MissingMetadataError(Exception): pass @@ -241,9 +251,9 @@ def _scrape_customs(self, readme_filename: Path, sdk_short: str) -> Dict[str, st self.lang_config["sdk_api_ref"] = href return customs - def render(self) -> Tuple[Optional["Renderer"], bool]: + def render(self) -> RenderStatus: if self.lang_config is None: - return None, False # Return False to indicate no update + return RenderStatus.UNIMPLEMENTED sdk = _transform_sdk(self.scanner.sdk(), self.scanner.sdk_ver) svc = _transform_service(self.scanner.service()) @@ -257,7 +267,10 @@ def render(self) -> Tuple[Optional["Renderer"], bool]: len(hello) + len(actions) + len(scenarios) + len(custom_cats) + len(crosses) == 0 ): - return None, False + return RenderStatus.NO_EXAMPLES + + if not self.readme_filename.parent.exists(): + return RenderStatus.NO_FOLDER self.lang_config["name"] = self.scanner.lang_name self.lang_config["sdk_ver"] = self.scanner.sdk_ver @@ -287,10 +300,17 @@ def render(self) -> Tuple[Optional["Renderer"], bool]: self.readme_text = self._expand_entities(self.readme_text) # Check if the rendered text is different from the existing file - readme_updated = not self.check() - return self, readme_updated - - # return self, True + if self.read_current() == self.readme_text: + return RenderStatus.UNCHANGED + else: + if ( + self.lang_config["service_folder"] + not in self.lang_config.get("service_folder_overrides", {}).values() + and self.readme_filename.exists() + ): + return RenderStatus.UNMANAGED + else: + return RenderStatus.UPDATED def write(self): if self.readme_filename.exists(): @@ -298,17 +318,20 @@ def write(self): self.readme_filename.rename( self.readme_filename.parent / config.saved_readme ) - + logging.debug("Removing existing file %s", self.readme_filename) # Do this so that new files are always updated to the correct case (README.md). self.readme_filename.unlink(missing_ok=True) with self.readme_filename.open("w", encoding="utf-8") as f: + logging.debug("Writing file %s", self.readme_filename) f.write(self.readme_text) - def check(self): - with self.readme_filename.open("r", encoding="utf-8") as f: - readme_current = f.read() - return readme_current == self.readme_text + def read_current(self): + try: + with self.readme_filename.open("r", encoding="utf-8") as f: + return f.read() + except FileNotFoundError: + return "" def _transform_sdk(sdk: Sdk, sdk_ver): diff --git a/.tools/readmes/writeme.py b/.tools/readmes/writeme.py index 7a8bcc2938d..ee9ed2d1370 100644 --- a/.tools/readmes/writeme.py +++ b/.tools/readmes/writeme.py @@ -10,13 +10,14 @@ import logging import os import sys +from difflib import unified_diff from pathlib import Path from typing import Optional -from render import Renderer, MissingMetadataError +from render import Renderer, MissingMetadataError, RenderStatus from scanner import Scanner -logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO").upper()) +logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO").upper(), force=True) from aws_doc_sdk_examples_tools.doc_gen import DocGen @@ -29,8 +30,8 @@ def prepare_scanner(doc_gen: DocGen) -> Optional[Scanner]: doc_gen.validate() if doc_gen.errors: error_strings = [str(error) for error in doc_gen.errors] - failed_list = "\n\t".join(error_strings) - logging.error(f"Metadata errors encountered:\n\t{failed_list}") + failed_list = "\n".join(f"DocGen Error: {e}" for e in error_strings) + print(f"Metadata errors encountered:\n\t{failed_list}") return None scanner = Scanner(doc_gen) @@ -80,6 +81,7 @@ def main(): ) parser.add_argument("--no-dry-run", dest="dry_run", action="store_false") parser.add_argument("--check", dest="dry_run", action="store_true") + parser.add_argument("--diff", action="store_true", default=False) args = parser.parse_args() if "all" in args.languages: @@ -94,13 +96,14 @@ def main(): logging.debug(f"Args configuration: {args}") if args.dry_run: - logging.info("Dry run, no changes will be made.") + print("Dry run, no changes will be made.") skipped = [] failed = [] written = [] non_writeme = [] unchanged = [] + no_folder = [] scanner = prepare_scanner(doc_gen) if scanner is None: @@ -113,54 +116,67 @@ def main(): id = f"{language}:{version}:{service}" try: renderer.set_example(service, language, int(version), args.safe) - if renderer.lang_config is None: - continue logging.debug("Rendering %s", id) - result, updated = renderer.render() - - if result is None: - if ( - renderer.lang_config["service_folder"] - not in renderer.lang_config.get( - "service_folder_overrides", {} - ).values() - and renderer.readme_filename.exists() - ): - non_writeme.append(id) - else: - skipped.append(id) - elif args.dry_run: - if not renderer.check(): + render_status = renderer.render() + logging.debug("Status %s", render_status) + + if render_status == RenderStatus.UPDATED: + if args.dry_run: failed.append(id) - elif not updated: + if args.diff: + print_diff(renderer, id) + else: + renderer.write() + written.append(id) + elif render_status == RenderStatus.UNCHANGED: unchanged.append(id) - else: - renderer.write() - written.append(id) - except FileNotFoundError: + elif render_status == RenderStatus.UNMANAGED: + non_writeme.append(id) + elif render_status == RenderStatus.NO_EXAMPLES: + skipped.append(id) + elif render_status == RenderStatus.NO_FOLDER: + no_folder.append(id) + elif render_status == RenderStatus.UNIMPLEMENTED: + pass + except FileNotFoundError as fnfe: + logging.debug(fnfe, exc_info=True) skipped.append(id) except MissingMetadataError as mme: - logging.error(mme) + logging.debug(mme, exc_info=True) failed.append(id) - except Exception: - logging.exception("Exception rendering %s", id) + except Exception as e: + logging.error(e, exc_info=True) failed.append(id) - done_list = "\n\t".join(sorted(written)) - skip_list = "\n\t".join(sorted(skipped)) - non_writeme_list = "\n\t".join(sorted(non_writeme)) - unchanged_list = "\n\t".join(sorted(unchanged)) - logging.debug(f"Skipped:\n\t{skip_list}") - logging.info(f"Wrote:\n\t{done_list}\nUnchanged:\n\t{unchanged_list}") - logging.warning(f"Non-WRITEME READMES:\n\t{non_writeme_list}") - if len(failed) > 0: - failed_list = "\n\t".join(failed) - logging.error(f"READMEs with incorrect formatting:\n\t{failed_list}") - logging.error("Rerun writeme.py to update README links and sections.") - logging.info("Run complete.") + skip_list = "\n".join(f"Skipped {f}" for f in sorted(skipped)) + logging.debug(skip_list or "(None Skipped)") + if unchanged: + unchanged_list = "\n".join(f"Unchanged {f}" for f in sorted(unchanged)) + print(unchanged_list) + if non_writeme: + non_writeme_list = "\n".join(f"Non-WRITEME: {f}" for f in sorted(non_writeme)) + print(non_writeme_list) + if no_folder: + no_folder_list = "\n".join(f"No folder: {f}" for f in sorted(no_folder)) + print(no_folder_list) + if not args.dry_run: + done_list = "\n".join(f"Wrote {f}" for f in sorted(written)) + print(done_list or "(None Written)") + if failed: + failed_list = "\n".join(f"Incorrect: {f}" for f in sorted(failed)) + print(failed_list) + print("Rerun writeme.py to update README links and sections.") + print("WRITEME Run completed.") return len(failed) +def print_diff(renderer, id): + current = renderer.read_current().split("\n") + expected = renderer.readme_text.split("\n") + diff = unified_diff(current, expected, f"{id}/current", f"{id}/expected") + print("\n".join(diff)) + + if __name__ == "__main__": sys.exit(main()) From 87d671d5627a2f23f53cde6a450723feb74faf81 Mon Sep 17 00:00:00 2001 From: Eric Shepherd <ericsh@amazon.com> Date: Mon, 19 Aug 2024 12:21:07 -0400 Subject: [PATCH 32/98] Swift SDK: Add Lambda function example (#6738) * Add Lambda function example for Swift --- .../lambda/using-lambda-runtime/.gitignore | 4 + .../lambda/using-lambda-runtime/Package.swift | 40 +++++ .../using-lambda-runtime/Sources/lambda.swift | 162 ++++++++++++++++++ 3 files changed, 206 insertions(+) create mode 100644 swift/example_code/lambda/using-lambda-runtime/.gitignore create mode 100644 swift/example_code/lambda/using-lambda-runtime/Package.swift create mode 100644 swift/example_code/lambda/using-lambda-runtime/Sources/lambda.swift diff --git a/swift/example_code/lambda/using-lambda-runtime/.gitignore b/swift/example_code/lambda/using-lambda-runtime/.gitignore new file mode 100644 index 00000000000..e6adc88d4b1 --- /dev/null +++ b/swift/example_code/lambda/using-lambda-runtime/.gitignore @@ -0,0 +1,4 @@ +.DS_Store +/.build +/.vscode +/Package.resolved \ No newline at end of file diff --git a/swift/example_code/lambda/using-lambda-runtime/Package.swift b/swift/example_code/lambda/using-lambda-runtime/Package.swift new file mode 100644 index 00000000000..2fb970be08a --- /dev/null +++ b/swift/example_code/lambda/using-lambda-runtime/Package.swift @@ -0,0 +1,40 @@ +// swift-tools-version: 5.10 +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[lambda.swift.function.package] +import PackageDescription + +let package = Package( + name: "LambdaExample", + platforms: [ + .macOS(.v12) + ], + // The product is an executable named "LambdaExample", which is built + // using the target "LambdaExample". + products: [ + .executable(name: "LambdaExample", targets: ["LambdaExample"]) + ], + // Add the dependencies: these are the packages that need to be fetched + // before building the project. + dependencies: [ + .package( + url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", + from: "1.0.0-alpha"), + .package(url: "https://github.com/awslabs/aws-sdk-swift.git", + from: "0.46.0"), + ], + targets: [ + // Add the executable target for the main program. These are the + // specific modules this project uses within the packages listed under + // "dependencies." + .executableTarget( + name: "LambdaExample", + dependencies: [ + .product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime"), + .product(name: "AWSS3", package: "aws-sdk-swift"), + ] + ) + ] +) +// snippet-end:[lambda.swift.function.package] diff --git a/swift/example_code/lambda/using-lambda-runtime/Sources/lambda.swift b/swift/example_code/lambda/using-lambda-runtime/Sources/lambda.swift new file mode 100644 index 00000000000..98087226074 --- /dev/null +++ b/swift/example_code/lambda/using-lambda-runtime/Sources/lambda.swift @@ -0,0 +1,162 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +// snippet-start:[lambda.swift.function.complete] +// snippet-start:[lambda.swift.function.imports] +import Foundation +import AWSLambdaRuntime +import AWSS3 + +import protocol AWSClientRuntime.AWSServiceError +import enum Smithy.ByteStream +// snippet-end:[lambda.swift.function.imports] + +// snippet-start:[lambda.swift.function.types] +// snippet-start:[lambda.swift.function.struct.request] +/// Represents the contents of the requests being received from the client. +/// This structure must be `Decodable` to indicate that its initializer +/// converts an external representation into this type. +struct Request: Decodable, Sendable { + /// The request body. + let body: String +} +// snippet-end:[lambda.swift.function.struct.request] + +// snippet-start:[lambda.swift.function.struct.response] +/// The contents of the response sent back to the client. This must be +/// `Encodable`. +struct Response: Encodable, Sendable { + /// The ID of the request this response corresponds to. + let req_id: String + /// The body of the response message. + let body: String +} +// snippet-end:[lambda.swift.function.struct.response] + +// snippet-start:[lambda.swift.function.errors] +/// The errors that the Lambda function can return. +enum S3ExampleLambdaErrors: Error { + /// A required environment variable is missing. The missing variable is + /// specified. + case noEnvironmentVariable(String) + /// The Amazon Simple Storage Service (S3) client couldn't be created. + case noS3Client +} +// snippet-end:[lambda.swift.function.errors] +// snippet-end:[lambda.swift.function.types] + +// snippet-start:[lambda.swift.function.handler] +/// A Swift AWS Lambda Runtime `LambdaHandler` lets you both perform needed +/// initialization and handle AWS Lambda requests. There are other handler +/// protocols available for other use cases. +@main +struct S3ExampleLambda: LambdaHandler { + let s3Client: S3Client? + + // snippet-start:[lambda.swift.function.handler.init] + /// Initialize the AWS Lambda runtime. + /// + /// ^ The logger is a standard Swift logger. You can control the verbosity + /// by setting the `LOG_LEVEL` environment variable. + init(context: LambdaInitializationContext) async throws { + // Display the `LOG_LEVEL` configuration for this process. + context.logger.info( + "Log Level env var : \(ProcessInfo.processInfo.environment["LOG_LEVEL"] ?? "info" )" + ) + + // Initialize the Amazon S3 client. This single client is used for every + // request. + let currentRegion = ProcessInfo.processInfo.environment["AWS_REGION"] ?? "us-east-1" + self.s3Client = try? S3Client(region: currentRegion) + } + // snippet-end:[lambda.swift.function.handler.init] + + // snippet-start:[lambda.swift.function.handler.putobject] + /// Write the specified text into a given Amazon S3 bucket. The object's + /// name is based on the current time. + /// + /// - Parameters: + /// - s3Client: The `S3Client` to use when sending the object to the + /// bucket. + /// - bucketName: The name of the Amazon S3 bucket to put the object + /// into. + /// - body: The string to write into the new object. + /// + /// - Returns: A string indicating the name of the file created in the AWS + /// S3 bucket. + private func putObject(client: S3Client, + bucketName: String, + body: String) async throws -> String { + // Generate an almost certainly unique object name based on the current + // timestamp. + let objectName = "\(Int(Date().timeIntervalSince1970*1_000_000)).txt" + + // Create a Smithy `ByteStream` that represents the string to write into + // the bucket. + let inputStream = Smithy.ByteStream.data(body.data(using: .utf8)) + + // Store the text into an object in the Amazon S3 bucket. + let putObjectRequest = PutObjectInput( + body: inputStream, + bucket: bucketName, + key: objectName + ) + let _ = try await client.putObject(input: putObjectRequest) + + // Return the name of the file. + return objectName + } + // snippet-end:[lambda.swift.function.handler.putobject] + + // snippet-start:[lambda.swift.function.handler.handle] + /// The Lambda function's entry point. Called by the Lambda runtime. + /// + /// - Parameters: + /// - event: The `Request` describing the request made by the + /// client. + /// - context: A `LambdaContext` describing the context in + /// which the lambda function is running. + /// + /// - Returns: A `Response` object that will be encoded to JSON and sent + /// to the client by the Lambda runtime. + func handle(_ event: Request, context: LambdaContext) async throws -> Response { + // Get the bucket name from the environment. + guard let bucketName = ProcessInfo.processInfo.environment["BUCKET_NAME"] else { + throw S3ExampleLambdaErrors.noEnvironmentVariable("BUCKET_NAME") + } + + // Make sure the `S3Client` is valid. + guard let s3Client else { + throw S3ExampleLambdaErrors.noS3Client + } + + // Call the `putObject` function to store the object on Amazon S3. + var responseMessage: String + do { + let filename = try await putObject( + client: s3Client, + bucketName: bucketName, + body: event.body) + + // Generate the response text. + responseMessage = "The Lambda function has successfully stored your data in S3 with name \(filename)'" + + // Send the success notification to the logger. + context.logger.info("Data successfully stored in S3.") + } catch let error as AWSServiceError { + // Generate the error message. + responseMessage = "The Lambda function encountered an error and your data was not saved. Root cause: \(error.errorCode ?? "") - \(error.message ?? "")" + + // Send the error message to the logger. + context.logger.error("Failed to upload data to Amazon S3.") + } + + // Return the response message. The AWS Lambda runtime will send it to the + // client. + return Response( + req_id: context.requestID, + body: responseMessage) + } + // snippet-end:[lambda.swift.function.handler.handle] +} +// snippet-end:[lambda.swift.function.handler] +// snippet-end:[lambda.swift.function.complete] From 0c424063155b1c042056e28ce0b2795b08206b69 Mon Sep 17 00:00:00 2001 From: Rachel Hagerman <110480692+rlhagerm@users.noreply.github.com> Date: Tue, 20 Aug 2024 08:21:34 -0500 Subject: [PATCH 33/98] Multilanguage: Fixes for incorrect GitHub paths in .NET, Kotlin, and Python. (#6748) * Fix for bad GitHub paths in .NET and Python. Co-authored-by: ford prior <fprior@amazon.com> --- .doc_gen/metadata/cross_metadata.yaml | 6 +++--- .doc_gen/metadata/s3_metadata.yaml | 2 +- .doc_gen/metadata/sns_metadata.yaml | 8 ++++---- dotnetv3/Aurora/README.md | 2 +- dotnetv3/RDS/README.md | 2 +- dotnetv3/SES/README.md | 4 ++-- dotnetv3/SNS/README.md | 2 +- dotnetv3/Translate/README.md | 2 +- dotnetv3/dynamodb/README.md | 2 +- python/example_code/s3/README.md | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.doc_gen/metadata/cross_metadata.yaml b/.doc_gen/metadata/cross_metadata.yaml index 115d9208fc6..42754363502 100644 --- a/.doc_gen/metadata/cross_metadata.yaml +++ b/.doc_gen/metadata/cross_metadata.yaml @@ -130,7 +130,7 @@ cross_RDSDataTracker: .NET: versions: - sdk_version: 3 - github: dotnetv3/cross_service/AuroraItemTracker + github: dotnetv3/cross-service/AuroraItemTracker block_content: cross_RDSDataTracker_Net_block.xml Java: versions: @@ -176,7 +176,7 @@ cross_SnsPublishSubscription: .NET: versions: - sdk_version: 3 - github: dotnetv3/cross_service/SubscribePublishTranslate + github: dotnetv3/cross-service/SubscribePublishTranslate block_content: cross_SNSSubPub_Net_block.xml Java: versions: @@ -216,7 +216,7 @@ cross_DynamoDBDataTracker: .NET: versions: - sdk_version: 3 - github: dotnetv3/cross_service/DynamoDbItemTracker + github: dotnetv3/cross-service/DynamoDbItemTracker block_content: cross_DynamoDBDataTracker_Net_block.xml Kotlin: versions: diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index e4403cce6d8..d319a28e7e2 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -2582,7 +2582,7 @@ s3_Scenario_BatchObjectVersioning: Python: versions: - sdk_version: 3 - github: python/code_examples/s3_versioning + github: python/example_code/s3/s3_versioning block_content: scenario_S3BatchObjectVersioning_Python_block.xml services: s3: {} diff --git a/.doc_gen/metadata/sns_metadata.yaml b/.doc_gen/metadata/sns_metadata.yaml index 0ab4e5a874c..3b2cb00107d 100644 --- a/.doc_gen/metadata/sns_metadata.yaml +++ b/.doc_gen/metadata/sns_metadata.yaml @@ -680,7 +680,7 @@ sns_Publish: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/secretsmanager + github: kotlin/services/sns sdkguide: excerpts: - description: @@ -876,7 +876,7 @@ sns_SetTopicAttributes: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/secretsmanager + github: kotlin/services/sns sdkguide: excerpts: - description: @@ -981,7 +981,7 @@ sns_Subscribe: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/secretsmanager + github: kotlin/services/sns sdkguide: excerpts: - description: Subscribe an email address to a topic. @@ -1098,7 +1098,7 @@ sns_Unsubscribe: Kotlin: versions: - sdk_version: 1 - github: kotlin/services/secretsmanager + github: kotlin/services/sns sdkguide: excerpts: - description: diff --git a/dotnetv3/Aurora/README.md b/dotnetv3/Aurora/README.md index 0fceff14a45..cedf29403d0 100644 --- a/dotnetv3/Aurora/README.md +++ b/dotnetv3/Aurora/README.md @@ -65,7 +65,7 @@ functions within the same service. Sample applications that work across multiple AWS services. -- [Create an Aurora Serverless work item tracker](../cross_service/AuroraItemTracker) +- [Create an Aurora Serverless work item tracker](../cross-service/AuroraItemTracker) <!--custom.examples.start--> diff --git a/dotnetv3/RDS/README.md b/dotnetv3/RDS/README.md index 31987978336..5c92010f832 100644 --- a/dotnetv3/RDS/README.md +++ b/dotnetv3/RDS/README.md @@ -62,7 +62,7 @@ functions within the same service. Sample applications that work across multiple AWS services. -- [Create an Aurora Serverless work item tracker](../cross_service/AuroraItemTracker) +- [Create an Aurora Serverless work item tracker](../cross-service/AuroraItemTracker) <!--custom.examples.start--> diff --git a/dotnetv3/SES/README.md b/dotnetv3/SES/README.md index c72fc6e0369..9a88223ff76 100644 --- a/dotnetv3/SES/README.md +++ b/dotnetv3/SES/README.md @@ -48,8 +48,8 @@ Code excerpts that show you how to call individual service functions. Sample applications that work across multiple AWS services. -- [Create a web application to track DynamoDB data](../cross_service/DynamoDbItemTracker) -- [Create an Aurora Serverless work item tracker](../cross_service/AuroraItemTracker) +- [Create a web application to track DynamoDB data](../cross-service/DynamoDbItemTracker) +- [Create an Aurora Serverless work item tracker](../cross-service/AuroraItemTracker) - [Detect objects in images](../cross-service/PhotoAnalyzerApp) diff --git a/dotnetv3/SNS/README.md b/dotnetv3/SNS/README.md index 20e9827a6a8..32ec39f4ba4 100644 --- a/dotnetv3/SNS/README.md +++ b/dotnetv3/SNS/README.md @@ -60,7 +60,7 @@ functions within the same service. Sample applications that work across multiple AWS services. -- [Building an Amazon SNS application](../cross_service/SubscribePublishTranslate) +- [Building an Amazon SNS application](../cross-service/SubscribePublishTranslate) - [Create a serverless application to manage photos](../cross-service/PhotoAssetManager) diff --git a/dotnetv3/Translate/README.md b/dotnetv3/Translate/README.md index b55439ac319..80089352789 100644 --- a/dotnetv3/Translate/README.md +++ b/dotnetv3/Translate/README.md @@ -43,7 +43,7 @@ Code excerpts that show you how to call individual service functions. Sample applications that work across multiple AWS services. -- [Building an Amazon SNS application](../cross_service/SubscribePublishTranslate) +- [Building an Amazon SNS application](../cross-service/SubscribePublishTranslate) - [Create an application to analyze customer feedback](../cross-service/FeedbackSentimentAnalyzer) diff --git a/dotnetv3/dynamodb/README.md b/dotnetv3/dynamodb/README.md index 65f530d6dc5..c3855798993 100644 --- a/dotnetv3/dynamodb/README.md +++ b/dotnetv3/dynamodb/README.md @@ -69,7 +69,7 @@ functions within the same service. Sample applications that work across multiple AWS services. - [Create a serverless application to manage photos](../cross-service/PhotoAssetManager) -- [Create a web application to track DynamoDB data](../cross_service/DynamoDbItemTracker) +- [Create a web application to track DynamoDB data](../cross-service/DynamoDbItemTracker) <!--custom.examples.start--> diff --git a/python/example_code/s3/README.md b/python/example_code/s3/README.md index 595fe407e9e..d90a93b6b09 100644 --- a/python/example_code/s3/README.md +++ b/python/example_code/s3/README.md @@ -79,7 +79,7 @@ functions within the same service. - [Create a presigned URL](s3_basics/presigned_url.py) - [Get started with buckets and objects](s3_basics/scenario_getting_started.py) -- [Manage versioned objects in batches with a Lambda function](python/code_examples/s3_versioning) +- [Manage versioned objects in batches with a Lambda function](python/example_code/s3/s3_versioning) - [Upload or download large files](file_transfer/file_transfer.py) - [Work with versioned objects](s3_versioning/versioning.py) From 9edc1223651ccc71a5661d00c4119d6ee551fc62 Mon Sep 17 00:00:00 2001 From: Rachel Hagerman <110480692+rlhagerm@users.noreply.github.com> Date: Tue, 20 Aug 2024 14:24:12 -0500 Subject: [PATCH 34/98] .NET v3: Adding EventBridge Scheduler Workflow (#6742) * .NET v3: Adding EventBridge Scheduler Workflow (#14) --- .doc_gen/metadata/scheduler_metadata.yaml | 96 +++ .doc_gen/metadata/services.yaml | 15 + .github/workflows/validate-doc-metadata.yml | 2 +- .tools/ailly/dotnet-prompts.yaml | 225 ++++++ .tools/readmes/config.py | 1 + .../Actions/HelloScheduler.cs | 41 ++ .../Actions/SchedulerActions.csproj | 18 + .../Actions/SchedulerWrapper.cs | 207 ++++++ .../Actions/ServiceActions.csproj | 17 + .../EventBridgeScheduler.sln | 48 ++ dotnetv3/EventBridge Scheduler/README.md | 132 ++++ .../EventBridge Scheduler/Scenarios/README.md | 100 +++ .../Scenarios/SchedulerScenario.csproj | 21 + .../Scenarios/SchedulerWorkflow.cs | 654 ++++++++++++++++++ .../Tests/SchedulerTests.csproj | 38 + .../Tests/SchedulerWorkflowTests.cs | 81 +++ .../EventBridge Scheduler/Tests/Usings.cs | 12 + workflows/eventbridge_scheduler/README.md | 84 +++ .../eventbridge_scheduler/SPECIFICATION.md | 165 +++++ .../resources/cfn_template.yaml | 48 ++ .../resources/emails.png | Bin 0 -> 11283 bytes .../resources/scheduler-workflow.png | Bin 0 -> 56179 bytes 22 files changed, 2004 insertions(+), 1 deletion(-) create mode 100644 .doc_gen/metadata/scheduler_metadata.yaml create mode 100644 .tools/ailly/dotnet-prompts.yaml create mode 100644 dotnetv3/EventBridge Scheduler/Actions/HelloScheduler.cs create mode 100644 dotnetv3/EventBridge Scheduler/Actions/SchedulerActions.csproj create mode 100644 dotnetv3/EventBridge Scheduler/Actions/SchedulerWrapper.cs create mode 100644 dotnetv3/EventBridge Scheduler/Actions/ServiceActions.csproj create mode 100644 dotnetv3/EventBridge Scheduler/EventBridgeScheduler.sln create mode 100644 dotnetv3/EventBridge Scheduler/README.md create mode 100644 dotnetv3/EventBridge Scheduler/Scenarios/README.md create mode 100644 dotnetv3/EventBridge Scheduler/Scenarios/SchedulerScenario.csproj create mode 100644 dotnetv3/EventBridge Scheduler/Scenarios/SchedulerWorkflow.cs create mode 100644 dotnetv3/EventBridge Scheduler/Tests/SchedulerTests.csproj create mode 100644 dotnetv3/EventBridge Scheduler/Tests/SchedulerWorkflowTests.cs create mode 100644 dotnetv3/EventBridge Scheduler/Tests/Usings.cs create mode 100644 workflows/eventbridge_scheduler/README.md create mode 100644 workflows/eventbridge_scheduler/SPECIFICATION.md create mode 100644 workflows/eventbridge_scheduler/resources/cfn_template.yaml create mode 100644 workflows/eventbridge_scheduler/resources/emails.png create mode 100644 workflows/eventbridge_scheduler/resources/scheduler-workflow.png diff --git a/.doc_gen/metadata/scheduler_metadata.yaml b/.doc_gen/metadata/scheduler_metadata.yaml new file mode 100644 index 00000000000..655a6d1c41b --- /dev/null +++ b/.doc_gen/metadata/scheduler_metadata.yaml @@ -0,0 +1,96 @@ +scheduler_hello: + title: Hello &EVS; + title_abbrev: Hello &EVS; + synopsis: get started using &EVS;. + category: Hello + languages: + .NET: + versions: + - sdk_version: 3 + github: dotnetv3/EventBridge Scheduler + excerpts: + - description: + genai: some + snippet_tags: + - Scheduler.dotnetv3.HelloScheduler + services: + scheduler: {ListSchedules} +scheduler_CreateSchedule: + languages: + .NET: + versions: + - sdk_version: 3 + github: dotnetv3/EventBridge Scheduler + excerpts: + - description: + genai: most + snippet_tags: + - Scheduler.dotnetv3.CreateSchedule + services: + scheduler: {CreateSchedule} +scheduler_CreateScheduleGroup: + languages: + .NET: + versions: + - sdk_version: 3 + github: dotnetv3/EventBridge Scheduler + excerpts: + - description: + genai: most + snippet_tags: + - Scheduler.dotnetv3.CreateScheduleGroup + services: + scheduler: {CreateScheduleGroup} +scheduler_DeleteSchedule: + languages: + .NET: + versions: + - sdk_version: 3 + github: dotnetv3/EventBridge Scheduler + excerpts: + - description: + genai: most + snippet_tags: + - Scheduler.dotnetv3.DeleteSchedule + services: + scheduler: {DeleteSchedule} +scheduler_DeleteScheduleGroup: + languages: + .NET: + versions: + - sdk_version: 3 + github: dotnetv3/EventBridge Scheduler + excerpts: + - description: + genai: most + snippet_tags: + - Scheduler.dotnetv3.DeleteScheduleGroup + services: + scheduler: {DeleteScheduleGroup} +scheduler_ScheduledEventsWorkflow: + title: A complete &EVS; Scheduled Events workflow using an &AWS; SDK + title_abbrev: Scheduled Events workflow + synopsis_list: + - Deploy a &CFN; stack with required resources. + - Create a &EVS; schedule group. + - Create a one-time &EVS; schedule with a flexible time window. + - Create a recurring &EVS; schedule with a specified rate. + - Delete &EVS; the schedule and schedule group. + - Clean up resources and delete the stack. + category: Scenarios + languages: + .NET: + versions: + - sdk_version: 3 + github: dotnetv3/EventBridge Scheduler + excerpts: + - description: Run the workflow. + genai: most + snippet_tags: + - Scheduler.dotnetv3.SchedulerWorkflow + - description: Wrapper for service operations. + genai: most + snippet_tags: + - Scheduler.dotnetv3.SchedulerWrapper + services: + scheduler: {CreateSchedule, CreateScheduleGroup, DeleteSchedule, DeleteScheduleGroups} diff --git a/.doc_gen/metadata/services.yaml b/.doc_gen/metadata/services.yaml index f3358ce1dfa..7b6854b0690 100644 --- a/.doc_gen/metadata/services.yaml +++ b/.doc_gen/metadata/services.yaml @@ -2739,6 +2739,21 @@ sagemaker: tags: product_categories: {'Machine Learning & AI'} version: sagemaker-2017-07-24 +scheduler: + long: '&EVSlong;' + short: '&EVS;' + sort: EventBridge Scheduler + expanded: + long: Amazon EventBridge Scheduler + short: EventBridge Scheduler + blurb: allows you to create, run, and manage tasks on a schedule from one central, managed service. + guide: + subtitle: User Guide + url: scheduler/latest/userguide/intro.html + api_ref: scheduler/latest/apireference/Welcome.html + tags: + product_categories: {'Management & Governance'} + version: '2021-06-30' secrets-manager: long: '&ASMlong;' short: '&ASM;' diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index 22ac2290b2e..add236e3f2b 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@2024-07-22-B + uses: awsdocs/aws-doc-sdk-examples-tools@2024-08-13-A with: doc_gen_only: "False" strict_titles: "True" diff --git a/.tools/ailly/dotnet-prompts.yaml b/.tools/ailly/dotnet-prompts.yaml new file mode 100644 index 00000000000..a7c5f4c5504 --- /dev/null +++ b/.tools/ailly/dotnet-prompts.yaml @@ -0,0 +1,225 @@ +code: + standards: | + <standards> + Use the following general structure guidelines. + + Service folders with examples should follow the common structure that uses folders for Actions, Scenarios, and Tests, with a top level solution file. + + Scenarios should use .NET Dependency Injection with interfaces to set up AWS services. + + ''' + static async Task Main(string[] args) + { + // Set up dependency injection for the Amazon RDS service. + using var host = Host.CreateDefaultBuilder(args) + .ConfigureLogging(logging => + logging.AddFilter("System", LogLevel.Debug) + .AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information) + .AddFilter<ConsoleLoggerProvider>("Microsoft", LogLevel.Trace)) + .ConfigureServices((_, services) => + services.AddAWSService<IAmazonRDS>() + .AddTransient<RDSWrapper>() + ) + .Build(); + + logger = LoggerFactory.Create(builder => + { + builder.AddConsole(); + }).CreateLogger<RDSInstanceScenario>(); + + rdsWrapper = host.Services.GetRequiredService<RDSWrapper>(); + + Console.WriteLine(sepBar); + Console.WriteLine( + "Welcome to the Amazon Relational Database Service (Amazon RDS) DB instance scenario example."); + Console.WriteLine(sepBar); + await BeginScenario(); + } + ''' + + Scenarios should include a top-level comment block explaining the steps of the example. + + ''' + /* + Before running this .NET code example, set up your development environment, including your credentials. + + This .NET example performs the following tasks: + 1. Returns a list of the available DB engine families using the DescribeDBEngineVersionsAsync method. + 2. Selects an engine family and creates a custom DB parameter group using the CreateDBParameterGroupAsync method. + 3. Gets the parameter groups using the DescribeDBParameterGroupsAsync method. + 4. Gets parameters in the group using the DescribeDBParameters method. + 5. Parses and displays parameters in the group. + 6. Modifies both the auto_increment_offset and auto_increment_increment parameters + using the ModifyDBParameterGroupAsync method. + 7. Gets and displays the updated parameters using the DescribeDBParameters method with a source of "user". + 8. Gets a list of allowed engine versions using the DescribeDBEngineVersionsAsync method. + 9. Displays and selects from a list of micro instance classes available for the selected engine and version. + 10. Creates an RDS DB instance that contains a MySql database and uses the parameter group + using the CreateDBInstanceAsync method. + 11. Waits for DB instance to be ready using the DescribeDBInstancesAsync method. + 12. Prints out the connection endpoint string for the new DB instance. + 13. Creates a snapshot of the DB instance using the CreateDBSnapshotAsync method. + 14. Waits for DB snapshot to be ready using the DescribeDBSnapshots method. + 15. Deletes the DB instance using the DeleteDBInstanceAsync method. + 16. Waits for DB instance to be deleted using the DescribeDbInstances method. + 17. Deletes the parameter group using the DeleteDBParameterGroupAsync. + */ + ''' + + Default configurations should use a settings.json file. Developer-specific configurations can be placed in a settings.local.json or settings.development.json file. + + Wrapper methods should provide additional context when calling service actions. For example, specify certain parameters and return true or false. Do not use Request/Response classes directly as the parameter and response types, and do not include a cancellation token unless the user is able to cancel the action. + + ''' + /// <summary> + /// Creates a contact list with the specified name. + /// </summary> + /// <param name="contactListName">The name of the contact list.</param> + /// <returns>True if successful.</returns> + public async Task<bool> CreateContactListAsync(string contactListName) + { + var request = new CreateContactListRequest + { + ContactListName = contactListName + }; + + try + { + var response = await _sesClient.CreateContactListAsync(request); + return response.HttpStatusCode == HttpStatusCode.OK; + } + catch (AlreadyExistsException ex) + { + Console.WriteLine($"Contact list with name {contactListName} already exists."); + Console.WriteLine(ex.Message); + return true; + } + catch (LimitExceededException ex) + { + Console.WriteLine("The limit for contact lists has been exceeded."); + Console.WriteLine(ex.Message); + } + catch (TooManyRequestsException ex) + { + Console.WriteLine("Too many requests were made. Please try again later."); + Console.WriteLine(ex.Message); + } + catch (Exception ex) + { + Console.WriteLine($"An error occurred while creating the contact list: {ex.Message}"); + } + return false; + } + ''' + + All methods should include full XML doc tags for summary, parameters, and return types. + + ''' + /// <summary> + /// Creates a contact list with the specified name. + /// </summary> + /// <param name="contactListName">The name of the contact list.</param> + /// <returns>True if successful.</returns> + ''' + + Use file-scoped namespaces to decrease indents, instead of namespace declarations with curly braces. + + When using top-level statements, add partial classes if necessary to facilitate testing. + + When a service is added or updated, add the projects to the top-level solution so it will be included in the build/lint/format and Weathertop tests. + + Use the following Language Features. + + Use async/await patterns if available. Do not use Task.Result for synchronizing an async method. + + Prefer var for variable declarations, and common class names such as string over String, etc. + + Use parameterized values for any query operations. + + Using statements should be outside the namespace, include no unused imports, and be ordered alphabetically. + + Prefer file-scoped namespaces to decrease indents in the published snippets. + + Use the following test guidelines. + + Use common naming for tests, such as: VerifyAction_ExpectedResult. + + Integration tests should be marked with [Trait("Category", "Integration")] + + Use Moq framework for mocking. + + Use XUnit with ordering for tests. Following is an example test. + + ''' + /// <summary> + /// Run the preparation step of the workflow. Should return successful. + /// </summary> + /// <returns>Async task.</returns> + [Fact] + [Order(1)] + [Trait("Category", "Unit")] + public async Task TestPrepareApplication() + { + // Arrange. + var mockSesV2Service = new Mock<IAmazonSimpleEmailServiceV2>(); + + mockSesV2Service.Setup(client => client.CreateEmailIdentityAsync( + It.IsAny<CreateEmailIdentityRequest>(), + It.IsAny<CancellationToken>())) + .Returns((CreateEmailIdentityResponse r, + CancellationToken token) => + { + return Task.FromResult(new CreateEmailIdentityResponse() + { + IdentityType = IdentityType.EMAIL_ADDRESS, + HttpStatusCode = HttpStatusCode.OK, + }); + }); + + mockSesV2Service.Setup(client => client.CreateContactListAsync( + It.IsAny<CreateContactListRequest>(), + It.IsAny<CancellationToken>())) + .Returns((CreateEmailIdentityResponse r, + CancellationToken token) => + { + return Task.FromResult(new CreateContactListResponse() + { + HttpStatusCode = HttpStatusCode.OK, + }); + }); + + mockSesV2Service.Setup(client => client.CreateEmailTemplateAsync( + It.IsAny<CreateEmailTemplateRequest>(), + It.IsAny<CancellationToken>())) + .Returns((CreateEmailTemplateResponse r, + CancellationToken token) => + { + return Task.FromResult(new CreateEmailTemplateResponse() + { + HttpStatusCode = HttpStatusCode.OK, + }); + }); + + var sESv2Wrapper = new SESv2Wrapper(mockSesV2Service.Object); + + NewsletterWorkflow._sesv2Wrapper = sESv2Wrapper; + NewsletterWorkflow._verifiedEmail = "test@example.com"; + + // Act. + var verifiedEmail = await NewsletterWorkflow.PrepareApplication(); + + // Assert. + Assert.Equal(NewsletterWorkflow._verifiedEmail, verifiedEmail); + } + ''' + + Use the following Metadata Snippet Contents guidelines. + + Metadata for Action examples should contain at minimum the following snippets. + + A snippet to show the action itself within context. + + If more than one variation of the Action is included, use descriptions in the metadata to explain the differences. + + Metadata for Scenario examples can contain the entire wrapper and scenario code, but should include descriptions for both. + </standards> diff --git a/.tools/readmes/config.py b/.tools/readmes/config.py index 7f318a2e832..b736a8f9165 100644 --- a/.tools/readmes/config.py +++ b/.tools/readmes/config.py @@ -102,6 +102,7 @@ "route-53": "dotnetv3/Route53", "s3": "dotnetv3/S3", "sagemaker": "dotnetv3/SageMaker", + "scheduler": "dotnetv3/EventBridge Scheduler", "secrets-manager": "dotnetv3/SecretsManager", "ses": "dotnetv3/SES", "sesv2": "dotnetv3/SESv2", diff --git a/dotnetv3/EventBridge Scheduler/Actions/HelloScheduler.cs b/dotnetv3/EventBridge Scheduler/Actions/HelloScheduler.cs new file mode 100644 index 00000000000..e1409392fdb --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/Actions/HelloScheduler.cs @@ -0,0 +1,41 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +using Amazon.Scheduler; +using Amazon.Scheduler.Model; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace SchedulerActions; + +// snippet-start:[Scheduler.dotnetv3.HelloScheduler] +public static class HelloScheduler +{ + static async Task Main(string[] args) + { + // Use the AWS .NET Core Setup package to set up dependency injection for the EventBridge Scheduler service. + // Use your AWS profile name, or leave it blank to use the default profile. + using var host = Host.CreateDefaultBuilder(args) + .ConfigureServices((_, services) => + services.AddAWSService<IAmazonScheduler>() + ).Build(); + + // Now the client is available for injection. + var schedulerClient = host.Services.GetRequiredService<IAmazonScheduler>(); + + // You can use await and any of the async methods to get a response, or a paginator to list schedules or groups. + var results = new List<ScheduleSummary>(); + var paginateSchedules = schedulerClient.Paginators.ListSchedules( + new ListSchedulesRequest()); + Console.WriteLine( + $"Hello AWS Scheduler! Let's list schedules in your account."); + // Get the entire list using the paginator. + await foreach (var schedule in paginateSchedules.Schedules) + { + results.Add(schedule); + } + Console.WriteLine($"\tTotal of {results.Count} schedule(s) available."); + results.ForEach(s => Console.WriteLine($"\tSchedule: {s.Name}")); + } +} +// snippet-end:[Scheduler.dotnetv3.HelloScheduler] \ No newline at end of file diff --git a/dotnetv3/EventBridge Scheduler/Actions/SchedulerActions.csproj b/dotnetv3/EventBridge Scheduler/Actions/SchedulerActions.csproj new file mode 100644 index 00000000000..4c84e2055f3 --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/Actions/SchedulerActions.csproj @@ -0,0 +1,18 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>net6.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="AWSSDK.CloudFormation" Version="3.7.308.12" /> + <PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.7.2" /> + <PackageReference Include="AWSSDK.Scheduler" Version="3.7.300.98" /> + <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" /> + <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> + </ItemGroup> + +</Project> diff --git a/dotnetv3/EventBridge Scheduler/Actions/SchedulerWrapper.cs b/dotnetv3/EventBridge Scheduler/Actions/SchedulerWrapper.cs new file mode 100644 index 00000000000..72765c79677 --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/Actions/SchedulerWrapper.cs @@ -0,0 +1,207 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[Scheduler.dotnetv3.SchedulerWrapper] +using Amazon.Scheduler; +using Amazon.Scheduler.Model; +using Microsoft.Extensions.Logging; + +namespace SchedulerActions; + +/// <summary> +/// Wrapper class for Amazon EventBridge Scheduler operations. +/// </summary> +public class SchedulerWrapper +{ + private readonly IAmazonScheduler _amazonScheduler; + private readonly ILogger<SchedulerWrapper> _logger; + + /// <summary> + /// Constructor for the SchedulerWrapper class. + /// </summary> + /// <param name="amazonScheduler">The injected EventBridge Scheduler client.</param> + /// <param name="logger">The injected logger.</param> + public SchedulerWrapper(IAmazonScheduler amazonScheduler, ILogger<SchedulerWrapper> logger) + { + _amazonScheduler = amazonScheduler; + _logger = logger; + } + + // snippet-start:[Scheduler.dotnetv3.CreateSchedule] + /// <summary> + /// Creates a new schedule in Amazon EventBridge Scheduler. + /// </summary> + /// <param name="name">The name of the schedule.</param> + /// <param name="scheduleExpression">The schedule expression that defines when the schedule should run.</param> + /// <param name="scheduleGroupName">The name of the schedule group to which the schedule should be added.</param> + /// <param name="deleteAfterCompletion">Indicates whether to delete the schedule after completion.</param> + /// <param name="useFlexibleTimeWindow">Indicates whether to use a flexible time window for the schedule.</param> + /// <param name="targetArn">ARN of the event target.</param> + /// <param name="roleArn">Execution Role ARN.</param> + /// <returns>True if the schedule was created successfully, false otherwise.</returns> + public async Task<bool> CreateScheduleAsync( + string name, + string scheduleExpression, + string scheduleGroupName, + string targetArn, + string roleArn, + string input, + bool deleteAfterCompletion = false, + bool useFlexibleTimeWindow = false) + { + try + { + int hoursToRun = 1; + int flexibleTimeWindowMinutes = 10; + + var request = new CreateScheduleRequest + { + Name = name, + ScheduleExpression = scheduleExpression, + GroupName = scheduleGroupName, + Target = new Target { Arn = targetArn, RoleArn = roleArn, Input = input }, + ActionAfterCompletion = deleteAfterCompletion + ? ActionAfterCompletion.DELETE + : ActionAfterCompletion.NONE, + StartDate = DateTime.UtcNow, // Ignored for one-time schedules. + EndDate = + DateTime.UtcNow + .AddHours(hoursToRun) // Ignored for one-time schedules. + }; + // Allow a flexible time window if the caller specifies it. + request.FlexibleTimeWindow = new FlexibleTimeWindow + { + Mode = useFlexibleTimeWindow + ? FlexibleTimeWindowMode.FLEXIBLE + : FlexibleTimeWindowMode.OFF, + MaximumWindowInMinutes = useFlexibleTimeWindow + ? flexibleTimeWindowMinutes + : null + }; + + var response = await _amazonScheduler.CreateScheduleAsync(request); + + Console.WriteLine($"Successfully created schedule '{name}' " + + $"in schedule group '{scheduleGroupName}': {response.ScheduleArn}."); + return true; + } + catch (ConflictException ex) + { + // If the name is not unique, a ConflictException will be thrown. + _logger.LogError($"Failed to create schedule '{name}' due to a conflict. {ex.Message}"); + return false; + } + catch (Exception ex) + { + _logger.LogError($"An error occurred while creating schedule '{name}' " + + $"in schedule group '{scheduleGroupName}': {ex.Message}"); + return false; + } + } + // snippet-end:[Scheduler.dotnetv3.CreateSchedule] + + // snippet-start:[Scheduler.dotnetv3.CreateScheduleGroup] + /// <summary> + /// Creates a new schedule group in Amazon EventBridge Scheduler. + /// </summary> + /// <param name="name">The name of the schedule group.</param> + /// <returns>True if the schedule group was created successfully, false otherwise.</returns> + public async Task<bool> CreateScheduleGroupAsync(string name) + { + try + { + var request = new CreateScheduleGroupRequest { Name = name }; + + var response = await _amazonScheduler.CreateScheduleGroupAsync(request); + + Console.WriteLine($"Successfully created schedule group '{name}': {response.ScheduleGroupArn}."); + return true; + + } + catch (ConflictException ex) + { + // If the name is not unique, a ConflictException will be thrown. + _logger.LogError($"Failed to create schedule group '{name}' due to a conflict. {ex.Message}"); + return false; + } + catch (Exception ex) + { + _logger.LogError( + $"An error occurred while creating schedule group '{name}': {ex.Message}"); + return false; + } + } + // snippet-end:[Scheduler.dotnetv3.CreateScheduleGroup] + + // snippet-start:[Scheduler.dotnetv3.DeleteSchedule] + /// <summary> + /// Deletes an existing schedule from Amazon EventBridge Scheduler. + /// </summary> + /// <param name="name">The name of the schedule to delete.</param> + /// <param name="groupName">The group name of the schedule to delete.</param> + /// <returns>True if the schedule was deleted successfully, false otherwise.</returns> + public async Task<bool> DeleteScheduleAsync(string name, string groupName) + { + try + { + var request = new DeleteScheduleRequest + { + Name = name, + GroupName = groupName + }; + + await _amazonScheduler.DeleteScheduleAsync(request); + + Console.WriteLine($"Successfully deleted schedule with name '{name}'."); + return true; + + } + catch (ResourceNotFoundException ex) + { + _logger.LogError( + $"Failed to delete schedule with ID '{name}' because the resource was not found: {ex.Message}"); + return true; + } + catch (Exception ex) + { + _logger.LogError( + $"An error occurred while deleting schedule with ID '{name}': {ex.Message}"); + return false; + } + } + // snippet-end:[Scheduler.dotnetv3.DeleteSchedule] + + // snippet-start:[Scheduler.dotnetv3.DeleteScheduleGroup] + /// <summary> + /// Deletes an existing schedule group from Amazon EventBridge Scheduler. + /// </summary> + /// <param name="name">The name of the schedule group to delete.</param> + /// <returns>True if the schedule group was deleted successfully, false otherwise.</returns> + public async Task<bool> DeleteScheduleGroupAsync(string name) + { + try + { + var request = new DeleteScheduleGroupRequest { Name = name }; + + await _amazonScheduler.DeleteScheduleGroupAsync(request); + + Console.WriteLine($"Successfully deleted schedule group '{name}'."); + return true; + + } + catch (ResourceNotFoundException ex) + { + _logger.LogError( + $"Failed to delete schedule group '{name}' because the resource was not found: {ex.Message}"); + return true; + } + catch (Exception ex) + { + _logger.LogError( + $"An error occurred while deleting schedule group '{name}': {ex.Message}"); + return false; + } + } + // snippet-end:[Scheduler.dotnetv3.DeleteScheduleGroup] +} +// snippet-end:[Scheduler.dotnetv3.SchedulerWrapper] \ No newline at end of file diff --git a/dotnetv3/EventBridge Scheduler/Actions/ServiceActions.csproj b/dotnetv3/EventBridge Scheduler/Actions/ServiceActions.csproj new file mode 100644 index 00000000000..032413b1226 --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/Actions/ServiceActions.csproj @@ -0,0 +1,17 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>net6.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.7.2" /> + <PackageReference Include="AWSSDK.Scheduler" Version="3.7.300.98" /> + <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" /> + <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> + </ItemGroup> + +</Project> diff --git a/dotnetv3/EventBridge Scheduler/EventBridgeScheduler.sln b/dotnetv3/EventBridge Scheduler/EventBridgeScheduler.sln new file mode 100644 index 00000000000..cf513970a9c --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/EventBridgeScheduler.sln @@ -0,0 +1,48 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32630.192 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Actions", "Actions", "{7907FB6A-1353-4735-95DC-EEC5DF8C0649}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scenarios", "Scenarios", "{B987097B-189C-4D0B-99BC-E67CD705BCA0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{5455D423-2AFC-4BC6-B79D-9DC4270D8F7D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SchedulerActions", "Actions\SchedulerActions.csproj", "{796910FA-6E94-460B-8CB4-97DF01B9ADC8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SchedulerScenario", "Scenarios\SchedulerScenario.csproj", "{B1731AE1-381F-4044-BEBE-269FF7E24B1F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SchedulerTests", "Tests\SchedulerTests.csproj", "{6046A2FC-6A39-4C2D-8DD9-AA3740B17B88}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {796910FA-6E94-460B-8CB4-97DF01B9ADC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {796910FA-6E94-460B-8CB4-97DF01B9ADC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {796910FA-6E94-460B-8CB4-97DF01B9ADC8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {796910FA-6E94-460B-8CB4-97DF01B9ADC8}.Release|Any CPU.Build.0 = Release|Any CPU + {B1731AE1-381F-4044-BEBE-269FF7E24B1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B1731AE1-381F-4044-BEBE-269FF7E24B1F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1731AE1-381F-4044-BEBE-269FF7E24B1F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1731AE1-381F-4044-BEBE-269FF7E24B1F}.Release|Any CPU.Build.0 = Release|Any CPU + {6046A2FC-6A39-4C2D-8DD9-AA3740B17B88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6046A2FC-6A39-4C2D-8DD9-AA3740B17B88}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6046A2FC-6A39-4C2D-8DD9-AA3740B17B88}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6046A2FC-6A39-4C2D-8DD9-AA3740B17B88}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {796910FA-6E94-460B-8CB4-97DF01B9ADC8} = {7907FB6A-1353-4735-95DC-EEC5DF8C0649} + {B1731AE1-381F-4044-BEBE-269FF7E24B1F} = {B987097B-189C-4D0B-99BC-E67CD705BCA0} + {6046A2FC-6A39-4C2D-8DD9-AA3740B17B88} = {5455D423-2AFC-4BC6-B79D-9DC4270D8F7D} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {870D888D-5C8B-4057-8722-F73ECF38E513} + EndGlobalSection +EndGlobal diff --git a/dotnetv3/EventBridge Scheduler/README.md b/dotnetv3/EventBridge Scheduler/README.md new file mode 100644 index 00000000000..bf297f22811 --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/README.md @@ -0,0 +1,132 @@ +# EventBridge Scheduler code examples for the SDK for .NET + +## Overview + +Shows how to use the AWS SDK for .NET to work with Amazon EventBridge Scheduler. + +<!--custom.overview.start--> +<!--custom.overview.end--> + +_EventBridge Scheduler allows you to create, run, and manage tasks on a schedule from one central, managed service._ + +## ⚠ Important + +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + +<!--custom.important.start--> +<!--custom.important.end--> + +## Code examples + +### Prerequisites + +For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3` folder. + + +<!--custom.prerequisites.start--> +<!--custom.prerequisites.end--> + +### Get started + +- [Hello EventBridge Scheduler](Actions/HelloScheduler.cs#L11) (`ListSchedules`) + + +### Single actions + +Code excerpts that show you how to call individual service functions. + +- [CreateSchedule](Actions/SchedulerWrapper.cs#L30) +- [CreateScheduleGroup](Actions/SchedulerWrapper.cs#L103) +- [DeleteSchedule](Actions/SchedulerWrapper.cs#L136) +- [DeleteScheduleGroup](Actions/SchedulerWrapper.cs#L174) + +### Scenarios + +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. + +- [Scheduled Events workflow](Scenarios/SchedulerWorkflow.cs) + + +<!--custom.examples.start--> +<!--custom.examples.end--> + +## Run the examples + +### Instructions + +For general instructions to run the examples, see the +[README](../README.md#building-and-running-the-code-examples) in the `dotnetv3` folder. + +Some projects might include a settings.json file. Before compiling the project, +you can change these values to match your own account and resources. Alternatively, +add a settings.local.json file with your local settings, which will be loaded automatically +when the application runs. + +After the example compiles, you can run it from the command line. To do so, navigate to +the folder that contains the .csproj file and run the following command: + +``` +dotnet run +``` + +Alternatively, you can run the example from within your IDE. + + +<!--custom.instructions.start--> +<!--custom.instructions.end--> + +#### Hello EventBridge Scheduler + +This example shows you how to get started using EventBridge Scheduler. + + + +#### Scheduled Events workflow + +This example shows you how to do the following: + +- Deploy a CloudFormation stack with required resources. +- Create a EventBridge Scheduler schedule group. +- Create a one-time EventBridge Scheduler schedule with a flexible time window. +- Create a recurring EventBridge Scheduler schedule with a specified rate. +- Delete EventBridge Scheduler the schedule and schedule group. +- Clean up resources and delete the stack. + +<!--custom.scenario_prereqs.scheduler_ScheduledEventsWorkflow.start--> +<!--custom.scenario_prereqs.scheduler_ScheduledEventsWorkflow.end--> + + +<!--custom.scenarios.scheduler_ScheduledEventsWorkflow.start--> +<!--custom.scenarios.scheduler_ScheduledEventsWorkflow.end--> + +### Tests + +⚠ Running tests might result in charges to your AWS account. + + +To find instructions for running these tests, see the [README](../README.md#Tests) +in the `dotnetv3` folder. + + + +<!--custom.tests.start--> +<!--custom.tests.end--> + +## Additional resources + +- [EventBridge Scheduler User Guide](https://docs.aws.amazon.com/scheduler/latest/userguide/intro.html) +- [EventBridge Scheduler API Reference](https://docs.aws.amazon.com/scheduler/latest/apireference/Welcome.html) +- [SDK for .NET EventBridge Scheduler reference](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Scheduler/NScheduler.html) + +<!--custom.resources.start--> +<!--custom.resources.end--> + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/dotnetv3/EventBridge Scheduler/Scenarios/README.md b/dotnetv3/EventBridge Scheduler/Scenarios/README.md new file mode 100644 index 00000000000..27b4b43ff57 --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/Scenarios/README.md @@ -0,0 +1,100 @@ +# Amazon EventBridge Scheduler Workflow + +## Overview +This example shows how to use AWS SDKs to work with Amazon EventBridge Scheduler with schedules and schedule groups. The workflow demonstrates how to create and delete one-time and recurring schedules within a schedule group to generate events on a specified target, such as an Amazon Simple Notification Service (Amazon SNS) Topic. + +The target SNS topic and the AWS Identity and Access Management (IAM) role used with the schedules are created as part of an AWS CloudFormation stack that is deployed at the start of the workflow, and deleted when the workflow is complete. + +![Object Lock Features](../../../workflows/eventbridge_scheduler/resources/scheduler-workflow.png) + +This workflow demonstrates the following steps and tasks: + +1. **Prepare the Application** + + - Prompts the user for an email address to use for the subscription for the SNS topic. + - Prompts the user for a name for the Cloud Formation stack. + - The user must confirm the email subscription to receive event emails. + - Deploys the Cloud Formation template in resources/cfn_template.yaml for resource creation. + - Stores the outputs of the stack into variables for use in the workflow. + - Creates a schedule group for all workflow schedules. + +2. **Create a one-time Schedule** + + - Creates a one-time schedule to send an initial event. + - Prompts the user for a name for the one-time schedule. + - The user must confirm the email subscription to receive an event email. + - The content of the email should include the name of the newly created schedule. + - Use a Flexible Time Window of 10 minutes and set the schedule to delete after completion. + +3. **Create a time-based schedule** + + - Prompts the user for a rate per minutes (example: every 2 minutes) for a scheduled recurring event. + - Creates the scheduled event for X times per hour for 1 hour. + - Deletes the schedule when the user is finished. + - Prompts the user to confirm when they are ready to delete the schedule. + +4. **Clean up** + + - Prompts the user to confirm they want to destroy the stack and clean up all resources. + - Deletes the schedule group. + - Destroys the Cloud Formation stack and wait until the stack has been removed. + +## ⚠ Important + +* Running this code might result in charges to your AWS account. +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + +## Scenario + +### Prerequisites + +Before running this workflow, ensure you have: + +- An AWS account with proper permissions to use Amazon EventBridge Scheduler and Amazon EventBridge. + +### AWS Services Used + +This workflow uses the following AWS services: + +- Amazon EventBridge Scheduler +- Amazon EventBridge +- Amazon Simple Notification Service (SNS) +- AWS CloudFormation + +### Resources + +The workflow scenario deploys the AWS CloudFormation stack with the required resources. + +### Instructions + +After the example compiles, you can run it from the command line. To do so, navigate to +the folder that contains the .sln file and run the following command: + +``` +dotnet run +``` + +Alternatively, you can run the example from within your IDE. + +This starts an interactive scenario that walks you through creating different types of schedules. + +## Amazon EventBridge Scheduler Actions + +The workflow covers the following EventBridge Scheduler API actions: + +- [`CreateSchedule`](https://docs.aws.amazon.com/scheduler/latest/APIReference/API_CreateSchedule.html) +- [`CreateScheduleGroup`](https://docs.aws.amazon.com/scheduler/latest/APIReference/API_CreateScheduleGroup.html) +- [`DeleteSchedule`](https://docs.aws.amazon.com/scheduler/latest/APIReference/API_DeleteSchedule.html) +- [`DeleteScheduleGroup`](https://docs.aws.amazon.com/scheduler/latest/APIReference/API_DeleteScheduleGroup.html) + +## Additional resources + +* [EventBridge Scheduler User Guide](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html) +* [EventBridge Scheduler API Reference](https://docs.aws.amazon.com/scheduler/latest/APIReference/Welcome.html) + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 diff --git a/dotnetv3/EventBridge Scheduler/Scenarios/SchedulerScenario.csproj b/dotnetv3/EventBridge Scheduler/Scenarios/SchedulerScenario.csproj new file mode 100644 index 00000000000..d8643123780 --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/Scenarios/SchedulerScenario.csproj @@ -0,0 +1,21 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>net6.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="AWSSDK.CloudFormation" Version="3.7.308.12" /> + <PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.7.2" /> + <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" /> + <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\Actions\SchedulerActions.csproj" /> + </ItemGroup> + +</Project> diff --git a/dotnetv3/EventBridge Scheduler/Scenarios/SchedulerWorkflow.cs b/dotnetv3/EventBridge Scheduler/Scenarios/SchedulerWorkflow.cs new file mode 100644 index 00000000000..ffe6e79c0e0 --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/Scenarios/SchedulerWorkflow.cs @@ -0,0 +1,654 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[Scheduler.dotnetv3.SchedulerWorkflow] +using System.Text.RegularExpressions; +using Amazon.CloudFormation; +using Amazon.CloudFormation.Model; +using Amazon.Scheduler; +using Amazon.Scheduler.Model; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Console; +using Microsoft.Extensions.Logging.Debug; +using SchedulerActions; +using Exception = System.Exception; + +namespace SchedulerScenario; + +public class SchedulerWorkflow +{ + /* + Before running this .NET code example, set up your development environment, including your credentials. + This .NET code example performs the following tasks for the Amazon EventBridge Scheduler workflow: + + 1. Prepare the Application: + - Prompt the user for an email address to use for the subscription for the SNS topic subscription. + - Prompt the user for a name for the Cloud Formation stack. + - Deploy the Cloud Formation template in resources/cfn_template.yaml for resource creation. + - Store the outputs of the stack into variables for use in the workflow. + - Create a schedule group for all workflow schedules. + + 2. Create one-time Schedule: + - Create a one-time schedule to send an initial event. + - Use a Flexible Time Window and set the schedule to delete after completion. + - Wait for the user to receive the event email from SNS. + + 3. Create a time-based schedule: + - Prompt the user for how many X times per Y hours a recurring event should be scheduled. + - Create the scheduled event for X times per hour for Y hours. + - Wait for the user to receive the event email from SNS. + - Delete the schedule when the user is finished. + + 4. Clean up: + - Prompt the user for y/n answer if they want to destroy the stack and clean up all resources. + - Delete the schedule group. + - Destroy the Cloud Formation stack and wait until the stack has been removed. + */ + + public static ILogger<SchedulerWorkflow> _logger = null!; + public static SchedulerWrapper _schedulerWrapper = null!; + public static IAmazonCloudFormation _amazonCloudFormation = null!; + + private static string _roleArn = null!; + private static string _snsTopicArn = null!; + + public static bool _interactive = true; + private static string _stackName = "default-scheduler-workflow-stack-name"; + private static string _scheduleGroupName = "workflow-schedules-group"; + private static string _stackResourcePath = "../../../../../../workflows/eventbridge_scheduler/resources/cfn_template.yaml"; + + public static async Task Main(string[] args) + { + using var host = Host.CreateDefaultBuilder(args) + .ConfigureLogging(logging => + logging.AddFilter("System", LogLevel.Debug) + .AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information) + .AddFilter<ConsoleLoggerProvider>("Microsoft", LogLevel.Trace)) + .ConfigureServices((_, services) => + services.AddAWSService<IAmazonScheduler>() + .AddAWSService<IAmazonCloudFormation>() + .AddTransient<SchedulerWrapper>() + ) + .Build(); + + if (_interactive) + { + _logger = LoggerFactory.Create(builder => { builder.AddConsole(); }) + .CreateLogger<SchedulerWorkflow>(); + + _schedulerWrapper = host.Services.GetRequiredService<SchedulerWrapper>(); + _amazonCloudFormation = host.Services.GetRequiredService<IAmazonCloudFormation>(); + } + + Console.WriteLine(new string('-', 80)); + Console.WriteLine("Welcome to the Amazon EventBridge Scheduler Workflow."); + Console.WriteLine(new string('-', 80)); + + try + { + Console.WriteLine(new string('-', 80)); + var prepareSuccess = await PrepareApplication(); + Console.WriteLine(new string('-', 80)); + + if (prepareSuccess) + { + Console.WriteLine(new string('-', 80)); + await CreateOneTimeSchedule(); + Console.WriteLine(new string('-', 80)); + + Console.WriteLine(new string('-', 80)); + await CreateRecurringSchedule(); + Console.WriteLine(new string('-', 80)); + } + + Console.WriteLine(new string('-', 80)); + await Cleanup(); + Console.WriteLine(new string('-', 80)); + } + catch (Exception ex) + { + _logger.LogError(ex, "There was a problem with the workflow, initiating cleanup..."); + _interactive = false; + await Cleanup(); + } + + Console.WriteLine("Amazon EventBridge Scheduler workflow completed."); + } + + /// <summary> + /// Prepares the application by creating the necessary resources. + /// </summary> + /// <returns>True if the application was prepared successfully.</returns> + public static async Task<bool> PrepareApplication() + { + Console.WriteLine("Preparing the application..."); + try + { + // Prompt the user for an email address to use for the subscription. + Console.WriteLine("\nThis example creates resources in a CloudFormation stack, including an SNS topic" + + "\nthat will be subscribed to the EventBridge Scheduler events. " + + "\n\nYou will need to confirm the subscription in order to receive event emails. "); + + var emailAddress = PromptUserForEmail(); + + // Prompt the user for a name for the CloudFormation stack + _stackName = PromptUserForStackName(); + + // Deploy the CloudFormation stack + var deploySuccess = await DeployCloudFormationStack(_stackName, emailAddress); + + if (deploySuccess) + { + // Create a schedule group for all workflow schedules + await _schedulerWrapper.CreateScheduleGroupAsync(_scheduleGroupName); + + Console.WriteLine("Application preparation complete."); + return true; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "An error occurred while preparing the application."); + } + Console.WriteLine("Application preparation failed."); + return false; + } + + /// <summary> + /// Deploys the CloudFormation stack with the necessary resources. + /// </summary> + /// <param name="stackName">The name of the CloudFormation stack.</param> + /// <param name="email">The email to use for the subscription.</param> + /// <returns>True if the stack was deployed successfully.</returns> + private static async Task<bool> DeployCloudFormationStack(string stackName, string email) + { + Console.WriteLine($"\nDeploying CloudFormation stack: {stackName}"); + + try + { + var request = new CreateStackRequest + { + StackName = stackName, + TemplateBody = await File.ReadAllTextAsync(_stackResourcePath), + Capabilities = { Capability.CAPABILITY_NAMED_IAM } + }; + + // If an email is provided, set the parameter. + if (!string.IsNullOrWhiteSpace(email)) + { + request.Parameters = new List<Parameter>() + { + new() { ParameterKey = "email", ParameterValue = email } + }; + } + + var response = await _amazonCloudFormation.CreateStackAsync(request); + + if (response.HttpStatusCode == System.Net.HttpStatusCode.OK) + { + Console.WriteLine($"CloudFormation stack creation started: {stackName}"); + + // Wait for the stack to be in CREATE_COMPLETE state + bool stackCreated = await WaitForStackCompletion(response.StackId); + + if (stackCreated) + { + // Retrieve the output values + var success = await GetStackOutputs(response.StackId); + return success; + } + else + { + _logger.LogError($"CloudFormation stack creation failed: {stackName}"); + return false; + } + } + else + { + _logger.LogError($"Failed to create CloudFormation stack: {stackName}"); + return false; + } + } + catch (AlreadyExistsException) + { + _logger.LogWarning($"CloudFormation stack '{stackName}' already exists. Please provide a unique name."); + var newStackName = PromptUserForStackName(); + return await DeployCloudFormationStack(newStackName, email); + } + catch (Exception ex) + { + _logger.LogError(ex, $"An error occurred while deploying the CloudFormation stack: {stackName}"); + return false; + } + } + + /// <summary> + /// Waits for the CloudFormation stack to be in the CREATE_COMPLETE state. + /// </summary> + /// <param name="client">The CloudFormation client.</param> + /// <param name="stackId">The ID of the CloudFormation stack.</param> + /// <returns>True if the stack was created successfully.</returns> + private static async Task<bool> WaitForStackCompletion(string stackId) + { + int retryCount = 0; + const int maxRetries = 10; + const int retryDelay = 30000; // 30 seconds. + + while (retryCount < maxRetries) + { + var describeStacksRequest = new DescribeStacksRequest + { + StackName = stackId + }; + + var describeStacksResponse = await _amazonCloudFormation.DescribeStacksAsync(describeStacksRequest); + + if (describeStacksResponse.Stacks.Count > 0) + { + if (describeStacksResponse.Stacks[0].StackStatus == StackStatus.CREATE_COMPLETE) + { + Console.WriteLine("CloudFormation stack creation complete."); + return true; + } + if (describeStacksResponse.Stacks[0].StackStatus == StackStatus.CREATE_FAILED || + describeStacksResponse.Stacks[0].StackStatus == StackStatus.ROLLBACK_COMPLETE) + { + Console.WriteLine("CloudFormation stack creation failed."); + return false; + } + } + + Console.WriteLine("Waiting for CloudFormation stack creation to complete..."); + await Task.Delay(retryDelay); + retryCount++; + } + + _logger.LogError("Timed out waiting for CloudFormation stack creation to complete."); + return false; + } + + /// <summary> + /// Retrieves the output values from the CloudFormation stack. + /// </summary> + /// <param name="stackId">The ID of the CloudFormation stack.</param> + private static async Task<bool> GetStackOutputs(string stackId) + { + try + { + var describeStacksRequest = new DescribeStacksRequest { StackName = stackId }; + + var describeStacksResponse = + await _amazonCloudFormation.DescribeStacksAsync(describeStacksRequest); + + if (describeStacksResponse.Stacks.Count > 0) + { + var stack = describeStacksResponse.Stacks[0]; + _roleArn = GetStackOutputValue(stack, "RoleARN"); + _snsTopicArn = GetStackOutputValue(stack, "SNStopicARN"); + return true; + } + else + { + _logger.LogError($"No stack found for stack outputs: {stackId}"); + return false; + } + } + catch (Exception ex) + { + _logger.LogError( + ex, $"Failed to retrieve CloudFormation stack outputs: {stackId}"); + return false; + } + } + + /// <summary> + /// Get an output value by key from a CloudFormation stack. + /// </summary> + /// <param name="stack">The CloudFormation stack.</param> + /// <param name="outputKey">The key of the output.</param> + /// <returns>The value as a string.</returns> + private static string GetStackOutputValue(Stack stack, string outputKey) + { + var output = stack.Outputs.First(o => o.OutputKey == outputKey); + var outputValue = output.OutputValue; + Console.WriteLine($"Stack output {outputKey}: {outputValue}"); + return outputValue; + } + + /// <summary> + /// Creates a one-time schedule to send an initial event. + /// </summary> + /// <returns>True if the one-time schedule was created successfully.</returns> + public static async Task<bool> CreateOneTimeSchedule() + { + var scheduleName = + PromptUserForResourceName("Enter a name for the one-time schedule:"); + + Console.WriteLine($"Creating a one-time schedule named '{scheduleName}' " + + $"\nto send an initial event in 1 minute with a flexible time window..."); + try + { + // Create a one-time schedule with a flexible time + // window set to delete after completion. + // You may also set a timezone instead of using UTC. + var scheduledTime = DateTime.UtcNow.AddMinutes(1).ToString("s"); + + var createSuccess = await _schedulerWrapper.CreateScheduleAsync( + scheduleName, + $"at({scheduledTime})", + _scheduleGroupName, + _snsTopicArn, + _roleArn, + $"One time scheduled event test from schedule {scheduleName}.", + true, + useFlexibleTimeWindow: true); + + Console.WriteLine($"Subscription email will receive an email from this event."); + Console.WriteLine($"You must confirm your subscription to receive event emails."); + + Console.WriteLine($"One-time schedule '{scheduleName}' created successfully."); + return createSuccess; + } + catch (ResourceNotFoundException ex) + { + _logger.LogError(ex, $"The target with ARN '{_snsTopicArn}' was not found."); + return false; + } + catch (Exception ex) + { + _logger.LogError(ex, $"An error occurred while creating the one-time schedule '{scheduleName}'."); + return false; + } + } + + /// <summary> + /// Create a recurring schedule to send events at a specified rate in minutes. + /// </summary> + /// <returns>True if the recurring schedule was created successfully.</returns> + public static async Task<bool> CreateRecurringSchedule() + { + Console.WriteLine("Creating a recurring schedule to send events for one hour..."); + + try + { + // Prompt the user for a schedule name. + var scheduleName = + PromptUserForResourceName("Enter a name for the recurring schedule: "); + + // Prompt the user for the schedule rate (in minutes). + var scheduleRateInMinutes = + PromptUserForInteger("Enter the desired schedule rate (in minutes): "); + + // Create the recurring schedule. + var createSuccess = await _schedulerWrapper.CreateScheduleAsync( + scheduleName, + $"rate({scheduleRateInMinutes} minutes)", + _scheduleGroupName, + _snsTopicArn, + _roleArn, + $"Recurrent event test from schedule {scheduleName}."); + + Console.WriteLine($"Subscription email will receive an email from this event."); + Console.WriteLine($"You must confirm your subscription to receive event emails."); + + // Delete the schedule when the user is finished. + if (!_interactive || GetYesNoResponse($"Are you ready to delete the '{scheduleName}' schedule? (y/n)")) + { + await _schedulerWrapper.DeleteScheduleAsync(scheduleName, _scheduleGroupName); + } + + return createSuccess; + } + catch (ResourceNotFoundException ex) + { + _logger.LogError(ex, $"The target with ARN '{_snsTopicArn}' was not found."); + return false; + } + catch (Exception ex) + { + _logger.LogError(ex, "An error occurred while creating the recurring schedule."); + return false; + } + } + + /// <summary> + /// Cleans up the resources created during the workflow. + /// </summary> + /// <returns>True if the cleanup was successful.</returns> + public static async Task<bool> Cleanup() + { + // Prompt the user to confirm cleanup. + var cleanup = !_interactive || GetYesNoResponse( + "Do you want to delete all resources created by this workflow? (y/n) "); + if (cleanup) + { + try + { + // Delete the schedule group. + var groupDeleteSuccess = await _schedulerWrapper.DeleteScheduleGroupAsync(_scheduleGroupName); + + // Destroy the CloudFormation stack and wait for it to be removed. + var stackDeleteSuccess = await DeleteCloudFormationStack(_stackName, false); + + return groupDeleteSuccess && stackDeleteSuccess; + } + catch (Exception ex) + { + _logger.LogError(ex, + "An error occurred while cleaning up the resources."); + return false; + } + } + _logger.LogInformation("EventBridge Scheduler workflow is complete."); + return true; + } + + /// <summary> + /// Delete the resources in the stack and wait for confirmation. + /// </summary> + /// <param name="stackName">The name of the stack.</param> + /// <param name="forceDelete">True to force delete the stack.</param> + /// <returns>True if successful.</returns> + private static async Task<bool> DeleteCloudFormationStack(string stackName, bool forceDelete) + { + var request = new DeleteStackRequest + { + StackName = stackName, + }; + + if (forceDelete) + { + request.DeletionMode = DeletionMode.FORCE_DELETE_STACK; + } + + await _amazonCloudFormation.DeleteStackAsync(request); + Console.WriteLine($"CloudFormation stack '{_stackName}' is being deleted. This may take a few minutes."); + + bool stackDeleted = await WaitForStackDeletion(_stackName, forceDelete); + + if (stackDeleted) + { + Console.WriteLine($"CloudFormation stack '{_stackName}' has been deleted."); + return true; + } + else + { + _logger.LogError($"Failed to delete CloudFormation stack '{_stackName}'."); + return false; + } + } + + /// <summary> + /// Wait for the stack to be deleted. + /// </summary> + /// <param name="stackName">The name of the stack.</param> + /// <param name="forceDelete">True to force delete the stack.</param> + /// <returns>True if successful.</returns> + private static async Task<bool> WaitForStackDeletion(string stackName, bool forceDelete) + { + int retryCount = 0; + const int maxRetries = 10; + const int retryDelay = 30000; // 30 seconds + + while (retryCount < maxRetries) + { + var describeStacksRequest = new DescribeStacksRequest + { + StackName = stackName + }; + + try + { + var describeStacksResponse = await _amazonCloudFormation.DescribeStacksAsync(describeStacksRequest); + + if (describeStacksResponse.Stacks.Count == 0 || describeStacksResponse.Stacks[0].StackStatus == StackStatus.DELETE_COMPLETE) + { + return true; + } + if (!forceDelete && describeStacksResponse.Stacks[0].StackStatus == StackStatus.DELETE_FAILED) + { + // Try one time to force delete. + return await DeleteCloudFormationStack(stackName, true); + } + } + catch (AmazonCloudFormationException ex) when (ex.ErrorCode == "ValidationError") + { + // Stack does not exist, so it has been successfully deleted. + return true; + } + + Console.WriteLine($"Waiting for CloudFormation stack '{stackName}' to be deleted..."); + await Task.Delay(retryDelay); + retryCount++; + } + + _logger.LogError($"Timed out waiting for CloudFormation stack '{stackName}' to be deleted."); + return false; + } + + /// <summary> + /// Helper method to get a yes or no response from the user. + /// </summary> + /// <param name="question">The question string to print on the console.</param> + /// <returns>True if the user responds with a yes.</returns> + private static bool GetYesNoResponse(string question) + { + Console.WriteLine(question); + var ynResponse = Console.ReadLine(); + var response = ynResponse != null && ynResponse.Equals("y", StringComparison.InvariantCultureIgnoreCase); + return response; + } + + /// <summary> + /// Prompt the user for a valid email address. + /// </summary> + /// <returns>The valid email address.</returns> + private static string PromptUserForEmail() + { + if (_interactive) + { + Console.WriteLine("Enter an email address to use for event subscriptions: "); + + string email = Console.ReadLine()!; + + if (!IsValidEmail(email)) + { + Console.WriteLine("Invalid email address. Please try again."); + return PromptUserForEmail(); + } + return email; + } + // Used when running without user prompts. + return ""; + } + + /// <summary> + /// Prompt the user for a non-empty stack name. + /// </summary> + /// <returns>The valid stack name</returns> + private static string PromptUserForStackName() + { + Console.WriteLine("Enter a name for the AWS Cloud Formation Stack: "); + if (_interactive) + { + string stackName = Console.ReadLine()!; + var regex = "[a-zA-Z][-a-zA-Z0-9]|arn:[-a-zA-Z0-9:/._+]"; + if (!Regex.IsMatch(stackName, regex)) + { + Console.WriteLine( + $"Invalid stack name. Please use a name that matches the pattern {regex}."); + return PromptUserForStackName(); + } + + return stackName; + } + // Used when running without user prompts. + return _stackName; + } + + /// <summary> + /// Prompt the user for a non-empty resource name. + /// </summary> + /// <returns>The valid stack name</returns> + private static string PromptUserForResourceName(string prompt) + { + if (_interactive) + { + Console.WriteLine(prompt); + string resourceName = Console.ReadLine()!; + var regex = "[0-9a-zA-Z-_.]+"; + if (!Regex.IsMatch(resourceName, regex)) + { + Console.WriteLine($"Invalid resource name. Please use a name that matches the pattern {regex}."); + return PromptUserForResourceName(prompt); + } + return resourceName!; + } + // Used when running without user prompts. + return "resource-" + Guid.NewGuid(); + } + + /// <summary> + /// Prompt the user for a non-empty resource name. + /// </summary> + /// <returns>The valid stack name</returns> + private static int PromptUserForInteger(string prompt) + { + if (_interactive) + { + Console.WriteLine(prompt); + string stringResponse = Console.ReadLine()!; + if (string.IsNullOrWhiteSpace(stringResponse) || + !Int32.TryParse(stringResponse, out var intResponse)) + { + Console.WriteLine($"Invalid integer. "); + return PromptUserForInteger(prompt); + } + return intResponse!; + } + // Used when running without user prompts. + return 1; + } + + /// <summary> + /// Use System Mail to check for a valid email address. + /// </summary> + /// <param name="email">The string to verify.</param> + /// <returns>True if a valid email address.</returns> + private static bool IsValidEmail(string email) + { + try + { + var mailAddress = new System.Net.Mail.MailAddress(email); + return mailAddress.Address == email; + } + catch + { + // Invalid emails will cause an exception, return false. + return false; + } + } +} +// snippet-end:[Scheduler.dotnetv3.SchedulerWorkflow] \ No newline at end of file diff --git a/dotnetv3/EventBridge Scheduler/Tests/SchedulerTests.csproj b/dotnetv3/EventBridge Scheduler/Tests/SchedulerTests.csproj new file mode 100644 index 00000000000..347928e7cad --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/Tests/SchedulerTests.csproj @@ -0,0 +1,38 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net6.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + + <IsPackable>false</IsPackable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" /> + <PackageReference Include="Moq" Version="4.20.70" /> + <PackageReference Include="xunit" Version="2.4.1" /> + <PackageReference Include="Xunit.Extensions.Ordering" Version="1.4.5" /> + <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> + <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> + <PrivateAssets>all</PrivateAssets> + </PackageReference> + <PackageReference Include="coverlet.collector" Version="3.1.2"> + <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> + <PrivateAssets>all</PrivateAssets> + </PackageReference> + </ItemGroup> + + <ItemGroup> + <Content Include="testsettings.*.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + <DependentUpon>testsettings.json</DependentUpon> + </Content> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\Scenarios\SchedulerScenario.csproj" /> + </ItemGroup> + +</Project> diff --git a/dotnetv3/EventBridge Scheduler/Tests/SchedulerWorkflowTests.cs b/dotnetv3/EventBridge Scheduler/Tests/SchedulerWorkflowTests.cs new file mode 100644 index 00000000000..22a9841d901 --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/Tests/SchedulerWorkflowTests.cs @@ -0,0 +1,81 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +using Amazon.CloudFormation; +using Amazon.Scheduler; +using Microsoft.Extensions.Logging; +using Moq; +using SchedulerActions; +using SchedulerScenario; + +namespace SchedulerTests; + +/// <summary> +/// Test class. +/// </summary> +public class SchedulerWorkflowTests +{ + private SchedulerWrapper _schedulerWrapper = null!; + + /// <summary> + /// Verifies the workflow with an integration test. No errors should be logged. + /// </summary> + /// <returns>Async task.</returns> + [Fact] + [Order(1)] + [Trait("Category", "Integration")] + public async Task TestWorkflow() + { + // Arrange. + SchedulerWorkflow._interactive = false; + var loggerWorkflowMock = new Mock<ILogger<SchedulerWorkflow>>(); + var loggerWrapperMock = new Mock<ILogger<SchedulerWrapper>>(); + + _schedulerWrapper = new SchedulerWrapper( + new AmazonSchedulerClient(), + loggerWrapperMock.Object); + + SchedulerWorkflow._schedulerWrapper = _schedulerWrapper; + SchedulerWorkflow._amazonCloudFormation = new AmazonCloudFormationClient(); + SchedulerWorkflow._logger = loggerWorkflowMock.Object; + + loggerWorkflowMock.Setup(logger => logger.Log( + It.Is<LogLevel>(logLevel => logLevel == LogLevel.Error), + It.IsAny<EventId>(), + It.Is<It.IsAnyType>((@object, @type) => true), + It.IsAny<Exception>(), + It.IsAny<Func<It.IsAnyType, Exception?, string>>() + )); + + loggerWrapperMock.Setup(logger => logger.Log( + It.Is<LogLevel>(logLevel => logLevel == LogLevel.Error), + It.IsAny<EventId>(), + It.Is<It.IsAnyType>((@object, @type) => true), + It.IsAny<Exception>(), + It.IsAny<Func<It.IsAnyType, Exception?, string>>() + )); + + // Act. + await SchedulerWorkflow.Main(new string[] { "" }); + + // Assert no exceptions or errors logged. + loggerWorkflowMock.Verify( + logger => logger.Log( + It.Is<LogLevel>(logLevel => logLevel == LogLevel.Error), + It.IsAny<EventId>(), + It.Is<It.IsAnyType>((@object, @type) => true), + It.IsAny<Exception>(), + It.IsAny<Func<It.IsAnyType, Exception?, string>>()), + Times.Never); + + loggerWrapperMock.Verify( + logger => logger.Log( + It.Is<LogLevel>(logLevel => logLevel == LogLevel.Error), + It.IsAny<EventId>(), + It.Is<It.IsAnyType>((@object, @type) => true), + It.IsAny<Exception>(), + It.IsAny<Func<It.IsAnyType, Exception?, string>>()), + Times.Never); + } + +} \ No newline at end of file diff --git a/dotnetv3/EventBridge Scheduler/Tests/Usings.cs b/dotnetv3/EventBridge Scheduler/Tests/Usings.cs new file mode 100644 index 00000000000..32e066afee3 --- /dev/null +++ b/dotnetv3/EventBridge Scheduler/Tests/Usings.cs @@ -0,0 +1,12 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +global using Xunit; +global using Xunit.Extensions.Ordering; + +// Optional. +[assembly: CollectionBehavior(DisableTestParallelization = true)] +// Optional. +[assembly: TestCaseOrderer("Xunit.Extensions.Ordering.TestCaseOrderer", "Xunit.Extensions.Ordering")] +// Optional. +[assembly: TestCollectionOrderer("Xunit.Extensions.Ordering.CollectionOrderer", "Xunit.Extensions.Ordering")] \ No newline at end of file diff --git a/workflows/eventbridge_scheduler/README.md b/workflows/eventbridge_scheduler/README.md new file mode 100644 index 00000000000..5c3028fd30f --- /dev/null +++ b/workflows/eventbridge_scheduler/README.md @@ -0,0 +1,84 @@ +# Amazon EventBridge Scheduler Workflow + +## Overview +This example shows how to use AWS SDKs to work with Amazon EventBridge Scheduler with schedules and schedule groups. The workflow demonstrates how to create and delete one-time and recurring schedules within a schedule group to generate events on a specified target, such as an Amazon Simple Notification Service (Amazon SNS) Topic. + +The target SNS topic and the AWS Identity and Access Management (IAM) role used with the schedules are created as part of an AWS CloudFormation stack that is deployed at the start of the workflow, and deleted when the workflow is complete. + +![Object Lock Features](resources/scheduler-workflow.png) + +This workflow demonstrates the following steps and tasks: + +1. **Prepare the Application** + + - Prompts the user for an email address to use for the subscription for the SNS topic. + - Prompts the user for a name for the Cloud Formation stack. + - The user must confirm the email subscription to receive event emails. + - Deploys the Cloud Formation template in resources/cfn_template.yaml for resource creation. + - Stores the outputs of the stack into variables for use in the workflow. + - Creates a schedule group for all workflow schedules. + +2. **Create a one-time Schedule** + + - Creates a one-time schedule to send an initial event. + - Prompts the user for a name for the one-time schedule. + - The user must confirm the email subscription to receive an event email. + - The content of the email should include the name of the newly created schedule. + - Use a Flexible Time Window of 10 minutes and set the schedule to delete after completion. + +3. **Create a time-based schedule** + + - Prompts the user for a rate per minutes (example: every 2 minutes) for a scheduled recurring event. + - Creates the scheduled event for X times per hour for 1 hour. + - Deletes the schedule when the user is finished. + - Prompts the user to confirm when they are ready to delete the schedule. + +4. **Clean up** + + - Prompts the user to confirm they want to destroy the stack and clean up all resources. + - Deletes the schedule group. + - Destroys the Cloud Formation stack and wait until the stack has been removed. + +## Prerequisites + +Before running this workflow, ensure you have: + +- An AWS account with proper permissions to use Amazon EventBridge Scheduler and Amazon EventBridge. + +## AWS Services Used + +This workflow uses the following AWS services: + +- Amazon EventBridge Scheduler +- Amazon EventBridge +- Amazon Simple Notification Service (SNS) +- AWS CloudFormation + +### Resources + +The workflow scenario deploys the AWS CloudFormation stack with the required resources. + +## Amazon EventBridge Scheduler Actions + +The workflow covers the following EventBridge Scheduler API actions: + +- [`CreateSchedule`](https://docs.aws.amazon.com/scheduler/latest/APIReference/API_CreateSchedule.html) +- [`CreateScheduleGroup`](https://docs.aws.amazon.com/scheduler/latest/APIReference/API_CreateScheduleGroup.html) +- [`DeleteSchedule`](https://docs.aws.amazon.com/scheduler/latest/APIReference/API_DeleteSchedule.html) +- [`DeleteScheduleGroup`](https://docs.aws.amazon.com/scheduler/latest/APIReference/API_DeleteScheduleGroup.html) + +## Implementations + +This example is implemented in the following languages: + +- [.NET](../../dotnetv3/EventBridge Scheduler/README.md) + +## Additional resources + +* [EventBridge Scheduler User Guide](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html) +* [EventBridge Scheduler API Reference](https://docs.aws.amazon.com/scheduler/latest/APIReference/Welcome.html) + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +SPDX-License-Identifier: Apache-2.0 diff --git a/workflows/eventbridge_scheduler/SPECIFICATION.md b/workflows/eventbridge_scheduler/SPECIFICATION.md new file mode 100644 index 00000000000..bf8e34a66d6 --- /dev/null +++ b/workflows/eventbridge_scheduler/SPECIFICATION.md @@ -0,0 +1,165 @@ +# EventBridge Scheduler Workflow - Technical Specification + +This document contains the technical specifications for _Amazon Eventbridge Scheduler Workflow_, +a workflow scenario that showcases AWS services and SDKs. It is primarily intended for the AWS code +examples team to use while developing this example in additional languages. + +This document explains the following: + +- Architecture and features of the example workflow. +- Sample reference output. +- Suggested error handling. +- Metadata information for the scenario. + +For an introduction, see the [README.md](README.md). + +--- + +### Table of contents + +- [Resources and User Input](#resources-and-user-input) +- [Errors](#errors) +- [Metadata](#metadata) + +## Resources and User Input + +- The workflow deploys an AWS CloudFormation stack with the following resources: + - An Amazon Simple Notification Service (Amazon SNS) topic. + - An email subscription to the topic. The user must confirm their subscription to receive email notifications for the scheduled events. + - An AWS Identity and Access Management (IAM) Role with permission for the scheduler service to assume the role and publish to SNS. +- The workflow should prompt the user for a stack name. +- The workflow should check that the stack name does not already exist. +- The workflow should wait for the stack CREATE_COMPLETE status. + - After a successful deploy, the workflow should retrieve and print the output values for `RoleARN` and `SNStopicARN`, which will be used for the EventBridge Scheduler operations. +- If the stack has any failed status, notify the user and end the workflow. + +Example: +``` +-------------------------------------------------------------------------------- +Welcome to the Amazon EventBridge Scheduler Workflow. +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +Preparing the application... + +This example creates resources in a CloudFormation stack, including an SNS topic +that will be subscribed to the EventBridge Scheduler events. + +You will need to confirm the subscription in order to receive event emails. +Enter an email address to use for event subscriptions: +test@example.com +Enter a name for the AWS Cloud Formation Stack: +teststack10 + +Deploying CloudFormation stack: teststack10 +Enter a name for the AWS Cloud Formation Stack: +warn: SchedulerScenario.SchedulerWorkflow[0] + CloudFormation stack 'teststack10' already exists. Please provide a unique name. +stackAB + +Deploying CloudFormation stack: stackAB +CloudFormation stack creation started: stackAB +Waiting for CloudFormation stack creation to complete... +CloudFormation stack creation complete. +Stack output RoleARN: arn:aws:iam::123456789123:role/example_scheduler_role +Stack output SNStopicARN: arn:aws:sns:us-east-1:123456789123:stackAB-SchedulerSnsTopic-UORtMkZypo3x +-------------------------------------------------------------------------------- + +``` +- The workflow creates the following EventBridge Scheduler resources: + - A Schedule Group, for organizing schedules. + - The group can use a default name, but should be unique. If the user enters and invalid name, they should be prompted again. + - A One-Time Schedule, with a flexible time window that will delete after completion. + - The user should be prompted for the schedule name, which will appear in notification emails. + - The schedule should use a flexible time window (for example, 5 minutes) and be set to delete after completion. + - A Recurring Schedule, which will run for one hour at a specified rate. + - The schedule should start at the current time and run for one hour. + - The user should be prompted for the schedule name, which will appear in notification emails. + - The program should wait to allow time for the schedule to run, and then prompt the user to delete the schedule. + +Example: + +``` +Successfully created schedule group 'workflow-schedules-group'. +Application preparation complete. +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +Enter a name for the one-time schedule: +one-time-test +Creating a one-time schedule named 'one-time-test' to send an initial event in 1 minute... +Successfully created schedule 'one-time-test' in schedule group 'workflow-schedules-group'. +Subscription email will receive an email from this event. +You must confirm your subscription to receive event emails. +One-time schedule 'one-time-test' created successfully. +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +Creating a recurring schedule to send events for one hour... +Enter a name for the recurring schedule: +recurring-test +Enter the desired schedule rate (in minutes): +2 +Successfully created schedule 'recurring-test' in schedule group 'workflow-schedules-group'. +Subscription email will receive an email from this event. +You must confirm your subscription to receive event emails. +Are you ready to delete the 'recurring-test' schedule? (y/n) +y +``` + +- Subscription Emails + - After confirming their subscription, the user should receive one email from the one-time schedule, and a recurring email from the recurring schedule. + - The email text should contain the user's custom name for each schedule. + +Example + +![Emails](/resources/emails.png) + +- Cleanup + - The workflow should prompt the user for cleanup: + - Delete the schedule and schedule group. + - Delete the CloudFormation stack. + - If the stack fails to delete, it should be force-deleted. + - The cleanup operation should attempt to run if there are any errors in the workflow. + - The user should be notified if the delete operation cannot occur. + +Example: + +``` +Are you ready to delete the 'recurring-test' schedule? (y/n) +y +Successfully deleted schedule with name 'recurring-test'. +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +Do you want to delete all resources created by this workflow? (y/n) +y +Successfully deleted schedule group 'workflow-schedules-group'. +CloudFormation stack 'teststack10' is being deleted. This may take a few minutes. +Waiting for CloudFormation stack 'teststack10' to be deleted... +Waiting for CloudFormation stack 'teststack10' to be deleted... +CloudFormation stack 'teststack10' has been deleted. +-------------------------------------------------------------------------------- +Amazon EventBridge Scheduler workflow completed. +``` + +--- +## Errors + +| action | Error | Handling | +|------------------------------|---------------------------|--------------------------------------------------| +| `ListSchedules` | none | Not required for Hello Service | +| `CreateSchedule` | ConflictException | Notify the user to use a unique name. | +| `CreateScheduleGroup` | ConflictException | Notify the user to use a unique name. | +| `DeleteSchedule` | ResourceNotFoundException | Notify the user the schedule is already deleted. | +| `DeleteScheduleGroup` | ResourceNotFoundException | Notify the user the group is already deleted. | + +--- + +## Metadata + +| action / scenario | metadata file | metadata key | +|----------------------------------|-------------------------| --------------------------------- | +| `ListSchedules` | scheduler_metadata.yaml | scheduler_hello | +| `CreateSchedule` | scheduler_metadata.yaml | scheduler_CreateSchedule | +| `CreateScheduleGroup` | scheduler_metadata.yaml | scheduler_CreateScheduleGroup | +| `DeleteSchedule` | scheduler_metadata.yaml | scheduler_DeleteSchedule | +| `DeleteScheduleGroup` | scheduler_metadata.yaml | scheduler_DeleteScheduleGroup | +| `EventBridge Scheduler Workflow` | scheduler_metadata.yaml | scheduler_ScheduledEventsWorkflow | + diff --git a/workflows/eventbridge_scheduler/resources/cfn_template.yaml b/workflows/eventbridge_scheduler/resources/cfn_template.yaml new file mode 100644 index 00000000000..b24408fadab --- /dev/null +++ b/workflows/eventbridge_scheduler/resources/cfn_template.yaml @@ -0,0 +1,48 @@ +Parameters: + email: + Type: String + Default: 'scheduler_test@example.com' + +Resources: + SchedulerSnsTopic: + Type: AWS::SNS::Topic + + MySubscription: + Type: AWS::SNS::Subscription + Properties: + Endpoint: !Ref email + Protocol: email + TopicArn: !Ref SchedulerSnsTopic + + SchedulerRole: + Type: AWS::IAM::Role + Properties: + RoleName: example_scheduler_role + Path: / + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: 'Allow' + Principal: + Service: 'scheduler.amazonaws.com' + Action: + - 'sts:AssumeRole' + Policies: + - PolicyName: 'Scheduler_SNS_policy' + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: 'Allow' + Action: + - 'sns:Publish' + Resource: !Ref SchedulerSnsTopic + +Outputs: + + SNStopicARN: + Description: SNS topic ARN + Value: !Ref SchedulerSnsTopic + + RoleARN: + Description: Scheduler role ARN + Value: !GetAtt SchedulerRole.Arn diff --git a/workflows/eventbridge_scheduler/resources/emails.png b/workflows/eventbridge_scheduler/resources/emails.png new file mode 100644 index 0000000000000000000000000000000000000000..8758735baf2acf470b2770aa60771f04d3478596 GIT binary patch literal 11283 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 F{0F7r5$6B^ literal 0 HcmV?d00001 diff --git a/workflows/eventbridge_scheduler/resources/scheduler-workflow.png b/workflows/eventbridge_scheduler/resources/scheduler-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..53fa99b5cd6150404387d6a2482c75842cba4085 GIT binary patch literal 56179 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 _pDG|*Abuu2leLxzGbo6=E7%Mca^#OO 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 F{$ER!0+|2+ literal 0 HcmV?d00001 From c8afcc94b12ff25d5428a99d6ad4446a5760700c Mon Sep 17 00:00:00 2001 From: Brian Murray <40031786+brmur@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:46:31 +0100 Subject: [PATCH 35/98] Removing old JS examples (#6763) Removing old JS examples (cross-service Transcription and Step Functions) --- ...s_ServerlessWorkflows_JavaScript_block.xml | 21 - ...ross_TranscriptionApp_JavaScript_block.xml | 19 - .doc_gen/metadata/cross_metadata.yaml | 19 - .../lambda-step-functions/README.md | 25 - .../lambda-step-functions/package.json | 24 - .../lambda-step-functions/setup.yaml | 205 - .../src/lambda1/getid.js | 28 - .../src/lambda2/additem.js | 72 - .../src/lambda3/sendemail.js | 70 - .../src/libs/dynamoClient.js | 25 - .../src/libs/sesClient.js | 24 - .../transcription-app/README.md | 25 - .../transcription-app/package.json | 41 - .../transcription-app/setup.yaml | 377 - .../transcription-app/src/helper.js | 89 - .../transcription-app/src/index.html | 55 - .../transcription-app/src/index.js | 283 - .../transcription-app/src/recorder.css | 66 - .../transcription-app/src/recorder.js | 69 - .../cdk.json | 10 - .../package-lock.json | 18523 ---------------- .../package.json | 29 - .../setup.ts | 212 - .../tsconfig.json | 23 - .../cdk/lambda_api_step_functions/cdk.json | 10 - .../lambda_api_step_functions/package.json | 30 - .../cdk/lambda_api_step_functions/setup.ts | 143 - .../lambda_api_step_functions/tsconfig.json | 23 - 28 files changed, 20540 deletions(-) delete mode 100644 .doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml delete mode 100644 .doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/README.md delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/package.json delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/README.md delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/package.json delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/setup.yaml delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/helper.js delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/index.html delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/index.js delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/recorder.css delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/recorder.js delete mode 100644 resources/cdk/javascript_example_code_transcribe_demo/cdk.json delete mode 100644 resources/cdk/javascript_example_code_transcribe_demo/package-lock.json delete mode 100644 resources/cdk/javascript_example_code_transcribe_demo/package.json delete mode 100644 resources/cdk/javascript_example_code_transcribe_demo/setup.ts delete mode 100644 resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json delete mode 100644 resources/cdk/lambda_api_step_functions/cdk.json delete mode 100644 resources/cdk/lambda_api_step_functions/package.json delete mode 100644 resources/cdk/lambda_api_step_functions/setup.ts delete mode 100644 resources/cdk/lambda_api_step_functions/tsconfig.json diff --git a/.doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml b/.doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml deleted file mode 100644 index 5869e6b626a..00000000000 --- a/.doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "file://zonbook/docbookx.dtd"[ - <!ENTITY % phrases-shared SYSTEM "file://AWSShared/common/phrases-shared.ent"> - %phrases-shared; -]> -<block> - <para> - Shows how to create an &AWS; serverless workflow by using &SFNlong; and the &JSBlong;. - Each workflow step is implemented using an &LAMlong; function. - </para> - <para>&LAM; is a compute service that enables you to run code without provisioning or managing servers. - &SFN; is a serverless orchestration service that lets you combine &LAM; functions and other &AWS; - services to build business-critical applications. - </para> - <para> - For complete source code and instructions on how to set up and run, see the full example on - <ulink url="https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/cross-services/lambda-step-functions">GitHub</ulink>. - </para> - <para>This example is also available in the - <ulink type="documentation" url="sdk-for-javascript/v3/developer-guide/serverless-step-functions-example.html">&JSBlong; v3 developer guide</ulink>.</para> -</block> \ No newline at end of file diff --git a/.doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml b/.doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml deleted file mode 100644 index 19ec9bc0f77..00000000000 --- a/.doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "file://zonbook/docbookx.dtd"[ - <!ENTITY % phrases-shared SYSTEM "file://AWSShared/common/phrases-shared.ent"> - %phrases-shared; -]> -<block> - <para> - Create an app that uses &TSClong; to transcribe and display voice recordings in the browser. The app uses - two &S3long; (&S3;) buckets, one to host the application code, and another to store transcriptions. The app uses - an &COGlong; user pool to authenticate your users. Authenticated users have &IAMlong; (&IAM;) permissions to - access the required &AWS; services. - </para> - <para> - For complete source code and instructions on how to set up and run, see the full example on - <ulink url="https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/cross-services/transcription-app">GitHub</ulink>. - </para> - <para>This example is also available in the - <ulink type="documentation" url="sdk-for-javascript/v3/developer-guide/transcribe-app.html">&JSBlong; v3 developer guide</ulink>.</para> -</block> diff --git a/.doc_gen/metadata/cross_metadata.yaml b/.doc_gen/metadata/cross_metadata.yaml index 42754363502..44f8c0360a8 100644 --- a/.doc_gen/metadata/cross_metadata.yaml +++ b/.doc_gen/metadata/cross_metadata.yaml @@ -426,31 +426,12 @@ cross_ServerlessWorkflows: versions: - sdk_version: 2 block_content: cross_ServerlessWorkflows_Java_block.xml - JavaScript: - versions: - - sdk_version: 3 - github: javascriptv3/example_code/cross-services/lambda-step-functions - block_content: cross_ServerlessWorkflows_JavaScript_block.xml service_main: sfn services: dynamodb: lambda: ses: sfn: -cross_TranscriptionApp: - title: Build an &TSC; app - title_abbrev: Build an &TSC; app - synopsis: use &TSClong; to transcribe and display voice recordings in the browser. - languages: - JavaScript: - versions: - - sdk_version: 3 - block_content: cross_TranscriptionApp_JavaScript_block.xml - service_main: transcribe - services: - cognito-identity: - s3: - transcribe: cross_TranscriptionStreamingApp: title: Build an &TSC; streaming app title_abbrev: Build an &TSC; streaming app diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/README.md b/javascriptv3/example_code/cross-services/lambda-step-functions/README.md deleted file mode 100644 index 8319df67117..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# JavaScript environment for tutorial to create an AWS serverless workflow using AWS SDK for JavaScript and AWS Step Functions - -This is a workspace where you can find an AWS SDK for JavaScript version 3 (v3) tutorial that demonstrates how to -create AWS serverless workflows using AWS Step Functions. - -For instructions on implementing this example, see [Creating AWS serverless workflows using AWS SDK for JavaScript](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-step-functions-example.html) in the _AWS SDK for JavaScript v3 Developer Guide_. - -# Getting started - -1. Clone the [AWS Code Examples Repository](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. - See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for - instructions. - -1. Install the dependencies listed in the [root]/javascriptv3/example_code/cross-services/lambda-step-functions/package.json. - -**Note**: These include the AWS SDK for JavaScript v3 client modules for the AWS services required in this example, -which include _@aws-sdk/client-dynamodb_ and _@aws-sdk/client-ses_. - -They also include third-party Node.js modules, including webpack. - -``` -npm install node -g -cd javascriptv3/example_code/cross-services/lambda-step-functions -npm install -``` diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/package.json b/javascriptv3/example_code/cross-services/lambda-step-functions/package.json deleted file mode 100644 index 43d46da3fd2..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@aws-doc-sdk-examples/lambda-api-gateway-example", - "version": "1.0.0", - "description": "Using the AWS SDK for JavaScript V3 to build and deploy Lambda functions on API Gateway.", - "main": "index.js", - "repository": "git@github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/iam.git", - "author": "brmur", - "license": "Apache 2.0", - "scripts": { - "build-lambda-1": "webpack getid.js --mode development --target node --devtool false --output-library-target umd -o index.js", - "build-lambda-2": "webpack additem.js --mode development --target node --devtool false --output-library-target umd -o index.js", - "build-lambda-3": "webpack sendemail.js --mode development --target node --devtool false --output-library-target umd -o index.js", - "build-cdk": "aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM", - "test": "exit 0" - }, - "dependencies": { - "@aws-sdk/client-dynamodb": "^3.32.0", - "@aws-sdk/client-ses": "^3.7.0" - }, - "devDependencies": { - "webpack": "^4.42.0", - "webpack-cli": "^3.3.11" - } -} diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml b/javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml deleted file mode 100644 index 854a3543338..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml +++ /dev/null @@ -1,205 +0,0 @@ -Resources: - ExampleIdentityPool: - Type: AWS::Cognito::IdentityPool - Properties: - AllowUnauthenticatedIdentities: true - Metadata: - aws:cdk:path: stepfunctions/ExampleIdentityPool - LambdaRole3A44B857: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRoleWithWebIdentity - Condition: - StringEquals: - cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPool - ForAnyValue:StringLike: - cognito-identity.amazonaws.com:amr: unauthenticated - Effect: Allow - Principal: - Federated: cognito-identity.amazonaws.com - - Action: sts:AssumeRole - Effect: Allow - Principal: - Service: lambda.amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: stepfunctions/LambdaRole/Resource - LambdaRoleDefaultPolicy75625A82: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: - - lambda:InvokeFunction - - mobileanalytics:PutEvents - - cognito-sync:* - Effect: Allow - Resource: "*" - - Action: dynamodb:* - Effect: Allow - Resource: "*" - - Action: ses:* - Effect: Allow - Resource: "*" - Version: "2012-10-17" - PolicyName: LambdaRoleDefaultPolicy75625A82 - Roles: - - Ref: LambdaRole3A44B857 - Metadata: - aws:cdk:path: stepfunctions/LambdaRole/DefaultPolicy/Resource - DefaultValid: - Type: AWS::Cognito::IdentityPoolRoleAttachment - Properties: - IdentityPoolId: - Ref: ExampleIdentityPool - Roles: - unauthenticated: - Fn::GetAtt: - - LambdaRole3A44B857 - - Arn - Metadata: - aws:cdk:path: stepfunctions/DefaultValid - ExampleIdentityPoolWorkflow: - Type: AWS::Cognito::IdentityPool - Properties: - AllowUnauthenticatedIdentities: true - Metadata: - aws:cdk:path: stepfunctions/ExampleIdentityPoolWorkflow - WorkflowRole21EC4257: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRoleWithWebIdentity - Condition: - StringEquals: - cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPoolWorkflow - ForAnyValue:StringLike: - cognito-identity.amazonaws.com:amr: unauthenticated - Effect: Allow - Principal: - Federated: cognito-identity.amazonaws.com - - Action: sts:AssumeRole - Effect: Allow - Principal: - Service: - Fn::Join: - - "" - - - states. - - Ref: AWS::Region - - .amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: stepfunctions/WorkflowRole/Resource - WorkflowRoleDefaultPolicyB4C63B85: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: - - lambda:InvokeFunction - - mobileanalytics:PutEvents - - cognito-sync:* - Effect: Allow - Resource: "*" - Version: "2012-10-17" - PolicyName: WorkflowRoleDefaultPolicyB4C63B85 - Roles: - - Ref: WorkflowRole21EC4257 - Metadata: - aws:cdk:path: stepfunctions/WorkflowRole/DefaultPolicy/Resource - DefaultValidWorkflow: - Type: AWS::Cognito::IdentityPoolRoleAttachment - Properties: - IdentityPoolId: - Ref: ExampleIdentityPoolWorkflow - Roles: - unauthenticated: - Fn::GetAtt: - - WorkflowRole21EC4257 - - Arn - Metadata: - aws:cdk:path: stepfunctions/DefaultValidWorkflow - CDKMetadata: - Type: AWS::CDK::Metadata - Properties: - Modules: aws-cdk=1.109.0,@aws-cdk/assets=1.84.0,@aws-cdk/aws-applicationautoscaling=1.84.0,@aws-cdk/aws-autoscaling-common=1.84.0,@aws-cdk/aws-cloudwatch=1.84.0,@aws-cdk/aws-codeguruprofiler=1.84.0,@aws-cdk/aws-cognito=1.84.0,@aws-cdk/aws-ec2=1.84.0,@aws-cdk/aws-ecr=1.84.0,@aws-cdk/aws-ecr-assets=1.84.0,@aws-cdk/aws-events=1.84.0,@aws-cdk/aws-iam=1.84.0,@aws-cdk/aws-kms=1.84.0,@aws-cdk/aws-lambda=1.84.0,@aws-cdk/aws-logs=1.84.0,@aws-cdk/aws-s3=1.84.0,@aws-cdk/aws-s3-assets=1.84.0,@aws-cdk/aws-sqs=1.84.0,@aws-cdk/aws-ssm=1.84.0,@aws-cdk/cloud-assembly-schema=1.84.0,@aws-cdk/core=1.84.0,@aws-cdk/custom-resources=1.84.0,@aws-cdk/cx-api=1.84.0,@aws-cdk/region-info=1.84.0,jsii-runtime=node.js/v14.7.0 - Metadata: - aws:cdk:path: stepfunctions/CDKMetadata/Default - Condition: CDKMetadataAvailable -Outputs: - Lambdasupportrole: - Value: - Ref: LambdaRole3A44B857 - Workflowsupportrole: - Value: - Ref: WorkflowRole21EC4257 -Conditions: - CDKMetadataAvailable: - Fn::Or: - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - ap-east-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ap-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ca-central-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-north-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-northwest-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-central-1 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - eu-north-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-2 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-3 - - Fn::Equals: - - Ref: AWS::Region - - me-south-1 - - Fn::Equals: - - Ref: AWS::Region - - sa-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-2 - - Fn::Equals: - - Ref: AWS::Region - - us-west-1 - - Fn::Equals: - - Ref: AWS::Region - - us-west-2 diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js deleted file mode 100644 index 4d431497495..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-workflows-using-step-functions.html. - -Purpose: -getid.js is part of a tutorial demonstrates how to create an AWS serverless workflow by using the AWS SDK for JavaScript (v3) -and AWS Step Functions. - -*/ - -// snippet-start:[lambda.JavaScript.lambda-step-functions.getid] - -exports.handler = async (event) => { - // Create a support case using the input as the case ID, then return a confirmation message - try { - const myCaseID = event.inputCaseID; - var myMessage = "Case " + myCaseID + ": opened..."; - var result = { Case: myCaseID, Message: myMessage }; - console.log(result); - } catch (err) { - console.log("Error", err); - } -}; -// snippet-end:[lambda.JavaScript.lambda-step-functions.getid] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js deleted file mode 100644 index d5267e6e6dd..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-workflows-using-step-functions.html. - -Purpose: -additem.js is part of a tutorial demonstrates how to create an AWS serverless workflow by using the AWS SDK for JavaScript (v3) -and AWS Step Functions. - -Inputs: -- RECEIVER_EMAIL_ADDRESS: A valid Amazon Simple Notification Services (Amazon SNS) email address. - -*/ -// snippet-start:[lambda.JavaScript.lambda-step-functions.additem] - -"use strict"; -// Load the required clients and commands. -const { PutItemCommand } = require ( "@aws-sdk/client-dynamodb" ); -const { dynamoClient } = require ( "../libs/dynamoClient" ); - -exports.handler = async (event) => { - try { - // Helper function to send message using Amazon SNS. - const val = event; - //PersistCase adds an item to a DynamoDB table - const tmp = Math.random() <= 0.5 ? 1 : 2; - console.log(tmp); - if (tmp == 1) { - const params = { - TableName: "Case", - Item: { - id: { N: val.Case }, - empEmail: { S: "brmur@amazon.com" }, - name: { S: "Tom Blue" }, - }, - }; - console.log("adding item for tom"); - try { - const data = await dynamoClient.send(new PutItemCommand(params)); - console.log(data); - } catch (err) { - console.error(err); - } - var result = { Email: params.Item.empEmail }; - return result; - } else { - const params = { - TableName: "Case", - Item: { - id: { N: val.Case }, - empEmail: { S: "RECEIVER_EMAIL_ADDRESS" }, // Valid Amazon Simple Notification Services (Amazon SNS) email address. - name: { S: "Sarah White" }, - }, - }; - console.log("adding item for sarah"); - try { - const data = await dynamoClient.send(new PutItemCommand(params)); - console.log(data); - } catch (err) { - console.error(err); - } - return params.Item.empEmail; - var result = { Email: params.Item.empEmail }; - } - } catch (err) { - console.log("Error", err); - } -}; -// snippet-end:[lambda.JavaScript.lambda-step-functions.additem] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js deleted file mode 100644 index 62aa3c2e1c4..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-workflows-using-step-functions.html. - -Purpose: -sendemail.js is part of a tutorial demonstrates how to create an AWS serverless workflow by using the AWS SDK for JavaScript (v3) -and AWS Step Functions. - -*/ -// snippet-start:[lambda.JavaScript.lambda-step-functions.sendemail] - -// Load the required clients and commands. -const { SendEmailCommand } = require ( "@aws-sdk/client-ses" ); -const { sesClient } = require ( "../libs/sesClient" ); - -exports.handler = async (event) => { - // Enter a sender email address. This address must be verified. - const senderEmail = "SENDER_EMAIL" - const sender = "Sender Name <" + senderEmail + ">"; - - // AWS Step Functions passes the employee's email to the event. - // This address must be verified. - const recepient = event.S; - - // The subject line for the email. - const subject = "New case"; - - // The email body for recipients with non-HTML email clients. - const body_text = - "Hello,\r\n" + "Please check the database for new ticket assigned to you."; - - // The HTML body of the email. - const body_html = `<html><head></head><body><h1>Hello!</h1><p>Please check the database for new ticket assigned to you.</p></body></html>`; - - // The character encoding for the email. - const charset = "UTF-8"; - var params = { - Source: sender, - Destination: { - ToAddresses: [recepient], - }, - Message: { - Subject: { - Data: subject, - Charset: charset, - }, - Body: { - Text: { - Data: body_text, - Charset: charset, - }, - Html: { - Data: body_html, - Charset: charset, - }, - }, - }, - }; - try { - const data = await sesClient.send(new SendEmailCommand(params)); - console.log(data); - } catch (err) { - console.error(err); - } -}; -// snippet-end:[lambda.JavaScript.lambda-step-functions.sendemail] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js deleted file mode 100644 index bba165579ce..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-step-functions-example.html. - -Purpose: -dynamoClient.js is a helper function that creates an Amazon DynamoDB service client. - -Inputs (replace in code): --REGION - -*/ -// snippet-start:[dynamodb.JavaScript.step-functions.createclientv3] - -const { DynamoDBClient } = require ( "@aws-sdk/client-dynamodb" ); -// Set the AWS Region. -const REGION = "REGION"; //e.g. "us-east-1" -// Create an Amazon DynamoDB service client object. -const dynamoClient = new DynamoDBClient({ region: REGION }); - -module.exports = { dynamoClient }; -// snippet-end:[dynamodb.JavaScript.step-functions.createclientv3] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js deleted file mode 100644 index cfc7f5d4db2..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-step-functions-example.html. - -Purpose: -sesClient.js is a helper function that creates an Amazon Simple Email Service (Amazon SES) service client. - -Inputs (replace in code): --REGION - -*/ -// snippet-start:[ses.JavaScript.step-functions.createclientv3] - -const { SESClient } = require ( "@aws-sdk/client-ses" ); -// Set the AWS Region. -const REGION = "REGION"; //e.g. "us-east-1" -// Create an Amazon SNS service client object. -const sesClient = new SESClient({ region: REGION }); -module.exports = { sesClient }; -// snippet-end:[ses.JavaScript.step-functions.createclientv3] diff --git a/javascriptv3/example_code/cross-services/transcription-app/README.md b/javascriptv3/example_code/cross-services/transcription-app/README.md deleted file mode 100644 index 00c142558aa..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# JavaScript environment for the Transcription App tutorial - -This is a workspace where you can find the following AWS SDK for JavaScript version 3 (v3) 'Transcription app' tutorial. - -For instructions on implementing this example, see [Build a transcription app with authenticated users](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html) in the -_AWS SDK for JavaScript v3 Developer Guide_. - -# Getting started - -1. Clone the [AWS Code Examples Repository](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. - See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for - instructions. - -1. Install the dependencies listed in the [root]/javascriptv3/example_code/cross-services/transcription-app/package.json. - -**Note**: These include the AWS SDK for JavaScript v3 client modules for the AWS services required in this example, -which are _@aws-sdk/client-iam_, _@aws-sdk/client-cognito-identity_, _@aws-sdk/credential-provider-cognito-identity_, _@aws-sdk/s3-request-presigner_, -_@aws-sdk/client-dynamodb_, _@aws-sdk/util-create-request_, _@aws-sdk/util-format-url_, _@aws-sdk/client-transcribe_ and _@aws-sdk/client-s3_. -They also include third-party Node.js modules, path, node-fetch, and webpack. - -``` -npm install node -g -cd javascriptv3/example_code/cross-services/transcription-app -npm install -``` diff --git a/javascriptv3/example_code/cross-services/transcription-app/package.json b/javascriptv3/example_code/cross-services/transcription-app/package.json deleted file mode 100644 index a49002b2b89..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "@aws-doc-sdk-examples/recording-app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "build:frontend": "webpack index.js --mode development --target web --devtool false -o main.js", - "test": "exit 0" - }, - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "json-loader": "^0.5.7", - "raw-loader": "^4.0.2", - "webpack": "^4.42.0", - "webpack-cli": "^3.3.11" - }, - "dependencies": { - "@aws-sdk/client-cognito-identity": "^3.32.0", - "@aws-sdk/client-iam": "^3.32.0", - "@aws-sdk/client-s3": "^3.32.0", - "@aws-sdk/client-transcribe": "^3.32.0", - "@aws-sdk/credential-provider-cognito-identity": "^3.32.0", - "@aws-sdk/s3-request-presigner": "^3.32.0", - "@aws-sdk/util-create-request": "^3.32.0", - "@aws-sdk/util-format-url": "^3.32.0", - "aws-sdk": "^2.793.0", - "babel-cli": "6.24.1", - "babel-core": "6.25.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-preset-env": "1.5.2", - "babel-preset-react": "6.24.1", - "fetch": "^1.1.0", - "file-system": "^2.2.2", - "node-fetch": "^2.6.1", - "stream": "0.0.2", - "stream-to-string": "^1.2.0", - "ts-node": "^9.0.0" - } -} diff --git a/javascriptv3/example_code/cross-services/transcription-app/setup.yaml b/javascriptv3/example_code/cross-services/transcription-app/setup.yaml deleted file mode 100644 index 9b4b539eba1..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/setup.yaml +++ /dev/null @@ -1,377 +0,0 @@ -Resources: - transcriptionsB38FCF73: - Type: AWS::S3::Bucket - Properties: - AccessControl: PublicRead - CorsConfiguration: - CorsRules: - - AllowedHeaders: - - "*" - AllowedMethods: - - GET - - POST - - PUT - - DELETE - AllowedOrigins: - - "*" - UpdateReplacePolicy: Delete - DeletionPolicy: Delete - Metadata: - aws:cdk:path: SetupStack/transcriptions/Resource - transcriptionsPolicy3F622C3C: - Type: AWS::S3::BucketPolicy - Properties: - Bucket: - Ref: transcriptionsB38FCF73 - PolicyDocument: - Statement: - - Action: s3:* - Condition: - Bool: - aws:SecureTransport: "false" - Effect: Deny - Principal: - AWS: "*" - Resource: - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - Fn::Join: - - "" - - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - /* - - Action: s3:GetObject - Effect: Allow - Principal: - AWS: "*" - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - /* - - Action: "*" - Effect: Allow - Principal: - AWS: - Fn::Join: - - "" - - - "arn:" - - Ref: AWS::Partition - - ":iam::" - - Ref: AWS::AccountId - - :root - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - /* - - Action: s3:PutObject - Effect: Allow - Principal: - AWS: "*" - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - /* - - Action: s3:DeleteObject - Effect: Allow - Principal: - AWS: "*" - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - /* - Version: "2012-10-17" - Metadata: - aws:cdk:path: SetupStack/transcriptions/Policy/Resource - appbucket8B6BC946: - Type: AWS::S3::Bucket - Properties: - PublicAccessBlockConfiguration: - BlockPublicAcls: true - BlockPublicPolicy: false - IgnorePublicAcls: true - RestrictPublicBuckets: false - WebsiteConfiguration: - ErrorDocument: index.html - IndexDocument: index.html - UpdateReplacePolicy: Delete - DeletionPolicy: Delete - Metadata: - aws:cdk:path: SetupStack/appbucket/Resource - appbucketPolicy820C1410: - Type: AWS::S3::BucketPolicy - Properties: - Bucket: - Ref: appbucket8B6BC946 - PolicyDocument: - Statement: - - Action: s3:* - Condition: - Bool: - aws:SecureTransport: "false" - Effect: Deny - Principal: - AWS: "*" - Resource: - - Fn::GetAtt: - - appbucket8B6BC946 - - Arn - - Fn::Join: - - "" - - - Fn::GetAtt: - - appbucket8B6BC946 - - Arn - - /* - - Action: s3:GetObject - Effect: Allow - Principal: - AWS: "*" - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - appbucket8B6BC946 - - Arn - - /* - - Action: s3:PutObject - Effect: Allow - Principal: - AWS: "*" - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - appbucket8B6BC946 - - Arn - - /* - Version: "2012-10-17" - Metadata: - aws:cdk:path: SetupStack/appbucket/Policy/Resource - exampleuserpoolid164CBD80: - Type: AWS::Cognito::UserPool - Properties: - AccountRecoverySetting: - RecoveryMechanisms: - - Name: verified_phone_number - Priority: 1 - - Name: verified_email - Priority: 2 - AdminCreateUserConfig: - AllowAdminCreateUserOnly: false - AutoVerifiedAttributes: - - email - EmailVerificationMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} - EmailVerificationSubject: Verify your email for our awesome app! - Schema: - - Mutable: false - Name: email - Required: true - SmsVerificationMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} - UserPoolName: ExampleUserPoolName-3962209636 - VerificationMessageTemplate: - DefaultEmailOption: CONFIRM_WITH_CODE - EmailMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} - EmailSubject: Verify your email for our awesome app! - SmsMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} - UpdateReplacePolicy: Retain - DeletionPolicy: Retain - Metadata: - aws:cdk:path: SetupStack/exampleuserpoolid/Resource - exampleuserpoolidCognitoDomain6126F7CC: - Type: AWS::Cognito::UserPoolDomain - Properties: - Domain: exampleuserpoolname-9212204094 - UserPoolId: - Ref: exampleuserpoolid164CBD80 - Metadata: - aws:cdk:path: SetupStack/exampleuserpoolid/CognitoDomain/Resource - ExampleUserPoolClientA3BAC0B9: - Type: AWS::Cognito::UserPoolClient - Properties: - UserPoolId: - Ref: exampleuserpoolid164CBD80 - AllowedOAuthFlows: - - implicit - - code - AllowedOAuthFlowsUserPoolClient: true - AllowedOAuthScopes: - - profile - - phone - - email - - openid - - aws.cognito.signin.user.admin - CallbackURLs: - - Fn::Join: - - "" - - - https://s3. - - Ref: AWS::Region - - "." - - Ref: AWS::URLSuffix - - / - - Ref: appbucket8B6BC946 - - /index.html - ClientName: ExampleUserPoolName-1269134866 - SupportedIdentityProviders: - - COGNITO - Metadata: - aws:cdk:path: SetupStack/ExampleUserPoolClient/Resource - ExampleIdentityPool: - Type: AWS::Cognito::IdentityPool - Properties: - AllowUnauthenticatedIdentities: false - CognitoIdentityProviders: - - ClientId: - Ref: ExampleUserPoolClientA3BAC0B9 - ProviderName: - Fn::GetAtt: - - exampleuserpoolid164CBD80 - - ProviderName - Metadata: - aws:cdk:path: SetupStack/ExampleIdentityPool - ExampleCognitoDefaultAuthenticatedRole37F17AF0: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRoleWithWebIdentity - Condition: - StringEquals: - cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPool - ForAnyValue:StringLike: - cognito-identity.amazonaws.com:amr: authenticated - Effect: Allow - Principal: - Federated: cognito-identity.amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: SetupStack/ExampleCognitoDefaultAuthenticatedRole/Resource - ExampleCognitoDefaultAuthenticatedRoleDefaultPolicy7CE891FB: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: - - mobileanalytics:PutEvents - - cognito-sync:* - - cognito-identity:* - Effect: Allow - Resource: "*" - - Action: sns:* - Effect: Allow - Resource: "*" - - Action: - - transcribe:StartTranscriptionJob - - transcribe:GetTranscriptionJob - Effect: Allow - Resource: "*" - Version: "2012-10-17" - PolicyName: ExampleCognitoDefaultAuthenticatedRoleDefaultPolicy7CE891FB - Roles: - - Ref: ExampleCognitoDefaultAuthenticatedRole37F17AF0 - Metadata: - aws:cdk:path: SetupStack/ExampleCognitoDefaultAuthenticatedRole/DefaultPolicy/Resource - DefaultValid: - Type: AWS::Cognito::IdentityPoolRoleAttachment - Properties: - IdentityPoolId: - Ref: ExampleIdentityPool - Roles: - authenticated: - Fn::GetAtt: - - ExampleCognitoDefaultAuthenticatedRole37F17AF0 - - Arn - Metadata: - aws:cdk:path: SetupStack/DefaultValid - CDKMetadata: - Type: AWS::CDK::Metadata - Properties: - Analytics: v2:deflate64:H4sIAAAAAAAA/01POw7CMAw9C3swLTAwAmVhQ0UcoEoNmLaxlKQgFOXuJP3QTu/j5yc7hXWyhWSxLz5mKctq5SRrBHe1haxExspY3UorsrvK0XCrJUYeBiVZYuVFXHRmA+7Yygq75MB6uHBN8jvZvfZC8kORZXA3g/rCXMfIn4/kxE1Baj4anFFmNaGy88DknMtAyH7H9rnOucaDDV8+m2B6QUUDLprdqxGnw4eTvReKS4SXWb3THaRrSBcvQ7TUbahtEPIef4oL19tUAQAA - Metadata: - aws:cdk:path: SetupStack/CDKMetadata/Default - Condition: CDKMetadataAvailable -Conditions: - CDKMetadataAvailable: - Fn::Or: - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - af-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-east-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ap-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ca-central-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-north-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-northwest-1 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - eu-central-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-north-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-south-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-2 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-3 - - Fn::Equals: - - Ref: AWS::Region - - me-south-1 - - Fn::Equals: - - Ref: AWS::Region - - sa-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-2 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - us-west-1 - - Fn::Equals: - - Ref: AWS::Region - - us-west-2 diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/helper.js b/javascriptv3/example_code/cross-services/transcription-app/src/helper.js deleted file mode 100644 index f9ddd5a7eeb..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/src/helper.js +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -Purpose: -helper.js is part of a tutorial demonstrating how to build and deploy an app that transcribes and displays -voice recordings for authenticated users. To run the full tutorial, see -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -Running the code: -For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -*/ -// This file contains vanilla JavaScript helper functions for user interface. - -// snippet-start:[transcribe.JavaScript.recording-app.helper] - -window.downloadInnerHtml = function (filename, elId, mimeType) { - var elHtml = document.getElementById(elId).innerHTML; - var link = document.createElement("a"); - mimeType = mimeType || "text/plain"; - link.setAttribute("download", filename); - link.setAttribute( - "href", - "data:" + mimeType + ";charset=utf-8," + encodeURIComponent(elHtml) - ); - link.click(); -}; - -// Delete a row from the user interface. -window.deleteRow = function (rowid) { - const row = document.getElementById(rowid); - row.parentNode.removeChild(row); -}; - -// Display transcription details on user interface. -window.displayTranscriptionDetails = function ( - i, - outputJSONTime, - jobName, - outputJSON -) { - var table = document.getElementById("myTable"); - var row = table.insertRow(1); - var cell1 = row.insertCell(0); - var cell2 = row.insertCell(1); - var cell3 = row.insertCell(2); - var cell4 = row.insertCell(3); - cell1.innerHTML = "<p id='dateTime'></p>"; - cell2.innerHTML = "<p id=" + i + "></p>"; - cell3.innerHTML = "<button type='button' id='download'>Download</button>"; - cell4.innerHTML = "<button type='button' id='delete'>Delete</button>"; - document.getElementById(i).innerHTML = outputJSON; - row.setAttribute("id", "row" + i); - document - .getElementById("download") - .setAttribute( - "onclick", - "downloadInnerHtml('output.txt','" + i + "','text')" - ); - document.getElementById("dateTime").innerHTML = outputJSONTime; - document - .getElementById("delete") - .setAttribute( - "onclick", - "deleteRow(" + "'" + "row" + i + "'); deleteJSON(" + "'" + jobName + "')" - ); -}; - -// Strips the token ID from the app URL after authentication. -window.getToken = function () { - var idtoken = window.location.href; - var idtoken1 = idtoken.split("=")[1]; - var idtoken2 = idtoken1.split("&")[0]; - var idtoken3 = idtoken2.split("&")[0]; - return idtoken3; -}; - -window.getAccessToken = function () { - var accesstoken = window.location.href; - var accesstoken1 = accesstoken.split("=")[2]; - var accesstoken2 = accesstoken1.split("&")[0]; - return accesstoken2; -}; -// snippet-end:[transcribe.JavaScript.recording-app.helper] diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/index.html b/javascriptv3/example_code/cross-services/transcription-app/src/index.html deleted file mode 100644 index 97ca500615c..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/src/index.html +++ /dev/null @@ -1,55 +0,0 @@ -<!-- Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -SPDX-License-Identifier: Apache-2.0 -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/lambda-create-table-example.html. - -Purpose: -index.html is the front-end HTML code for a tutorial demonstrating how to build and deploy an app that transcribes and displays -voice recordings for authenticated users. To run the full tutorial, see -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/lambda-create-table-example.html. - -*/ ---> - -<!-- snippet-start:[transcribe.HTML.recording-app.complete] --> -<!doctype html> -<html> - <head> - <meta charset="UTF-8" /> - <title>title - - - - -

Record

-

- - -

- - -

- -

- -

My transcriptions

-
- - - - - - - -
Time createdTransciptionDownloadDelete
- - - - - diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/index.js b/javascriptv3/example_code/cross-services/transcription-app/src/index.js deleted file mode 100644 index e16bb76f2c5..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/src/index.js +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -Purpose: -index.js is part of a tutorial demonstrating how to build and deploy an app that transcribes and displays -voice recordings for authenticated users. To run the full tutorial, see -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -Inputs (replace in code): -- COGNITO_ID -- ID_TOKEN -- BUCKET -- REGION -- IDENTITY_POOL_ID - -Running the code: -For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -[Outputs | Returns]: - -*/ -// snippet-start:[transcribe.JavaScript.recording-app.config] -// Import the required AWS SDK clients and commands for Node.js -import "./helper.js"; -import "./recorder.js"; -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { - CognitoIdentityProviderClient, - GetUserCommand, -} from "@aws-sdk/client-cognito-identity-provider"; -import { S3RequestPresigner } from "@aws-sdk/s3-request-presigner"; -import { createRequest } from "@aws-sdk/util-create-request"; -import { formatUrl } from "@aws-sdk/util-format-url"; -import { - TranscribeClient, - StartTranscriptionJobCommand, -} from "@aws-sdk/client-transcribe"; -import { - S3Client, - PutObjectCommand, - GetObjectCommand, - ListObjectsCommand, - DeleteObjectCommand, -} from "@aws-sdk/client-s3"; -import fetch from "node-fetch"; - -// Set the parameters. -// 'COGINTO_ID' has the format 'cognito-idp.eu-west-1.amazonaws.com/COGNITO_ID'. -let COGNITO_ID = "COGNITO_ID"; -// Get the Amazon Cognito ID token for the user. 'getToken()' is in 'helper.js'. -let idToken = getToken(); -let loginData = { - [COGNITO_ID]: idToken, -}; - -const params = { - Bucket: "BUCKET", // The Amazon Simple Storage Solution (S3) bucket to store the transcriptions. - Region: "REGION", // The AWS Region - identityPoolID: "IDENTITY_POOL_ID", // Amazon Cognito Identity Pool ID. -}; - -// Create an Amazon Transcribe service client object. -const client = new TranscribeClient({ - region: params.Region, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: params.Region }), - identityPoolId: params.identityPoolID, - logins: loginData, - }), -}); - -// Create an Amazon S3 client object. -const s3Client = new S3Client({ - region: params.Region, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: params.Region }), - identityPoolId: params.identityPoolID, - logins: loginData, - }), -}); -// snippet-end:[transcribe.JavaScript.recording-app.config] -// snippet-start:[transcribe.JavaScript.recording-app.onload] -window.onload = async () => { - // Set the parameters. - const userParams = { - // Get the access token. 'GetAccessToken()' is in 'helper.js'. - AccessToken: getAccessToken(), - }; - // Create a CognitoIdentityProviderClient client object. - const client = new CognitoIdentityProviderClient({ region: params.Region }); - try { - const data = await client.send(new GetUserCommand(userParams)); - const username = data.Username; - // Export username for use in 'recorder.js'. - exports.username = username; - try { - // If this is user's first sign-in, create a folder with user's name in Amazon S3 bucket. - // Otherwise, no effect. - const Key = `${username}/`; - try { - const data = await s3Client.send( - new PutObjectCommand({ Key: Key, Bucket: params.Bucket }) - ); - console.log("Folder created for user ", data.Username); - } catch (err) { - console.log("Error", err); - } - try { - // Get a list of the objects in the Amazon S3 bucket. - const data = await s3Client.send( - new ListObjectsCommand({ Bucket: params.Bucket, Prefix: username }) - ); - // Create a variable for the list of objects in the Amazon S3 bucket. - const output = data.Contents; - // Loop through the objects, populating a row on the user interface for each object. - for (var i = 0; i < output.length; i++) { - var obj = output[i]; - const objectParams = { - Bucket: params.Bucket, - Key: obj.Key, - }; - // Get the name of the object from the Amazon S3 bucket. - const data = await s3Client.send(new GetObjectCommand(objectParams)); - // Extract the body contents, a readable stream, from the returned data. - const result = data.Body; - // Create a variable for the string version of the readable stream. - let stringResult = ""; - // Use 'yieldUnit8Chunks' to convert the readable streams into JSON. - for await (let chunk of yieldUint8Chunks(result)) { - stringResult += String.fromCharCode.apply(null, chunk); - } - // The setTimeout function waits while readable stream is converted into JSON. - setTimeout(function () { - // Parse JSON into human readable transcript, which will be displayed on user interface (UI). - const outputJSON = - JSON.parse(stringResult).results.transcripts[0].transcript; - // Create name for transcript, which will be displayed. - const outputJSONTime = JSON.parse(stringResult) - .jobName.split("/")[0] - .replace("-job", ""); - i++; - // - // Display the details for the transcription on the UI. - // 'displayTranscriptionDetails()' is in 'helper.js'. - displayTranscriptionDetails( - i, - outputJSONTime, - objectParams.Key, - outputJSON - ); - }, 1000); - } - } catch (err) { - console.log("Error", err); - } - } catch (err) { - console.log("Error creating presigned URL", err); - } - } catch (err) { - console.log("Error", err); - } -}; - -// Convert readable streams. -async function* yieldUint8Chunks(data) { - const reader = data.getReader(); - try { - while (true) { - const { done, value } = await reader.read(); - if (done) return; - yield value; - } - } finally { - reader.releaseLock(); - } -} -// snippet-end:[transcribe.JavaScript.recording-app.onload] -// snippet-start:[transcribe.JavaScript.recording-app.create-transcriptions] - -// Upload recordings to Amazon S3 bucket -window.upload = async function (blob, userName) { - // Set the parameters for the recording recording. - const Key = `${userName}/test-object-${Math.ceil(Math.random() * 10 ** 10)}`; - let signedUrl; - - // Create a presigned URL to upload the transcription to the Amazon S3 bucket when it is ready. - try { - // Create an Amazon S3RequestPresigner object. - const signer = new S3RequestPresigner({ ...s3Client.config }); - // Create the request. - const request = await createRequest( - s3Client, - new PutObjectCommand({ Key, Bucket: params.Bucket }) - ); - // Define the duration until expiration of the presigned URL. - const expiration = new Date(Date.now() + 60 * 60 * 1000); - // Create and format the presigned URL. - signedUrl = formatUrl(await signer.presign(request, expiration)); - console.log(`\nPutting "${Key}"`); - } catch (err) { - console.log("Error creating presigned URL", err); - } - try { - // Upload the object to the Amazon S3 bucket using a presigned URL. - response = await fetch(signedUrl, { - method: "PUT", - headers: { - "content-type": "application/octet-stream", - }, - body: blob, - }); - // Create the transcription job name. In this case, it's the current date and time. - const today = new Date(); - const date = - today.getFullYear() + - "-" + - (today.getMonth() + 1) + - "-" + - today.getDate(); - const time = - today.getHours() + "-" + today.getMinutes() + "-" + today.getSeconds(); - const jobName = date + "-time-" + time; - - // Call the "createTranscriptionJob()" function. - createTranscriptionJob( - "s3://" + params.Bucket + "/" + Key, - jobName, - params.Bucket, - Key - ); - } catch (err) { - console.log("Error uploading object", err); - } -}; - -// Create the AWS Transcribe transcription job. -const createTranscriptionJob = async (recording, jobName, bucket, key) => { - // Set the parameters for transcriptions job - const params = { - TranscriptionJobName: jobName + "-job", - LanguageCode: "en-US", // For example, 'en-US', - OutputBucketName: bucket, - OutputKey: key, - Media: { - MediaFileUri: recording, // For example, "https://transcribe-demo.s3-REGION.amazonaws.com/hello_world.wav" - }, - }; - try { - // Start the transcription job. - const data = await client.send(new StartTranscriptionJobCommand(params)); - console.log("Success - transcription submitted", data); - } catch (err) { - console.log("Error", err); - } -}; -// snippet-end:[transcribe.JavaScript.recording-app.create-transcriptions] -// snippet-start:[transcribe.JavaScript.recording-app.delete-transcriptions] -// Delete a transcription from the Amazon S3 bucket. -window.deleteJSON = async (jsonFileName) => { - try { - await s3Client.send( - new DeleteObjectCommand({ - Bucket: params.Bucket, - Key: jsonFileName, - }) - ); - console.log("Success - JSON deleted"); - } catch (err) { - console.log("Error", err); - } -}; -// Delete a row from the user interface. -window.deleteRow = function (rowid) { - const row = document.getElementById(rowid); - row.parentNode.removeChild(row); -}; -// snippet-end:[transcribe.JavaScript.recording-app.delete-transcriptions] diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/recorder.css b/javascriptv3/example_code/cross-services/transcription-app/src/recorder.css deleted file mode 100644 index 00fd49556a4..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/src/recorder.css +++ /dev/null @@ -1,66 +0,0 @@ -#record { - background-color: red; - border-width: medium; - border-color: black; - color: white; - padding: 20px; - text-align: center; - text-decoration: none; - display: inline-block; - font-size: 16px; - margin: 4px 2px; - cursor: pointer; - max-width: 50%; - max-height: 15%; - border-radius: 50%; - left: 100px; - right: 100px; - position: relative; -} -#stopRecord { - background-color: green; - border-width: medium; - border-color: black; - color: white; - padding: 20px; - text-align: center; - text-decoration: none; - display: inline-block; - font-size: 16px; - margin: 4px 2px; - cursor: pointer; - max-width: 50%; - max-height: 15%; - border-radius: 50%; - left: 100px; - right: 100px; - position: relative; -} -#convertRecord { - background-color: brown; /* Green */ - border-width: medium; - border-color: black; - color: white; - padding: 20px; - text-align: center; - text-decoration: none; - display: inline-block; - font-size: 16px; - margin: 4px 2px; - cursor: pointer; - max-width: 50%; - max-height: 15%; - border-radius: 50%; - left: 100px; - right: 100px; - position: relative; -} -h2 { - left: 100px; - position: relative; -} -#recordedAudio { - left: 100px; - right: 100px; - position: relative; -} diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/recorder.js b/javascriptv3/example_code/cross-services/transcription-app/src/recorder.js deleted file mode 100644 index 51bb79841dc..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/src/recorder.js +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -Purpose: -recorder.js is part of a tutorial demonstrating how to build and deploy an app that transcribes and displays -voice recordings for authenticated users. To run the full tutorial, see -https://docs.aws.amazon.comsdk-for-javascript/v3/developer-guide/transcribe-app.html. - -*/ - -// snippet-start:[transcribe.JavaScript.recording-app.recorder] - -// Functions for recording transcriptions. -// Enable microphone on browser. -import "./helper.js"; -import index from "./index.js"; -navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { - handlerFunction(stream); -}); - -// This is a handler function to manage recordings. -function handlerFunction(stream) { - let rec; - rec = new MediaRecorder(stream); - rec.ondataavailable = (e) => { - audioChunks.push(e.data); - if (rec.state == "inactive") { - let blob = new Blob(audioChunks, { type: "audio/mpeg-3" }); - var recordedAudio = document.getElementById("recordedAudio"); - recordedAudio.src = URL.createObjectURL(blob); - recordedAudio.controls = true; - recordedAudio.autoplay = true; - // Take username from 'index.js'. - var username = index.username; - // The upload function is in 'index.js'. - upload(blob, username); - alert("Refresh page in ~1 min to view your transcription."); - } - }; -} - -// Start recording. -window.startRecord = function () { - console.log("Recording started"); - var record = document.getElementById("record"); - var stop = document.getElementById("stopRecord"); - record.disabled = true; - record.style.backgroundColor = "blue"; - stop.disabled = false; - rec.start(); -}; - -// Stop recording. -window.stopRecord = function () { - console.log("Recording stopped"); - var record = document.getElementById("record"); - var stop = document.getElementById("stopRecord"); - record.disabled = false; - stop.disabled = true; - record.style.backgroundColor = "red"; - rec.stop(); -}; - -// snippet-end:[transcribe.JavaScript.recording-app.recorder] diff --git a/resources/cdk/javascript_example_code_transcribe_demo/cdk.json b/resources/cdk/javascript_example_code_transcribe_demo/cdk.json deleted file mode 100644 index 90acb5637f9..00000000000 --- a/resources/cdk/javascript_example_code_transcribe_demo/cdk.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "app": "npx ts-node --prefer-ts-exts setup.ts", - "context": { - "@aws-cdk/core:enableStackNameDuplicates": "true", - "aws-cdk:enableDiffNoFail": "true", - "@aws-cdk/core:stackRelativeExports": "true", - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true - } -} diff --git a/resources/cdk/javascript_example_code_transcribe_demo/package-lock.json b/resources/cdk/javascript_example_code_transcribe_demo/package-lock.json deleted file mode 100644 index 69ab87d0513..00000000000 --- a/resources/cdk/javascript_example_code_transcribe_demo/package-lock.json +++ /dev/null @@ -1,18523 +0,0 @@ -{ - "name": "setup", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "setup", - "version": "0.1.0", - "dependencies": { - "@aws-cdk/aws-cognito": "^1.204.0", - "@aws-cdk/aws-iam": "^1.204.0", - "@aws-cdk/core": "^1.204.0", - "source-map-support": "^0.5.16" - }, - "bin": { - "setup": "setup.js" - }, - "devDependencies": { - "@aws-cdk/assert": "1.79.0", - "@types/jest": "^26.0.10", - "@types/node": "10.17.27", - "aws-cdk": "1.77.0", - "jest": "^26.4.2", - "ts-jest": "^26.2.0", - "ts-node": "^9.0.0", - "typescript": "~3.9.7" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@aws-cdk/assert": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/assert/-/assert-1.79.0.tgz", - "integrity": "sha512-wCiMyxhtUz82blUlSnfoqpHdSjgFOkjpunjgxT2aG5Y6RTN0ExOOm9pdKDdXnul0zml6ZvfOL51wDG0Udg7zFg==", - "dev": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "@aws-cdk/cloudformation-diff": "1.79.0", - "@aws-cdk/core": "1.79.0", - "@aws-cdk/cx-api": "1.79.0", - "constructs": "^3.2.0" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.79.0", - "constructs": "^3.2.0", - "jest": "^26.6.3" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.79.0.tgz", - "integrity": "sha512-I+2GbQfbPy6TewnGbviE1W8cUhgBEA1mQLYm5gBj/Rzix1tCyaNvfYsBU3ipg3jIATpHsg1CzUq0zrumUnmnTg==", - "bundleDependencies": [ - "fs-extra", - "minimatch", - "@balena/dockerignore", - "ignore" - ], - "dev": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "@aws-cdk/cx-api": "1.79.0", - "@aws-cdk/region-info": "1.79.0", - "@balena/dockerignore": "^1.0.2", - "constructs": "^3.2.0", - "fs-extra": "^9.0.1", - "ignore": "^5.1.8", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "@aws-cdk/cx-api": "1.79.0", - "@aws-cdk/region-info": "1.79.0", - "constructs": "^3.2.0" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/@balena/dockerignore": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/balanced-match": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/fs-extra": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/graceful-fs": { - "version": "4.2.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/ignore": { - "version": "5.1.8", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/jsonfile": { - "version": "6.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/minimatch": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/universalify": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/region-info": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.79.0.tgz", - "integrity": "sha512-klnXCc1Cd/krE4VOXJ1Blvey8ucPRzuwgGacPsCV2ugMSlaJSbdGqKzTUNxcK2o8g9PaEuJ5lNjfwqqyvp571g==", - "dev": true, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - } - }, - "node_modules/@aws-cdk/assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/assets/-/assets-1.204.0.tgz", - "integrity": "sha512-rY9YHZ3gUWr+dLwTwSUWYbIfk/AXy4JZRkhLbunrtzjQhH+QMm/2IWIebfBGu+A5AlVRaFbRLonReuGP5WZoUQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-acmpca": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-acmpca/-/aws-acmpca-1.204.0.tgz", - "integrity": "sha512-2zyuQZwynwkz2qiuFDp088tglWXKX3q7saWRDqeuq2n2HE6PGuQRjd4zjl9nDGUVxQYtzzXyEuPyaEta8fg9lQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-applicationautoscaling": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.204.0.tgz", - "integrity": "sha512-sEe2NODKUowJx2guM2SPfs/20gGdBq1C09M32b8c1im7K+PqQkHkE156nyz5Ml0hpsNeCZlRS17oKZ042aZevQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-autoscaling-common": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-autoscaling-common": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-autoscaling-common": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.204.0.tgz", - "integrity": "sha512-P+PwbTaj28Eg9+/U9ZTXTh1gA7L9Z45GL+9xcEZvEqAkJt9MNgzZICavVZu1sMD74foK1r1ZOBXTsqV6wEiltQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-certificatemanager": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.204.0.tgz", - "integrity": "sha512-ZLykfAOb5Zbg/MFtzA+eHhMAK1xL32+oHKSK6tAYrgvv2aS42wJE4zSBV6jGCjnCkhcliUd5pwnACEl3ib0KLw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-acmpca": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-route53": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-acmpca": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-route53": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-cloudformation": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.204.0.tgz", - "integrity": "sha512-9PkZa9mKLneB0My8wJC7lLZmPJsnOxNYy57ZZlRCQhK0eO6Jc9eVqrI29537W+3ireaEjCLEitkb8NO1FN/kQA==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-cloudwatch": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.204.0.tgz", - "integrity": "sha512-ADT2D+4FtB9Zcy/TlF2tswQmjmrPVgORYTkznQQ2SniCODHWzz558+G1RV+IVvWRdH7nYQtV0UEuGZKpffWh2w==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-codeguruprofiler": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.204.0.tgz", - "integrity": "sha512-IrgY4SmVf9p5POfHm8BsPzaAO5lQTG7nhb5qN5AzS6zKCTuEjjTNHjx1TOfPV12mMIDAIVsK91mjDlAR88Mjbg==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-codestarnotifications": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codestarnotifications/-/aws-codestarnotifications-1.204.0.tgz", - "integrity": "sha512-t//hSpC5/uVW2321YlbGabNVzhWayvqz+xSnagADGcT9qiq3KQR/uUlrgpHv1/eHRMk7EMrY9prlXeZpfzZ+cw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-cognito": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cognito/-/aws-cognito-1.204.0.tgz", - "integrity": "sha512-7QIbExW9dn1fktpDOh2nMHmor2S3uuHtIX5y33lc9OKg3xUuYw4AZ67MKapunN7QUBlffTlNzoUqlHoNSab+Zg==", - "bundleDependencies": [ - "punycode" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-certificatemanager": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69", - "punycode": "^2.3.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-certificatemanager": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-cognito/node_modules/punycode": { - "version": "2.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@aws-cdk/aws-ec2": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ec2/-/aws-ec2-1.204.0.tgz", - "integrity": "sha512-SoqZEgzdfPW0aa+FQ0CjzbDG+X+sDu6/BnLL2O10lxpa+9Dc1iyArAqNKFJG5KXGJe9ibvQXyNQqEjeGRFc22Q==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-ssm": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-ssm": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-ecr": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr/-/aws-ecr-1.204.0.tgz", - "integrity": "sha512-oCts9e+ackWoFHeyn/3oKm3X1lSizleWNNXHp5WGM38lpNVrtCLMKSShu5iXJBhqRH2Mz1AcA4fDMWhe8DvJFA==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.204.0.tgz", - "integrity": "sha512-2GHD3pZdDoPxq3HhD4czANuI7TMoxpjszbzsQAc2wbdMX1j+K4vIL+PBpj3altfscPqcvy1v70lBjbG5rcBIkQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-efs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-efs/-/aws-efs-1.204.0.tgz", - "integrity": "sha512-FB6nHgCuzYF5K9ywqYPEPjL2G1ATLIR9dJp1p4ydcEUuXDb4KSEVN4Bgx+q1e7EkWGIq+9glr+ckheEcTvETgw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-events": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-events/-/aws-events-1.204.0.tgz", - "integrity": "sha512-KnfUmtv+4RhydD9+5CHFxNJxtgn7+Xftwfwg1G7qV/tWYPFHcNIvhlSOgwDrQPa+pTo1MmkiUN0lAR0G8B/cbw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-iam": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-iam/-/aws-iam-1.204.0.tgz", - "integrity": "sha512-Fh2egW3v/uDdw3m4jvcupS7COL/+sJl2NHjz9l298ddyMxqDwJD2NQwE8mvgPLK4rDtAtDnE0c8RS6d+NWiC+w==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-kms": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-kms/-/aws-kms-1.204.0.tgz", - "integrity": "sha512-iryZQ428L1VUVQ0zE96XTWWX7ANVtDrb6x+ZXXLTVUEPgjEd/W6zlcp++Qi0A3a9HLNd4PbEhK9rs0UKNTylzw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-lambda": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda/-/aws-lambda-1.204.0.tgz", - "integrity": "sha512-r0XXovrLAx8Q8Fz915SwzyQM/KLhEB6YCp3CsWliFGSOHEjRP8yX8UZdEJqe5kYD7Th9JAhUVzKgyv20P7g5Tg==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-applicationautoscaling": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codeguruprofiler": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-ecr-assets": "1.204.0", - "@aws-cdk/aws-efs": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-signer": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-applicationautoscaling": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codeguruprofiler": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-ecr-assets": "1.204.0", - "@aws-cdk/aws-efs": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-signer": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-logs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-logs/-/aws-logs-1.204.0.tgz", - "integrity": "sha512-PuHsDSkX6JFBgldxViGw91eFLageJ2cX89/RyLbWaJJUV4tlUKXSmmkVgOaBmvil0QKuGqbOzLXcXCoIK9Sg3A==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-route53": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-route53/-/aws-route53-1.204.0.tgz", - "integrity": "sha512-wQpGUXqc2y7yJFTipfuVxWy/VGeshyGlfGl4evusQK9Md0DMpVmG8kRgazLk1myqUSNSfi643UwvDJqNbYmdnA==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-s3": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3/-/aws-s3-1.204.0.tgz", - "integrity": "sha512-jsQ4n1L4MdPYDirBoOYgg7yzSk1TaFYo4dnwDlKiLJ5LcHG3Nai1cHb9XQbCy/9KKqbWsbd3WlkH+vcWEl8EUA==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-s3-assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.204.0.tgz", - "integrity": "sha512-3MQbVZ95wW29Bl63tqu0Bz0td3osLyGg352l5G7Ztf3nK35FpuQlgxO4kcu74+s2sRwdd/R4KFV6eWhhPk+J7g==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-signer": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-signer/-/aws-signer-1.204.0.tgz", - "integrity": "sha512-AI26FhWF3+f/vDh3mleQa2CXv2/CmSerXgyk4XHMVVTTCjnlYGGmHmGlzYhqOSw6ALpQNdOSw8GVxU/ySpQCaw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-sns": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sns/-/aws-sns-1.204.0.tgz", - "integrity": "sha512-KoWxqKT/dTjt9Pk0a3kJLcd6xZHvrwbZDC0mrLtxdRNhQoHmnURAHW2UqX/lefrCU1GcUFf4L58N9ehBTunAFQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codestarnotifications": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codestarnotifications": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-sqs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sqs/-/aws-sqs-1.204.0.tgz", - "integrity": "sha512-dVzuGMh6d5/X9P9jel1w2Wgdy5MuSE35+eBSFxN+S7oJRoVSARpyKMNYAPMCW+2OJCDw7fIqO1rWbsZBT1Gq8g==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-ssm": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ssm/-/aws-ssm-1.204.0.tgz", - "integrity": "sha512-yYx7HZ8cWNXDAmX/99WkB477QhLoV2rcB8orei8aj7nRkNq5TMjeox0IJaZVgU+edNEDOi1fVX3flh0SAMiUrg==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/cfnspec": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-1.79.0.tgz", - "integrity": "sha512-rbBhox7hzXPXk2n+1BDjsmiz/0W9ZHv3NeCKiq94WfHW6Jj4mSjtGs7ZUBFq8JkkgYVsE9ktH1634wt9A9fbRg==", - "dev": true, - "dependencies": { - "md5": "^2.3.0" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.79.0.tgz", - "integrity": "sha512-n2ARtOXIUq3FdJ1EBuHzsM0DQau6ZwHprPhpk1xc5bv21s7D5X5ECe06eC0K5xC5ZyfC13BDWu1f+xFh+krnYA==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "dev": true, - "dependencies": { - "jsonschema": "^1.4.0", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/cloudformation-diff": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-1.79.0.tgz", - "integrity": "sha512-GsX8Br7E0/2W2ugntO4zXodbApVi2C+AP/6QtTX6fasZbgZSwe8gjiXYPQ6EvtgjlWnYxPTn6vHRlb53vDFzMg==", - "dev": true, - "dependencies": { - "@aws-cdk/cfnspec": "1.79.0", - "colors": "^1.4.0", - "diff": "^5.0.0", - "fast-deep-equal": "^3.1.3", - "string-width": "^4.2.0", - "table": "^6.0.4" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - } - }, - "node_modules/@aws-cdk/core": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.204.0.tgz", - "integrity": "sha512-yO/flJ9ihpzRhLTEqlbdbuPGtyyghHiiQPkUTLslwUM5vThVTbpgvW4UQHSGqytyst4MYXrN2jQn2RkwIRU57g==", - "bundleDependencies": [ - "fs-extra", - "minimatch", - "@balena/dockerignore", - "ignore" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "@balena/dockerignore": "^1.0.2", - "constructs": "^3.3.69", - "fs-extra": "^9.1.0", - "ignore": "^5.2.4", - "minimatch": "^3.1.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/core/node_modules/@balena/dockerignore": { - "version": "1.0.2", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/@aws-cdk/core/node_modules/at-least-node": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@aws-cdk/core/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@aws-cdk/core/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@aws-cdk/core/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@aws-cdk/core/node_modules/fs-extra": { - "version": "9.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/core/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/core/node_modules/ignore": { - "version": "5.2.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@aws-cdk/core/node_modules/jsonfile": { - "version": "6.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@aws-cdk/core/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/core/node_modules/universalify": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-cdk/custom-resources": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/custom-resources/-/custom-resources-1.204.0.tgz", - "integrity": "sha512-0w3oi7LnAtMZpf7uUBDH6aT2Oo1EBQrqD+VTvPZDX8PJFAox8ol7buZ9sSTpIXgv9j/GK9yaPTIHt4m8ok9kVQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-cloudformation": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-cloudformation": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/cx-api": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.79.0.tgz", - "integrity": "sha512-ymQOqHcPzYhrcQ4swMgw5JzAaOm+PehH1cepsxi/Wq2zNOXkyN9o6Hw6l+eDpezFvNIKFy4mMAo6FR9xRCUiow==", - "bundleDependencies": [ - "semver" - ], - "dev": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.79.0" - } - }, - "node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/region-info": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.204.0.tgz", - "integrity": "sha512-lPkYJNoN4Gjlf0Fdfgcd1RTm5RD9qtfaFMwVvTn2KGTr7ZqmFskGQ9FqIcd5vd6GmsbAL8OrFOToLr1AHDuOiQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "node-notifier": "^8.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "26.0.24", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", - "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", - "dev": true, - "dependencies": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "node_modules/@types/node": { - "version": "10.17.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.27.tgz", - "integrity": "sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/aws-cdk": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-1.77.0.tgz", - "integrity": "sha512-DM0ELcihYV9K7EtEeZZrViwjQUHb/G3CDFPSPQ39d5XuCEcQmnDSuJ6LQ2jFUbZE+Qsj+lmUp+WM1j66kJT9HA==", - "dev": true, - "hasShrinkwrap": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "@aws-cdk/cloudformation-diff": "1.77.0", - "@aws-cdk/cx-api": "1.77.0", - "@aws-cdk/region-info": "1.77.0", - "@aws-cdk/yaml-cfn": "1.77.0", - "archiver": "^5.1.0", - "aws-sdk": "^2.804.0", - "camelcase": "^6.2.0", - "cdk-assets": "1.77.0", - "colors": "^1.4.0", - "decamelize": "^4.0.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "json-diff": "^0.5.4", - "minimatch": ">=3.0", - "promptly": "^3.2.0", - "proxy-agent": "^4.0.0", - "semver": "^7.3.2", - "source-map-support": "^0.5.19", - "table": "^6.0.4", - "uuid": "^8.3.1", - "wrap-ansi": "^7.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "cdk": "bin/cdk" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - } - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/cfnspec": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "md5": "^2.3.0" - } - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "jsonschema": "^1.4.0", - "semver": "^7.3.2" - } - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/cloudformation-diff": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "@aws-cdk/cfnspec": "1.77.0", - "colors": "^1.4.0", - "diff": "^5.0.0", - "fast-deep-equal": "^3.1.3", - "string-width": "^4.2.0", - "table": "^6.0.4" - } - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/cx-api": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "semver": "^7.3.2" - } - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/region-info": { - "version": "1.77.0", - "dev": true - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/yaml-cfn": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "yaml": "1.10.0" - } - }, - "node_modules/aws-cdk/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - } - }, - "node_modules/aws-cdk/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/aws-cdk/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - } - }, - "node_modules/aws-cdk/node_modules/archiver": { - "version": "5.1.0", - "resolved": "https://registry.yarnpkg.com/archiver/-/archiver-5.1.0.tgz#05b0f6f7836f3e6356a0532763d2bb91017a7e37", - "integrity": "sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA==", - "dev": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.1.4", - "zip-stream": "^4.0.4" - } - }, - "node_modules/aws-cdk/node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - } - }, - "node_modules/aws-cdk/node_modules/archiver/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/archiver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/archiver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/aws-cdk/node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - } - }, - "node_modules/aws-cdk/node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/aws-sdk": { - "version": "2.804.0", - "resolved": "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.804.0.tgz#ff7e6f91b86b4878ec69e3de895c10eb8203fc4b", - "integrity": "sha512-a02pZdjL06MunElAZPPEjpghOp/ZA+16f+t4imh1k9FCDpsNVQrT23HRq/PMvRADA5uZZRkYwX8r9o6oH/1RlA==", - "dev": true, - "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - } - }, - "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/buffer/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/bl": { - "version": "4.0.3", - "resolved": "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/aws-cdk/node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/bl/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/bl/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/aws-cdk/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/aws-cdk/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/aws-cdk/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/cdk-assets": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "@aws-cdk/cx-api": "1.77.0", - "archiver": "^5.1.0", - "aws-sdk": "^2.804.0", - "glob": "^7.1.6", - "yargs": "^16.2.0" - } - }, - "node_modules/aws-cdk/node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/cli-color": { - "version": "0.1.7", - "resolved": "https://registry.yarnpkg.com/cli-color/-/cli-color-0.1.7.tgz#adc3200fa471cc211b0da7f566b71e98b9d67347", - "integrity": "sha1-rcMgD6RxzCEbDaf1ZrcemLnWc0c=", - "dev": true, - "dependencies": { - "es5-ext": "0.8.x" - } - }, - "node_modules/aws-cdk/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/aws-cdk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - } - }, - "node_modules/aws-cdk/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/compress-commons": { - "version": "4.0.2", - "resolved": "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.0.2.tgz#d6896be386e52f37610cef9e6fa5defc58c31bd7", - "integrity": "sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A==", - "dev": true, - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/aws-cdk/node_modules/compress-commons/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/compress-commons/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/compress-commons/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/aws-cdk/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/crc-32": { - "version": "1.2.0", - "resolved": "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "dev": true, - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "node_modules/aws-cdk/node_modules/crc32-stream": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.1.tgz#0f047d74041737f8a55e86837a1b826bd8ab0067", - "integrity": "sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - } - }, - "node_modules/aws-cdk/node_modules/crc32-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/crc32-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/crc32-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/aws-cdk/node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/debug": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - } - }, - "node_modules/aws-cdk/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/degenerator": { - "version": "2.2.0", - "resolved": "https://registry.yarnpkg.com/degenerator/-/degenerator-2.2.0.tgz#49e98c11fa0293c5b26edfbb52f15729afcdb254", - "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", - "dev": true, - "dependencies": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0" - } - }, - "node_modules/aws-cdk/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/difflib": { - "version": "0.2.4", - "resolved": "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e", - "integrity": "sha1-teMDYabbAjF21WKJLbhZQKcY9H4=", - "dev": true, - "dependencies": { - "heap": ">= 0.2.0" - } - }, - "node_modules/aws-cdk/node_modules/dreamopt": { - "version": "0.6.0", - "resolved": "https://registry.yarnpkg.com/dreamopt/-/dreamopt-0.6.0.tgz#d813ccdac8d39d8ad526775514a13dda664d6b4b", - "integrity": "sha1-2BPM2sjTnYrVJndVFKE92mZNa0s=", - "dev": true, - "dependencies": { - "wordwrap": ">=0.0.2" - } - }, - "node_modules/aws-cdk/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/aws-cdk/node_modules/es5-ext": { - "version": "0.8.2", - "resolved": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.8.2.tgz#aba8d9e1943a895ac96837a62a39b3f55ecd94ab", - "integrity": "sha1-q6jZ4ZQ6iVrJaDemKjmz9V7NlKs=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - } - }, - "node_modules/aws-cdk/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "node_modules/aws-cdk/node_modules/fs-extra/node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/ftp": { - "version": "0.3.10", - "resolved": "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "dev": true, - "dependencies": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - } - }, - "node_modules/aws-cdk/node_modules/ftp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/ftp/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/aws-cdk/node_modules/ftp/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/get-uri": { - "version": "3.0.2", - "resolved": "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - } - }, - "node_modules/aws-cdk/node_modules/get-uri/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/aws-cdk/node_modules/get-uri/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/get-uri/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "node_modules/aws-cdk/node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/heap": { - "version": "0.2.6", - "resolved": "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac", - "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "node_modules/aws-cdk/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "node_modules/aws-cdk/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - } - }, - "node_modules/aws-cdk/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "node_modules/aws-cdk/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/aws-cdk/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/jmespath": { - "version": "0.15.0", - "resolved": "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/json-diff": { - "version": "0.5.4", - "resolved": "https://registry.yarnpkg.com/json-diff/-/json-diff-0.5.4.tgz#7bc8198c441756632aab66c7d9189d365a7a035a", - "integrity": "sha512-q5Xmx9QXNOzOzIlMoYtLrLiu4Jl/Ce2bn0CNcv54PhyH89CI4GWlGVDye8ei2Ijt9R3U+vsWPsXpLUNob8bs8Q==", - "dev": true, - "dependencies": { - "cli-color": "~0.1.6", - "difflib": "~0.2.1", - "dreamopt": "~0.6.0" - } - }, - "node_modules/aws-cdk/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - } - }, - "node_modules/aws-cdk/node_modules/jsonschema": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2", - "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.5" - } - }, - "node_modules/aws-cdk/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "node_modules/aws-cdk/node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/aws-cdk/node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/aws-cdk/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - } - }, - "node_modules/aws-cdk/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/netmask": { - "version": "1.0.6", - "resolved": "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/aws-cdk/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "node_modules/aws-cdk/node_modules/pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz#66883eeabadc915fc5e95457324cb0f0ac78defb", - "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" - } - }, - "node_modules/aws-cdk/node_modules/pac-resolver": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-4.1.0.tgz#4b12e7d096b255a3b84e53f6831f32e9c7e5fe95", - "integrity": "sha512-d6lf2IrZJJ7ooVHr7BfwSjRO1yKSJMaiiWYSHcrxSIUtZrCa4KKGwcztdkZ/E9LFleJfjoi1yl+XLR7AX24nbQ==", - "dev": true, - "dependencies": { - "degenerator": "^2.2.0", - "ip": "^1.1.5", - "netmask": "^1.0.6" - } - }, - "node_modules/aws-cdk/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/printj": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/promptly": { - "version": "3.2.0", - "resolved": "https://registry.yarnpkg.com/promptly/-/promptly-3.2.0.tgz#a5517fbbf59bd31c1751d4e1d9bef1714f42b9d8", - "integrity": "sha512-WnR9obtgW+rG4oUV3hSnNGl1pHm3V1H/qD9iJBumGSmVsSC5HpZOLuu8qdMb6yCItGfT7dcRszejr/5P3i9Pug==", - "dev": true, - "dependencies": { - "read": "^1.0.4" - } - }, - "node_modules/aws-cdk/node_modules/proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-4.0.0.tgz#a92976af3fbc7d846f2e850e2ac5ac6ca3fb74c7", - "integrity": "sha512-8P0Y2SkwvKjiGU1IkEfYuTteioMIDFxPL4/j49zzt5Mz3pG1KO+mIrDG1qH0PQUHTTczjwGcYl+EzfXiFj5vUQ==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^4.1.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" - } - }, - "node_modules/aws-cdk/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/raw-body": { - "version": "2.4.1", - "resolved": "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "node_modules/aws-cdk/node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "dependencies": { - "mute-stream": "~0.0.4" - } - }, - "node_modules/aws-cdk/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/aws-cdk/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "node_modules/aws-cdk/node_modules/smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/socks": { - "version": "2.5.0", - "resolved": "https://registry.yarnpkg.com/socks/-/socks-2.5.0.tgz#3a7c286db114f67864a4bd8b4207a91d1db3d6db", - "integrity": "sha512-00OqQHp5SCbwm9ecOMJj9aQtMSjwi1uVuGQoxnpKCS50VKZcOZ8z11CTKypmR8sEy7nZimy/qXY7rYJYbRlXmA==", - "dev": true, - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "node_modules/aws-cdk/node_modules/socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - } - }, - "node_modules/aws-cdk/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/aws-cdk/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/aws-cdk/node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/aws-cdk/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - } - }, - "node_modules/aws-cdk/node_modules/table": { - "version": "6.0.4", - "resolved": "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d", - "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "lodash": "^4.17.20", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - } - }, - "node_modules/aws-cdk/node_modules/tar-stream": { - "version": "2.1.4", - "resolved": "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa", - "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "node_modules/aws-cdk/node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/tar-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/tar-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/aws-cdk/node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/tslib": { - "version": "2.0.3", - "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - } - }, - "node_modules/aws-cdk/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/aws-cdk/node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/aws-cdk/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/uuid": { - "version": "8.3.1", - "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/aws-cdk/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "node_modules/aws-cdk/node_modules/xml2js/node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/xregexp": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/y18n": { - "version": "5.0.5", - "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/yaml": { - "version": "1.10.0", - "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "node_modules/aws-cdk/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/zip-stream": { - "version": "4.0.4", - "resolved": "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a", - "integrity": "sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw==", - "dev": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.0.2", - "readable-stream": "^3.6.0" - } - }, - "node_modules/aws-cdk/node_modules/zip-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/zip-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/zip-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "dependencies": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001505", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001505.tgz", - "integrity": "sha512-jaAOR5zVtxHfL0NjZyflVTtXm3D3J9P15zSJ7HmQF8dSKGA6tqzQq+0ZI3xkjyQj46I4/M0K2GbMpcAFOcbr3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/constructs": { - "version": "3.4.329", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.329.tgz", - "integrity": "sha512-uj62KOOmaX6i10KcBLzXcXgcFRZpP+XoCiEqT8tg1zXIGSY3iQ6n6wzw/44laG9L4qrWvCtMna6wACW8CejKkQ==", - "engines": { - "node": ">= 16.14.0" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.434", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.434.tgz", - "integrity": "sha512-5Gvm09UZTQRaWrimRtWRO5rvaX6Kpk5WHAPKDa7A4Gj6NIPuJ8w8WNpnxCXdd+CJJt6RBU6tUw0KyULoW6XuHw==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", - "dev": true, - "optional": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "optional": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "dependencies": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "fsevents": "^2.1.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "dependencies": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "dependencies": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node_modules/node-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - }, - "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", - "dev": true - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true, - "engines": { - "node": "6.* || >= 7.*" - } - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", - "dev": true, - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/sane/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/sane/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-jest": { - "version": "26.5.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", - "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "jest": ">=26 <27", - "typescript": ">=3.8 <5.0" - } - }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@aws-cdk/assert": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/assert/-/assert-1.79.0.tgz", - "integrity": "sha512-wCiMyxhtUz82blUlSnfoqpHdSjgFOkjpunjgxT2aG5Y6RTN0ExOOm9pdKDdXnul0zml6ZvfOL51wDG0Udg7zFg==", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "@aws-cdk/cloudformation-diff": "1.79.0", - "@aws-cdk/core": "1.79.0", - "@aws-cdk/cx-api": "1.79.0", - "constructs": "^3.2.0" - }, - "dependencies": { - "@aws-cdk/core": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.79.0.tgz", - "integrity": "sha512-I+2GbQfbPy6TewnGbviE1W8cUhgBEA1mQLYm5gBj/Rzix1tCyaNvfYsBU3ipg3jIATpHsg1CzUq0zrumUnmnTg==", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "@aws-cdk/cx-api": "1.79.0", - "@aws-cdk/region-info": "1.79.0", - "@balena/dockerignore": "^1.0.2", - "constructs": "^3.2.0", - "fs-extra": "^9.0.1", - "ignore": "^5.1.8", - "minimatch": "^3.0.4" - }, - "dependencies": { - "@balena/dockerignore": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "fs-extra": { - "version": "9.0.1", - "bundled": true, - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "bundled": true, - "dev": true - }, - "ignore": { - "version": "5.1.8", - "bundled": true, - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "universalify": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "@aws-cdk/region-info": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.79.0.tgz", - "integrity": "sha512-klnXCc1Cd/krE4VOXJ1Blvey8ucPRzuwgGacPsCV2ugMSlaJSbdGqKzTUNxcK2o8g9PaEuJ5lNjfwqqyvp571g==", - "dev": true - } - } - }, - "@aws-cdk/assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/assets/-/assets-1.204.0.tgz", - "integrity": "sha512-rY9YHZ3gUWr+dLwTwSUWYbIfk/AXy4JZRkhLbunrtzjQhH+QMm/2IWIebfBGu+A5AlVRaFbRLonReuGP5WZoUQ==", - "requires": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-acmpca": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-acmpca/-/aws-acmpca-1.204.0.tgz", - "integrity": "sha512-2zyuQZwynwkz2qiuFDp088tglWXKX3q7saWRDqeuq2n2HE6PGuQRjd4zjl9nDGUVxQYtzzXyEuPyaEta8fg9lQ==", - "requires": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-applicationautoscaling": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.204.0.tgz", - "integrity": "sha512-sEe2NODKUowJx2guM2SPfs/20gGdBq1C09M32b8c1im7K+PqQkHkE156nyz5Ml0hpsNeCZlRS17oKZ042aZevQ==", - "requires": { - "@aws-cdk/aws-autoscaling-common": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-autoscaling-common": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.204.0.tgz", - "integrity": "sha512-P+PwbTaj28Eg9+/U9ZTXTh1gA7L9Z45GL+9xcEZvEqAkJt9MNgzZICavVZu1sMD74foK1r1ZOBXTsqV6wEiltQ==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-certificatemanager": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.204.0.tgz", - "integrity": "sha512-ZLykfAOb5Zbg/MFtzA+eHhMAK1xL32+oHKSK6tAYrgvv2aS42wJE4zSBV6jGCjnCkhcliUd5pwnACEl3ib0KLw==", - "requires": { - "@aws-cdk/aws-acmpca": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-route53": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-cloudformation": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.204.0.tgz", - "integrity": "sha512-9PkZa9mKLneB0My8wJC7lLZmPJsnOxNYy57ZZlRCQhK0eO6Jc9eVqrI29537W+3ireaEjCLEitkb8NO1FN/kQA==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-cloudwatch": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.204.0.tgz", - "integrity": "sha512-ADT2D+4FtB9Zcy/TlF2tswQmjmrPVgORYTkznQQ2SniCODHWzz558+G1RV+IVvWRdH7nYQtV0UEuGZKpffWh2w==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-codeguruprofiler": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.204.0.tgz", - "integrity": "sha512-IrgY4SmVf9p5POfHm8BsPzaAO5lQTG7nhb5qN5AzS6zKCTuEjjTNHjx1TOfPV12mMIDAIVsK91mjDlAR88Mjbg==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-codestarnotifications": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codestarnotifications/-/aws-codestarnotifications-1.204.0.tgz", - "integrity": "sha512-t//hSpC5/uVW2321YlbGabNVzhWayvqz+xSnagADGcT9qiq3KQR/uUlrgpHv1/eHRMk7EMrY9prlXeZpfzZ+cw==", - "requires": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-cognito": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cognito/-/aws-cognito-1.204.0.tgz", - "integrity": "sha512-7QIbExW9dn1fktpDOh2nMHmor2S3uuHtIX5y33lc9OKg3xUuYw4AZ67MKapunN7QUBlffTlNzoUqlHoNSab+Zg==", - "requires": { - "@aws-cdk/aws-certificatemanager": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69", - "punycode": "^2.3.0" - }, - "dependencies": { - "punycode": { - "version": "2.3.0", - "bundled": true - } - } - }, - "@aws-cdk/aws-ec2": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ec2/-/aws-ec2-1.204.0.tgz", - "integrity": "sha512-SoqZEgzdfPW0aa+FQ0CjzbDG+X+sDu6/BnLL2O10lxpa+9Dc1iyArAqNKFJG5KXGJe9ibvQXyNQqEjeGRFc22Q==", - "requires": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-ssm": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-ecr": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr/-/aws-ecr-1.204.0.tgz", - "integrity": "sha512-oCts9e+ackWoFHeyn/3oKm3X1lSizleWNNXHp5WGM38lpNVrtCLMKSShu5iXJBhqRH2Mz1AcA4fDMWhe8DvJFA==", - "requires": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-ecr-assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.204.0.tgz", - "integrity": "sha512-2GHD3pZdDoPxq3HhD4czANuI7TMoxpjszbzsQAc2wbdMX1j+K4vIL+PBpj3altfscPqcvy1v70lBjbG5rcBIkQ==", - "requires": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-efs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-efs/-/aws-efs-1.204.0.tgz", - "integrity": "sha512-FB6nHgCuzYF5K9ywqYPEPjL2G1ATLIR9dJp1p4ydcEUuXDb4KSEVN4Bgx+q1e7EkWGIq+9glr+ckheEcTvETgw==", - "requires": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-events": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-events/-/aws-events-1.204.0.tgz", - "integrity": "sha512-KnfUmtv+4RhydD9+5CHFxNJxtgn7+Xftwfwg1G7qV/tWYPFHcNIvhlSOgwDrQPa+pTo1MmkiUN0lAR0G8B/cbw==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-iam": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-iam/-/aws-iam-1.204.0.tgz", - "integrity": "sha512-Fh2egW3v/uDdw3m4jvcupS7COL/+sJl2NHjz9l298ddyMxqDwJD2NQwE8mvgPLK4rDtAtDnE0c8RS6d+NWiC+w==", - "requires": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-kms": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-kms/-/aws-kms-1.204.0.tgz", - "integrity": "sha512-iryZQ428L1VUVQ0zE96XTWWX7ANVtDrb6x+ZXXLTVUEPgjEd/W6zlcp++Qi0A3a9HLNd4PbEhK9rs0UKNTylzw==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-lambda": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda/-/aws-lambda-1.204.0.tgz", - "integrity": "sha512-r0XXovrLAx8Q8Fz915SwzyQM/KLhEB6YCp3CsWliFGSOHEjRP8yX8UZdEJqe5kYD7Th9JAhUVzKgyv20P7g5Tg==", - "requires": { - "@aws-cdk/aws-applicationautoscaling": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codeguruprofiler": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-ecr-assets": "1.204.0", - "@aws-cdk/aws-efs": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-signer": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-logs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-logs/-/aws-logs-1.204.0.tgz", - "integrity": "sha512-PuHsDSkX6JFBgldxViGw91eFLageJ2cX89/RyLbWaJJUV4tlUKXSmmkVgOaBmvil0QKuGqbOzLXcXCoIK9Sg3A==", - "requires": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-route53": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-route53/-/aws-route53-1.204.0.tgz", - "integrity": "sha512-wQpGUXqc2y7yJFTipfuVxWy/VGeshyGlfGl4evusQK9Md0DMpVmG8kRgazLk1myqUSNSfi643UwvDJqNbYmdnA==", - "requires": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-s3": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3/-/aws-s3-1.204.0.tgz", - "integrity": "sha512-jsQ4n1L4MdPYDirBoOYgg7yzSk1TaFYo4dnwDlKiLJ5LcHG3Nai1cHb9XQbCy/9KKqbWsbd3WlkH+vcWEl8EUA==", - "requires": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-s3-assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.204.0.tgz", - "integrity": "sha512-3MQbVZ95wW29Bl63tqu0Bz0td3osLyGg352l5G7Ztf3nK35FpuQlgxO4kcu74+s2sRwdd/R4KFV6eWhhPk+J7g==", - "requires": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-signer": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-signer/-/aws-signer-1.204.0.tgz", - "integrity": "sha512-AI26FhWF3+f/vDh3mleQa2CXv2/CmSerXgyk4XHMVVTTCjnlYGGmHmGlzYhqOSw6ALpQNdOSw8GVxU/ySpQCaw==", - "requires": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-sns": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sns/-/aws-sns-1.204.0.tgz", - "integrity": "sha512-KoWxqKT/dTjt9Pk0a3kJLcd6xZHvrwbZDC0mrLtxdRNhQoHmnURAHW2UqX/lefrCU1GcUFf4L58N9ehBTunAFQ==", - "requires": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codestarnotifications": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-sqs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sqs/-/aws-sqs-1.204.0.tgz", - "integrity": "sha512-dVzuGMh6d5/X9P9jel1w2Wgdy5MuSE35+eBSFxN+S7oJRoVSARpyKMNYAPMCW+2OJCDw7fIqO1rWbsZBT1Gq8g==", - "requires": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-ssm": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ssm/-/aws-ssm-1.204.0.tgz", - "integrity": "sha512-yYx7HZ8cWNXDAmX/99WkB477QhLoV2rcB8orei8aj7nRkNq5TMjeox0IJaZVgU+edNEDOi1fVX3flh0SAMiUrg==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/cfnspec": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-1.79.0.tgz", - "integrity": "sha512-rbBhox7hzXPXk2n+1BDjsmiz/0W9ZHv3NeCKiq94WfHW6Jj4mSjtGs7ZUBFq8JkkgYVsE9ktH1634wt9A9fbRg==", - "dev": true, - "requires": { - "md5": "^2.3.0" - } - }, - "@aws-cdk/cloud-assembly-schema": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.79.0.tgz", - "integrity": "sha512-n2ARtOXIUq3FdJ1EBuHzsM0DQau6ZwHprPhpk1xc5bv21s7D5X5ECe06eC0K5xC5ZyfC13BDWu1f+xFh+krnYA==", - "dev": true, - "requires": { - "jsonschema": "^1.4.0", - "semver": "^7.3.2" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.0", - "bundled": true, - "dev": true - }, - "semver": { - "version": "7.3.2", - "bundled": true, - "dev": true - } - } - }, - "@aws-cdk/cloudformation-diff": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-1.79.0.tgz", - "integrity": "sha512-GsX8Br7E0/2W2ugntO4zXodbApVi2C+AP/6QtTX6fasZbgZSwe8gjiXYPQ6EvtgjlWnYxPTn6vHRlb53vDFzMg==", - "dev": true, - "requires": { - "@aws-cdk/cfnspec": "1.79.0", - "colors": "^1.4.0", - "diff": "^5.0.0", - "fast-deep-equal": "^3.1.3", - "string-width": "^4.2.0", - "table": "^6.0.4" - } - }, - "@aws-cdk/core": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.204.0.tgz", - "integrity": "sha512-yO/flJ9ihpzRhLTEqlbdbuPGtyyghHiiQPkUTLslwUM5vThVTbpgvW4UQHSGqytyst4MYXrN2jQn2RkwIRU57g==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "@balena/dockerignore": "^1.0.2", - "constructs": "^3.3.69", - "fs-extra": "^9.1.0", - "ignore": "^5.2.4", - "minimatch": "^3.1.2" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@balena/dockerignore": { - "version": "1.0.2", - "bundled": true - }, - "at-least-node": { - "version": "1.0.0", - "bundled": true - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "fs-extra": { - "version": "9.1.0", - "bundled": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "bundled": true - }, - "ignore": { - "version": "5.2.4", - "bundled": true - }, - "jsonfile": { - "version": "6.1.0", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "universalify": { - "version": "2.0.0", - "bundled": true - } - } - }, - "@aws-cdk/custom-resources": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/custom-resources/-/custom-resources-1.204.0.tgz", - "integrity": "sha512-0w3oi7LnAtMZpf7uUBDH6aT2Oo1EBQrqD+VTvPZDX8PJFAox8ol7buZ9sSTpIXgv9j/GK9yaPTIHt4m8ok9kVQ==", - "requires": { - "@aws-cdk/aws-cloudformation": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/cx-api": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.79.0.tgz", - "integrity": "sha512-ymQOqHcPzYhrcQ4swMgw5JzAaOm+PehH1cepsxi/Wq2zNOXkyN9o6Hw6l+eDpezFvNIKFy4mMAo6FR9xRCUiow==", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "semver": "^7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "bundled": true, - "dev": true - } - } - }, - "@aws-cdk/region-info": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.204.0.tgz", - "integrity": "sha512-lPkYJNoN4Gjlf0Fdfgcd1RTm5RD9qtfaFMwVvTn2KGTr7ZqmFskGQ9FqIcd5vd6GmsbAL8OrFOToLr1AHDuOiQ==" - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", - "dev": true - }, - "@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", - "dev": true, - "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - } - }, - "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - } - }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - } - }, - "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - } - }, - "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } - } - }, - "@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.24", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", - "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", - "dev": true, - "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "@types/node": { - "version": "10.17.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.27.tgz", - "integrity": "sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-cdk": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-1.77.0.tgz", - "integrity": "sha512-DM0ELcihYV9K7EtEeZZrViwjQUHb/G3CDFPSPQ39d5XuCEcQmnDSuJ6LQ2jFUbZE+Qsj+lmUp+WM1j66kJT9HA==", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "@aws-cdk/cloudformation-diff": "1.77.0", - "@aws-cdk/cx-api": "1.77.0", - "@aws-cdk/region-info": "1.77.0", - "@aws-cdk/yaml-cfn": "1.77.0", - "archiver": "^5.1.0", - "aws-sdk": "^2.804.0", - "camelcase": "^6.2.0", - "cdk-assets": "1.77.0", - "colors": "^1.4.0", - "decamelize": "^4.0.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "json-diff": "^0.5.4", - "minimatch": ">=3.0", - "promptly": "^3.2.0", - "proxy-agent": "^4.0.0", - "semver": "^7.3.2", - "source-map-support": "^0.5.19", - "table": "^6.0.4", - "uuid": "^8.3.1", - "wrap-ansi": "^7.0.0", - "yargs": "^16.2.0" - }, - "dependencies": { - "@aws-cdk/cfnspec": { - "version": "1.77.0", - "dev": true, - "requires": { - "md5": "^2.3.0" - } - }, - "@aws-cdk/cloud-assembly-schema": { - "version": "1.77.0", - "dev": true, - "requires": { - "jsonschema": "^1.4.0", - "semver": "^7.3.2" - } - }, - "@aws-cdk/cloudformation-diff": { - "version": "1.77.0", - "dev": true, - "requires": { - "@aws-cdk/cfnspec": "1.77.0", - "colors": "^1.4.0", - "diff": "^5.0.0", - "fast-deep-equal": "^3.1.3", - "string-width": "^4.2.0", - "table": "^6.0.4" - } - }, - "@aws-cdk/cx-api": { - "version": "1.77.0", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "semver": "^7.3.2" - } - }, - "@aws-cdk/region-info": { - "version": "1.77.0", - "dev": true - }, - "@aws-cdk/yaml-cfn": { - "version": "1.77.0", - "dev": true, - "requires": { - "yaml": "1.10.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "archiver": { - "version": "5.1.0", - "resolved": "https://registry.yarnpkg.com/archiver/-/archiver-5.1.0.tgz#05b0f6f7836f3e6356a0532763d2bb91017a7e37", - "integrity": "sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA==", - "dev": true, - "requires": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.1.4", - "zip-stream": "^4.0.4" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - } - }, - "ast-types": { - "version": "0.13.4", - "resolved": "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "aws-sdk": { - "version": "2.804.0", - "resolved": "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.804.0.tgz#ff7e6f91b86b4878ec69e3de895c10eb8203fc4b", - "integrity": "sha512-a02pZdjL06MunElAZPPEjpghOp/ZA+16f+t4imh1k9FCDpsNVQrT23HRq/PMvRADA5uZZRkYwX8r9o6oH/1RlA==", - "dev": true, - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bl": { - "version": "4.0.3", - "resolved": "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "cdk-assets": { - "version": "1.77.0", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "@aws-cdk/cx-api": "1.77.0", - "archiver": "^5.1.0", - "aws-sdk": "^2.804.0", - "glob": "^7.1.6", - "yargs": "^16.2.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "cli-color": { - "version": "0.1.7", - "resolved": "https://registry.yarnpkg.com/cli-color/-/cli-color-0.1.7.tgz#adc3200fa471cc211b0da7f566b71e98b9d67347", - "integrity": "sha1-rcMgD6RxzCEbDaf1ZrcemLnWc0c=", - "dev": true, - "requires": { - "es5-ext": "0.8.x" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "compress-commons": { - "version": "4.0.2", - "resolved": "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.0.2.tgz#d6896be386e52f37610cef9e6fa5defc58c31bd7", - "integrity": "sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A==", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "crc-32": { - "version": "1.2.0", - "resolved": "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "dev": true, - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "crc32-stream": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.1.tgz#0f047d74041737f8a55e86837a1b826bd8ab0067", - "integrity": "sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, - "data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "degenerator": { - "version": "2.2.0", - "resolved": "https://registry.yarnpkg.com/degenerator/-/degenerator-2.2.0.tgz#49e98c11fa0293c5b26edfbb52f15729afcdb254", - "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", - "dev": true, - "requires": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "difflib": { - "version": "0.2.4", - "resolved": "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e", - "integrity": "sha1-teMDYabbAjF21WKJLbhZQKcY9H4=", - "dev": true, - "requires": { - "heap": ">= 0.2.0" - } - }, - "dreamopt": { - "version": "0.6.0", - "resolved": "https://registry.yarnpkg.com/dreamopt/-/dreamopt-0.6.0.tgz#d813ccdac8d39d8ad526775514a13dda664d6b4b", - "integrity": "sha1-2BPM2sjTnYrVJndVFKE92mZNa0s=", - "dev": true, - "requires": { - "wordwrap": ">=0.0.2" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "es5-ext": { - "version": "0.8.2", - "resolved": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.8.2.tgz#aba8d9e1943a895ac96837a62a39b3f55ecd94ab", - "integrity": "sha1-q6jZ4ZQ6iVrJaDemKjmz9V7NlKs=", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - }, - "dependencies": { - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "dev": true, - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-uri": { - "version": "3.0.2", - "resolved": "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "heap": { - "version": "0.2.6", - "resolved": "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac", - "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", - "dev": true - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", - "dev": true - }, - "json-diff": { - "version": "0.5.4", - "resolved": "https://registry.yarnpkg.com/json-diff/-/json-diff-0.5.4.tgz#7bc8198c441756632aab66c7d9189d365a7a035a", - "integrity": "sha512-q5Xmx9QXNOzOzIlMoYtLrLiu4Jl/Ce2bn0CNcv54PhyH89CI4GWlGVDye8ei2Ijt9R3U+vsWPsXpLUNob8bs8Q==", - "dev": true, - "requires": { - "cli-color": "~0.1.6", - "difflib": "~0.2.1", - "dreamopt": "~0.6.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "universalify": "^2.0.0" - } - }, - "jsonschema": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2", - "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz#66883eeabadc915fc5e95457324cb0f0ac78defb", - "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" - } - }, - "pac-resolver": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-4.1.0.tgz#4b12e7d096b255a3b84e53f6831f32e9c7e5fe95", - "integrity": "sha512-d6lf2IrZJJ7ooVHr7BfwSjRO1yKSJMaiiWYSHcrxSIUtZrCa4KKGwcztdkZ/E9LFleJfjoi1yl+XLR7AX24nbQ==", - "dev": true, - "requires": { - "degenerator": "^2.2.0", - "ip": "^1.1.5", - "netmask": "^1.0.6" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "printj": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promptly": { - "version": "3.2.0", - "resolved": "https://registry.yarnpkg.com/promptly/-/promptly-3.2.0.tgz#a5517fbbf59bd31c1751d4e1d9bef1714f42b9d8", - "integrity": "sha512-WnR9obtgW+rG4oUV3hSnNGl1pHm3V1H/qD9iJBumGSmVsSC5HpZOLuu8qdMb6yCItGfT7dcRszejr/5P3i9Pug==", - "dev": true, - "requires": { - "read": "^1.0.4" - } - }, - "proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-4.0.0.tgz#a92976af3fbc7d846f2e850e2ac5ac6ca3fb74c7", - "integrity": "sha512-8P0Y2SkwvKjiGU1IkEfYuTteioMIDFxPL4/j49zzt5Mz3pG1KO+mIrDG1qH0PQUHTTczjwGcYl+EzfXiFj5vUQ==", - "dev": true, - "requires": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^4.1.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true - }, - "socks": { - "version": "2.5.0", - "resolved": "https://registry.yarnpkg.com/socks/-/socks-2.5.0.tgz#3a7c286db114f67864a4bd8b4207a91d1db3d6db", - "integrity": "sha512-00OqQHp5SCbwm9ecOMJj9aQtMSjwi1uVuGQoxnpKCS50VKZcOZ8z11CTKypmR8sEy7nZimy/qXY7rYJYbRlXmA==", - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "table": { - "version": "6.0.4", - "resolved": "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d", - "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "lodash": "^4.17.20", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - } - }, - "tar-stream": { - "version": "2.1.4", - "resolved": "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa", - "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "8.3.1", - "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - }, - "dependencies": { - "sax": { - "version": "1.2.4", - "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - } - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", - "dev": true - }, - "y18n": { - "version": "5.0.5", - "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "zip-stream": { - "version": "4.0.4", - "resolved": "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a", - "integrity": "sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw==", - "dev": true, - "requires": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.0.2", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - } - } - }, - "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - } - } - }, - "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001505", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001505.tgz", - "integrity": "sha512-jaAOR5zVtxHfL0NjZyflVTtXm3D3J9P15zSJ7HmQF8dSKGA6tqzQq+0ZI3xkjyQj46I4/M0K2GbMpcAFOcbr3A==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "constructs": { - "version": "3.4.329", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.329.tgz", - "integrity": "sha512-uj62KOOmaX6i10KcBLzXcXgcFRZpP+XoCiEqT8tg1zXIGSY3iQ6n6wzw/44laG9L4qrWvCtMna6wACW8CejKkQ==" - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "electron-to-chromium": { - "version": "1.4.434", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.434.tgz", - "integrity": "sha512-5Gvm09UZTQRaWrimRtWRO5rvaX6Kpk5WHAPKDa7A4Gj6NIPuJ8w8WNpnxCXdd+CJJt6RBU6tUw0KyULoW6XuHw==", - "dev": true - }, - "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", - "dev": true, - "optional": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - } - }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - } - }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } - }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - } - }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - } - }, - "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - } - }, - "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - } - }, - "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - } - }, - "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - } - }, - "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - } - }, - "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - } - }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - } - }, - "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - } - } - }, - "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "ts-jest": { - "version": "26.5.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", - "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true - } - } - }, - "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "dev": true - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - }, - "v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/resources/cdk/javascript_example_code_transcribe_demo/package.json b/resources/cdk/javascript_example_code_transcribe_demo/package.json deleted file mode 100644 index f22cd5fbbd2..00000000000 --- a/resources/cdk/javascript_example_code_transcribe_demo/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "setup", - "version": "0.1.0", - "bin": { - "setup": "setup.js" - }, - "scripts": { - "build": "tsc", - "watch": "tsc -w", - "test": "jest", - "cdk": "cdk" - }, - "devDependencies": { - "@aws-cdk/assert": "1.79.0", - "@types/jest": "^26.0.10", - "@types/node": "10.17.27", - "aws-cdk": "1.77.0", - "jest": "^26.4.2", - "ts-jest": "^26.2.0", - "ts-node": "^9.0.0", - "typescript": "~3.9.7" - }, - "dependencies": { - "@aws-cdk/aws-cognito": "^1.204.0", - "@aws-cdk/aws-iam": "^1.204.0", - "@aws-cdk/core": "^1.204.0", - "source-map-support": "^0.5.16" - } -} diff --git a/resources/cdk/javascript_example_code_transcribe_demo/setup.ts b/resources/cdk/javascript_example_code_transcribe_demo/setup.ts deleted file mode 100644 index b03c0f6b773..00000000000 --- a/resources/cdk/javascript_example_code_transcribe_demo/setup.ts +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/env node -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Purpose: This AWS Cloud Development Kit (AWS CDK) app -// creates the following AWS resources: -// -// This AWS CDK app creates the following resources: -// -// - An Amazon Cognito identity pool with an authenticated user role. -// - An IAM policy with permissions for the Amazon S3 and Amazon Transcribe is -// attached to the authenticated user role. -// - An Amazon Cognito user pool that enables users to sign up and sign in to the -// app. -// - An Amazon S3 bucket to host the application files. -// - An Amazon S3 bucket to to store the transcriptions. -// -// For instructions on how to run any of these apps, see -// https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/resources/cdk/README.md#Running-a-CDK-app - -import * as cdk from "@aws-cdk/core"; -import * as cognito from "@aws-cdk/aws-cognito"; -import * as iam from "@aws-cdk/aws-iam"; -import { Effect, PolicyStatement } from "@aws-cdk/aws-iam"; -import * as s3 from "@aws-cdk/aws-s3"; -import { - Bucket, - BucketAccessControl, - BlockPublicAccess, - BlockPublicAccessOptions, -} from "@aws-cdk/aws-s3"; - -export class SetupStackTranscription extends cdk.Stack { - constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { - super(scope, id, props); - - const transcriptionBucket = new Bucket(this, "transcriptions", { - enforceSSL: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - publicReadAccess: true, - accessControl: BucketAccessControl.PUBLIC_READ, - }); - - transcriptionBucket.addToResourcePolicy( - new iam.PolicyStatement({ - effect: Effect.ALLOW, - actions: ["*"], - resources: [transcriptionBucket.arnForObjects("*")], - principals: [new iam.AccountRootPrincipal()], - }) - ); - transcriptionBucket.grantPublicAccess("*", "s3:GetObject"); - transcriptionBucket.grantPublicAccess("*", "s3:PutObject"); - transcriptionBucket.grantPublicAccess("*", "s3:DeleteObject"); - - const cfnBucket = transcriptionBucket.node.findChild( - "Resource" - ) as s3.CfnBucket; - cfnBucket.addPropertyOverride("CorsConfiguration", { - CorsRules: [ - { - AllowedHeaders: ["*"], - AllowedMethods: ["GET", "POST", "PUT", "DELETE"], - AllowedOrigins: ["*"], - }, - ], - }); - - const appBucket = new s3.Bucket(this, "appbucket", { - enforceSSL: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - websiteIndexDocument: "index.html", - websiteErrorDocument: "index.html", - blockPublicAccess: { - blockPublicAcls: true, - blockPublicPolicy: false, - ignorePublicAcls: true, - restrictPublicBuckets: false, - }, - }); - appBucket.grantPublicAccess("*", "s3:GetObject"); - appBucket.grantPublicAccess("*", "s3:PutObject"); - - const randomUserPoolName = `ExampleUserPoolName-${Math.ceil( - Math.random() * 10 ** 10 - )}`; - - const myUserPool = new cognito.UserPool(this, "exampleuserpoolid", { - userPoolName: randomUserPoolName, - selfSignUpEnabled: true, - autoVerify: { - email: true, - }, - userVerification: { - emailSubject: "Verify your email for our awesome app!", - emailBody: - "Hello, Thanks for signing up to our awesome app! Your verification code is {####}", - smsMessage: - "Hello, Thanks for signing up to our awesome app! Your verification code is {####}", - }, - standardAttributes: { - email: { - required: true, - mutable: false, - }, - }, - }); - - const randomUserPoolClientName = `ExampleUserPoolName-${Math.ceil( - Math.random() * 10 ** 10 - )}`; - - const userPoolClient = new cognito.UserPoolClient( - this, - "ExampleUserPoolClient", - { - userPool: myUserPool, - userPoolClientName: randomUserPoolClientName, - oAuth: { - callbackUrls: [appBucket.urlForObject("index.html")], - }, - } - ); - - const randomDomain = `exampleuserpoolname-${Math.ceil( - Math.random() * 10 ** 10 - )}`; - - myUserPool.addDomain("CognitoDomain", { - cognitoDomain: { - domainPrefix: randomDomain, - }, - }); - - const myIdentityPool = new cognito.CfnIdentityPool( - this, - "ExampleIdentityPool", - { - allowUnauthenticatedIdentities: false, - cognitoIdentityProviders: [ - { - clientId: userPoolClient.userPoolClientId, - providerName: myUserPool.userPoolProviderName, - }, - ], - } - ); - const authenticatedRole = new iam.Role( - this, - "ExampleCognitoDefaultAuthenticatedRole", - { - assumedBy: new iam.FederatedPrincipal( - "cognito-identity.amazonaws.com", - { - StringEquals: { - "cognito-identity.amazonaws.com:aud": myIdentityPool.ref, - }, - "ForAnyValue:StringLike": { - "cognito-identity.amazonaws.com:amr": "authenticated", - }, - }, - "sts:AssumeRoleWithWebIdentity" - ), - } - ); - authenticatedRole.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: [ - "mobileanalytics:PutEvents", - "cognito-sync:*", - "cognito-identity:*", - ], - resources: ["*"], - }) - ); - - authenticatedRole.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ["sns:*"], - resources: ["*"], - }) - ); - authenticatedRole.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: [ - "transcribe:StartTranscriptionJob", - "transcribe:GetTranscriptionJob", - ], - resources: ["*"], - }) - ); - const defaultPolicy = new cognito.CfnIdentityPoolRoleAttachment( - this, - "DefaultValid", - { - identityPoolId: myIdentityPool.ref, - roles: { - authenticated: authenticatedRole.roleArn, - }, - } - ); - } -} - -const stackName = "SetupStack"; - -const app = new cdk.App(); - -new SetupStackTranscription(app, stackName); diff --git a/resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json b/resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json deleted file mode 100644 index ec75123ce65..00000000000 --- a/resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2018", - "module": "commonjs", - "lib": ["es2018"], - "declaration": true, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": false, - "inlineSourceMap": true, - "inlineSources": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "typeRoots": ["./node_modules/@types"] - }, - "exclude": ["cdk.out"] -} diff --git a/resources/cdk/lambda_api_step_functions/cdk.json b/resources/cdk/lambda_api_step_functions/cdk.json deleted file mode 100644 index 90acb5637f9..00000000000 --- a/resources/cdk/lambda_api_step_functions/cdk.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "app": "npx ts-node --prefer-ts-exts setup.ts", - "context": { - "@aws-cdk/core:enableStackNameDuplicates": "true", - "aws-cdk:enableDiffNoFail": "true", - "@aws-cdk/core:stackRelativeExports": "true", - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true - } -} diff --git a/resources/cdk/lambda_api_step_functions/package.json b/resources/cdk/lambda_api_step_functions/package.json deleted file mode 100644 index d968b45ddb7..00000000000 --- a/resources/cdk/lambda_api_step_functions/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "setup", - "version": "0.1.0", - "bin": { - "setup": "setup.js" - }, - "scripts": { - "build": "tsc", - "watch": "tsc -w", - "test": "jest", - "cdk": "cdk" - }, - "devDependencies": { - "@aws-cdk/assert": "1.87.1", - "@types/jest": "^26.0.10", - "@types/node": "10.17.27", - "aws-cdk": "1.87.1", - "jest": "^26.4.2", - "ts-jest": "^26.2.0", - "ts-node": "^9.0.0", - "typescript": "~3.9.7" - }, - "dependencies": { - "@aws-cdk/aws-lambda": "^1.87.1", - "@aws-cdk/aws-cognito": "^1.87.1", - "@aws-cdk/aws-iam": "^1.87.1", - "@aws-cdk/core": "^1.87.1", - "source-map-support": "^0.5.16" - } -} diff --git a/resources/cdk/lambda_api_step_functions/setup.ts b/resources/cdk/lambda_api_step_functions/setup.ts deleted file mode 100644 index a6dd76a5375..00000000000 --- a/resources/cdk/lambda_api_step_functions/setup.ts +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env node -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -import "source-map-support/register"; -import * as cdk from "@aws-cdk/core"; -import { CfnOutput } from "@aws-cdk/core"; -import * as cognito from "@aws-cdk/aws-cognito"; -import * as iam from "@aws-cdk/aws-iam"; -import { Effect, PolicyStatement } from "@aws-cdk/aws-iam"; - -export class stepfunctions extends cdk.Stack { - constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { - super(scope, id, props); - - const myIdentityPool = new cognito.CfnIdentityPool( - this, - "ExampleIdentityPool", - { - allowUnauthenticatedIdentities: true, - } - ); - - const lambda_support_role = new iam.Role(this, "LambdaRole", { - assumedBy: new iam.FederatedPrincipal( - "cognito-identity.amazonaws.com", - { - StringEquals: { - "cognito-identity.amazonaws.com:aud": myIdentityPool.ref, - }, - "ForAnyValue:StringLike": { - "cognito-identity.amazonaws.com:amr": "unauthenticated", - }, - }, - "sts:AssumeRoleWithWebIdentity" - ), - }); - - lambda_support_role.assumeRolePolicy?.addStatements( - new iam.PolicyStatement({ - effect: iam.Effect.ALLOW, - principals: [new iam.ServicePrincipal("lambda.amazonaws.com")], - actions: ["sts:AssumeRole"], - }) - ); - - lambda_support_role.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: [ - "lambda:InvokeFunction", - "mobileanalytics:PutEvents", - "cognito-sync:*", - ], - resources: ["*"], - }) - ); - lambda_support_role.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ["dynamodb:*"], - resources: ["*"], - }) - ); - lambda_support_role.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ["ses:*"], - resources: ["*"], - }) - ); - const defaultPolicy = new cognito.CfnIdentityPoolRoleAttachment( - this, - "DefaultValid", - { - identityPoolId: myIdentityPool.ref, - roles: { - unauthenticated: lambda_support_role.roleArn, - }, - } - ); - const myIdentityPool_workflow = new cognito.CfnIdentityPool( - this, - "ExampleIdentityPoolWorkflow", - { - allowUnauthenticatedIdentities: true, - } - ); - const workflow_support_role = new iam.Role(this, "WorkflowRole", { - assumedBy: new iam.FederatedPrincipal( - "cognito-identity.amazonaws.com", - { - StringEquals: { - "cognito-identity.amazonaws.com:aud": myIdentityPool_workflow.ref, - }, - "ForAnyValue:StringLike": { - "cognito-identity.amazonaws.com:amr": "unauthenticated", - }, - }, - "sts:AssumeRoleWithWebIdentity" - ), - }); - workflow_support_role.assumeRolePolicy?.addStatements( - new iam.PolicyStatement({ - effect: iam.Effect.ALLOW, - principals: [new iam.ServicePrincipal("states.amazonaws.com")], - actions: ["sts:AssumeRole"], - }) - ); - - workflow_support_role.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: [ - "lambda:InvokeFunction", - "mobileanalytics:PutEvents", - "cognito-sync:*", - ], - resources: ["*"], - }) - ); - - const defaultPolicyworkflow = new cognito.CfnIdentityPoolRoleAttachment( - this, - "DefaultValidWorkflow", - { - identityPoolId: myIdentityPool_workflow.ref, - roles: { - unauthenticated: workflow_support_role.roleArn, - }, - } - ); - new CfnOutput(this, "Lambda support role", { - value: lambda_support_role.roleName, - }); - new CfnOutput(this, "Workflow support role", { - value: workflow_support_role.roleName, - }); - } -} - -const app = new cdk.App(); -new stepfunctions(app, "stepfunctions"); diff --git a/resources/cdk/lambda_api_step_functions/tsconfig.json b/resources/cdk/lambda_api_step_functions/tsconfig.json deleted file mode 100644 index ec75123ce65..00000000000 --- a/resources/cdk/lambda_api_step_functions/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2018", - "module": "commonjs", - "lib": ["es2018"], - "declaration": true, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": false, - "inlineSourceMap": true, - "inlineSources": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "typeRoots": ["./node_modules/@types"] - }, - "exclude": ["cdk.out"] -} From 9791f9665ce47020e01e2666cd02e135724b7b69 Mon Sep 17 00:00:00 2001 From: liunamz-aws <83244944+liunamz-aws@users.noreply.github.com> Date: Wed, 21 Aug 2024 08:13:26 -0700 Subject: [PATCH 36/98] Update IotActions.java (#6724) Fixed describeEndpoint code example --- .../iot/src/main/java/com/example/iot/scenario/IotActions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javav2/example_code/iot/src/main/java/com/example/iot/scenario/IotActions.java b/javav2/example_code/iot/src/main/java/com/example/iot/scenario/IotActions.java index 0baa1887c65..a25ab0d6e40 100644 --- a/javav2/example_code/iot/src/main/java/com/example/iot/scenario/IotActions.java +++ b/javav2/example_code/iot/src/main/java/com/example/iot/scenario/IotActions.java @@ -316,7 +316,7 @@ public void updateShadowThing(String thingName) { * If an exception occurs, it prints the error message. */ public String describeEndpoint() { - CompletableFuture future = getAsyncClient().describeEndpoint(DescribeEndpointRequest.builder().build()); + CompletableFuture future = getAsyncClient().describeEndpoint(DescribeEndpointRequest.builder().endpointType("iot:Data-ATS").build()); final String[] result = {null}; future.whenComplete((endpointResponse, ex) -> { From 4d9be850d1067291119bd43b0084e805a688cd64 Mon Sep 17 00:00:00 2001 From: Steven Meyer <108885656+meyertst-aws@users.noreply.github.com> Date: Wed, 21 Aug 2024 12:40:38 -0400 Subject: [PATCH 37/98] Revert "Removing old JS examples" (#6765) Revert "Removing old JS examples (#6763)" This reverts commit c8afcc94b12ff25d5428a99d6ad4446a5760700c. --- ...s_ServerlessWorkflows_JavaScript_block.xml | 21 + ...ross_TranscriptionApp_JavaScript_block.xml | 19 + .doc_gen/metadata/cross_metadata.yaml | 19 + .../lambda-step-functions/README.md | 25 + .../lambda-step-functions/package.json | 24 + .../lambda-step-functions/setup.yaml | 205 + .../src/lambda1/getid.js | 28 + .../src/lambda2/additem.js | 72 + .../src/lambda3/sendemail.js | 70 + .../src/libs/dynamoClient.js | 25 + .../src/libs/sesClient.js | 24 + .../transcription-app/README.md | 25 + .../transcription-app/package.json | 41 + .../transcription-app/setup.yaml | 377 + .../transcription-app/src/helper.js | 89 + .../transcription-app/src/index.html | 55 + .../transcription-app/src/index.js | 283 + .../transcription-app/src/recorder.css | 66 + .../transcription-app/src/recorder.js | 69 + .../cdk.json | 10 + .../package-lock.json | 18523 ++++++++++++++++ .../package.json | 29 + .../setup.ts | 212 + .../tsconfig.json | 23 + .../cdk/lambda_api_step_functions/cdk.json | 10 + .../lambda_api_step_functions/package.json | 30 + .../cdk/lambda_api_step_functions/setup.ts | 143 + .../lambda_api_step_functions/tsconfig.json | 23 + 28 files changed, 20540 insertions(+) create mode 100644 .doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml create mode 100644 .doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml create mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/README.md create mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/package.json create mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml create mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js create mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js create mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js create mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js create mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js create mode 100644 javascriptv3/example_code/cross-services/transcription-app/README.md create mode 100644 javascriptv3/example_code/cross-services/transcription-app/package.json create mode 100644 javascriptv3/example_code/cross-services/transcription-app/setup.yaml create mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/helper.js create mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/index.html create mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/index.js create mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/recorder.css create mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/recorder.js create mode 100644 resources/cdk/javascript_example_code_transcribe_demo/cdk.json create mode 100644 resources/cdk/javascript_example_code_transcribe_demo/package-lock.json create mode 100644 resources/cdk/javascript_example_code_transcribe_demo/package.json create mode 100644 resources/cdk/javascript_example_code_transcribe_demo/setup.ts create mode 100644 resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json create mode 100644 resources/cdk/lambda_api_step_functions/cdk.json create mode 100644 resources/cdk/lambda_api_step_functions/package.json create mode 100644 resources/cdk/lambda_api_step_functions/setup.ts create mode 100644 resources/cdk/lambda_api_step_functions/tsconfig.json diff --git a/.doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml b/.doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml new file mode 100644 index 00000000000..5869e6b626a --- /dev/null +++ b/.doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml @@ -0,0 +1,21 @@ + + + %phrases-shared; +]> + + + Shows how to create an &AWS; serverless workflow by using &SFNlong; and the &JSBlong;. + Each workflow step is implemented using an &LAMlong; function. + + &LAM; is a compute service that enables you to run code without provisioning or managing servers. + &SFN; is a serverless orchestration service that lets you combine &LAM; functions and other &AWS; + services to build business-critical applications. + + + For complete source code and instructions on how to set up and run, see the full example on + GitHub. + + This example is also available in the + &JSBlong; v3 developer guide. + \ No newline at end of file diff --git a/.doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml b/.doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml new file mode 100644 index 00000000000..19ec9bc0f77 --- /dev/null +++ b/.doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml @@ -0,0 +1,19 @@ + + + %phrases-shared; +]> + + + Create an app that uses &TSClong; to transcribe and display voice recordings in the browser. The app uses + two &S3long; (&S3;) buckets, one to host the application code, and another to store transcriptions. The app uses + an &COGlong; user pool to authenticate your users. Authenticated users have &IAMlong; (&IAM;) permissions to + access the required &AWS; services. + + + For complete source code and instructions on how to set up and run, see the full example on + GitHub. + + This example is also available in the + &JSBlong; v3 developer guide. + diff --git a/.doc_gen/metadata/cross_metadata.yaml b/.doc_gen/metadata/cross_metadata.yaml index 44f8c0360a8..42754363502 100644 --- a/.doc_gen/metadata/cross_metadata.yaml +++ b/.doc_gen/metadata/cross_metadata.yaml @@ -426,12 +426,31 @@ cross_ServerlessWorkflows: versions: - sdk_version: 2 block_content: cross_ServerlessWorkflows_Java_block.xml + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/cross-services/lambda-step-functions + block_content: cross_ServerlessWorkflows_JavaScript_block.xml service_main: sfn services: dynamodb: lambda: ses: sfn: +cross_TranscriptionApp: + title: Build an &TSC; app + title_abbrev: Build an &TSC; app + synopsis: use &TSClong; to transcribe and display voice recordings in the browser. + languages: + JavaScript: + versions: + - sdk_version: 3 + block_content: cross_TranscriptionApp_JavaScript_block.xml + service_main: transcribe + services: + cognito-identity: + s3: + transcribe: cross_TranscriptionStreamingApp: title: Build an &TSC; streaming app title_abbrev: Build an &TSC; streaming app diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/README.md b/javascriptv3/example_code/cross-services/lambda-step-functions/README.md new file mode 100644 index 00000000000..8319df67117 --- /dev/null +++ b/javascriptv3/example_code/cross-services/lambda-step-functions/README.md @@ -0,0 +1,25 @@ +# JavaScript environment for tutorial to create an AWS serverless workflow using AWS SDK for JavaScript and AWS Step Functions + +This is a workspace where you can find an AWS SDK for JavaScript version 3 (v3) tutorial that demonstrates how to +create AWS serverless workflows using AWS Step Functions. + +For instructions on implementing this example, see [Creating AWS serverless workflows using AWS SDK for JavaScript](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-step-functions-example.html) in the _AWS SDK for JavaScript v3 Developer Guide_. + +# Getting started + +1. Clone the [AWS Code Examples Repository](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. + See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for + instructions. + +1. Install the dependencies listed in the [root]/javascriptv3/example_code/cross-services/lambda-step-functions/package.json. + +**Note**: These include the AWS SDK for JavaScript v3 client modules for the AWS services required in this example, +which include _@aws-sdk/client-dynamodb_ and _@aws-sdk/client-ses_. + +They also include third-party Node.js modules, including webpack. + +``` +npm install node -g +cd javascriptv3/example_code/cross-services/lambda-step-functions +npm install +``` diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/package.json b/javascriptv3/example_code/cross-services/lambda-step-functions/package.json new file mode 100644 index 00000000000..43d46da3fd2 --- /dev/null +++ b/javascriptv3/example_code/cross-services/lambda-step-functions/package.json @@ -0,0 +1,24 @@ +{ + "name": "@aws-doc-sdk-examples/lambda-api-gateway-example", + "version": "1.0.0", + "description": "Using the AWS SDK for JavaScript V3 to build and deploy Lambda functions on API Gateway.", + "main": "index.js", + "repository": "git@github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/iam.git", + "author": "brmur", + "license": "Apache 2.0", + "scripts": { + "build-lambda-1": "webpack getid.js --mode development --target node --devtool false --output-library-target umd -o index.js", + "build-lambda-2": "webpack additem.js --mode development --target node --devtool false --output-library-target umd -o index.js", + "build-lambda-3": "webpack sendemail.js --mode development --target node --devtool false --output-library-target umd -o index.js", + "build-cdk": "aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM", + "test": "exit 0" + }, + "dependencies": { + "@aws-sdk/client-dynamodb": "^3.32.0", + "@aws-sdk/client-ses": "^3.7.0" + }, + "devDependencies": { + "webpack": "^4.42.0", + "webpack-cli": "^3.3.11" + } +} diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml b/javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml new file mode 100644 index 00000000000..854a3543338 --- /dev/null +++ b/javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml @@ -0,0 +1,205 @@ +Resources: + ExampleIdentityPool: + Type: AWS::Cognito::IdentityPool + Properties: + AllowUnauthenticatedIdentities: true + Metadata: + aws:cdk:path: stepfunctions/ExampleIdentityPool + LambdaRole3A44B857: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRoleWithWebIdentity + Condition: + StringEquals: + cognito-identity.amazonaws.com:aud: + Ref: ExampleIdentityPool + ForAnyValue:StringLike: + cognito-identity.amazonaws.com:amr: unauthenticated + Effect: Allow + Principal: + Federated: cognito-identity.amazonaws.com + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: lambda.amazonaws.com + Version: "2012-10-17" + Metadata: + aws:cdk:path: stepfunctions/LambdaRole/Resource + LambdaRoleDefaultPolicy75625A82: + Type: AWS::IAM::Policy + Properties: + PolicyDocument: + Statement: + - Action: + - lambda:InvokeFunction + - mobileanalytics:PutEvents + - cognito-sync:* + Effect: Allow + Resource: "*" + - Action: dynamodb:* + Effect: Allow + Resource: "*" + - Action: ses:* + Effect: Allow + Resource: "*" + Version: "2012-10-17" + PolicyName: LambdaRoleDefaultPolicy75625A82 + Roles: + - Ref: LambdaRole3A44B857 + Metadata: + aws:cdk:path: stepfunctions/LambdaRole/DefaultPolicy/Resource + DefaultValid: + Type: AWS::Cognito::IdentityPoolRoleAttachment + Properties: + IdentityPoolId: + Ref: ExampleIdentityPool + Roles: + unauthenticated: + Fn::GetAtt: + - LambdaRole3A44B857 + - Arn + Metadata: + aws:cdk:path: stepfunctions/DefaultValid + ExampleIdentityPoolWorkflow: + Type: AWS::Cognito::IdentityPool + Properties: + AllowUnauthenticatedIdentities: true + Metadata: + aws:cdk:path: stepfunctions/ExampleIdentityPoolWorkflow + WorkflowRole21EC4257: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRoleWithWebIdentity + Condition: + StringEquals: + cognito-identity.amazonaws.com:aud: + Ref: ExampleIdentityPoolWorkflow + ForAnyValue:StringLike: + cognito-identity.amazonaws.com:amr: unauthenticated + Effect: Allow + Principal: + Federated: cognito-identity.amazonaws.com + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: + Fn::Join: + - "" + - - states. + - Ref: AWS::Region + - .amazonaws.com + Version: "2012-10-17" + Metadata: + aws:cdk:path: stepfunctions/WorkflowRole/Resource + WorkflowRoleDefaultPolicyB4C63B85: + Type: AWS::IAM::Policy + Properties: + PolicyDocument: + Statement: + - Action: + - lambda:InvokeFunction + - mobileanalytics:PutEvents + - cognito-sync:* + Effect: Allow + Resource: "*" + Version: "2012-10-17" + PolicyName: WorkflowRoleDefaultPolicyB4C63B85 + Roles: + - Ref: WorkflowRole21EC4257 + Metadata: + aws:cdk:path: stepfunctions/WorkflowRole/DefaultPolicy/Resource + DefaultValidWorkflow: + Type: AWS::Cognito::IdentityPoolRoleAttachment + Properties: + IdentityPoolId: + Ref: ExampleIdentityPoolWorkflow + Roles: + unauthenticated: + Fn::GetAtt: + - WorkflowRole21EC4257 + - Arn + Metadata: + aws:cdk:path: stepfunctions/DefaultValidWorkflow + CDKMetadata: + Type: AWS::CDK::Metadata + Properties: + Modules: aws-cdk=1.109.0,@aws-cdk/assets=1.84.0,@aws-cdk/aws-applicationautoscaling=1.84.0,@aws-cdk/aws-autoscaling-common=1.84.0,@aws-cdk/aws-cloudwatch=1.84.0,@aws-cdk/aws-codeguruprofiler=1.84.0,@aws-cdk/aws-cognito=1.84.0,@aws-cdk/aws-ec2=1.84.0,@aws-cdk/aws-ecr=1.84.0,@aws-cdk/aws-ecr-assets=1.84.0,@aws-cdk/aws-events=1.84.0,@aws-cdk/aws-iam=1.84.0,@aws-cdk/aws-kms=1.84.0,@aws-cdk/aws-lambda=1.84.0,@aws-cdk/aws-logs=1.84.0,@aws-cdk/aws-s3=1.84.0,@aws-cdk/aws-s3-assets=1.84.0,@aws-cdk/aws-sqs=1.84.0,@aws-cdk/aws-ssm=1.84.0,@aws-cdk/cloud-assembly-schema=1.84.0,@aws-cdk/core=1.84.0,@aws-cdk/custom-resources=1.84.0,@aws-cdk/cx-api=1.84.0,@aws-cdk/region-info=1.84.0,jsii-runtime=node.js/v14.7.0 + Metadata: + aws:cdk:path: stepfunctions/CDKMetadata/Default + Condition: CDKMetadataAvailable +Outputs: + Lambdasupportrole: + Value: + Ref: LambdaRole3A44B857 + Workflowsupportrole: + Value: + Ref: WorkflowRole21EC4257 +Conditions: + CDKMetadataAvailable: + Fn::Or: + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - ap-east-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ap-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ca-central-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-north-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-northwest-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-central-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - eu-north-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-2 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-3 + - Fn::Equals: + - Ref: AWS::Region + - me-south-1 + - Fn::Equals: + - Ref: AWS::Region + - sa-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-2 + - Fn::Equals: + - Ref: AWS::Region + - us-west-1 + - Fn::Equals: + - Ref: AWS::Region + - us-west-2 diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js new file mode 100644 index 00000000000..4d431497495 --- /dev/null +++ b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js @@ -0,0 +1,28 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/* +ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), +which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-workflows-using-step-functions.html. + +Purpose: +getid.js is part of a tutorial demonstrates how to create an AWS serverless workflow by using the AWS SDK for JavaScript (v3) +and AWS Step Functions. + +*/ + +// snippet-start:[lambda.JavaScript.lambda-step-functions.getid] + +exports.handler = async (event) => { + // Create a support case using the input as the case ID, then return a confirmation message + try { + const myCaseID = event.inputCaseID; + var myMessage = "Case " + myCaseID + ": opened..."; + var result = { Case: myCaseID, Message: myMessage }; + console.log(result); + } catch (err) { + console.log("Error", err); + } +}; +// snippet-end:[lambda.JavaScript.lambda-step-functions.getid] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js new file mode 100644 index 00000000000..d5267e6e6dd --- /dev/null +++ b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js @@ -0,0 +1,72 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/* +ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), +which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-workflows-using-step-functions.html. + +Purpose: +additem.js is part of a tutorial demonstrates how to create an AWS serverless workflow by using the AWS SDK for JavaScript (v3) +and AWS Step Functions. + +Inputs: +- RECEIVER_EMAIL_ADDRESS: A valid Amazon Simple Notification Services (Amazon SNS) email address. + +*/ +// snippet-start:[lambda.JavaScript.lambda-step-functions.additem] + +"use strict"; +// Load the required clients and commands. +const { PutItemCommand } = require ( "@aws-sdk/client-dynamodb" ); +const { dynamoClient } = require ( "../libs/dynamoClient" ); + +exports.handler = async (event) => { + try { + // Helper function to send message using Amazon SNS. + const val = event; + //PersistCase adds an item to a DynamoDB table + const tmp = Math.random() <= 0.5 ? 1 : 2; + console.log(tmp); + if (tmp == 1) { + const params = { + TableName: "Case", + Item: { + id: { N: val.Case }, + empEmail: { S: "brmur@amazon.com" }, + name: { S: "Tom Blue" }, + }, + }; + console.log("adding item for tom"); + try { + const data = await dynamoClient.send(new PutItemCommand(params)); + console.log(data); + } catch (err) { + console.error(err); + } + var result = { Email: params.Item.empEmail }; + return result; + } else { + const params = { + TableName: "Case", + Item: { + id: { N: val.Case }, + empEmail: { S: "RECEIVER_EMAIL_ADDRESS" }, // Valid Amazon Simple Notification Services (Amazon SNS) email address. + name: { S: "Sarah White" }, + }, + }; + console.log("adding item for sarah"); + try { + const data = await dynamoClient.send(new PutItemCommand(params)); + console.log(data); + } catch (err) { + console.error(err); + } + return params.Item.empEmail; + var result = { Email: params.Item.empEmail }; + } + } catch (err) { + console.log("Error", err); + } +}; +// snippet-end:[lambda.JavaScript.lambda-step-functions.additem] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js new file mode 100644 index 00000000000..62aa3c2e1c4 --- /dev/null +++ b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js @@ -0,0 +1,70 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/* +ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), +which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-workflows-using-step-functions.html. + +Purpose: +sendemail.js is part of a tutorial demonstrates how to create an AWS serverless workflow by using the AWS SDK for JavaScript (v3) +and AWS Step Functions. + +*/ +// snippet-start:[lambda.JavaScript.lambda-step-functions.sendemail] + +// Load the required clients and commands. +const { SendEmailCommand } = require ( "@aws-sdk/client-ses" ); +const { sesClient } = require ( "../libs/sesClient" ); + +exports.handler = async (event) => { + // Enter a sender email address. This address must be verified. + const senderEmail = "SENDER_EMAIL" + const sender = "Sender Name <" + senderEmail + ">"; + + // AWS Step Functions passes the employee's email to the event. + // This address must be verified. + const recepient = event.S; + + // The subject line for the email. + const subject = "New case"; + + // The email body for recipients with non-HTML email clients. + const body_text = + "Hello,\r\n" + "Please check the database for new ticket assigned to you."; + + // The HTML body of the email. + const body_html = `

Hello!

Please check the database for new ticket assigned to you.

`; + + // The character encoding for the email. + const charset = "UTF-8"; + var params = { + Source: sender, + Destination: { + ToAddresses: [recepient], + }, + Message: { + Subject: { + Data: subject, + Charset: charset, + }, + Body: { + Text: { + Data: body_text, + Charset: charset, + }, + Html: { + Data: body_html, + Charset: charset, + }, + }, + }, + }; + try { + const data = await sesClient.send(new SendEmailCommand(params)); + console.log(data); + } catch (err) { + console.error(err); + } +}; +// snippet-end:[lambda.JavaScript.lambda-step-functions.sendemail] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js new file mode 100644 index 00000000000..bba165579ce --- /dev/null +++ b/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js @@ -0,0 +1,25 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/* +ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), +which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-step-functions-example.html. + +Purpose: +dynamoClient.js is a helper function that creates an Amazon DynamoDB service client. + +Inputs (replace in code): +-REGION + +*/ +// snippet-start:[dynamodb.JavaScript.step-functions.createclientv3] + +const { DynamoDBClient } = require ( "@aws-sdk/client-dynamodb" ); +// Set the AWS Region. +const REGION = "REGION"; //e.g. "us-east-1" +// Create an Amazon DynamoDB service client object. +const dynamoClient = new DynamoDBClient({ region: REGION }); + +module.exports = { dynamoClient }; +// snippet-end:[dynamodb.JavaScript.step-functions.createclientv3] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js new file mode 100644 index 00000000000..cfc7f5d4db2 --- /dev/null +++ b/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js @@ -0,0 +1,24 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/* +ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), +which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-step-functions-example.html. + +Purpose: +sesClient.js is a helper function that creates an Amazon Simple Email Service (Amazon SES) service client. + +Inputs (replace in code): +-REGION + +*/ +// snippet-start:[ses.JavaScript.step-functions.createclientv3] + +const { SESClient } = require ( "@aws-sdk/client-ses" ); +// Set the AWS Region. +const REGION = "REGION"; //e.g. "us-east-1" +// Create an Amazon SNS service client object. +const sesClient = new SESClient({ region: REGION }); +module.exports = { sesClient }; +// snippet-end:[ses.JavaScript.step-functions.createclientv3] diff --git a/javascriptv3/example_code/cross-services/transcription-app/README.md b/javascriptv3/example_code/cross-services/transcription-app/README.md new file mode 100644 index 00000000000..00c142558aa --- /dev/null +++ b/javascriptv3/example_code/cross-services/transcription-app/README.md @@ -0,0 +1,25 @@ +# JavaScript environment for the Transcription App tutorial + +This is a workspace where you can find the following AWS SDK for JavaScript version 3 (v3) 'Transcription app' tutorial. + +For instructions on implementing this example, see [Build a transcription app with authenticated users](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html) in the +_AWS SDK for JavaScript v3 Developer Guide_. + +# Getting started + +1. Clone the [AWS Code Examples Repository](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. + See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for + instructions. + +1. Install the dependencies listed in the [root]/javascriptv3/example_code/cross-services/transcription-app/package.json. + +**Note**: These include the AWS SDK for JavaScript v3 client modules for the AWS services required in this example, +which are _@aws-sdk/client-iam_, _@aws-sdk/client-cognito-identity_, _@aws-sdk/credential-provider-cognito-identity_, _@aws-sdk/s3-request-presigner_, +_@aws-sdk/client-dynamodb_, _@aws-sdk/util-create-request_, _@aws-sdk/util-format-url_, _@aws-sdk/client-transcribe_ and _@aws-sdk/client-s3_. +They also include third-party Node.js modules, path, node-fetch, and webpack. + +``` +npm install node -g +cd javascriptv3/example_code/cross-services/transcription-app +npm install +``` diff --git a/javascriptv3/example_code/cross-services/transcription-app/package.json b/javascriptv3/example_code/cross-services/transcription-app/package.json new file mode 100644 index 00000000000..a49002b2b89 --- /dev/null +++ b/javascriptv3/example_code/cross-services/transcription-app/package.json @@ -0,0 +1,41 @@ +{ + "name": "@aws-doc-sdk-examples/recording-app", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build:frontend": "webpack index.js --mode development --target web --devtool false -o main.js", + "test": "exit 0" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "json-loader": "^0.5.7", + "raw-loader": "^4.0.2", + "webpack": "^4.42.0", + "webpack-cli": "^3.3.11" + }, + "dependencies": { + "@aws-sdk/client-cognito-identity": "^3.32.0", + "@aws-sdk/client-iam": "^3.32.0", + "@aws-sdk/client-s3": "^3.32.0", + "@aws-sdk/client-transcribe": "^3.32.0", + "@aws-sdk/credential-provider-cognito-identity": "^3.32.0", + "@aws-sdk/s3-request-presigner": "^3.32.0", + "@aws-sdk/util-create-request": "^3.32.0", + "@aws-sdk/util-format-url": "^3.32.0", + "aws-sdk": "^2.793.0", + "babel-cli": "6.24.1", + "babel-core": "6.25.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-preset-env": "1.5.2", + "babel-preset-react": "6.24.1", + "fetch": "^1.1.0", + "file-system": "^2.2.2", + "node-fetch": "^2.6.1", + "stream": "0.0.2", + "stream-to-string": "^1.2.0", + "ts-node": "^9.0.0" + } +} diff --git a/javascriptv3/example_code/cross-services/transcription-app/setup.yaml b/javascriptv3/example_code/cross-services/transcription-app/setup.yaml new file mode 100644 index 00000000000..9b4b539eba1 --- /dev/null +++ b/javascriptv3/example_code/cross-services/transcription-app/setup.yaml @@ -0,0 +1,377 @@ +Resources: + transcriptionsB38FCF73: + Type: AWS::S3::Bucket + Properties: + AccessControl: PublicRead + CorsConfiguration: + CorsRules: + - AllowedHeaders: + - "*" + AllowedMethods: + - GET + - POST + - PUT + - DELETE + AllowedOrigins: + - "*" + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + Metadata: + aws:cdk:path: SetupStack/transcriptions/Resource + transcriptionsPolicy3F622C3C: + Type: AWS::S3::BucketPolicy + Properties: + Bucket: + Ref: transcriptionsB38FCF73 + PolicyDocument: + Statement: + - Action: s3:* + Condition: + Bool: + aws:SecureTransport: "false" + Effect: Deny + Principal: + AWS: "*" + Resource: + - Fn::GetAtt: + - transcriptionsB38FCF73 + - Arn + - Fn::Join: + - "" + - - Fn::GetAtt: + - transcriptionsB38FCF73 + - Arn + - /* + - Action: s3:GetObject + Effect: Allow + Principal: + AWS: "*" + Resource: + Fn::Join: + - "" + - - Fn::GetAtt: + - transcriptionsB38FCF73 + - Arn + - /* + - Action: "*" + Effect: Allow + Principal: + AWS: + Fn::Join: + - "" + - - "arn:" + - Ref: AWS::Partition + - ":iam::" + - Ref: AWS::AccountId + - :root + Resource: + Fn::Join: + - "" + - - Fn::GetAtt: + - transcriptionsB38FCF73 + - Arn + - /* + - Action: s3:PutObject + Effect: Allow + Principal: + AWS: "*" + Resource: + Fn::Join: + - "" + - - Fn::GetAtt: + - transcriptionsB38FCF73 + - Arn + - /* + - Action: s3:DeleteObject + Effect: Allow + Principal: + AWS: "*" + Resource: + Fn::Join: + - "" + - - Fn::GetAtt: + - transcriptionsB38FCF73 + - Arn + - /* + Version: "2012-10-17" + Metadata: + aws:cdk:path: SetupStack/transcriptions/Policy/Resource + appbucket8B6BC946: + Type: AWS::S3::Bucket + Properties: + PublicAccessBlockConfiguration: + BlockPublicAcls: true + BlockPublicPolicy: false + IgnorePublicAcls: true + RestrictPublicBuckets: false + WebsiteConfiguration: + ErrorDocument: index.html + IndexDocument: index.html + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + Metadata: + aws:cdk:path: SetupStack/appbucket/Resource + appbucketPolicy820C1410: + Type: AWS::S3::BucketPolicy + Properties: + Bucket: + Ref: appbucket8B6BC946 + PolicyDocument: + Statement: + - Action: s3:* + Condition: + Bool: + aws:SecureTransport: "false" + Effect: Deny + Principal: + AWS: "*" + Resource: + - Fn::GetAtt: + - appbucket8B6BC946 + - Arn + - Fn::Join: + - "" + - - Fn::GetAtt: + - appbucket8B6BC946 + - Arn + - /* + - Action: s3:GetObject + Effect: Allow + Principal: + AWS: "*" + Resource: + Fn::Join: + - "" + - - Fn::GetAtt: + - appbucket8B6BC946 + - Arn + - /* + - Action: s3:PutObject + Effect: Allow + Principal: + AWS: "*" + Resource: + Fn::Join: + - "" + - - Fn::GetAtt: + - appbucket8B6BC946 + - Arn + - /* + Version: "2012-10-17" + Metadata: + aws:cdk:path: SetupStack/appbucket/Policy/Resource + exampleuserpoolid164CBD80: + Type: AWS::Cognito::UserPool + Properties: + AccountRecoverySetting: + RecoveryMechanisms: + - Name: verified_phone_number + Priority: 1 + - Name: verified_email + Priority: 2 + AdminCreateUserConfig: + AllowAdminCreateUserOnly: false + AutoVerifiedAttributes: + - email + EmailVerificationMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} + EmailVerificationSubject: Verify your email for our awesome app! + Schema: + - Mutable: false + Name: email + Required: true + SmsVerificationMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} + UserPoolName: ExampleUserPoolName-3962209636 + VerificationMessageTemplate: + DefaultEmailOption: CONFIRM_WITH_CODE + EmailMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} + EmailSubject: Verify your email for our awesome app! + SmsMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} + UpdateReplacePolicy: Retain + DeletionPolicy: Retain + Metadata: + aws:cdk:path: SetupStack/exampleuserpoolid/Resource + exampleuserpoolidCognitoDomain6126F7CC: + Type: AWS::Cognito::UserPoolDomain + Properties: + Domain: exampleuserpoolname-9212204094 + UserPoolId: + Ref: exampleuserpoolid164CBD80 + Metadata: + aws:cdk:path: SetupStack/exampleuserpoolid/CognitoDomain/Resource + ExampleUserPoolClientA3BAC0B9: + Type: AWS::Cognito::UserPoolClient + Properties: + UserPoolId: + Ref: exampleuserpoolid164CBD80 + AllowedOAuthFlows: + - implicit + - code + AllowedOAuthFlowsUserPoolClient: true + AllowedOAuthScopes: + - profile + - phone + - email + - openid + - aws.cognito.signin.user.admin + CallbackURLs: + - Fn::Join: + - "" + - - https://s3. + - Ref: AWS::Region + - "." + - Ref: AWS::URLSuffix + - / + - Ref: appbucket8B6BC946 + - /index.html + ClientName: ExampleUserPoolName-1269134866 + SupportedIdentityProviders: + - COGNITO + Metadata: + aws:cdk:path: SetupStack/ExampleUserPoolClient/Resource + ExampleIdentityPool: + Type: AWS::Cognito::IdentityPool + Properties: + AllowUnauthenticatedIdentities: false + CognitoIdentityProviders: + - ClientId: + Ref: ExampleUserPoolClientA3BAC0B9 + ProviderName: + Fn::GetAtt: + - exampleuserpoolid164CBD80 + - ProviderName + Metadata: + aws:cdk:path: SetupStack/ExampleIdentityPool + ExampleCognitoDefaultAuthenticatedRole37F17AF0: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRoleWithWebIdentity + Condition: + StringEquals: + cognito-identity.amazonaws.com:aud: + Ref: ExampleIdentityPool + ForAnyValue:StringLike: + cognito-identity.amazonaws.com:amr: authenticated + Effect: Allow + Principal: + Federated: cognito-identity.amazonaws.com + Version: "2012-10-17" + Metadata: + aws:cdk:path: SetupStack/ExampleCognitoDefaultAuthenticatedRole/Resource + ExampleCognitoDefaultAuthenticatedRoleDefaultPolicy7CE891FB: + Type: AWS::IAM::Policy + Properties: + PolicyDocument: + Statement: + - Action: + - mobileanalytics:PutEvents + - cognito-sync:* + - cognito-identity:* + Effect: Allow + Resource: "*" + - Action: sns:* + Effect: Allow + Resource: "*" + - Action: + - transcribe:StartTranscriptionJob + - transcribe:GetTranscriptionJob + Effect: Allow + Resource: "*" + Version: "2012-10-17" + PolicyName: ExampleCognitoDefaultAuthenticatedRoleDefaultPolicy7CE891FB + Roles: + - Ref: ExampleCognitoDefaultAuthenticatedRole37F17AF0 + Metadata: + aws:cdk:path: SetupStack/ExampleCognitoDefaultAuthenticatedRole/DefaultPolicy/Resource + DefaultValid: + Type: AWS::Cognito::IdentityPoolRoleAttachment + Properties: + IdentityPoolId: + Ref: ExampleIdentityPool + Roles: + authenticated: + Fn::GetAtt: + - ExampleCognitoDefaultAuthenticatedRole37F17AF0 + - Arn + Metadata: + aws:cdk:path: SetupStack/DefaultValid + CDKMetadata: + Type: AWS::CDK::Metadata + Properties: + Analytics: v2:deflate64:H4sIAAAAAAAA/01POw7CMAw9C3swLTAwAmVhQ0UcoEoNmLaxlKQgFOXuJP3QTu/j5yc7hXWyhWSxLz5mKctq5SRrBHe1haxExspY3UorsrvK0XCrJUYeBiVZYuVFXHRmA+7Yygq75MB6uHBN8jvZvfZC8kORZXA3g/rCXMfIn4/kxE1Baj4anFFmNaGy88DknMtAyH7H9rnOucaDDV8+m2B6QUUDLprdqxGnw4eTvReKS4SXWb3THaRrSBcvQ7TUbahtEPIef4oL19tUAQAA + Metadata: + aws:cdk:path: SetupStack/CDKMetadata/Default + Condition: CDKMetadataAvailable +Conditions: + CDKMetadataAvailable: + Fn::Or: + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - af-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-east-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ap-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ca-central-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-north-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-northwest-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - eu-central-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-north-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-south-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-2 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-3 + - Fn::Equals: + - Ref: AWS::Region + - me-south-1 + - Fn::Equals: + - Ref: AWS::Region + - sa-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-2 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - us-west-1 + - Fn::Equals: + - Ref: AWS::Region + - us-west-2 diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/helper.js b/javascriptv3/example_code/cross-services/transcription-app/src/helper.js new file mode 100644 index 00000000000..f9ddd5a7eeb --- /dev/null +++ b/javascriptv3/example_code/cross-services/transcription-app/src/helper.js @@ -0,0 +1,89 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/* +ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), +which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. + +Purpose: +helper.js is part of a tutorial demonstrating how to build and deploy an app that transcribes and displays +voice recordings for authenticated users. To run the full tutorial, see +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. + +Running the code: +For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. + +*/ +// This file contains vanilla JavaScript helper functions for user interface. + +// snippet-start:[transcribe.JavaScript.recording-app.helper] + +window.downloadInnerHtml = function (filename, elId, mimeType) { + var elHtml = document.getElementById(elId).innerHTML; + var link = document.createElement("a"); + mimeType = mimeType || "text/plain"; + link.setAttribute("download", filename); + link.setAttribute( + "href", + "data:" + mimeType + ";charset=utf-8," + encodeURIComponent(elHtml) + ); + link.click(); +}; + +// Delete a row from the user interface. +window.deleteRow = function (rowid) { + const row = document.getElementById(rowid); + row.parentNode.removeChild(row); +}; + +// Display transcription details on user interface. +window.displayTranscriptionDetails = function ( + i, + outputJSONTime, + jobName, + outputJSON +) { + var table = document.getElementById("myTable"); + var row = table.insertRow(1); + var cell1 = row.insertCell(0); + var cell2 = row.insertCell(1); + var cell3 = row.insertCell(2); + var cell4 = row.insertCell(3); + cell1.innerHTML = "

"; + cell2.innerHTML = "

"; + cell3.innerHTML = ""; + cell4.innerHTML = ""; + document.getElementById(i).innerHTML = outputJSON; + row.setAttribute("id", "row" + i); + document + .getElementById("download") + .setAttribute( + "onclick", + "downloadInnerHtml('output.txt','" + i + "','text')" + ); + document.getElementById("dateTime").innerHTML = outputJSONTime; + document + .getElementById("delete") + .setAttribute( + "onclick", + "deleteRow(" + "'" + "row" + i + "'); deleteJSON(" + "'" + jobName + "')" + ); +}; + +// Strips the token ID from the app URL after authentication. +window.getToken = function () { + var idtoken = window.location.href; + var idtoken1 = idtoken.split("=")[1]; + var idtoken2 = idtoken1.split("&")[0]; + var idtoken3 = idtoken2.split("&")[0]; + return idtoken3; +}; + +window.getAccessToken = function () { + var accesstoken = window.location.href; + var accesstoken1 = accesstoken.split("=")[2]; + var accesstoken2 = accesstoken1.split("&")[0]; + return accesstoken2; +}; +// snippet-end:[transcribe.JavaScript.recording-app.helper] diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/index.html b/javascriptv3/example_code/cross-services/transcription-app/src/index.html new file mode 100644 index 00000000000..97ca500615c --- /dev/null +++ b/javascriptv3/example_code/cross-services/transcription-app/src/index.html @@ -0,0 +1,55 @@ + + + + + + + + title + + + + +

Record

+

+ + +

+ + +

+ +

+ +

My transcriptions

+
+ + + + + + + +
Time createdTransciptionDownloadDelete
+ + + + + diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/index.js b/javascriptv3/example_code/cross-services/transcription-app/src/index.js new file mode 100644 index 00000000000..e16bb76f2c5 --- /dev/null +++ b/javascriptv3/example_code/cross-services/transcription-app/src/index.js @@ -0,0 +1,283 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/* +ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), +which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. + +Purpose: +index.js is part of a tutorial demonstrating how to build and deploy an app that transcribes and displays +voice recordings for authenticated users. To run the full tutorial, see +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. + +Inputs (replace in code): +- COGNITO_ID +- ID_TOKEN +- BUCKET +- REGION +- IDENTITY_POOL_ID + +Running the code: +For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. + +[Outputs | Returns]: + +*/ +// snippet-start:[transcribe.JavaScript.recording-app.config] +// Import the required AWS SDK clients and commands for Node.js +import "./helper.js"; +import "./recorder.js"; +import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; +import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; +import { + CognitoIdentityProviderClient, + GetUserCommand, +} from "@aws-sdk/client-cognito-identity-provider"; +import { S3RequestPresigner } from "@aws-sdk/s3-request-presigner"; +import { createRequest } from "@aws-sdk/util-create-request"; +import { formatUrl } from "@aws-sdk/util-format-url"; +import { + TranscribeClient, + StartTranscriptionJobCommand, +} from "@aws-sdk/client-transcribe"; +import { + S3Client, + PutObjectCommand, + GetObjectCommand, + ListObjectsCommand, + DeleteObjectCommand, +} from "@aws-sdk/client-s3"; +import fetch from "node-fetch"; + +// Set the parameters. +// 'COGINTO_ID' has the format 'cognito-idp.eu-west-1.amazonaws.com/COGNITO_ID'. +let COGNITO_ID = "COGNITO_ID"; +// Get the Amazon Cognito ID token for the user. 'getToken()' is in 'helper.js'. +let idToken = getToken(); +let loginData = { + [COGNITO_ID]: idToken, +}; + +const params = { + Bucket: "BUCKET", // The Amazon Simple Storage Solution (S3) bucket to store the transcriptions. + Region: "REGION", // The AWS Region + identityPoolID: "IDENTITY_POOL_ID", // Amazon Cognito Identity Pool ID. +}; + +// Create an Amazon Transcribe service client object. +const client = new TranscribeClient({ + region: params.Region, + credentials: fromCognitoIdentityPool({ + client: new CognitoIdentityClient({ region: params.Region }), + identityPoolId: params.identityPoolID, + logins: loginData, + }), +}); + +// Create an Amazon S3 client object. +const s3Client = new S3Client({ + region: params.Region, + credentials: fromCognitoIdentityPool({ + client: new CognitoIdentityClient({ region: params.Region }), + identityPoolId: params.identityPoolID, + logins: loginData, + }), +}); +// snippet-end:[transcribe.JavaScript.recording-app.config] +// snippet-start:[transcribe.JavaScript.recording-app.onload] +window.onload = async () => { + // Set the parameters. + const userParams = { + // Get the access token. 'GetAccessToken()' is in 'helper.js'. + AccessToken: getAccessToken(), + }; + // Create a CognitoIdentityProviderClient client object. + const client = new CognitoIdentityProviderClient({ region: params.Region }); + try { + const data = await client.send(new GetUserCommand(userParams)); + const username = data.Username; + // Export username for use in 'recorder.js'. + exports.username = username; + try { + // If this is user's first sign-in, create a folder with user's name in Amazon S3 bucket. + // Otherwise, no effect. + const Key = `${username}/`; + try { + const data = await s3Client.send( + new PutObjectCommand({ Key: Key, Bucket: params.Bucket }) + ); + console.log("Folder created for user ", data.Username); + } catch (err) { + console.log("Error", err); + } + try { + // Get a list of the objects in the Amazon S3 bucket. + const data = await s3Client.send( + new ListObjectsCommand({ Bucket: params.Bucket, Prefix: username }) + ); + // Create a variable for the list of objects in the Amazon S3 bucket. + const output = data.Contents; + // Loop through the objects, populating a row on the user interface for each object. + for (var i = 0; i < output.length; i++) { + var obj = output[i]; + const objectParams = { + Bucket: params.Bucket, + Key: obj.Key, + }; + // Get the name of the object from the Amazon S3 bucket. + const data = await s3Client.send(new GetObjectCommand(objectParams)); + // Extract the body contents, a readable stream, from the returned data. + const result = data.Body; + // Create a variable for the string version of the readable stream. + let stringResult = ""; + // Use 'yieldUnit8Chunks' to convert the readable streams into JSON. + for await (let chunk of yieldUint8Chunks(result)) { + stringResult += String.fromCharCode.apply(null, chunk); + } + // The setTimeout function waits while readable stream is converted into JSON. + setTimeout(function () { + // Parse JSON into human readable transcript, which will be displayed on user interface (UI). + const outputJSON = + JSON.parse(stringResult).results.transcripts[0].transcript; + // Create name for transcript, which will be displayed. + const outputJSONTime = JSON.parse(stringResult) + .jobName.split("/")[0] + .replace("-job", ""); + i++; + // + // Display the details for the transcription on the UI. + // 'displayTranscriptionDetails()' is in 'helper.js'. + displayTranscriptionDetails( + i, + outputJSONTime, + objectParams.Key, + outputJSON + ); + }, 1000); + } + } catch (err) { + console.log("Error", err); + } + } catch (err) { + console.log("Error creating presigned URL", err); + } + } catch (err) { + console.log("Error", err); + } +}; + +// Convert readable streams. +async function* yieldUint8Chunks(data) { + const reader = data.getReader(); + try { + while (true) { + const { done, value } = await reader.read(); + if (done) return; + yield value; + } + } finally { + reader.releaseLock(); + } +} +// snippet-end:[transcribe.JavaScript.recording-app.onload] +// snippet-start:[transcribe.JavaScript.recording-app.create-transcriptions] + +// Upload recordings to Amazon S3 bucket +window.upload = async function (blob, userName) { + // Set the parameters for the recording recording. + const Key = `${userName}/test-object-${Math.ceil(Math.random() * 10 ** 10)}`; + let signedUrl; + + // Create a presigned URL to upload the transcription to the Amazon S3 bucket when it is ready. + try { + // Create an Amazon S3RequestPresigner object. + const signer = new S3RequestPresigner({ ...s3Client.config }); + // Create the request. + const request = await createRequest( + s3Client, + new PutObjectCommand({ Key, Bucket: params.Bucket }) + ); + // Define the duration until expiration of the presigned URL. + const expiration = new Date(Date.now() + 60 * 60 * 1000); + // Create and format the presigned URL. + signedUrl = formatUrl(await signer.presign(request, expiration)); + console.log(`\nPutting "${Key}"`); + } catch (err) { + console.log("Error creating presigned URL", err); + } + try { + // Upload the object to the Amazon S3 bucket using a presigned URL. + response = await fetch(signedUrl, { + method: "PUT", + headers: { + "content-type": "application/octet-stream", + }, + body: blob, + }); + // Create the transcription job name. In this case, it's the current date and time. + const today = new Date(); + const date = + today.getFullYear() + + "-" + + (today.getMonth() + 1) + + "-" + + today.getDate(); + const time = + today.getHours() + "-" + today.getMinutes() + "-" + today.getSeconds(); + const jobName = date + "-time-" + time; + + // Call the "createTranscriptionJob()" function. + createTranscriptionJob( + "s3://" + params.Bucket + "/" + Key, + jobName, + params.Bucket, + Key + ); + } catch (err) { + console.log("Error uploading object", err); + } +}; + +// Create the AWS Transcribe transcription job. +const createTranscriptionJob = async (recording, jobName, bucket, key) => { + // Set the parameters for transcriptions job + const params = { + TranscriptionJobName: jobName + "-job", + LanguageCode: "en-US", // For example, 'en-US', + OutputBucketName: bucket, + OutputKey: key, + Media: { + MediaFileUri: recording, // For example, "https://transcribe-demo.s3-REGION.amazonaws.com/hello_world.wav" + }, + }; + try { + // Start the transcription job. + const data = await client.send(new StartTranscriptionJobCommand(params)); + console.log("Success - transcription submitted", data); + } catch (err) { + console.log("Error", err); + } +}; +// snippet-end:[transcribe.JavaScript.recording-app.create-transcriptions] +// snippet-start:[transcribe.JavaScript.recording-app.delete-transcriptions] +// Delete a transcription from the Amazon S3 bucket. +window.deleteJSON = async (jsonFileName) => { + try { + await s3Client.send( + new DeleteObjectCommand({ + Bucket: params.Bucket, + Key: jsonFileName, + }) + ); + console.log("Success - JSON deleted"); + } catch (err) { + console.log("Error", err); + } +}; +// Delete a row from the user interface. +window.deleteRow = function (rowid) { + const row = document.getElementById(rowid); + row.parentNode.removeChild(row); +}; +// snippet-end:[transcribe.JavaScript.recording-app.delete-transcriptions] diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/recorder.css b/javascriptv3/example_code/cross-services/transcription-app/src/recorder.css new file mode 100644 index 00000000000..00fd49556a4 --- /dev/null +++ b/javascriptv3/example_code/cross-services/transcription-app/src/recorder.css @@ -0,0 +1,66 @@ +#record { + background-color: red; + border-width: medium; + border-color: black; + color: white; + padding: 20px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 16px; + margin: 4px 2px; + cursor: pointer; + max-width: 50%; + max-height: 15%; + border-radius: 50%; + left: 100px; + right: 100px; + position: relative; +} +#stopRecord { + background-color: green; + border-width: medium; + border-color: black; + color: white; + padding: 20px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 16px; + margin: 4px 2px; + cursor: pointer; + max-width: 50%; + max-height: 15%; + border-radius: 50%; + left: 100px; + right: 100px; + position: relative; +} +#convertRecord { + background-color: brown; /* Green */ + border-width: medium; + border-color: black; + color: white; + padding: 20px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 16px; + margin: 4px 2px; + cursor: pointer; + max-width: 50%; + max-height: 15%; + border-radius: 50%; + left: 100px; + right: 100px; + position: relative; +} +h2 { + left: 100px; + position: relative; +} +#recordedAudio { + left: 100px; + right: 100px; + position: relative; +} diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/recorder.js b/javascriptv3/example_code/cross-services/transcription-app/src/recorder.js new file mode 100644 index 00000000000..51bb79841dc --- /dev/null +++ b/javascriptv3/example_code/cross-services/transcription-app/src/recorder.js @@ -0,0 +1,69 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/* +ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), +which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. + +Purpose: +recorder.js is part of a tutorial demonstrating how to build and deploy an app that transcribes and displays +voice recordings for authenticated users. To run the full tutorial, see +https://docs.aws.amazon.comsdk-for-javascript/v3/developer-guide/transcribe-app.html. + +*/ + +// snippet-start:[transcribe.JavaScript.recording-app.recorder] + +// Functions for recording transcriptions. +// Enable microphone on browser. +import "./helper.js"; +import index from "./index.js"; +navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { + handlerFunction(stream); +}); + +// This is a handler function to manage recordings. +function handlerFunction(stream) { + let rec; + rec = new MediaRecorder(stream); + rec.ondataavailable = (e) => { + audioChunks.push(e.data); + if (rec.state == "inactive") { + let blob = new Blob(audioChunks, { type: "audio/mpeg-3" }); + var recordedAudio = document.getElementById("recordedAudio"); + recordedAudio.src = URL.createObjectURL(blob); + recordedAudio.controls = true; + recordedAudio.autoplay = true; + // Take username from 'index.js'. + var username = index.username; + // The upload function is in 'index.js'. + upload(blob, username); + alert("Refresh page in ~1 min to view your transcription."); + } + }; +} + +// Start recording. +window.startRecord = function () { + console.log("Recording started"); + var record = document.getElementById("record"); + var stop = document.getElementById("stopRecord"); + record.disabled = true; + record.style.backgroundColor = "blue"; + stop.disabled = false; + rec.start(); +}; + +// Stop recording. +window.stopRecord = function () { + console.log("Recording stopped"); + var record = document.getElementById("record"); + var stop = document.getElementById("stopRecord"); + record.disabled = false; + stop.disabled = true; + record.style.backgroundColor = "red"; + rec.stop(); +}; + +// snippet-end:[transcribe.JavaScript.recording-app.recorder] diff --git a/resources/cdk/javascript_example_code_transcribe_demo/cdk.json b/resources/cdk/javascript_example_code_transcribe_demo/cdk.json new file mode 100644 index 00000000000..90acb5637f9 --- /dev/null +++ b/resources/cdk/javascript_example_code_transcribe_demo/cdk.json @@ -0,0 +1,10 @@ +{ + "app": "npx ts-node --prefer-ts-exts setup.ts", + "context": { + "@aws-cdk/core:enableStackNameDuplicates": "true", + "aws-cdk:enableDiffNoFail": "true", + "@aws-cdk/core:stackRelativeExports": "true", + "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, + "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true + } +} diff --git a/resources/cdk/javascript_example_code_transcribe_demo/package-lock.json b/resources/cdk/javascript_example_code_transcribe_demo/package-lock.json new file mode 100644 index 00000000000..69ab87d0513 --- /dev/null +++ b/resources/cdk/javascript_example_code_transcribe_demo/package-lock.json @@ -0,0 +1,18523 @@ +{ + "name": "setup", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "setup", + "version": "0.1.0", + "dependencies": { + "@aws-cdk/aws-cognito": "^1.204.0", + "@aws-cdk/aws-iam": "^1.204.0", + "@aws-cdk/core": "^1.204.0", + "source-map-support": "^0.5.16" + }, + "bin": { + "setup": "setup.js" + }, + "devDependencies": { + "@aws-cdk/assert": "1.79.0", + "@types/jest": "^26.0.10", + "@types/node": "10.17.27", + "aws-cdk": "1.77.0", + "jest": "^26.4.2", + "ts-jest": "^26.2.0", + "ts-node": "^9.0.0", + "typescript": "~3.9.7" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-cdk/assert": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/assert/-/assert-1.79.0.tgz", + "integrity": "sha512-wCiMyxhtUz82blUlSnfoqpHdSjgFOkjpunjgxT2aG5Y6RTN0ExOOm9pdKDdXnul0zml6ZvfOL51wDG0Udg7zFg==", + "dev": true, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.79.0", + "@aws-cdk/cloudformation-diff": "1.79.0", + "@aws-cdk/core": "1.79.0", + "@aws-cdk/cx-api": "1.79.0", + "constructs": "^3.2.0" + }, + "engines": { + "node": ">= 10.13.0 <13 || >=13.7.0" + }, + "peerDependencies": { + "@aws-cdk/core": "1.79.0", + "constructs": "^3.2.0", + "jest": "^26.6.3" + } + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.79.0.tgz", + "integrity": "sha512-I+2GbQfbPy6TewnGbviE1W8cUhgBEA1mQLYm5gBj/Rzix1tCyaNvfYsBU3ipg3jIATpHsg1CzUq0zrumUnmnTg==", + "bundleDependencies": [ + "fs-extra", + "minimatch", + "@balena/dockerignore", + "ignore" + ], + "dev": true, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.79.0", + "@aws-cdk/cx-api": "1.79.0", + "@aws-cdk/region-info": "1.79.0", + "@balena/dockerignore": "^1.0.2", + "constructs": "^3.2.0", + "fs-extra": "^9.0.1", + "ignore": "^5.1.8", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">= 10.13.0 <13 || >=13.7.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.79.0", + "@aws-cdk/cx-api": "1.79.0", + "@aws-cdk/region-info": "1.79.0", + "constructs": "^3.2.0" + } + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/balanced-match": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/fs-extra": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/graceful-fs": { + "version": "4.2.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/ignore": { + "version": "5.1.8", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/minimatch": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/universalify": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/region-info": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.79.0.tgz", + "integrity": "sha512-klnXCc1Cd/krE4VOXJ1Blvey8ucPRzuwgGacPsCV2ugMSlaJSbdGqKzTUNxcK2o8g9PaEuJ5lNjfwqqyvp571g==", + "dev": true, + "engines": { + "node": ">= 10.13.0 <13 || >=13.7.0" + } + }, + "node_modules/@aws-cdk/assets": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/assets/-/assets-1.204.0.tgz", + "integrity": "sha512-rY9YHZ3gUWr+dLwTwSUWYbIfk/AXy4JZRkhLbunrtzjQhH+QMm/2IWIebfBGu+A5AlVRaFbRLonReuGP5WZoUQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-acmpca": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-acmpca/-/aws-acmpca-1.204.0.tgz", + "integrity": "sha512-2zyuQZwynwkz2qiuFDp088tglWXKX3q7saWRDqeuq2n2HE6PGuQRjd4zjl9nDGUVxQYtzzXyEuPyaEta8fg9lQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-applicationautoscaling": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.204.0.tgz", + "integrity": "sha512-sEe2NODKUowJx2guM2SPfs/20gGdBq1C09M32b8c1im7K+PqQkHkE156nyz5Ml0hpsNeCZlRS17oKZ042aZevQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-autoscaling-common": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-autoscaling-common": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-autoscaling-common": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.204.0.tgz", + "integrity": "sha512-P+PwbTaj28Eg9+/U9ZTXTh1gA7L9Z45GL+9xcEZvEqAkJt9MNgzZICavVZu1sMD74foK1r1ZOBXTsqV6wEiltQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-certificatemanager": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.204.0.tgz", + "integrity": "sha512-ZLykfAOb5Zbg/MFtzA+eHhMAK1xL32+oHKSK6tAYrgvv2aS42wJE4zSBV6jGCjnCkhcliUd5pwnACEl3ib0KLw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-acmpca": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/aws-route53": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-acmpca": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/aws-route53": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-cloudformation": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.204.0.tgz", + "integrity": "sha512-9PkZa9mKLneB0My8wJC7lLZmPJsnOxNYy57ZZlRCQhK0eO6Jc9eVqrI29537W+3ireaEjCLEitkb8NO1FN/kQA==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-cloudwatch": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.204.0.tgz", + "integrity": "sha512-ADT2D+4FtB9Zcy/TlF2tswQmjmrPVgORYTkznQQ2SniCODHWzz558+G1RV+IVvWRdH7nYQtV0UEuGZKpffWh2w==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-codeguruprofiler": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.204.0.tgz", + "integrity": "sha512-IrgY4SmVf9p5POfHm8BsPzaAO5lQTG7nhb5qN5AzS6zKCTuEjjTNHjx1TOfPV12mMIDAIVsK91mjDlAR88Mjbg==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-codestarnotifications": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codestarnotifications/-/aws-codestarnotifications-1.204.0.tgz", + "integrity": "sha512-t//hSpC5/uVW2321YlbGabNVzhWayvqz+xSnagADGcT9qiq3KQR/uUlrgpHv1/eHRMk7EMrY9prlXeZpfzZ+cw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-cognito": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cognito/-/aws-cognito-1.204.0.tgz", + "integrity": "sha512-7QIbExW9dn1fktpDOh2nMHmor2S3uuHtIX5y33lc9OKg3xUuYw4AZ67MKapunN7QUBlffTlNzoUqlHoNSab+Zg==", + "bundleDependencies": [ + "punycode" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-certificatemanager": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/custom-resources": "1.204.0", + "constructs": "^3.3.69", + "punycode": "^2.3.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-certificatemanager": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/custom-resources": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-cognito/node_modules/punycode": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@aws-cdk/aws-ec2": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ec2/-/aws-ec2-1.204.0.tgz", + "integrity": "sha512-SoqZEgzdfPW0aa+FQ0CjzbDG+X+sDu6/BnLL2O10lxpa+9Dc1iyArAqNKFJG5KXGJe9ibvQXyNQqEjeGRFc22Q==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/aws-ssm": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/aws-ssm": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-ecr": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr/-/aws-ecr-1.204.0.tgz", + "integrity": "sha512-oCts9e+ackWoFHeyn/3oKm3X1lSizleWNNXHp5WGM38lpNVrtCLMKSShu5iXJBhqRH2Mz1AcA4fDMWhe8DvJFA==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.204.0.tgz", + "integrity": "sha512-2GHD3pZdDoPxq3HhD4czANuI7TMoxpjszbzsQAc2wbdMX1j+K4vIL+PBpj3altfscPqcvy1v70lBjbG5rcBIkQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/assets": "1.204.0", + "@aws-cdk/aws-ecr": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/assets": "1.204.0", + "@aws-cdk/aws-ecr": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-efs": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-efs/-/aws-efs-1.204.0.tgz", + "integrity": "sha512-FB6nHgCuzYF5K9ywqYPEPjL2G1ATLIR9dJp1p4ydcEUuXDb4KSEVN4Bgx+q1e7EkWGIq+9glr+ckheEcTvETgw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-events": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-events/-/aws-events-1.204.0.tgz", + "integrity": "sha512-KnfUmtv+4RhydD9+5CHFxNJxtgn7+Xftwfwg1G7qV/tWYPFHcNIvhlSOgwDrQPa+pTo1MmkiUN0lAR0G8B/cbw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-iam": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-iam/-/aws-iam-1.204.0.tgz", + "integrity": "sha512-Fh2egW3v/uDdw3m4jvcupS7COL/+sJl2NHjz9l298ddyMxqDwJD2NQwE8mvgPLK4rDtAtDnE0c8RS6d+NWiC+w==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/core": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-kms": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-kms/-/aws-kms-1.204.0.tgz", + "integrity": "sha512-iryZQ428L1VUVQ0zE96XTWWX7ANVtDrb6x+ZXXLTVUEPgjEd/W6zlcp++Qi0A3a9HLNd4PbEhK9rs0UKNTylzw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-lambda": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda/-/aws-lambda-1.204.0.tgz", + "integrity": "sha512-r0XXovrLAx8Q8Fz915SwzyQM/KLhEB6YCp3CsWliFGSOHEjRP8yX8UZdEJqe5kYD7Th9JAhUVzKgyv20P7g5Tg==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-applicationautoscaling": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-codeguruprofiler": "1.204.0", + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-ecr": "1.204.0", + "@aws-cdk/aws-ecr-assets": "1.204.0", + "@aws-cdk/aws-efs": "1.204.0", + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/aws-signer": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/aws-sqs": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-applicationautoscaling": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-codeguruprofiler": "1.204.0", + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-ecr": "1.204.0", + "@aws-cdk/aws-ecr-assets": "1.204.0", + "@aws-cdk/aws-efs": "1.204.0", + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/aws-signer": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/aws-sqs": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-logs": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-logs/-/aws-logs-1.204.0.tgz", + "integrity": "sha512-PuHsDSkX6JFBgldxViGw91eFLageJ2cX89/RyLbWaJJUV4tlUKXSmmkVgOaBmvil0QKuGqbOzLXcXCoIK9Sg3A==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-route53": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-route53/-/aws-route53-1.204.0.tgz", + "integrity": "sha512-wQpGUXqc2y7yJFTipfuVxWy/VGeshyGlfGl4evusQK9Md0DMpVmG8kRgazLk1myqUSNSfi643UwvDJqNbYmdnA==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/custom-resources": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/custom-resources": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-s3": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3/-/aws-s3-1.204.0.tgz", + "integrity": "sha512-jsQ4n1L4MdPYDirBoOYgg7yzSk1TaFYo4dnwDlKiLJ5LcHG3Nai1cHb9XQbCy/9KKqbWsbd3WlkH+vcWEl8EUA==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-s3-assets": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.204.0.tgz", + "integrity": "sha512-3MQbVZ95wW29Bl63tqu0Bz0td3osLyGg352l5G7Ztf3nK35FpuQlgxO4kcu74+s2sRwdd/R4KFV6eWhhPk+J7g==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/assets": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/assets": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-signer": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-signer/-/aws-signer-1.204.0.tgz", + "integrity": "sha512-AI26FhWF3+f/vDh3mleQa2CXv2/CmSerXgyk4XHMVVTTCjnlYGGmHmGlzYhqOSw6ALpQNdOSw8GVxU/ySpQCaw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-sns": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sns/-/aws-sns-1.204.0.tgz", + "integrity": "sha512-KoWxqKT/dTjt9Pk0a3kJLcd6xZHvrwbZDC0mrLtxdRNhQoHmnURAHW2UqX/lefrCU1GcUFf4L58N9ehBTunAFQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-codestarnotifications": "1.204.0", + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-sqs": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-codestarnotifications": "1.204.0", + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-sqs": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-sqs": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sqs/-/aws-sqs-1.204.0.tgz", + "integrity": "sha512-dVzuGMh6d5/X9P9jel1w2Wgdy5MuSE35+eBSFxN+S7oJRoVSARpyKMNYAPMCW+2OJCDw7fIqO1rWbsZBT1Gq8g==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-ssm": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ssm/-/aws-ssm-1.204.0.tgz", + "integrity": "sha512-yYx7HZ8cWNXDAmX/99WkB477QhLoV2rcB8orei8aj7nRkNq5TMjeox0IJaZVgU+edNEDOi1fVX3flh0SAMiUrg==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/cfnspec": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-1.79.0.tgz", + "integrity": "sha512-rbBhox7hzXPXk2n+1BDjsmiz/0W9ZHv3NeCKiq94WfHW6Jj4mSjtGs7ZUBFq8JkkgYVsE9ktH1634wt9A9fbRg==", + "dev": true, + "dependencies": { + "md5": "^2.3.0" + } + }, + "node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.79.0.tgz", + "integrity": "sha512-n2ARtOXIUq3FdJ1EBuHzsM0DQau6ZwHprPhpk1xc5bv21s7D5X5ECe06eC0K5xC5ZyfC13BDWu1f+xFh+krnYA==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "dev": true, + "dependencies": { + "jsonschema": "^1.4.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0 <13 || >=13.7.0" + } + }, + "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/cloudformation-diff": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-1.79.0.tgz", + "integrity": "sha512-GsX8Br7E0/2W2ugntO4zXodbApVi2C+AP/6QtTX6fasZbgZSwe8gjiXYPQ6EvtgjlWnYxPTn6vHRlb53vDFzMg==", + "dev": true, + "dependencies": { + "@aws-cdk/cfnspec": "1.79.0", + "colors": "^1.4.0", + "diff": "^5.0.0", + "fast-deep-equal": "^3.1.3", + "string-width": "^4.2.0", + "table": "^6.0.4" + }, + "engines": { + "node": ">= 10.13.0 <13 || >=13.7.0" + } + }, + "node_modules/@aws-cdk/core": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.204.0.tgz", + "integrity": "sha512-yO/flJ9ihpzRhLTEqlbdbuPGtyyghHiiQPkUTLslwUM5vThVTbpgvW4UQHSGqytyst4MYXrN2jQn2RkwIRU57g==", + "bundleDependencies": [ + "fs-extra", + "minimatch", + "@balena/dockerignore", + "ignore" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "@balena/dockerignore": "^1.0.2", + "constructs": "^3.3.69", + "fs-extra": "^9.1.0", + "ignore": "^5.2.4", + "minimatch": "^3.1.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/core/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/core/node_modules/at-least-node": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@aws-cdk/core/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@aws-cdk/core/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@aws-cdk/core/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@aws-cdk/core/node_modules/fs-extra": { + "version": "9.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/core/node_modules/graceful-fs": { + "version": "4.2.10", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/core/node_modules/ignore": { + "version": "5.2.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@aws-cdk/core/node_modules/jsonfile": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@aws-cdk/core/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/core/node_modules/universalify": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-cdk/custom-resources": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/custom-resources/-/custom-resources-1.204.0.tgz", + "integrity": "sha512-0w3oi7LnAtMZpf7uUBDH6aT2Oo1EBQrqD+VTvPZDX8PJFAox8ol7buZ9sSTpIXgv9j/GK9yaPTIHt4m8ok9kVQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-cloudformation": "1.204.0", + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-cloudformation": "1.204.0", + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/cx-api": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.79.0.tgz", + "integrity": "sha512-ymQOqHcPzYhrcQ4swMgw5JzAaOm+PehH1cepsxi/Wq2zNOXkyN9o6Hw6l+eDpezFvNIKFy4mMAo6FR9xRCUiow==", + "bundleDependencies": [ + "semver" + ], + "dev": true, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.79.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0 <13 || >=13.7.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.79.0" + } + }, + "node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/region-info": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.204.0.tgz", + "integrity": "sha512-lPkYJNoN4Gjlf0Fdfgcd1RTm5RD9qtfaFMwVvTn2KGTr7ZqmFskGQ9FqIcd5vd6GmsbAL8OrFOToLr1AHDuOiQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "dev": true, + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "node_modules/@types/node": { + "version": "10.17.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.27.tgz", + "integrity": "sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "15.0.15", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", + "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/aws-cdk": { + "version": "1.77.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-1.77.0.tgz", + "integrity": "sha512-DM0ELcihYV9K7EtEeZZrViwjQUHb/G3CDFPSPQ39d5XuCEcQmnDSuJ6LQ2jFUbZE+Qsj+lmUp+WM1j66kJT9HA==", + "dev": true, + "hasShrinkwrap": true, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.77.0", + "@aws-cdk/cloudformation-diff": "1.77.0", + "@aws-cdk/cx-api": "1.77.0", + "@aws-cdk/region-info": "1.77.0", + "@aws-cdk/yaml-cfn": "1.77.0", + "archiver": "^5.1.0", + "aws-sdk": "^2.804.0", + "camelcase": "^6.2.0", + "cdk-assets": "1.77.0", + "colors": "^1.4.0", + "decamelize": "^4.0.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "json-diff": "^0.5.4", + "minimatch": ">=3.0", + "promptly": "^3.2.0", + "proxy-agent": "^4.0.0", + "semver": "^7.3.2", + "source-map-support": "^0.5.19", + "table": "^6.0.4", + "uuid": "^8.3.1", + "wrap-ansi": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 10.13.0 <13 || >=13.7.0" + } + }, + "node_modules/aws-cdk/node_modules/@aws-cdk/cfnspec": { + "version": "1.77.0", + "dev": true, + "dependencies": { + "md5": "^2.3.0" + } + }, + "node_modules/aws-cdk/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.77.0", + "dev": true, + "dependencies": { + "jsonschema": "^1.4.0", + "semver": "^7.3.2" + } + }, + "node_modules/aws-cdk/node_modules/@aws-cdk/cloudformation-diff": { + "version": "1.77.0", + "dev": true, + "dependencies": { + "@aws-cdk/cfnspec": "1.77.0", + "colors": "^1.4.0", + "diff": "^5.0.0", + "fast-deep-equal": "^3.1.3", + "string-width": "^4.2.0", + "table": "^6.0.4" + } + }, + "node_modules/aws-cdk/node_modules/@aws-cdk/cx-api": { + "version": "1.77.0", + "dev": true, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.77.0", + "semver": "^7.3.2" + } + }, + "node_modules/aws-cdk/node_modules/@aws-cdk/region-info": { + "version": "1.77.0", + "dev": true + }, + "node_modules/aws-cdk/node_modules/@aws-cdk/yaml-cfn": { + "version": "1.77.0", + "dev": true, + "dependencies": { + "yaml": "1.10.0" + } + }, + "node_modules/aws-cdk/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + } + }, + "node_modules/aws-cdk/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/aws-cdk/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + } + }, + "node_modules/aws-cdk/node_modules/archiver": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/archiver/-/archiver-5.1.0.tgz#05b0f6f7836f3e6356a0532763d2bb91017a7e37", + "integrity": "sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA==", + "dev": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.1.4", + "zip-stream": "^4.0.4" + } + }, + "node_modules/aws-cdk/node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + } + }, + "node_modules/aws-cdk/node_modules/archiver/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "node_modules/aws-cdk/node_modules/archiver/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/archiver/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/aws-cdk/node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + } + }, + "node_modules/aws-cdk/node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/aws-sdk": { + "version": "2.804.0", + "resolved": "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.804.0.tgz#ff7e6f91b86b4878ec69e3de895c10eb8203fc4b", + "integrity": "sha512-a02pZdjL06MunElAZPPEjpghOp/ZA+16f+t4imh1k9FCDpsNVQrT23HRq/PMvRADA5uZZRkYwX8r9o6oH/1RlA==", + "dev": true, + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + } + }, + "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/buffer/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/bl": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/aws-cdk/node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "node_modules/aws-cdk/node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/aws-cdk/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/aws-cdk/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/cdk-assets": { + "version": "1.77.0", + "dev": true, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.77.0", + "@aws-cdk/cx-api": "1.77.0", + "archiver": "^5.1.0", + "aws-sdk": "^2.804.0", + "glob": "^7.1.6", + "yargs": "^16.2.0" + } + }, + "node_modules/aws-cdk/node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/cli-color": { + "version": "0.1.7", + "resolved": "https://registry.yarnpkg.com/cli-color/-/cli-color-0.1.7.tgz#adc3200fa471cc211b0da7f566b71e98b9d67347", + "integrity": "sha1-rcMgD6RxzCEbDaf1ZrcemLnWc0c=", + "dev": true, + "dependencies": { + "es5-ext": "0.8.x" + } + }, + "node_modules/aws-cdk/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/aws-cdk/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + } + }, + "node_modules/aws-cdk/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/compress-commons": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.0.2.tgz#d6896be386e52f37610cef9e6fa5defc58c31bd7", + "integrity": "sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/aws-cdk/node_modules/compress-commons/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "node_modules/aws-cdk/node_modules/compress-commons/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/compress-commons/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/aws-cdk/node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/crc-32": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dev": true, + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "node_modules/aws-cdk/node_modules/crc32-stream": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.1.tgz#0f047d74041737f8a55e86837a1b826bd8ab0067", + "integrity": "sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "node_modules/aws-cdk/node_modules/crc32-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "node_modules/aws-cdk/node_modules/crc32-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/crc32-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/aws-cdk/node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + } + }, + "node_modules/aws-cdk/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/degenerator": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/degenerator/-/degenerator-2.2.0.tgz#49e98c11fa0293c5b26edfbb52f15729afcdb254", + "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0" + } + }, + "node_modules/aws-cdk/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e", + "integrity": "sha1-teMDYabbAjF21WKJLbhZQKcY9H4=", + "dev": true, + "dependencies": { + "heap": ">= 0.2.0" + } + }, + "node_modules/aws-cdk/node_modules/dreamopt": { + "version": "0.6.0", + "resolved": "https://registry.yarnpkg.com/dreamopt/-/dreamopt-0.6.0.tgz#d813ccdac8d39d8ad526775514a13dda664d6b4b", + "integrity": "sha1-2BPM2sjTnYrVJndVFKE92mZNa0s=", + "dev": true, + "dependencies": { + "wordwrap": ">=0.0.2" + } + }, + "node_modules/aws-cdk/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/aws-cdk/node_modules/es5-ext": { + "version": "0.8.2", + "resolved": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.8.2.tgz#aba8d9e1943a895ac96837a62a39b3f55ecd94ab", + "integrity": "sha1-q6jZ4ZQ6iVrJaDemKjmz9V7NlKs=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + } + }, + "node_modules/aws-cdk/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "node_modules/aws-cdk/node_modules/fs-extra/node_modules/universalify": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + } + }, + "node_modules/aws-cdk/node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/aws-cdk/node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + } + }, + "node_modules/aws-cdk/node_modules/get-uri/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/aws-cdk/node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/get-uri/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "node_modules/aws-cdk/node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/heap": { + "version": "0.2.6", + "resolved": "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac", + "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "node_modules/aws-cdk/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "node_modules/aws-cdk/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + } + }, + "node_modules/aws-cdk/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "node_modules/aws-cdk/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/aws-cdk/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/jmespath": { + "version": "0.15.0", + "resolved": "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/json-diff": { + "version": "0.5.4", + "resolved": "https://registry.yarnpkg.com/json-diff/-/json-diff-0.5.4.tgz#7bc8198c441756632aab66c7d9189d365a7a035a", + "integrity": "sha512-q5Xmx9QXNOzOzIlMoYtLrLiu4Jl/Ce2bn0CNcv54PhyH89CI4GWlGVDye8ei2Ijt9R3U+vsWPsXpLUNob8bs8Q==", + "dev": true, + "dependencies": { + "cli-color": "~0.1.6", + "difflib": "~0.2.1", + "dreamopt": "~0.6.0" + } + }, + "node_modules/aws-cdk/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + } + }, + "node_modules/aws-cdk/node_modules/jsonschema": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2", + "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + } + }, + "node_modules/aws-cdk/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "node_modules/aws-cdk/node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/aws-cdk/node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/aws-cdk/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + } + }, + "node_modules/aws-cdk/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/netmask": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/aws-cdk/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "node_modules/aws-cdk/node_modules/pac-proxy-agent": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz#66883eeabadc915fc5e95457324cb0f0ac78defb", + "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^4.1.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + } + }, + "node_modules/aws-cdk/node_modules/pac-resolver": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-4.1.0.tgz#4b12e7d096b255a3b84e53f6831f32e9c7e5fe95", + "integrity": "sha512-d6lf2IrZJJ7ooVHr7BfwSjRO1yKSJMaiiWYSHcrxSIUtZrCa4KKGwcztdkZ/E9LFleJfjoi1yl+XLR7AX24nbQ==", + "dev": true, + "dependencies": { + "degenerator": "^2.2.0", + "ip": "^1.1.5", + "netmask": "^1.0.6" + } + }, + "node_modules/aws-cdk/node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/printj": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/promptly": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/promptly/-/promptly-3.2.0.tgz#a5517fbbf59bd31c1751d4e1d9bef1714f42b9d8", + "integrity": "sha512-WnR9obtgW+rG4oUV3hSnNGl1pHm3V1H/qD9iJBumGSmVsSC5HpZOLuu8qdMb6yCItGfT7dcRszejr/5P3i9Pug==", + "dev": true, + "dependencies": { + "read": "^1.0.4" + } + }, + "node_modules/aws-cdk/node_modules/proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-4.0.0.tgz#a92976af3fbc7d846f2e850e2ac5ac6ca3fb74c7", + "integrity": "sha512-8P0Y2SkwvKjiGU1IkEfYuTteioMIDFxPL4/j49zzt5Mz3pG1KO+mIrDG1qH0PQUHTTczjwGcYl+EzfXiFj5vUQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^4.1.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + } + }, + "node_modules/aws-cdk/node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/raw-body": { + "version": "2.4.1", + "resolved": "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "node_modules/aws-cdk/node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + } + }, + "node_modules/aws-cdk/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/aws-cdk/node_modules/readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/aws-cdk/node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "node_modules/aws-cdk/node_modules/smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/socks": { + "version": "2.5.0", + "resolved": "https://registry.yarnpkg.com/socks/-/socks-2.5.0.tgz#3a7c286db114f67864a4bd8b4207a91d1db3d6db", + "integrity": "sha512-00OqQHp5SCbwm9ecOMJj9aQtMSjwi1uVuGQoxnpKCS50VKZcOZ8z11CTKypmR8sEy7nZimy/qXY7rYJYbRlXmA==", + "dev": true, + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "node_modules/aws-cdk/node_modules/socks-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + } + }, + "node_modules/aws-cdk/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/aws-cdk/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/aws-cdk/node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/aws-cdk/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + } + }, + "node_modules/aws-cdk/node_modules/table": { + "version": "6.0.4", + "resolved": "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d", + "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + } + }, + "node_modules/aws-cdk/node_modules/tar-stream": { + "version": "2.1.4", + "resolved": "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa", + "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "node_modules/aws-cdk/node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "node_modules/aws-cdk/node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/aws-cdk/node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/tslib": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + } + }, + "node_modules/aws-cdk/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/uri-js": { + "version": "4.4.0", + "resolved": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/aws-cdk/node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/aws-cdk/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/uuid": { + "version": "8.3.1", + "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/aws-cdk/node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/aws-cdk/node_modules/xml2js/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true + }, + "node_modules/aws-cdk/node_modules/y18n": { + "version": "5.0.5", + "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/yaml": { + "version": "1.10.0", + "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "node_modules/aws-cdk/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/zip-stream": { + "version": "4.0.4", + "resolved": "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a", + "integrity": "sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw==", + "dev": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.0.2", + "readable-stream": "^3.6.0" + } + }, + "node_modules/aws-cdk/node_modules/zip-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "node_modules/aws-cdk/node_modules/zip-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/aws-cdk/node_modules/zip-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "dependencies": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001505", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001505.tgz", + "integrity": "sha512-jaAOR5zVtxHfL0NjZyflVTtXm3D3J9P15zSJ7HmQF8dSKGA6tqzQq+0ZI3xkjyQj46I4/M0K2GbMpcAFOcbr3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/constructs": { + "version": "3.4.329", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.329.tgz", + "integrity": "sha512-uj62KOOmaX6i10KcBLzXcXgcFRZpP+XoCiEqT8tg1zXIGSY3iQ6n6wzw/44laG9L4qrWvCtMna6wACW8CejKkQ==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.434", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.434.tgz", + "integrity": "sha512-5Gvm09UZTQRaWrimRtWRO5rvaX6Kpk5WHAPKDa7A4Gj6NIPuJ8w8WNpnxCXdd+CJJt6RBU6tUw0KyULoW6XuHw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true, + "optional": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "optional": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "dev": true, + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", + "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", + "dev": true + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "dev": true, + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sane/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-jest": { + "version": "26.5.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", + "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "jest": ">=26 <27", + "typescript": ">=3.8 <5.0" + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": ">=2.7" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@aws-cdk/assert": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/assert/-/assert-1.79.0.tgz", + "integrity": "sha512-wCiMyxhtUz82blUlSnfoqpHdSjgFOkjpunjgxT2aG5Y6RTN0ExOOm9pdKDdXnul0zml6ZvfOL51wDG0Udg7zFg==", + "dev": true, + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.79.0", + "@aws-cdk/cloudformation-diff": "1.79.0", + "@aws-cdk/core": "1.79.0", + "@aws-cdk/cx-api": "1.79.0", + "constructs": "^3.2.0" + }, + "dependencies": { + "@aws-cdk/core": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.79.0.tgz", + "integrity": "sha512-I+2GbQfbPy6TewnGbviE1W8cUhgBEA1mQLYm5gBj/Rzix1tCyaNvfYsBU3ipg3jIATpHsg1CzUq0zrumUnmnTg==", + "dev": true, + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.79.0", + "@aws-cdk/cx-api": "1.79.0", + "@aws-cdk/region-info": "1.79.0", + "@balena/dockerignore": "^1.0.2", + "constructs": "^3.2.0", + "fs-extra": "^9.0.1", + "ignore": "^5.1.8", + "minimatch": "^3.0.4" + }, + "dependencies": { + "@balena/dockerignore": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "fs-extra": { + "version": "9.0.1", + "bundled": true, + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "bundled": true, + "dev": true + }, + "ignore": { + "version": "5.1.8", + "bundled": true, + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "universalify": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "@aws-cdk/region-info": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.79.0.tgz", + "integrity": "sha512-klnXCc1Cd/krE4VOXJ1Blvey8ucPRzuwgGacPsCV2ugMSlaJSbdGqKzTUNxcK2o8g9PaEuJ5lNjfwqqyvp571g==", + "dev": true + } + } + }, + "@aws-cdk/assets": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/assets/-/assets-1.204.0.tgz", + "integrity": "sha512-rY9YHZ3gUWr+dLwTwSUWYbIfk/AXy4JZRkhLbunrtzjQhH+QMm/2IWIebfBGu+A5AlVRaFbRLonReuGP5WZoUQ==", + "requires": { + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-acmpca": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-acmpca/-/aws-acmpca-1.204.0.tgz", + "integrity": "sha512-2zyuQZwynwkz2qiuFDp088tglWXKX3q7saWRDqeuq2n2HE6PGuQRjd4zjl9nDGUVxQYtzzXyEuPyaEta8fg9lQ==", + "requires": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-applicationautoscaling": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.204.0.tgz", + "integrity": "sha512-sEe2NODKUowJx2guM2SPfs/20gGdBq1C09M32b8c1im7K+PqQkHkE156nyz5Ml0hpsNeCZlRS17oKZ042aZevQ==", + "requires": { + "@aws-cdk/aws-autoscaling-common": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-autoscaling-common": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.204.0.tgz", + "integrity": "sha512-P+PwbTaj28Eg9+/U9ZTXTh1gA7L9Z45GL+9xcEZvEqAkJt9MNgzZICavVZu1sMD74foK1r1ZOBXTsqV6wEiltQ==", + "requires": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-certificatemanager": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.204.0.tgz", + "integrity": "sha512-ZLykfAOb5Zbg/MFtzA+eHhMAK1xL32+oHKSK6tAYrgvv2aS42wJE4zSBV6jGCjnCkhcliUd5pwnACEl3ib0KLw==", + "requires": { + "@aws-cdk/aws-acmpca": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/aws-route53": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-cloudformation": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.204.0.tgz", + "integrity": "sha512-9PkZa9mKLneB0My8wJC7lLZmPJsnOxNYy57ZZlRCQhK0eO6Jc9eVqrI29537W+3ireaEjCLEitkb8NO1FN/kQA==", + "requires": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-cloudwatch": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.204.0.tgz", + "integrity": "sha512-ADT2D+4FtB9Zcy/TlF2tswQmjmrPVgORYTkznQQ2SniCODHWzz558+G1RV+IVvWRdH7nYQtV0UEuGZKpffWh2w==", + "requires": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-codeguruprofiler": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.204.0.tgz", + "integrity": "sha512-IrgY4SmVf9p5POfHm8BsPzaAO5lQTG7nhb5qN5AzS6zKCTuEjjTNHjx1TOfPV12mMIDAIVsK91mjDlAR88Mjbg==", + "requires": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-codestarnotifications": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codestarnotifications/-/aws-codestarnotifications-1.204.0.tgz", + "integrity": "sha512-t//hSpC5/uVW2321YlbGabNVzhWayvqz+xSnagADGcT9qiq3KQR/uUlrgpHv1/eHRMk7EMrY9prlXeZpfzZ+cw==", + "requires": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-cognito": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cognito/-/aws-cognito-1.204.0.tgz", + "integrity": "sha512-7QIbExW9dn1fktpDOh2nMHmor2S3uuHtIX5y33lc9OKg3xUuYw4AZ67MKapunN7QUBlffTlNzoUqlHoNSab+Zg==", + "requires": { + "@aws-cdk/aws-certificatemanager": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/custom-resources": "1.204.0", + "constructs": "^3.3.69", + "punycode": "^2.3.0" + }, + "dependencies": { + "punycode": { + "version": "2.3.0", + "bundled": true + } + } + }, + "@aws-cdk/aws-ec2": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ec2/-/aws-ec2-1.204.0.tgz", + "integrity": "sha512-SoqZEgzdfPW0aa+FQ0CjzbDG+X+sDu6/BnLL2O10lxpa+9Dc1iyArAqNKFJG5KXGJe9ibvQXyNQqEjeGRFc22Q==", + "requires": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/aws-ssm": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-ecr": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr/-/aws-ecr-1.204.0.tgz", + "integrity": "sha512-oCts9e+ackWoFHeyn/3oKm3X1lSizleWNNXHp5WGM38lpNVrtCLMKSShu5iXJBhqRH2Mz1AcA4fDMWhe8DvJFA==", + "requires": { + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-ecr-assets": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.204.0.tgz", + "integrity": "sha512-2GHD3pZdDoPxq3HhD4czANuI7TMoxpjszbzsQAc2wbdMX1j+K4vIL+PBpj3altfscPqcvy1v70lBjbG5rcBIkQ==", + "requires": { + "@aws-cdk/assets": "1.204.0", + "@aws-cdk/aws-ecr": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-efs": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-efs/-/aws-efs-1.204.0.tgz", + "integrity": "sha512-FB6nHgCuzYF5K9ywqYPEPjL2G1ATLIR9dJp1p4ydcEUuXDb4KSEVN4Bgx+q1e7EkWGIq+9glr+ckheEcTvETgw==", + "requires": { + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-events": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-events/-/aws-events-1.204.0.tgz", + "integrity": "sha512-KnfUmtv+4RhydD9+5CHFxNJxtgn7+Xftwfwg1G7qV/tWYPFHcNIvhlSOgwDrQPa+pTo1MmkiUN0lAR0G8B/cbw==", + "requires": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-iam": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-iam/-/aws-iam-1.204.0.tgz", + "integrity": "sha512-Fh2egW3v/uDdw3m4jvcupS7COL/+sJl2NHjz9l298ddyMxqDwJD2NQwE8mvgPLK4rDtAtDnE0c8RS6d+NWiC+w==", + "requires": { + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-kms": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-kms/-/aws-kms-1.204.0.tgz", + "integrity": "sha512-iryZQ428L1VUVQ0zE96XTWWX7ANVtDrb6x+ZXXLTVUEPgjEd/W6zlcp++Qi0A3a9HLNd4PbEhK9rs0UKNTylzw==", + "requires": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-lambda": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda/-/aws-lambda-1.204.0.tgz", + "integrity": "sha512-r0XXovrLAx8Q8Fz915SwzyQM/KLhEB6YCp3CsWliFGSOHEjRP8yX8UZdEJqe5kYD7Th9JAhUVzKgyv20P7g5Tg==", + "requires": { + "@aws-cdk/aws-applicationautoscaling": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-codeguruprofiler": "1.204.0", + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-ecr": "1.204.0", + "@aws-cdk/aws-ecr-assets": "1.204.0", + "@aws-cdk/aws-efs": "1.204.0", + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/aws-signer": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/aws-sqs": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-logs": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-logs/-/aws-logs-1.204.0.tgz", + "integrity": "sha512-PuHsDSkX6JFBgldxViGw91eFLageJ2cX89/RyLbWaJJUV4tlUKXSmmkVgOaBmvil0QKuGqbOzLXcXCoIK9Sg3A==", + "requires": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-route53": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-route53/-/aws-route53-1.204.0.tgz", + "integrity": "sha512-wQpGUXqc2y7yJFTipfuVxWy/VGeshyGlfGl4evusQK9Md0DMpVmG8kRgazLk1myqUSNSfi643UwvDJqNbYmdnA==", + "requires": { + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/custom-resources": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-s3": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3/-/aws-s3-1.204.0.tgz", + "integrity": "sha512-jsQ4n1L4MdPYDirBoOYgg7yzSk1TaFYo4dnwDlKiLJ5LcHG3Nai1cHb9XQbCy/9KKqbWsbd3WlkH+vcWEl8EUA==", + "requires": { + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-s3-assets": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.204.0.tgz", + "integrity": "sha512-3MQbVZ95wW29Bl63tqu0Bz0td3osLyGg352l5G7Ztf3nK35FpuQlgxO4kcu74+s2sRwdd/R4KFV6eWhhPk+J7g==", + "requires": { + "@aws-cdk/assets": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/aws-signer": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-signer/-/aws-signer-1.204.0.tgz", + "integrity": "sha512-AI26FhWF3+f/vDh3mleQa2CXv2/CmSerXgyk4XHMVVTTCjnlYGGmHmGlzYhqOSw6ALpQNdOSw8GVxU/ySpQCaw==", + "requires": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-sns": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sns/-/aws-sns-1.204.0.tgz", + "integrity": "sha512-KoWxqKT/dTjt9Pk0a3kJLcd6xZHvrwbZDC0mrLtxdRNhQoHmnURAHW2UqX/lefrCU1GcUFf4L58N9ehBTunAFQ==", + "requires": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-codestarnotifications": "1.204.0", + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-sqs": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-sqs": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sqs/-/aws-sqs-1.204.0.tgz", + "integrity": "sha512-dVzuGMh6d5/X9P9jel1w2Wgdy5MuSE35+eBSFxN+S7oJRoVSARpyKMNYAPMCW+2OJCDw7fIqO1rWbsZBT1Gq8g==", + "requires": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/aws-ssm": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ssm/-/aws-ssm-1.204.0.tgz", + "integrity": "sha512-yYx7HZ8cWNXDAmX/99WkB477QhLoV2rcB8orei8aj7nRkNq5TMjeox0IJaZVgU+edNEDOi1fVX3flh0SAMiUrg==", + "requires": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + } + } + }, + "@aws-cdk/cfnspec": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-1.79.0.tgz", + "integrity": "sha512-rbBhox7hzXPXk2n+1BDjsmiz/0W9ZHv3NeCKiq94WfHW6Jj4mSjtGs7ZUBFq8JkkgYVsE9ktH1634wt9A9fbRg==", + "dev": true, + "requires": { + "md5": "^2.3.0" + } + }, + "@aws-cdk/cloud-assembly-schema": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.79.0.tgz", + "integrity": "sha512-n2ARtOXIUq3FdJ1EBuHzsM0DQau6ZwHprPhpk1xc5bv21s7D5X5ECe06eC0K5xC5ZyfC13BDWu1f+xFh+krnYA==", + "dev": true, + "requires": { + "jsonschema": "^1.4.0", + "semver": "^7.3.2" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.0", + "bundled": true, + "dev": true + }, + "semver": { + "version": "7.3.2", + "bundled": true, + "dev": true + } + } + }, + "@aws-cdk/cloudformation-diff": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-1.79.0.tgz", + "integrity": "sha512-GsX8Br7E0/2W2ugntO4zXodbApVi2C+AP/6QtTX6fasZbgZSwe8gjiXYPQ6EvtgjlWnYxPTn6vHRlb53vDFzMg==", + "dev": true, + "requires": { + "@aws-cdk/cfnspec": "1.79.0", + "colors": "^1.4.0", + "diff": "^5.0.0", + "fast-deep-equal": "^3.1.3", + "string-width": "^4.2.0", + "table": "^6.0.4" + } + }, + "@aws-cdk/core": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.204.0.tgz", + "integrity": "sha512-yO/flJ9ihpzRhLTEqlbdbuPGtyyghHiiQPkUTLslwUM5vThVTbpgvW4UQHSGqytyst4MYXrN2jQn2RkwIRU57g==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "@balena/dockerignore": "^1.0.2", + "constructs": "^3.3.69", + "fs-extra": "^9.1.0", + "ignore": "^5.2.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "requires": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "jsonschema": { + "version": "1.4.1", + "bundled": true + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "@balena/dockerignore": { + "version": "1.0.2", + "bundled": true + }, + "at-least-node": { + "version": "1.0.0", + "bundled": true + }, + "balanced-match": { + "version": "1.0.2", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "fs-extra": { + "version": "9.1.0", + "bundled": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "bundled": true + }, + "ignore": { + "version": "5.2.4", + "bundled": true + }, + "jsonfile": { + "version": "6.1.0", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "universalify": { + "version": "2.0.0", + "bundled": true + } + } + }, + "@aws-cdk/custom-resources": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/custom-resources/-/custom-resources-1.204.0.tgz", + "integrity": "sha512-0w3oi7LnAtMZpf7uUBDH6aT2Oo1EBQrqD+VTvPZDX8PJFAox8ol7buZ9sSTpIXgv9j/GK9yaPTIHt4m8ok9kVQ==", + "requires": { + "@aws-cdk/aws-cloudformation": "1.204.0", + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "@aws-cdk/cx-api": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.79.0.tgz", + "integrity": "sha512-ymQOqHcPzYhrcQ4swMgw5JzAaOm+PehH1cepsxi/Wq2zNOXkyN9o6Hw6l+eDpezFvNIKFy4mMAo6FR9xRCUiow==", + "dev": true, + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.79.0", + "semver": "^7.3.2" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "bundled": true, + "dev": true + } + } + }, + "@aws-cdk/region-info": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.204.0.tgz", + "integrity": "sha512-lPkYJNoN4Gjlf0Fdfgcd1RTm5RD9qtfaFMwVvTn2KGTr7ZqmFskGQ9FqIcd5vd6GmsbAL8OrFOToLr1AHDuOiQ==" + }, + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/compat-data": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "dev": true + }, + "@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "requires": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/node": { + "version": "10.17.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.27.tgz", + "integrity": "sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.15", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", + "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-cdk": { + "version": "1.77.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-1.77.0.tgz", + "integrity": "sha512-DM0ELcihYV9K7EtEeZZrViwjQUHb/G3CDFPSPQ39d5XuCEcQmnDSuJ6LQ2jFUbZE+Qsj+lmUp+WM1j66kJT9HA==", + "dev": true, + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.77.0", + "@aws-cdk/cloudformation-diff": "1.77.0", + "@aws-cdk/cx-api": "1.77.0", + "@aws-cdk/region-info": "1.77.0", + "@aws-cdk/yaml-cfn": "1.77.0", + "archiver": "^5.1.0", + "aws-sdk": "^2.804.0", + "camelcase": "^6.2.0", + "cdk-assets": "1.77.0", + "colors": "^1.4.0", + "decamelize": "^4.0.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "json-diff": "^0.5.4", + "minimatch": ">=3.0", + "promptly": "^3.2.0", + "proxy-agent": "^4.0.0", + "semver": "^7.3.2", + "source-map-support": "^0.5.19", + "table": "^6.0.4", + "uuid": "^8.3.1", + "wrap-ansi": "^7.0.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "@aws-cdk/cfnspec": { + "version": "1.77.0", + "dev": true, + "requires": { + "md5": "^2.3.0" + } + }, + "@aws-cdk/cloud-assembly-schema": { + "version": "1.77.0", + "dev": true, + "requires": { + "jsonschema": "^1.4.0", + "semver": "^7.3.2" + } + }, + "@aws-cdk/cloudformation-diff": { + "version": "1.77.0", + "dev": true, + "requires": { + "@aws-cdk/cfnspec": "1.77.0", + "colors": "^1.4.0", + "diff": "^5.0.0", + "fast-deep-equal": "^3.1.3", + "string-width": "^4.2.0", + "table": "^6.0.4" + } + }, + "@aws-cdk/cx-api": { + "version": "1.77.0", + "dev": true, + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.77.0", + "semver": "^7.3.2" + } + }, + "@aws-cdk/region-info": { + "version": "1.77.0", + "dev": true + }, + "@aws-cdk/yaml-cfn": { + "version": "1.77.0", + "dev": true, + "requires": { + "yaml": "1.10.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "archiver": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/archiver/-/archiver-5.1.0.tgz#05b0f6f7836f3e6356a0532763d2bb91017a7e37", + "integrity": "sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.1.4", + "zip-stream": "^4.0.4" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + } + }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "requires": { + "tslib": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "aws-sdk": { + "version": "2.804.0", + "resolved": "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.804.0.tgz#ff7e6f91b86b4878ec69e3de895c10eb8203fc4b", + "integrity": "sha512-a02pZdjL06MunElAZPPEjpghOp/ZA+16f+t4imh1k9FCDpsNVQrT23HRq/PMvRADA5uZZRkYwX8r9o6oH/1RlA==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + } + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bl": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "cdk-assets": { + "version": "1.77.0", + "dev": true, + "requires": { + "@aws-cdk/cloud-assembly-schema": "1.77.0", + "@aws-cdk/cx-api": "1.77.0", + "archiver": "^5.1.0", + "aws-sdk": "^2.804.0", + "glob": "^7.1.6", + "yargs": "^16.2.0" + } + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, + "cli-color": { + "version": "0.1.7", + "resolved": "https://registry.yarnpkg.com/cli-color/-/cli-color-0.1.7.tgz#adc3200fa471cc211b0da7f566b71e98b9d67347", + "integrity": "sha1-rcMgD6RxzCEbDaf1ZrcemLnWc0c=", + "dev": true, + "requires": { + "es5-ext": "0.8.x" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "compress-commons": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.0.2.tgz#d6896be386e52f37610cef9e6fa5defc58c31bd7", + "integrity": "sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dev": true, + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "crc32-stream": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.1.tgz#0f047d74041737f8a55e86837a1b826bd8ab0067", + "integrity": "sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "dev": true + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "degenerator": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/degenerator/-/degenerator-2.2.0.tgz#49e98c11fa0293c5b26edfbb52f15729afcdb254", + "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", + "dev": true, + "requires": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "difflib": { + "version": "0.2.4", + "resolved": "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e", + "integrity": "sha1-teMDYabbAjF21WKJLbhZQKcY9H4=", + "dev": true, + "requires": { + "heap": ">= 0.2.0" + } + }, + "dreamopt": { + "version": "0.6.0", + "resolved": "https://registry.yarnpkg.com/dreamopt/-/dreamopt-0.6.0.tgz#d813ccdac8d39d8ad526775514a13dda664d6b4b", + "integrity": "sha1-2BPM2sjTnYrVJndVFKE92mZNa0s=", + "dev": true, + "requires": { + "wordwrap": ">=0.0.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "es5-ext": { + "version": "0.8.2", + "resolved": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.8.2.tgz#aba8d9e1943a895ac96837a62a39b3f55ecd94ab", + "integrity": "sha1-q6jZ4ZQ6iVrJaDemKjmz9V7NlKs=", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "dependencies": { + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-uri": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "heap": { + "version": "0.2.6", + "resolved": "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac", + "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "dev": true + }, + "json-diff": { + "version": "0.5.4", + "resolved": "https://registry.yarnpkg.com/json-diff/-/json-diff-0.5.4.tgz#7bc8198c441756632aab66c7d9189d365a7a035a", + "integrity": "sha512-q5Xmx9QXNOzOzIlMoYtLrLiu4Jl/Ce2bn0CNcv54PhyH89CI4GWlGVDye8ei2Ijt9R3U+vsWPsXpLUNob8bs8Q==", + "dev": true, + "requires": { + "cli-color": "~0.1.6", + "difflib": "~0.2.1", + "dreamopt": "~0.6.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "universalify": "^2.0.0" + } + }, + "jsonschema": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2", + "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==", + "dev": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "pac-proxy-agent": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz#66883eeabadc915fc5e95457324cb0f0ac78defb", + "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^4.1.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + } + }, + "pac-resolver": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-4.1.0.tgz#4b12e7d096b255a3b84e53f6831f32e9c7e5fe95", + "integrity": "sha512-d6lf2IrZJJ7ooVHr7BfwSjRO1yKSJMaiiWYSHcrxSIUtZrCa4KKGwcztdkZ/E9LFleJfjoi1yl+XLR7AX24nbQ==", + "dev": true, + "requires": { + "degenerator": "^2.2.0", + "ip": "^1.1.5", + "netmask": "^1.0.6" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promptly": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/promptly/-/promptly-3.2.0.tgz#a5517fbbf59bd31c1751d4e1d9bef1714f42b9d8", + "integrity": "sha512-WnR9obtgW+rG4oUV3hSnNGl1pHm3V1H/qD9iJBumGSmVsSC5HpZOLuu8qdMb6yCItGfT7dcRszejr/5P3i9Pug==", + "dev": true, + "requires": { + "read": "^1.0.4" + } + }, + "proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-4.0.0.tgz#a92976af3fbc7d846f2e850e2ac5ac6ca3fb74c7", + "integrity": "sha512-8P0Y2SkwvKjiGU1IkEfYuTteioMIDFxPL4/j49zzt5Mz3pG1KO+mIrDG1qH0PQUHTTczjwGcYl+EzfXiFj5vUQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^4.1.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "socks": { + "version": "2.5.0", + "resolved": "https://registry.yarnpkg.com/socks/-/socks-2.5.0.tgz#3a7c286db114f67864a4bd8b4207a91d1db3d6db", + "integrity": "sha512-00OqQHp5SCbwm9ecOMJj9aQtMSjwi1uVuGQoxnpKCS50VKZcOZ8z11CTKypmR8sEy7nZimy/qXY7rYJYbRlXmA==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "table": { + "version": "6.0.4", + "resolved": "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d", + "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + } + }, + "tar-stream": { + "version": "2.1.4", + "resolved": "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa", + "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "zip-stream": { + "version": "4.0.4", + "resolved": "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a", + "integrity": "sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.0.2", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + } + } + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + } + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001505", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001505.tgz", + "integrity": "sha512-jaAOR5zVtxHfL0NjZyflVTtXm3D3J9P15zSJ7HmQF8dSKGA6tqzQq+0ZI3xkjyQj46I4/M0K2GbMpcAFOcbr3A==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "constructs": { + "version": "3.4.329", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.329.tgz", + "integrity": "sha512-uj62KOOmaX6i10KcBLzXcXgcFRZpP+XoCiEqT8tg1zXIGSY3iQ6n6wzw/44laG9L4qrWvCtMna6wACW8CejKkQ==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "electron-to-chromium": { + "version": "1.4.434", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.434.tgz", + "integrity": "sha512-5Gvm09UZTQRaWrimRtWRO5rvaX6Kpk5WHAPKDa7A4Gj6NIPuJ8w8WNpnxCXdd+CJJt6RBU6tUw0KyULoW6XuHw==", + "dev": true + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true, + "optional": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "optional": true + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + } + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + } + }, + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + } + }, + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "optional": true + } + } + }, + "node-releases": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", + "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "ts-jest": { + "version": "26.5.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", + "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true + }, + "v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "word-wrap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/resources/cdk/javascript_example_code_transcribe_demo/package.json b/resources/cdk/javascript_example_code_transcribe_demo/package.json new file mode 100644 index 00000000000..f22cd5fbbd2 --- /dev/null +++ b/resources/cdk/javascript_example_code_transcribe_demo/package.json @@ -0,0 +1,29 @@ +{ + "name": "setup", + "version": "0.1.0", + "bin": { + "setup": "setup.js" + }, + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "jest", + "cdk": "cdk" + }, + "devDependencies": { + "@aws-cdk/assert": "1.79.0", + "@types/jest": "^26.0.10", + "@types/node": "10.17.27", + "aws-cdk": "1.77.0", + "jest": "^26.4.2", + "ts-jest": "^26.2.0", + "ts-node": "^9.0.0", + "typescript": "~3.9.7" + }, + "dependencies": { + "@aws-cdk/aws-cognito": "^1.204.0", + "@aws-cdk/aws-iam": "^1.204.0", + "@aws-cdk/core": "^1.204.0", + "source-map-support": "^0.5.16" + } +} diff --git a/resources/cdk/javascript_example_code_transcribe_demo/setup.ts b/resources/cdk/javascript_example_code_transcribe_demo/setup.ts new file mode 100644 index 00000000000..b03c0f6b773 --- /dev/null +++ b/resources/cdk/javascript_example_code_transcribe_demo/setup.ts @@ -0,0 +1,212 @@ +#!/usr/bin/env node +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// Purpose: This AWS Cloud Development Kit (AWS CDK) app +// creates the following AWS resources: +// +// This AWS CDK app creates the following resources: +// +// - An Amazon Cognito identity pool with an authenticated user role. +// - An IAM policy with permissions for the Amazon S3 and Amazon Transcribe is +// attached to the authenticated user role. +// - An Amazon Cognito user pool that enables users to sign up and sign in to the +// app. +// - An Amazon S3 bucket to host the application files. +// - An Amazon S3 bucket to to store the transcriptions. +// +// For instructions on how to run any of these apps, see +// https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/resources/cdk/README.md#Running-a-CDK-app + +import * as cdk from "@aws-cdk/core"; +import * as cognito from "@aws-cdk/aws-cognito"; +import * as iam from "@aws-cdk/aws-iam"; +import { Effect, PolicyStatement } from "@aws-cdk/aws-iam"; +import * as s3 from "@aws-cdk/aws-s3"; +import { + Bucket, + BucketAccessControl, + BlockPublicAccess, + BlockPublicAccessOptions, +} from "@aws-cdk/aws-s3"; + +export class SetupStackTranscription extends cdk.Stack { + constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { + super(scope, id, props); + + const transcriptionBucket = new Bucket(this, "transcriptions", { + enforceSSL: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + publicReadAccess: true, + accessControl: BucketAccessControl.PUBLIC_READ, + }); + + transcriptionBucket.addToResourcePolicy( + new iam.PolicyStatement({ + effect: Effect.ALLOW, + actions: ["*"], + resources: [transcriptionBucket.arnForObjects("*")], + principals: [new iam.AccountRootPrincipal()], + }) + ); + transcriptionBucket.grantPublicAccess("*", "s3:GetObject"); + transcriptionBucket.grantPublicAccess("*", "s3:PutObject"); + transcriptionBucket.grantPublicAccess("*", "s3:DeleteObject"); + + const cfnBucket = transcriptionBucket.node.findChild( + "Resource" + ) as s3.CfnBucket; + cfnBucket.addPropertyOverride("CorsConfiguration", { + CorsRules: [ + { + AllowedHeaders: ["*"], + AllowedMethods: ["GET", "POST", "PUT", "DELETE"], + AllowedOrigins: ["*"], + }, + ], + }); + + const appBucket = new s3.Bucket(this, "appbucket", { + enforceSSL: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + websiteIndexDocument: "index.html", + websiteErrorDocument: "index.html", + blockPublicAccess: { + blockPublicAcls: true, + blockPublicPolicy: false, + ignorePublicAcls: true, + restrictPublicBuckets: false, + }, + }); + appBucket.grantPublicAccess("*", "s3:GetObject"); + appBucket.grantPublicAccess("*", "s3:PutObject"); + + const randomUserPoolName = `ExampleUserPoolName-${Math.ceil( + Math.random() * 10 ** 10 + )}`; + + const myUserPool = new cognito.UserPool(this, "exampleuserpoolid", { + userPoolName: randomUserPoolName, + selfSignUpEnabled: true, + autoVerify: { + email: true, + }, + userVerification: { + emailSubject: "Verify your email for our awesome app!", + emailBody: + "Hello, Thanks for signing up to our awesome app! Your verification code is {####}", + smsMessage: + "Hello, Thanks for signing up to our awesome app! Your verification code is {####}", + }, + standardAttributes: { + email: { + required: true, + mutable: false, + }, + }, + }); + + const randomUserPoolClientName = `ExampleUserPoolName-${Math.ceil( + Math.random() * 10 ** 10 + )}`; + + const userPoolClient = new cognito.UserPoolClient( + this, + "ExampleUserPoolClient", + { + userPool: myUserPool, + userPoolClientName: randomUserPoolClientName, + oAuth: { + callbackUrls: [appBucket.urlForObject("index.html")], + }, + } + ); + + const randomDomain = `exampleuserpoolname-${Math.ceil( + Math.random() * 10 ** 10 + )}`; + + myUserPool.addDomain("CognitoDomain", { + cognitoDomain: { + domainPrefix: randomDomain, + }, + }); + + const myIdentityPool = new cognito.CfnIdentityPool( + this, + "ExampleIdentityPool", + { + allowUnauthenticatedIdentities: false, + cognitoIdentityProviders: [ + { + clientId: userPoolClient.userPoolClientId, + providerName: myUserPool.userPoolProviderName, + }, + ], + } + ); + const authenticatedRole = new iam.Role( + this, + "ExampleCognitoDefaultAuthenticatedRole", + { + assumedBy: new iam.FederatedPrincipal( + "cognito-identity.amazonaws.com", + { + StringEquals: { + "cognito-identity.amazonaws.com:aud": myIdentityPool.ref, + }, + "ForAnyValue:StringLike": { + "cognito-identity.amazonaws.com:amr": "authenticated", + }, + }, + "sts:AssumeRoleWithWebIdentity" + ), + } + ); + authenticatedRole.addToPolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: [ + "mobileanalytics:PutEvents", + "cognito-sync:*", + "cognito-identity:*", + ], + resources: ["*"], + }) + ); + + authenticatedRole.addToPolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: ["sns:*"], + resources: ["*"], + }) + ); + authenticatedRole.addToPolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: [ + "transcribe:StartTranscriptionJob", + "transcribe:GetTranscriptionJob", + ], + resources: ["*"], + }) + ); + const defaultPolicy = new cognito.CfnIdentityPoolRoleAttachment( + this, + "DefaultValid", + { + identityPoolId: myIdentityPool.ref, + roles: { + authenticated: authenticatedRole.roleArn, + }, + } + ); + } +} + +const stackName = "SetupStack"; + +const app = new cdk.App(); + +new SetupStackTranscription(app, stackName); diff --git a/resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json b/resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json new file mode 100644 index 00000000000..ec75123ce65 --- /dev/null +++ b/resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "lib": ["es2018"], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "typeRoots": ["./node_modules/@types"] + }, + "exclude": ["cdk.out"] +} diff --git a/resources/cdk/lambda_api_step_functions/cdk.json b/resources/cdk/lambda_api_step_functions/cdk.json new file mode 100644 index 00000000000..90acb5637f9 --- /dev/null +++ b/resources/cdk/lambda_api_step_functions/cdk.json @@ -0,0 +1,10 @@ +{ + "app": "npx ts-node --prefer-ts-exts setup.ts", + "context": { + "@aws-cdk/core:enableStackNameDuplicates": "true", + "aws-cdk:enableDiffNoFail": "true", + "@aws-cdk/core:stackRelativeExports": "true", + "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, + "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true + } +} diff --git a/resources/cdk/lambda_api_step_functions/package.json b/resources/cdk/lambda_api_step_functions/package.json new file mode 100644 index 00000000000..d968b45ddb7 --- /dev/null +++ b/resources/cdk/lambda_api_step_functions/package.json @@ -0,0 +1,30 @@ +{ + "name": "setup", + "version": "0.1.0", + "bin": { + "setup": "setup.js" + }, + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "jest", + "cdk": "cdk" + }, + "devDependencies": { + "@aws-cdk/assert": "1.87.1", + "@types/jest": "^26.0.10", + "@types/node": "10.17.27", + "aws-cdk": "1.87.1", + "jest": "^26.4.2", + "ts-jest": "^26.2.0", + "ts-node": "^9.0.0", + "typescript": "~3.9.7" + }, + "dependencies": { + "@aws-cdk/aws-lambda": "^1.87.1", + "@aws-cdk/aws-cognito": "^1.87.1", + "@aws-cdk/aws-iam": "^1.87.1", + "@aws-cdk/core": "^1.87.1", + "source-map-support": "^0.5.16" + } +} diff --git a/resources/cdk/lambda_api_step_functions/setup.ts b/resources/cdk/lambda_api_step_functions/setup.ts new file mode 100644 index 00000000000..a6dd76a5375 --- /dev/null +++ b/resources/cdk/lambda_api_step_functions/setup.ts @@ -0,0 +1,143 @@ +#!/usr/bin/env node +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import "source-map-support/register"; +import * as cdk from "@aws-cdk/core"; +import { CfnOutput } from "@aws-cdk/core"; +import * as cognito from "@aws-cdk/aws-cognito"; +import * as iam from "@aws-cdk/aws-iam"; +import { Effect, PolicyStatement } from "@aws-cdk/aws-iam"; + +export class stepfunctions extends cdk.Stack { + constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + + const myIdentityPool = new cognito.CfnIdentityPool( + this, + "ExampleIdentityPool", + { + allowUnauthenticatedIdentities: true, + } + ); + + const lambda_support_role = new iam.Role(this, "LambdaRole", { + assumedBy: new iam.FederatedPrincipal( + "cognito-identity.amazonaws.com", + { + StringEquals: { + "cognito-identity.amazonaws.com:aud": myIdentityPool.ref, + }, + "ForAnyValue:StringLike": { + "cognito-identity.amazonaws.com:amr": "unauthenticated", + }, + }, + "sts:AssumeRoleWithWebIdentity" + ), + }); + + lambda_support_role.assumeRolePolicy?.addStatements( + new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + principals: [new iam.ServicePrincipal("lambda.amazonaws.com")], + actions: ["sts:AssumeRole"], + }) + ); + + lambda_support_role.addToPolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: [ + "lambda:InvokeFunction", + "mobileanalytics:PutEvents", + "cognito-sync:*", + ], + resources: ["*"], + }) + ); + lambda_support_role.addToPolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: ["dynamodb:*"], + resources: ["*"], + }) + ); + lambda_support_role.addToPolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: ["ses:*"], + resources: ["*"], + }) + ); + const defaultPolicy = new cognito.CfnIdentityPoolRoleAttachment( + this, + "DefaultValid", + { + identityPoolId: myIdentityPool.ref, + roles: { + unauthenticated: lambda_support_role.roleArn, + }, + } + ); + const myIdentityPool_workflow = new cognito.CfnIdentityPool( + this, + "ExampleIdentityPoolWorkflow", + { + allowUnauthenticatedIdentities: true, + } + ); + const workflow_support_role = new iam.Role(this, "WorkflowRole", { + assumedBy: new iam.FederatedPrincipal( + "cognito-identity.amazonaws.com", + { + StringEquals: { + "cognito-identity.amazonaws.com:aud": myIdentityPool_workflow.ref, + }, + "ForAnyValue:StringLike": { + "cognito-identity.amazonaws.com:amr": "unauthenticated", + }, + }, + "sts:AssumeRoleWithWebIdentity" + ), + }); + workflow_support_role.assumeRolePolicy?.addStatements( + new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + principals: [new iam.ServicePrincipal("states.amazonaws.com")], + actions: ["sts:AssumeRole"], + }) + ); + + workflow_support_role.addToPolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: [ + "lambda:InvokeFunction", + "mobileanalytics:PutEvents", + "cognito-sync:*", + ], + resources: ["*"], + }) + ); + + const defaultPolicyworkflow = new cognito.CfnIdentityPoolRoleAttachment( + this, + "DefaultValidWorkflow", + { + identityPoolId: myIdentityPool_workflow.ref, + roles: { + unauthenticated: workflow_support_role.roleArn, + }, + } + ); + new CfnOutput(this, "Lambda support role", { + value: lambda_support_role.roleName, + }); + new CfnOutput(this, "Workflow support role", { + value: workflow_support_role.roleName, + }); + } +} + +const app = new cdk.App(); +new stepfunctions(app, "stepfunctions"); diff --git a/resources/cdk/lambda_api_step_functions/tsconfig.json b/resources/cdk/lambda_api_step_functions/tsconfig.json new file mode 100644 index 00000000000..ec75123ce65 --- /dev/null +++ b/resources/cdk/lambda_api_step_functions/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "lib": ["es2018"], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "typeRoots": ["./node_modules/@types"] + }, + "exclude": ["cdk.out"] +} From e575ff9b71b648df188afc327fd6af1d17c2de2e Mon Sep 17 00:00:00 2001 From: Laren-AWS <57545972+Laren-AWS@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:27:36 -0700 Subject: [PATCH 38/98] SOS: Recategorize examples REQUIRES TANDEM INTERNAL MERGE (#6754) * Recategorize Scenarios as Basics where appropriate. * Remove titles from Basics examples. * Refactor SOS templates for recategorization. * Add basics to WRITEME code and templates. * Run WRITEME for recategorization. * Update validate-doc-metadata to tagged release. --- .doc_gen/metadata/acm_metadata.yaml | 4 +- .doc_gen/metadata/aurora_metadata.yaml | 4 +- .doc_gen/metadata/auto-scaling_metadata.yaml | 4 +- .doc_gen/metadata/cloudwatch_metadata.yaml | 4 +- .doc_gen/metadata/cross_metadata.yaml | 34 +++++- .doc_gen/metadata/dynamodb_metadata.yaml | 4 +- .doc_gen/metadata/ec2_metadata.yaml | 4 +- .doc_gen/metadata/ecr_metadata.yaml | 4 +- .doc_gen/metadata/eventbridge_metadata.yaml | 4 +- .doc_gen/metadata/glue_metadata.yaml | 4 +- .doc_gen/metadata/iot_metadata.yaml | 6 +- .doc_gen/metadata/keyspaces_metadata.yaml | 4 +- .doc_gen/metadata/kinesis_metadata.yaml | 4 +- .doc_gen/metadata/kms_metadata.yaml | 10 +- .doc_gen/metadata/rds_metadata.yaml | 4 +- .doc_gen/metadata/redshift_metadata.yaml | 4 +- .../metadata/route53domains_metadata.yaml | 4 +- .doc_gen/metadata/s3_metadata.yaml | 4 +- .doc_gen/metadata/sfn_metadata.yaml | 4 +- .doc_gen/metadata/ssm_metadata.yaml | 4 +- .doc_gen/metadata/support_metadata.yaml | 4 +- .../zonbook/library_by_sdk_chapter.xml | 8 +- .../zonbook/library_by_service_chapter.xml | 51 ++------- .../zonbook/sdk_chapter_template.xml | 4 +- .../zonbook/service_chapter_template.xml | 58 ++-------- .doc_gen/templates/zonbook/utility/basics.xml | 68 ++++++++++++ .../templates/zonbook/utility/customs.xml | 22 ++++ .doc_gen/templates/zonbook/utility/hello.xml | 2 +- .doc_gen/templates/zonbook/utility/notes.xml | 21 ++-- .../templates/zonbook/utility/scenarios.xml | 28 +++++ .../zonbook/utility/sdk_api_examples.xml | 82 +++++--------- .../zonbook/utility/sdk_cross_examples.xml | 39 ------- .../zonbook/utility/sdk_examples.xml | 29 +++++ .../zonbook/utility/service_examples.xml | 3 +- .github/workflows/validate-doc-metadata.yml | 2 +- .tools/readmes/config.py | 2 + .tools/readmes/includes/code_examples.jinja2 | 8 ++ .../readmes/includes/run_instructions.jinja2 | 38 +++++++ .tools/readmes/render.py | 14 ++- .tools/readmes/scanner.py | 16 ++- aws-cli/bash-linux/dynamodb/README.md | 26 ++--- aws-cli/bash-linux/ec2/README.md | 26 ++--- aws-cli/bash-linux/s3/README.md | 26 ++--- cpp/example_code/aurora/README.md | 39 ++++--- cpp/example_code/dynamodb/README.md | 39 ++++--- cpp/example_code/glue/README.md | 48 +++------ cpp/example_code/iot/README.md | 27 +++-- cpp/example_code/lambda/README.md | 19 ++-- cpp/example_code/rds/README.md | 39 ++++--- cpp/example_code/rekognition/README.md | 19 +++- cpp/example_code/s3/README.md | 49 +++++---- cpp/example_code/ses/README.md | 19 +++- cpp/example_code/sns/README.md | 19 ++-- dotnetv3/Aurora/README.md | 37 ++++--- dotnetv3/AutoScaling/README.md | 56 +++++----- dotnetv3/CloudWatch/README.md | 26 ++--- dotnetv3/Comprehend/README.md | 17 ++- dotnetv3/EC2/README.md | 42 ++++---- dotnetv3/EventBridge/README.md | 26 ++--- dotnetv3/Glue/README.md | 28 ++--- dotnetv3/Keyspaces/README.md | 26 ++--- dotnetv3/Lambda/README.md | 43 ++++++-- dotnetv3/Polly/README.md | 17 ++- dotnetv3/RDS/README.md | 37 ++++--- dotnetv3/Rekognition/README.md | 29 ++++- dotnetv3/S3/README.md | 77 +++++++++---- dotnetv3/SES/README.md | 41 ++++++- dotnetv3/SNS/README.md | 33 ++++-- dotnetv3/SQS/README.md | 17 ++- dotnetv3/StepFunctions/README.md | 26 ++--- dotnetv3/Support/README.md | 26 ++--- dotnetv3/Translate/README.md | 29 ++++- dotnetv3/dynamodb/README.md | 53 ++++++--- gov2/aurora/README.md | 26 ++--- gov2/dynamodb/README.md | 20 ++-- gov2/rds/README.md | 26 ++--- gov2/s3/README.md | 45 ++++---- javascriptv3/example_code/dynamodb/README.md | 39 ++++--- javascriptv3/example_code/ec2/README.md | 42 ++++---- javascriptv3/example_code/glue/README.md | 26 ++--- javascriptv3/example_code/lambda/README.md | 19 ++-- javascriptv3/example_code/s3/README.md | 42 ++++---- javascriptv3/example_code/ses/README.md | 19 +++- javascriptv3/example_code/sfn/README.md | 19 +++- javascriptv3/example_code/support/README.md | 26 ++--- javav2/example_code/cloudwatch/README.md | 26 ++--- javav2/example_code/dynamodb/README.md | 20 ++-- javav2/example_code/ec2/README.md | 42 ++++---- javav2/example_code/ecr/README.md | 26 ++--- javav2/example_code/eventbridge/README.md | 20 ++-- javav2/example_code/glue/README.md | 26 ++--- javav2/example_code/iot/README.md | 26 ++--- javav2/example_code/keyspaces/README.md | 26 ++--- javav2/example_code/kms/README.md | 32 +++--- javav2/example_code/rds/README.md | 26 ++--- javav2/example_code/redshift/README.md | 26 ++--- javav2/example_code/s3/README.md | 42 ++++---- javav2/example_code/ssm/README.md | 26 ++--- javav2/example_code/support/README.md | 26 ++--- kotlin/services/cloudwatch/README.md | 26 ++--- kotlin/services/dynamodb/README.md | 20 ++-- kotlin/services/ec2/README.md | 26 ++--- kotlin/services/ecr/README.md | 26 ++--- kotlin/services/eventbridge/README.md | 26 ++--- kotlin/services/glue/README.md | 26 ++--- kotlin/services/iot/README.md | 26 ++--- kotlin/services/keyspaces/README.md | 26 ++--- kotlin/services/rds/README.md | 26 ++--- kotlin/services/s3/README.md | 42 ++++---- kotlin/services/support/README.md | 26 ++--- php/example_code/auto-scaling/README.md | 26 ++--- php/example_code/dynamodb/README.md | 39 ++++--- php/example_code/glue/README.md | 26 ++--- php/example_code/lambda/README.md | 19 ++-- php/example_code/s3/README.md | 49 +++++---- php/example_code/sns/README.md | 19 ++-- python/example_code/acm/README.md | 26 ++--- python/example_code/api-gateway/README.md | 61 +++++++++-- python/example_code/aurora/README.md | 53 ++++++--- python/example_code/auto-scaling/README.md | 56 +++++----- python/example_code/comprehend/README.md | 19 ++-- python/example_code/dynamodb/README.md | 101 +++++++++++++----- python/example_code/ec2/README.md | 54 +++++----- python/example_code/glue/README.md | 26 ++--- python/example_code/keyspaces/README.md | 26 ++--- python/example_code/lambda/README.md | 89 +++++++++++++-- python/example_code/rds/README.md | 39 ++++--- python/example_code/redshift/README.md | 26 ++--- python/example_code/rekognition/README.md | 33 ++++-- python/example_code/s3/README.md | 88 +++++++++++---- python/example_code/secretsmanager/README.md | 17 ++- python/example_code/ses/README.md | 47 ++++++-- python/example_code/sns/README.md | 19 ++-- python/example_code/sqs/README.md | 33 ++++-- python/example_code/ssm/README.md | 26 ++--- python/example_code/support/README.md | 26 ++--- python/example_code/textract/README.md | 33 +++++- ruby/example_code/dynamodb/README.md | 20 ++-- ruby/example_code/glue/README.md | 25 +++-- ruby/example_code/s3/README.md | 48 +++++---- rustv1/examples/aurora/README.md | 26 ++--- rustv1/examples/auto-scaling/README.md | 26 ++--- rustv1/examples/ec2/README.md | 26 ++--- rustv1/examples/glue/README.md | 26 ++--- rustv1/examples/s3/README.md | 42 ++++---- sap-abap/services/dyn/README.md | 26 ++--- sap-abap/services/kinesis/README.md | 26 ++--- sap-abap/services/s3/README.md | 26 ++--- swift/example_code/s3/README.md | 26 ++--- 149 files changed, 2539 insertions(+), 1613 deletions(-) create mode 100644 .doc_gen/templates/zonbook/utility/basics.xml create mode 100644 .doc_gen/templates/zonbook/utility/customs.xml create mode 100644 .doc_gen/templates/zonbook/utility/scenarios.xml delete mode 100644 .doc_gen/templates/zonbook/utility/sdk_cross_examples.xml create mode 100644 .doc_gen/templates/zonbook/utility/sdk_examples.xml diff --git a/.doc_gen/metadata/acm_metadata.yaml b/.doc_gen/metadata/acm_metadata.yaml index b830859ed95..679119fc936 100644 --- a/.doc_gen/metadata/acm_metadata.yaml +++ b/.doc_gen/metadata/acm_metadata.yaml @@ -264,14 +264,12 @@ acm_UpdateCertificateOptions: services: acm: {UpdateCertificateOptions} acm_Usage_ImportListRemove: - title: Manage &ACM; certificates using an &AWS; SDK - title_abbrev: Manage certificates synopsis_list: - Request a certificate from &ACM;. - Import a self-signed certificate. - List and describe certificates. - Remove certificates. - category: Scenarios + category: Basics languages: Python: versions: diff --git a/.doc_gen/metadata/aurora_metadata.yaml b/.doc_gen/metadata/aurora_metadata.yaml index 9fdafe24fef..013dd57fef7 100644 --- a/.doc_gen/metadata/aurora_metadata.yaml +++ b/.doc_gen/metadata/aurora_metadata.yaml @@ -1093,14 +1093,12 @@ aurora_DeleteDBInstance: services: aurora: {DeleteDBInstance} aurora_Scenario_GetStartedClusters: - title: Get started with &AUR; DB clusters using an &AWS; SDK - title_abbrev: Get started with DB clusters synopsis_list: - Create a custom &AUR; DB cluster parameter group and set parameter values. - Create a DB cluster that uses the parameter group. - Create a DB instance that contains a database. - Take a snapshot of the DB cluster, then clean up resources. - category: Scenarios + category: Basics languages: .NET: versions: diff --git a/.doc_gen/metadata/auto-scaling_metadata.yaml b/.doc_gen/metadata/auto-scaling_metadata.yaml index c98b7f80415..2b130d98922 100644 --- a/.doc_gen/metadata/auto-scaling_metadata.yaml +++ b/.doc_gen/metadata/auto-scaling_metadata.yaml @@ -756,8 +756,6 @@ auto-scaling_AttachLoadBalancerTargetGroups: services: auto-scaling: {AttachLoadBalancerTargetGroups} auto-scaling_Scenario_GroupsAndInstances: - title: Manage &AS; groups and instances using an &AWS; SDK - title_abbrev: Manage groups and instances synopsis_list: - Create an &ASlong; group with a launch template and Availability Zones, and get information about running instances. - Enable &CWlong; metrics collection. @@ -765,7 +763,7 @@ auto-scaling_Scenario_GroupsAndInstances: - Terminate an instance in the group. - List scaling activities that occur in response to user requests and capacity changes. - Get statistics for &CW; metrics, then clean up resources. - category: Scenarios + category: Basics languages: .NET: versions: diff --git a/.doc_gen/metadata/cloudwatch_metadata.yaml b/.doc_gen/metadata/cloudwatch_metadata.yaml index f8ae51773c5..e79cea8f9c0 100644 --- a/.doc_gen/metadata/cloudwatch_metadata.yaml +++ b/.doc_gen/metadata/cloudwatch_metadata.yaml @@ -1026,8 +1026,6 @@ cloudwatch_PutMetricData: services: cloudwatch: {PutMetricData} cloudwatch_GetStartedMetricsDashboardsAlarms: - title: Get started with &CW; metrics, dashboards, and alarms using an &AWS; SDK - title_abbrev: Get started with metrics, dashboards, and alarms synopsis_list: - List &CW; namespaces and metrics. - Get statistics for a metric and for estimated billing. @@ -1036,7 +1034,7 @@ cloudwatch_GetStartedMetricsDashboardsAlarms: - Create and trigger an alarm, then view alarm history. - Add an anomaly detector. - Get a metric image, then clean up resources. - category: Scenarios + category: Basics languages: Kotlin: versions: diff --git a/.doc_gen/metadata/cross_metadata.yaml b/.doc_gen/metadata/cross_metadata.yaml index 42754363502..b4d9c7f8fc3 100644 --- a/.doc_gen/metadata/cross_metadata.yaml +++ b/.doc_gen/metadata/cross_metadata.yaml @@ -3,7 +3,7 @@ cross_MessageProcessingFrameworkTutorial: title: Use the &AWS; Message Processing Framework for .NET to publish and receive &SQS; messages title_abbrev: Use the &AWS; Message Processing Framework for .NET with &SQS; synopsis: create applications that publish and receive &SQS; messages using the &AWS; Message Processing Framework for .NET. - category: Cross-service examples + category: Scenarios languages: .NET: versions: @@ -18,6 +18,7 @@ cross_FSA: title_abbrev: Create an application to analyze customer feedback synopsis: create an application that analyzes customer comment cards, translates them from their original language, determines their sentiment, and generates an audio file from the translated text. + category: Scenarios languages: .NET: versions: @@ -47,6 +48,7 @@ cross_PAM: title: Create a photo asset management application that lets users manage photos using labels title_abbrev: Create a serverless application to manage photos synopsis: create a serverless application that lets users manage photos using labels. + category: Scenarios languages: Java: versions: @@ -91,6 +93,7 @@ cross_RedshiftDataTracker: title: Create an &RSlong; item tracker title_abbrev: Create a web application to track &RS; data synopsis: create a web application that tracks and reports on work items using an &RSlong; database. + category: Scenarios languages: Java: versions: @@ -108,6 +111,7 @@ cross_SQSMessageApp: title: Create a web application that sends and retrieves messages by using &SQS; title_abbrev: Create a messaging application synopsis: create a messaging application by using &SQS;. + category: Scenarios languages: Kotlin: versions: @@ -126,6 +130,7 @@ cross_RDSDataTracker: title_abbrev: Create an &AUR; Serverless work item tracker synopsis: create a web application that tracks work items in an &AURlong; Serverless database and uses &SESlong; (&SES;) to send reports. + category: Scenarios languages: .NET: versions: @@ -168,6 +173,7 @@ cross_SnsPublishSubscription: title: Build a publish and subscription application that translates messages title_abbrev: Building an &SNS; application synopsis: create an application that has subscription and publish functionality and translates messages. + category: Scenarios languages: Kotlin: versions: @@ -190,6 +196,7 @@ cross_LexChatbotLanguages: title: Create an &LEX2; chatbot to engage your website visitors title_abbrev: Building an &LEX2; chatbot synopsis: create a chatbot to engage your website visitors. + category: Scenarios languages: Java: versions: @@ -208,6 +215,7 @@ cross_DynamoDBDataTracker: title: Create a web application to track &DDB; data title_abbrev: Create a web application to track &DDB; data synopsis: create a web application that tracks work items in an &DDBlong; table and uses &SESlong; (&SES;) to send reports. + category: Scenarios languages: Java: versions: @@ -240,6 +248,7 @@ cross_ApiGatewayDataTracker: title_abbrev: Create a REST API to track COVID-19 data synopsis: create a REST API that simulates a system to track daily cases of COVID-19 in the United States, using fictional data. + category: Scenarios languages: Python: versions: @@ -256,6 +265,7 @@ cross_ApiGatewayWebsocketChat: title: Create a websocket chat application with &ABP; title_abbrev: Create a websocket chat application synopsis: create a chat application that is served by a websocket API built on &ABPlong;. + category: Scenarios languages: Python: versions: @@ -272,6 +282,7 @@ cross_AuroraRestLendingLibrary: title_abbrev: Create a lending library REST API synopsis: create a lending library where patrons can borrow and return books by using a REST API backed by an &AURlong; database. + category: Scenarios languages: Python: versions: @@ -288,6 +299,7 @@ cross_StepFunctionsMessenger: title: Create a messenger application with &SFN; title_abbrev: Create a messenger application synopsis: create an &SFNlong; messenger application that retrieves message records from a database table. + category: Scenarios languages: Python: versions: @@ -304,6 +316,7 @@ cross_TextractExplorer: title: Create an &TEXTRACT; explorer application title_abbrev: Create an &TEXTRACT; explorer application synopsis: explore &TEXTRACTlong; output through an interactive application. + category: Scenarios languages: JavaScript: versions: @@ -326,7 +339,7 @@ cross_TextractComprehendDetectEntities: title: Detect entities in text extracted from an image using an &AWS; SDK title_abbrev: Detect entities in text extracted from an image synopsis: use &CMP; to detect entities in text extracted by &TEXTRACT; from an image that is stored in &S3;. - category: + category: Scenarios languages: Python: versions: @@ -342,6 +355,7 @@ cross_SubmitDataApp: title: Build an application to submit data to a &DDB; table title_abbrev: Build an app to submit data to a &DDB; table synopsis: build an application that submits data to an &DDBlong; table and notifies you when a user updates the table. + category: Scenarios languages: Kotlin: versions: @@ -363,6 +377,7 @@ cross_LambdaAPIGateway: title: Use &ABP; to invoke a &LAM; function title_abbrev: Use &ABP; to invoke a &LAM; function synopsis: create an &LAMlong; function invoked by &ABPlong;. + category: Scenarios languages: Java: versions: @@ -391,6 +406,7 @@ cross_LambdaScheduledEvents: title: Use scheduled events to invoke a &LAM; function title_abbrev: Use scheduled events to invoke a &LAM; function synopsis: create an &LAMlong; function invoked by an &EVlong; scheduled event. + category: Scenarios languages: Java: versions: @@ -421,6 +437,7 @@ cross_ServerlessWorkflows: title: Use &SFN; to invoke &LAM; functions title_abbrev: Use &SFN; to invoke &LAM; functions synopsis: create an &SFNlong; state machine that invokes &LAMlong; functions in sequence. + category: Scenarios languages: Java: versions: @@ -441,6 +458,7 @@ cross_TranscriptionApp: title: Build an &TSC; app title_abbrev: Build an &TSC; app synopsis: use &TSClong; to transcribe and display voice recordings in the browser. + category: Scenarios languages: JavaScript: versions: @@ -455,6 +473,7 @@ cross_TranscriptionStreamingApp: title: Build an &TSC; streaming app title_abbrev: Build an &TSC; streaming app synopsis: build an app that records, transcribes, and translates live audio in real-time, and emails the results. + category: Scenarios languages: JavaScript: versions: @@ -470,6 +489,7 @@ cross_RekognitionPhotoAnalyzerPPE: title: Detect PPE in images with &REK; using an &AWS; SDK title_abbrev: Detect PPE in images synopsis: build an app that uses &REK; to detect Personal Protective Equipment (PPE) in images. + category: Scenarios languages: Java: versions: @@ -489,6 +509,7 @@ cross_RekognitionPhotoAnalyzer: title: Detect objects in images with &REK; using an &AWS; SDK title_abbrev: Detect objects in images synopsis: build an app that uses &REK; to detect objects by category in images. + category: Scenarios languages: Kotlin: versions: @@ -521,7 +542,7 @@ cross_RekognitionVideoDetection: title: Detect people and objects in a video with &REK; using an &AWS; SDK title_abbrev: Detect people and objects in a video synopsis: detect people and objects in a video with &REK;. - category: Cross-service examples + category: Scenarios languages: Java: versions: @@ -555,6 +576,7 @@ cross_DetectFaces: - Save an image in an &S3; bucket. - Use &REKlong; to detect facial details, such as age range, gender, and emotion (such as smiling). - Display those details. + category: Scenarios languages: Rust: versions: @@ -572,6 +594,7 @@ cross_DetectLabels: - Upload the image file to an &S3; bucket. - Use &REKlong; to identify the three top attributes (labels) in the file. - Add the EXIF and label information to an &DDBlong; table in the Region. + category: Scenarios languages: Rust: versions: @@ -590,6 +613,7 @@ cross_Telephone: - Upload the audio file to an &S3; bucket. - Use &TSClong; to convert the audio file to text. - Display the text. + category: Scenarios languages: Rust: versions: @@ -604,6 +628,7 @@ cross_LambdaForBrowser: title: Invoke a &LAM; function from a browser title_abbrev: Invoke a &LAM; function from a browser synopsis: invoke an &LAMlong; function from a browser. + category: Scenarios languages: JavaScript: versions: @@ -780,7 +805,7 @@ cross_ServerlessS3DataTransformation: title: Transform data for your application with S3 Object Lambda title_abbrev: Transform data with S3 Object Lambda synopsis: transform data for your application with S3 Object Lambda. - category: Cross-service examples + category: Scenarios languages: .NET: versions: @@ -929,6 +954,7 @@ cross_MonitorDynamoDB: title: Monitor performance of &DDBlong; using an &AWS; SDK title_abbrev: Monitor &DDB; performance synopsis: configure an application's use of &DDB; to monitor performance. + category: Scenarios languages: Java: versions: diff --git a/.doc_gen/metadata/dynamodb_metadata.yaml b/.doc_gen/metadata/dynamodb_metadata.yaml index 136b37caa6e..fc2f262668b 100644 --- a/.doc_gen/metadata/dynamodb_metadata.yaml +++ b/.doc_gen/metadata/dynamodb_metadata.yaml @@ -1804,8 +1804,6 @@ dynamodb_Usage_DaxDemo: services: dynamodb: {CreateTable, PutItem, GetItem, Query, Scan, DeleteTable} dynamodb_Scenario_GettingStartedMovies: - title: Get started with &DDB; tables, items, and queries using an &AWS; SDK - title_abbrev: Get started with tables, items, and queries synopsis_list: - Create a table that can hold movie data. - Put, get, and update a single movie in the table. @@ -1813,7 +1811,7 @@ dynamodb_Scenario_GettingStartedMovies: - Query for movies that were released in a given year. - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - category: Scenarios + category: Basics languages: .NET: versions: diff --git a/.doc_gen/metadata/ec2_metadata.yaml b/.doc_gen/metadata/ec2_metadata.yaml index 90dae3c3b4f..adeaa9a12ef 100644 --- a/.doc_gen/metadata/ec2_metadata.yaml +++ b/.doc_gen/metadata/ec2_metadata.yaml @@ -2150,15 +2150,13 @@ ec2_DescribeSubnets: services: ec2: {DescribeSubnets} ec2_Scenario_GetStartedInstances: - title: Get started with &EC2; instances using an &AWS; SDK - title_abbrev: Get started with instances synopsis_list: - Create a key pair and security group. - Select an Amazon Machine Image (AMI) and compatible instance type, then create an instance. - Stop and restart the instance. - Associate an Elastic IP address with your instance. - Connect to your instance with SSH, then clean up resources. - category: Scenarios + category: Basics languages: .NET: versions: diff --git a/.doc_gen/metadata/ecr_metadata.yaml b/.doc_gen/metadata/ecr_metadata.yaml index 47074fbd29f..8604aa43d0f 100644 --- a/.doc_gen/metadata/ecr_metadata.yaml +++ b/.doc_gen/metadata/ecr_metadata.yaml @@ -246,8 +246,6 @@ ecr_ListImages: services: ecr: {ListImages} ecr_Scenario_RepositoryManagement: - title: Learn core operations for &ECR; using an &AWS; SDK - title_abbrev: Learn &ECR; core operations synopsis_list: - Create an &ECR; repository. - Set repository policies. @@ -258,7 +256,7 @@ ecr_Scenario_RepositoryManagement: - Verify the existence of an image in an &ECR; repository. - List &ECR; repositories for your account and get details about them. - Delete &ECR; repositories. - category: Scenarios + category: Basics languages: Kotlin: versions: diff --git a/.doc_gen/metadata/eventbridge_metadata.yaml b/.doc_gen/metadata/eventbridge_metadata.yaml index cfa506a8876..5cce9cb323d 100644 --- a/.doc_gen/metadata/eventbridge_metadata.yaml +++ b/.doc_gen/metadata/eventbridge_metadata.yaml @@ -478,14 +478,12 @@ eventbridge_RemoveTargets: services: eventbridge: {RemoveTargets} eventbridge_Scenario_GettingStarted: - title: Get started with &EV; rules and targets using an &AWS; SDK - title_abbrev: Get started with rules and targets synopsis_list: - Create a rule and add a target to it. - Enable and disable rules. - List and update rules and targets. - Send events, then clean up resources. - category: Scenarios + category: Basics languages: Kotlin: versions: diff --git a/.doc_gen/metadata/glue_metadata.yaml b/.doc_gen/metadata/glue_metadata.yaml index 8be0db4bc50..ed2c3ca45c9 100644 --- a/.doc_gen/metadata/glue_metadata.yaml +++ b/.doc_gen/metadata/glue_metadata.yaml @@ -1120,15 +1120,13 @@ glue_GetJob: services: glue: {GetJob} glue_Scenario_GetStartedCrawlersJobs: - title: Get started running &GLU; crawlers and jobs using an &AWS; SDK - title_abbrev: Get started with crawlers and jobs synopsis_list: - Create a crawler that crawls a public &S3; bucket and generates a database of CSV-formatted metadata. - List information about databases and tables in your &GLUDCLong;. - Create a job to extract CSV data from the S3 bucket, transform the data, and load JSON-formatted output into another S3 bucket. - List information about job runs, view transformed data, and clean up resources. - category: Scenarios + category: Basics guide_topic: title: 'Tutorial: Getting started with &GLU; Studio' url: glue/latest/ug/tutorial-create-job.html diff --git a/.doc_gen/metadata/iot_metadata.yaml b/.doc_gen/metadata/iot_metadata.yaml index cdafecc3503..8c75fada4d3 100644 --- a/.doc_gen/metadata/iot_metadata.yaml +++ b/.doc_gen/metadata/iot_metadata.yaml @@ -429,10 +429,8 @@ iot_CreateThing: services: iot: {CreateThing} iot_Scenario: - title: Work with &IoT; devices, things, and shadows using &IoT; SDK - title_abbrev: Work with device management use cases - synopsis: work with &IoT; device management use cases using &IoT; SDK - category: Scenarios + synopsis: work with &IoT; device management. + category: Basics languages: Kotlin: versions: diff --git a/.doc_gen/metadata/keyspaces_metadata.yaml b/.doc_gen/metadata/keyspaces_metadata.yaml index 0e466ce9044..5b8f25db809 100644 --- a/.doc_gen/metadata/keyspaces_metadata.yaml +++ b/.doc_gen/metadata/keyspaces_metadata.yaml @@ -453,15 +453,13 @@ keyspaces_DeleteKeyspace: services: keyspaces: {DeleteKeyspace} keyspaces_Scenario_GetStartedKeyspaces: - title: Get started with &KEY; keyspaces and tables using an &AWS; SDK - title_abbrev: Get started with keyspaces and tables synopsis_list: - Create a keyspace and table. The table schema holds movie data and has point-in-time recovery enabled. - Connect to the keyspace using a secure TLS connection with SigV4 authentication. - Query the table. Add, retrieve, and update movie data. - Update the table. Add a column to track watched movies. - Restore the table to its previous state and clean up resources. - category: Scenarios + category: Basics languages: .NET: versions: diff --git a/.doc_gen/metadata/kinesis_metadata.yaml b/.doc_gen/metadata/kinesis_metadata.yaml index 723b2b91981..5aa20bc77a4 100644 --- a/.doc_gen/metadata/kinesis_metadata.yaml +++ b/.doc_gen/metadata/kinesis_metadata.yaml @@ -297,13 +297,11 @@ kinesis_AddTagsToStream: services: kinesis: {AddTagsToStream} kinesis_Scenario_GettingStarted: - title: Get started with basic &AK; data stream operations using an &AWS; SDK - title_abbrev: Get started with data streams synopsis_list: - Create a stream and put a record in it. - Create a shard iterator. - Read the record, then clean up resources. - category: Scenarios + category: Basics languages: SAP ABAP: versions: diff --git a/.doc_gen/metadata/kms_metadata.yaml b/.doc_gen/metadata/kms_metadata.yaml index e71cf7d551b..a3dcaacb0db 100644 --- a/.doc_gen/metadata/kms_metadata.yaml +++ b/.doc_gen/metadata/kms_metadata.yaml @@ -1,8 +1,8 @@ # zexi 0.4.0 kms_Hello: - title: Hello &kms-key; - title_abbrev: Hello &kms-key; - synopsis: get started using &kms-key;. + title: Hello &KMS; + title_abbrev: Hello &KMS; + synopsis: get started using &KMS;. category: Hello languages: Java: @@ -785,8 +785,6 @@ kms_Scenario_KeyManagement: services: kms: {CreateKey, ListKeys, DescribeKey, GenerateDataKey, EnableKey, DisableKey, ScheduleKeyDeletion} kms_Scenario_Basics: - title: Learn core operations for &kms-key; using an &AWS; SDK - title_abbrev: Learn &kms-key; core operations synopsis_list: - Create a &kms-key;. - List &kms-keys; for your account and get details about them. @@ -795,7 +793,7 @@ kms_Scenario_Basics: - Generate an asymmetric key used to digitally sign data. - Tag keys. - Delete &kms-keys;. - category: Scenarios + category: Basics languages: Java: versions: diff --git a/.doc_gen/metadata/rds_metadata.yaml b/.doc_gen/metadata/rds_metadata.yaml index c444640635a..d47b0ca4471 100644 --- a/.doc_gen/metadata/rds_metadata.yaml +++ b/.doc_gen/metadata/rds_metadata.yaml @@ -849,14 +849,12 @@ rds_GenerateRDSAuthToken: services: rds: {GenerateRDSAuthToken} rds_Scenario_GetStartedInstances: - title: Get started with &RDS; DB instances using an &AWS; SDK - title_abbrev: Get started with DB instances synopsis_list: - Create a custom DB parameter group and set parameter values. - Create a DB instance that's configured to use the parameter group. The DB instance also contains a database. - Take a snapshot of the instance. - Delete the instance and parameter group. - category: Scenarios + category: Basics languages: Kotlin: versions: diff --git a/.doc_gen/metadata/redshift_metadata.yaml b/.doc_gen/metadata/redshift_metadata.yaml index 39334703df7..8d7809cf5cf 100644 --- a/.doc_gen/metadata/redshift_metadata.yaml +++ b/.doc_gen/metadata/redshift_metadata.yaml @@ -320,10 +320,8 @@ redshift_CreateTable: services: redshift: {CreateTable} redshift_Scenario: - title: Get started with &RS; tables, items, and queries - title_abbrev: Get started with &RS; synopsis: work with &RS; tables, items, and queries. - category: Scenarios + category: Basics languages: Java: versions: diff --git a/.doc_gen/metadata/route53domains_metadata.yaml b/.doc_gen/metadata/route53domains_metadata.yaml index 9317c948877..128ca69a4d3 100644 --- a/.doc_gen/metadata/route53domains_metadata.yaml +++ b/.doc_gen/metadata/route53domains_metadata.yaml @@ -344,8 +344,6 @@ route-53-domains_ViewBilling: services: route-53-domains: {ViewBilling} route-53-domains_Scenario_GetStartedRoute53Domains: - title: Get started with &R53DR; using an &AWS; SDK - title_abbrev: Get started with domains synopsis_list: - List current domains, and list operations in the past year. - View billing for the past year, and view prices for domain types. @@ -354,7 +352,7 @@ route-53-domains_Scenario_GetStartedRoute53Domains: - Optionally, request a domain registration. - Get an operation detail. - Optionally, get a domain detail. - category: Scenarios + category: Basics languages: Kotlin: versions: diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index d319a28e7e2..100da914af6 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -2785,15 +2785,13 @@ s3_GetBucketLocation: services: s3: {GetBucketLocation} s3_Scenario_GettingStarted: - title: Get started with &S3; buckets and objects using an &AWS; SDK - title_abbrev: Get started with buckets and objects synopsis_list: - Create a bucket and upload a file to it. - Download an object from a bucket. - Copy an object to a subfolder in a bucket. - List the objects in a bucket. - Delete the bucket objects and the bucket. - category: Scenarios + category: Basics languages: .NET: versions: diff --git a/.doc_gen/metadata/sfn_metadata.yaml b/.doc_gen/metadata/sfn_metadata.yaml index a61d676f7b1..2b512cfd32f 100644 --- a/.doc_gen/metadata/sfn_metadata.yaml +++ b/.doc_gen/metadata/sfn_metadata.yaml @@ -533,14 +533,12 @@ sfn_DeleteActivity: services: sfn: {DeleteActivity} sfn_Scenario_GetStartedStateMachines: - title: Get started with &SFN; state machines using an &AWS; SDK - title_abbrev: Get started with state machines synopsis_list: - Create an activity. - Create a state machine from an &SLN; definition that contains the previously created activity as a step. - Run the state machine and respond to the activity with user input. - Get the final status and output after the run completes, then clean up resources. - category: Scenarios + category: Basics languages: Kotlin: versions: diff --git a/.doc_gen/metadata/ssm_metadata.yaml b/.doc_gen/metadata/ssm_metadata.yaml index 8de1d8e474c..950d539b347 100644 --- a/.doc_gen/metadata/ssm_metadata.yaml +++ b/.doc_gen/metadata/ssm_metadata.yaml @@ -313,10 +313,8 @@ ssm_UpdateOpsItem: services: ssm: {UpdateOpsItem} ssm_Scenario: - title: Get started with &SYS; using an &AWS; SDK - title_abbrev: Get started with &SYS; synopsis: work with &SYS; maintenance windows, documents, and OpsItems. - category: Scenarios + category: Basics languages: Java: versions: diff --git a/.doc_gen/metadata/support_metadata.yaml b/.doc_gen/metadata/support_metadata.yaml index 2281452de32..323774d5274 100644 --- a/.doc_gen/metadata/support_metadata.yaml +++ b/.doc_gen/metadata/support_metadata.yaml @@ -482,8 +482,6 @@ support_ResolveCase: services: support: {ResolveCase} support_Scenario_GetStartedSupportCases: - title: Get started with &SUP; cases using an &AWS; SDK - title_abbrev: Get started with cases synopsis_list: - Get and display available services and severity levels for cases. - Create a support case using a selected service, category, and severity level. @@ -492,7 +490,7 @@ support_Scenario_GetStartedSupportCases: - Describe the new attachment and communication for the case. - Resolve the case. - Get and display a list of resolved cases for the current day. - category: Scenarios + category: Basics languages: Kotlin: versions: diff --git a/.doc_gen/templates/zonbook/library_by_sdk_chapter.xml b/.doc_gen/templates/zonbook/library_by_sdk_chapter.xml index dce6641fd5d..e6e59e08582 100644 --- a/.doc_gen/templates/zonbook/library_by_sdk_chapter.xml +++ b/.doc_gen/templates/zonbook/library_by_sdk_chapter.xml @@ -17,7 +17,7 @@ The following code examples show you how to use &AWS-services; with an &AWS; software development kit (SDK). This section is organized by SDK language. - {{- template "note_example_types" makeSlice 1 1 1}} + {{- template "note_example_types" makeSlice 1 1 1 1}} More resources @@ -64,7 +64,7 @@ The following code examples show you how to use the {{$sdk_examples.SdkEntity.Long}} with &AWS;. - {{- template "note_example_types" makeSlice 1 1 1}} + {{- template "note_example_types" makeSlice 1 1 1 1}} More resources @@ -97,9 +97,7 @@ - Examples - {{- template "sdk_api_examples" makeSlice $sdk_examples $sdk_ver}} - {{- template "sdk_cross_examples" makeSlice $sdk_examples $sdk_ver}} + {{- template "sdk_api_examples" makeSlice $sdk_examples $sdk_ver}} {{- end}} {{- end}} diff --git a/.doc_gen/templates/zonbook/library_by_service_chapter.xml b/.doc_gen/templates/zonbook/library_by_service_chapter.xml index 78337ee75d4..2bac0577b37 100644 --- a/.doc_gen/templates/zonbook/library_by_service_chapter.xml +++ b/.doc_gen/templates/zonbook/library_by_service_chapter.xml @@ -14,7 +14,7 @@ The following code examples show you how to use &AWS-services; with an &AWS; software development kit (SDK). This section is organized by &AWS-service;. - {{- template "note_example_types" makeSlice 1 1 1}} + {{- template "note_example_types" makeSlice 1 1 1 1}} More resources @@ -38,6 +38,10 @@ Code examples {{- range $svc_sort, $service := .}} + {{- $hello := index $service.CategorizedExampleSets "Hello"}} + {{- $basics := index $service.CategorizedExampleSets "Basics"}} + {{- $actions := index $service.CategorizedExampleSets "Actions"}} + {{- $scenarios := index $service.CategorizedExampleSets "Scenarios"}} {{- $section_id := printf "%s_code_examples" $service.Model}}
@@ -48,10 +52,7 @@ The following code examples show you how to use {{$service.ServiceEntity.Long}} with an &AWS; software development kit (SDK). - {{- $cross_service := index $service.CategorizedExampleSets "Cross-service examples"}} - {{- $scenarios := index $service.CategorizedExampleSets "Scenarios"}} - {{- $actions := index $service.CategorizedExampleSets "Actions"}} - {{- template "note_example_types" makeSlice $actions.Examples $scenarios.Examples $cross_service.Examples}} + {{- template "note_example_types" makeSlice $hello.Examples $basics.Examples $actions.Examples $scenarios.Examples}} More resources @@ -67,43 +68,9 @@ {{- template "hello" makeSlice $service.CategorizedExampleSets "" $service.Model}} Code examples - {{- range $category := $service.CategoryNamesSorted}} - {{- if ne $category "Hello"}} - {{- with $cat_examples := index $service.CategorizedExampleSets $category}} -
- - {{$cat_examples.CategoryName}} for {{$service.ServiceEntity.Short}} using &AWS; SDKs - {{$cat_examples.CategoryName}} - - The following code examples show how to use {{$service.ServiceEntity.Short}} with &AWS; SDKs. - - - {{- $category_desc := ""}} - {{- if eq $cat_examples.CategoryName "Cross-service examples"}} - {{- $category_desc = " Each example contains a sample application that works across multiple &AWS-services;."}} - {{- else if eq $cat_examples.CategoryName "Scenarios"}} - {{- $category_desc = " Each example shows you how to accomplish a specific task by calling multiple functions within the same service."}} - {{- else if eq $cat_examples.CategoryName "Actions"}} - {{- $category_desc = " Each example calls an individual service function."}} - {{- end}} - The following code examples show how to use {{$service.ServiceEntity.Long}} with &AWS; SDKs.{{$category_desc}} - {{- if eq $cat_examples.CategoryName "Actions"}} - {{- $cat_scenarios := index $service.CategorizedExampleSets "Scenarios"}} - {{- $cat_id_suffix := $cat_scenarios.CategoryIdSuffix}} - {{- if $cat_id_suffix}} - Action examples are code excerpts from larger programs and must be run in context. You can see actions in context in - . - {{- end}} - {{- else if eq $cat_examples.CategoryName "Scenarios"}} - Scenarios target an intermediate level of experience to help you understand service actions in context. - {{- else if eq $cat_examples.CategoryName "Cross-service examples"}} - Cross-service examples target an advanced level of experience to help you start building applications. - {{- end}} - {{- template "service_examples" makeSlice $cat_examples $service 1}} -
- {{- end}} - {{- end}} - {{- end}} + {{- template "basics" makeSlice $service $section_id 1}} + {{- template "scenarios" makeSlice $service $section_id 1}} + {{- template "customs" makeSlice $service $section_id 1}}
{{- end}} diff --git a/.doc_gen/templates/zonbook/sdk_chapter_template.xml b/.doc_gen/templates/zonbook/sdk_chapter_template.xml index 3c26127f9c5..40d0c407771 100644 --- a/.doc_gen/templates/zonbook/sdk_chapter_template.xml +++ b/.doc_gen/templates/zonbook/sdk_chapter_template.xml @@ -24,10 +24,8 @@ The code examples in this topic show you how to use the {{.SdkEntity.Long}} with &AWS;. - {{- template "note_example_types" makeSlice 1 1 1}} - Examples + {{- template "note_example_types" makeSlice 1 1 1 1}} {{- template "sdk_api_examples" makeSlice . .LanguageSlug}} - {{- template "sdk_cross_examples" makeSlice . .LanguageSlug}} {{- if eq .OutputType "section" }} {{- else }} diff --git a/.doc_gen/templates/zonbook/service_chapter_template.xml b/.doc_gen/templates/zonbook/service_chapter_template.xml index 0da03cbc429..c1ed034d56b 100644 --- a/.doc_gen/templates/zonbook/service_chapter_template.xml +++ b/.doc_gen/templates/zonbook/service_chapter_template.xml @@ -1,5 +1,9 @@ {{- template "prologue"}} {{- $doc_id := "service_code_examples"}} +{{- $hello := index .CategorizedExampleSets "Hello"}} +{{- $basics := index .CategorizedExampleSets "Basics"}} +{{- $actions := index .CategorizedExampleSets "Actions"}} +{{- $scenarios := index .CategorizedExampleSets "Scenarios"}} {{- $title := printf "Code examples for %s using &AWS; SDKs" .ServiceEntity.Short }} {{- if .ChapterOverrideTitle }} {{- $title = .ChapterOverrideTitle }} @@ -8,9 +12,6 @@ {{- if .ChapterOverrideTitleAbbrev }} {{- $title_abbrev = .ChapterOverrideTitleAbbrev }} {{- end }} -{{- $cross_service := index .CategorizedExampleSets "Cross-service examples"}} -{{- $scenarios := index .CategorizedExampleSets "Scenarios"}} -{{- $actions := index .CategorizedExampleSets "Actions"}} {{- $include_docs := "file://AWSShared/code-samples/docs/"}} {{- if isSnapshot}} {{- $include_docs = ""}} @@ -31,56 +32,13 @@ The following code examples show how to use {{.ServiceEntity.Short}} with an &AWS; software development kit (SDK). {{.ServiceEntity.Caveat}} - {{- template "note_example_types" makeSlice $actions.Examples $scenarios.Examples $cross_service.Examples}} + {{- template "note_example_types" makeSlice $hello.Examples $basics.Examples $actions.Examples $scenarios.Examples}} {{- template "note_complete_list"}} {{- template "hello" makeSlice .CategorizedExampleSets "" 0}} Code examples - {{- range $category := .CategoryNamesSorted}} - {{- if ne $category "Hello"}} - {{- with $cat_examples := index $.CategorizedExampleSets $category}} -
- - {{$cat_examples.CategoryName}} for {{$.ServiceEntity.Short}} using &AWS; SDKs - {{$cat_examples.CategoryName}} - - The following code examples show how to use {{$.ServiceEntity.Short}} with &AWS; SDKs. - - - {{- if eq $cat_examples.CategoryName "Cross-service examples"}} - The following sample applications use &AWS; SDKs to combine {{$.ServiceEntity.Short}} - with other &AWS-services;. Each example includes a link to GitHub, where you can find - instructions on how to set up and run the application. - {{- else if eq $cat_examples.CategoryName "Scenarios"}} - The following code examples show you how to implement common scenarios in {{$.ServiceEntity.Short}} - with &AWS; SDKs. These scenarios show you how to accomplish specific tasks by calling multiple functions - within {{$.ServiceEntity.Short}}. Each scenario includes a link to GitHub, where you can find instructions - on how to set up and run the code. - {{- else if eq $cat_examples.CategoryName "Actions"}} - The following code examples demonstrate how to perform individual {{$.ServiceEntity.Short}} - actions with &AWS; SDKs. These excerpts call the {{$.ServiceEntity.Short}} API and - are code excerpts from larger programs that must be run in context. Each example includes - a link to GitHub, where you can find instructions for setting up and running the code. - - The following examples include only the most commonly used actions. - For a complete list, see the - {{- if $.ApiRef}} - {{$.ServiceEntity.Long}} API Reference. - {{- else }} - {{$.ServiceEntity.Long}} API Reference. - {{- end}} - - {{- else}} - The following code examples show how to use {{$.ServiceEntity.Short}} with &AWS; SDKs. - {{- end}} - {{- $bundle_prefix := ""}} - {{- if $.Bundle}} - {{$bundle_prefix = $}} - {{- end}} - {{- template "service_examples" makeSlice $cat_examples $bundle_prefix 0}} -
- {{- end}} - {{- end}} - {{- end}} + {{- template "basics" makeSlice . $doc_id 0}} + {{- template "scenarios" makeSlice . $doc_id 0}} + {{- template "customs" makeSlice . $doc_id 0}} {{- if .Bundle}} {{- else}} diff --git a/.doc_gen/templates/zonbook/utility/basics.xml b/.doc_gen/templates/zonbook/utility/basics.xml new file mode 100644 index 00000000000..21ac3cceb6d --- /dev/null +++ b/.doc_gen/templates/zonbook/utility/basics.xml @@ -0,0 +1,68 @@ +{{- define "basics"}} +{{- $service := index . 0}} +{{- $hello := index $service.CategorizedExampleSets "Hello"}} +{{- $basics := index $service.CategorizedExampleSets "Basics"}} +{{- $actions := index $service.CategorizedExampleSets "Actions"}} +{{- $scenarios := index $service.CategorizedExampleSets "Scenarios"}} +{{- $doc_id := index . 1}} +{{- $is_library := index . 2}} +{{- if or $hello.Examples (or $basics.Examples $actions.Examples) }} +
+ + Basic examples for + {{$service.ServiceEntity.Short}} using &AWS; SDKs + + Basics + + The following code examples show how to use the basics of {{$service.ServiceEntity.Short}} + with &AWS; SDKs. + + + +The following code examples show how to use the basics of {{$service.ServiceEntity.Long}} with &AWS; + SDKs. + +Examples +{{- if $hello.Examples}}{{- template "service_examples" makeSlice $hello $service $is_library}}{{- end}} +{{- if $basics.Examples}}{{- template "service_examples" makeSlice $basics $service $is_library}}{{- end}} +{{- if $actions.Examples}} +
+ + Actions for {{$service.ServiceEntity.Short}} using &AWS; SDKs + + Actions + + The following code examples show how to use {{$service.ServiceEntity.Short}} with &AWS; SDKs. + + + + The following code examples demonstrate how to perform individual {{$service.ServiceEntity.Short}} + actions with &AWS; SDKs. Each example includes + a link to GitHub, where you can find instructions for setting up and running the code. + + {{- $cat_scenarios := index $service.CategorizedExampleSets "Scenarios"}} + {{- $cat_id_suffix := $cat_scenarios.CategoryIdSuffix}} + {{- if $cat_id_suffix}} + These excerpts call the {{$service.ServiceEntity.Short}} API and + are code excerpts from larger programs that must be run in context. + You can see actions in context in + . + + {{- end}} + + The following examples include only the most commonly used actions. + For a complete list, see the + {{- if $service.ApiRef}} + {{$service.ServiceEntity.Long}} API Reference. + {{- else }} + {{$service.ServiceEntity.Long}} API Reference. + {{- end}} + + Examples + {{- template "service_examples" makeSlice $actions $service $is_library}} +
+{{- end}} +
+{{- end}} +{{- end}} \ No newline at end of file diff --git a/.doc_gen/templates/zonbook/utility/customs.xml b/.doc_gen/templates/zonbook/utility/customs.xml new file mode 100644 index 00000000000..c554b0e05c6 --- /dev/null +++ b/.doc_gen/templates/zonbook/utility/customs.xml @@ -0,0 +1,22 @@ +{{- define "customs"}} +{{- $service := index . 0}} +{{- $doc_id := index . 1}} +{{- $is_library := index . 2}} +{{- range $category := $service.CustomCategoriesSorted}} +{{- $cat_examples := index $service.CategorizedExampleSets $category}} +
+ + {{$cat_examples.CategoryName}} for {{$service.ServiceEntity.Short}} using &AWS; SDKs + + {{$cat_examples.CategoryName}} + + + The following code examples show how to use {{$service.ServiceEntity.Short}} with &AWS; SDKs. + + + The following code examples show how to use {{$service.ServiceEntity.Short}} with &AWS; SDKs. + Examples + {{- template "service_examples" makeSlice $cat_examples $service $is_library}} +
+{{- end}} +{{- end}} diff --git a/.doc_gen/templates/zonbook/utility/hello.xml b/.doc_gen/templates/zonbook/utility/hello.xml index 6dc19266164..5f58bf4daa0 100644 --- a/.doc_gen/templates/zonbook/utility/hello.xml +++ b/.doc_gen/templates/zonbook/utility/hello.xml @@ -19,7 +19,7 @@ {{- range $hello.Examples}} -
+
{{.Title}} {{.TitleAbbrev}} diff --git a/.doc_gen/templates/zonbook/utility/notes.xml b/.doc_gen/templates/zonbook/utility/notes.xml index 6ffde7f012b..61060857fbc 100644 --- a/.doc_gen/templates/zonbook/utility/notes.xml +++ b/.doc_gen/templates/zonbook/utility/notes.xml @@ -1,18 +1,19 @@ {{- define "note_example_types"}} -{{- $actions := index . 0}} -{{- $scenarios := index . 1}} -{{- $crosses := index . 2}} +{{- $hello := index . 0}} +{{- $basics := index . 1}} +{{- $actions := index . 2}} +{{- $scenarios := index . 3}} +{{- if or $hello $basics}} +Basics are code examples that show you how to perform the essential operations within a service. +{{- end}} {{- if $actions}} Actions are code excerpts from larger programs and must be run in context. While actions - show you how to call individual service functions, you can see actions in context in their related scenarios and - cross-service examples. + show you how to call individual service functions, you can see actions in context in their related scenarios. {{- end}} {{- if $scenarios}} -Scenarios are code examples that show you how to accomplish a specific task by - calling multiple functions within the same service. -{{- end}} -{{- if $crosses}} -Cross-service examples are sample applications that work across multiple &AWS-services;. +Scenarios are code examples that show you how to accomplish specific tasks by + calling multiple functions within a service or combined with other &AWS-services;. + {{- end}} {{- end}} diff --git a/.doc_gen/templates/zonbook/utility/scenarios.xml b/.doc_gen/templates/zonbook/utility/scenarios.xml new file mode 100644 index 00000000000..0eb54dd0f77 --- /dev/null +++ b/.doc_gen/templates/zonbook/utility/scenarios.xml @@ -0,0 +1,28 @@ +{{- define "scenarios"}} +{{- $service := index . 0}} +{{- $scenarios := index $service.CategorizedExampleSets "Scenarios"}} +{{- $doc_id := index . 1}} +{{- $is_library := index . 2}} +{{- if $scenarios.Examples}} +
+ + Scenarios for + {{$service.ServiceEntity.Short}} using &AWS; SDKs + + Scenarios + + The following code examples show how to use {{$service.ServiceEntity.Short}} with &AWS; SDKs. + + + + The following code examples show you how to implement common scenarios in {{$service.ServiceEntity.Short}} + with &AWS; SDKs. These scenarios show you how to accomplish specific tasks by calling multiple functions + within {{$service.ServiceEntity.Short}} or combined with other &AWS-services;. + Each scenario includes a link to the complete source code, where you can find instructions on how to set up and run the code. + + Scenarios target an intermediate level of experience to help you understand service actions in context. +Examples +{{- template "service_examples" makeSlice $scenarios $service $is_library}} +
+{{- end}} +{{- end}} \ No newline at end of file diff --git a/.doc_gen/templates/zonbook/utility/sdk_api_examples.xml b/.doc_gen/templates/zonbook/utility/sdk_api_examples.xml index bd622e0e88e..46c3f17b0a0 100644 --- a/.doc_gen/templates/zonbook/utility/sdk_api_examples.xml +++ b/.doc_gen/templates/zonbook/utility/sdk_api_examples.xml @@ -5,69 +5,37 @@ {{- if isSnapshot}} {{- $include_docs = ""}} {{- end}} -{{- if $examples.ApiExamples}} -
+Services +{{- range $service, $svc_examples := $examples.ApiExamples}} +{{- if $svc_examples.ServiceEntity.Short}} +{{- $basics := index $svc_examples.CategorizedExampleSets "Basics"}} +{{- $actions := index $svc_examples.CategorizedExampleSets "Actions"}} +{{- $scenarios := index $svc_examples.CategorizedExampleSets "Scenarios"}} +
- Actions and scenarios using {{$examples.SdkEntity.Short}} - Actions and scenarios + {{$svc_examples.ServiceEntity.Short}} examples using {{$examples.SdkEntity.Short}} + {{$svc_examples.ServiceEntity.Short}} - The following code examples show how to implement common scenarios and perform individual service actions by using - {{$examples.SdkEntity.Short}} with &AWS-services;. + Code examples that show how to use {{$examples.SdkEntity.Long}} with {{$svc_examples.ServiceEntity.Short}}. - The following code examples show how to perform actions and implement common scenarios by using - the {{$examples.SdkEntity.Long}} with &AWS-services;. - {{- template "note_example_types" makeSlice 1 1 0}} - Services + The following code examples show you how to perform actions and implement common scenarios by using + the {{$examples.SdkEntity.Long}} with {{$svc_examples.ServiceEntity.Short}}. + {{- template "note_example_types" makeSlice 0 $basics.Examples $actions.Examples $scenarios.Examples}} + Each example includes a link to the complete source code, where you can find + instructions on how to set up and run the code in context. + {{- template "hello" makeSlice $svc_examples.CategorizedExampleSets $examples.Language $examples.LanguageSlug}} + {{- if or $basics.Examples (or $actions.Examples (or $scenarios.Examples $svc_examples.CustomCategoriesSorted))}} + + {{- template "sdk_examples" makeSlice $basics $sdk_prefix $include_docs $examples}} + {{- template "sdk_examples" makeSlice $actions $sdk_prefix $include_docs $examples}} + {{- template "sdk_examples" makeSlice $scenarios $sdk_prefix $include_docs $examples}} + {{- range $category := $svc_examples.CustomCategoriesSorted}} + {{- $cat_examples := index $svc_examples.CategorizedExampleSets $category}} + {{- template "sdk_examples" makeSlice $cat_examples $sdk_prefix $include_docs $examples}} {{- end}} - {{- range $service, $svc_examples := $examples.ApiExamples}} - {{- if $svc_examples.ServiceEntity.Short}} -
- - {{$svc_examples.ServiceEntity.Short}} examples using {{$examples.SdkEntity.Short}} - {{$svc_examples.ServiceEntity.Short}} - - Code examples that show how to use {{$examples.SdkEntity.Long}} with {{$svc_examples.ServiceEntity.Short}}. - - - The following code examples show you how to perform actions and implement common scenarios by using - the {{$examples.SdkEntity.Long}} with {{$svc_examples.ServiceEntity.Short}}. - {{- template "note_example_types" makeSlice 1 1 0}} - Each example includes a link to GitHub, where you can find - instructions on how to set up and run the code in context. - {{- template "hello" makeSlice $svc_examples.CategorizedExampleSets $examples.Language $examples.LanguageSlug}} - - {{- range $category := $svc_examples.CategoryNamesSorted}} - {{- if ne $category "Hello"}} - {{- with $cat_examples := index $svc_examples.CategorizedExampleSets $category}} -
- - {{$cat_examples.CategoryName}} - {{$cat_examples.CategoryName}} - - - {{- range $cat_examples.Examples}} -
- - {{.TitleAbbrev}} - {{.TitleAbbrev}} - - {{- template "sdk_synopsis" .}} - {{- if .GuideTopic.Url}} - For more information, see {{.GuideTopic.Text}}. - {{- end}} - -
- {{- end}} -
-
- {{- end}} - {{- end}} - {{- end}} -
{{- end}} - {{- end}} - {{- if $examples.ApiExamples}}
{{- end}} +{{- end}} {{- end}} \ No newline at end of file diff --git a/.doc_gen/templates/zonbook/utility/sdk_cross_examples.xml b/.doc_gen/templates/zonbook/utility/sdk_cross_examples.xml deleted file mode 100644 index ac8f1efd062..00000000000 --- a/.doc_gen/templates/zonbook/utility/sdk_cross_examples.xml +++ /dev/null @@ -1,39 +0,0 @@ -{{- define "sdk_cross_examples"}} -{{- $examples := index . 0}} -{{- $sdk_prefix := index . 1}} -{{- $include_docs := "file://AWSShared/code-samples/docs/"}} -{{- if isSnapshot}} - {{- $include_docs = ""}} -{{- end}} -{{- if $examples.CrossServiceExamples}} -
- - Cross-service examples using {{$examples.SdkEntity.Short}} - Cross-service examples - - The following sample applications use the {{$examples.SdkEntity.Long}} - to work across multiple &AWS-services;. - - - The following sample applications use the {{$examples.SdkEntity.Long}} - to work across multiple &AWS-services;. - Cross-service examples target an advanced level of experience to help you start building applications. - - Examples - {{- end}} - {{- range $examples.CrossServiceExamples}} -
- - {{.Title}} - {{.TitleAbbrev}} - - - {{- if .GuideTopic.Url}} - For more information, see {{.GuideTopic.Text}}. - {{- end}} -
- {{- end}} - {{- if $examples.CrossServiceExamples}} -
-{{- end}} -{{- end}} \ No newline at end of file diff --git a/.doc_gen/templates/zonbook/utility/sdk_examples.xml b/.doc_gen/templates/zonbook/utility/sdk_examples.xml new file mode 100644 index 00000000000..aa863b9dec9 --- /dev/null +++ b/.doc_gen/templates/zonbook/utility/sdk_examples.xml @@ -0,0 +1,29 @@ +{{- define "sdk_examples"}} +{{- $cat_examples := index . 0}} +{{- $sdk_prefix := index . 1}} +{{- $include_docs := index . 2}} +{{- $examples := index . 3}} +{{- if $cat_examples.Examples}} +
+ + {{$cat_examples.CategoryName}} + {{$cat_examples.CategoryName}} + + + {{- range $cat_examples.Examples}} +
+ + {{.TitleAbbrev}} + {{.TitleAbbrev}} + + {{- template "sdk_synopsis" .}} + {{- if .GuideTopic.Url}} + For more information, see {{.GuideTopic.Text}}. + {{- end}} + +
+ {{- end}} +
+
+{{- end}} +{{- end}} \ No newline at end of file diff --git a/.doc_gen/templates/zonbook/utility/service_examples.xml b/.doc_gen/templates/zonbook/utility/service_examples.xml index 73184b2c3fc..8829b7df311 100644 --- a/.doc_gen/templates/zonbook/utility/service_examples.xml +++ b/.doc_gen/templates/zonbook/utility/service_examples.xml @@ -3,14 +3,13 @@ {{- $service := index . 1}} {{- $is_library := index . 2}} {{- $svc_prefix := ""}} -{{- if $service}} +{{- if or $is_library $service.Bundle}} {{- $svc_prefix = printf "%s_" $service.Model}} {{- end}} {{- $include_docs := "file://AWSShared/code-samples/docs/"}} {{- if isSnapshot}} {{- $include_docs = ""}} {{- end}} -Examples {{- range $examples.Examples}} {{- $addSvc := ""}} {{- if .AddService}} diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index add236e3f2b..f0385a2e979 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@2024-08-13-A + uses: awsdocs/aws-doc-sdk-examples-tools@2024-08-19-A with: doc_gen_only: "False" strict_titles: "True" diff --git a/.tools/readmes/config.py b/.tools/readmes/config.py index b736a8f9165..a41f1a886b4 100644 --- a/.tools/readmes/config.py +++ b/.tools/readmes/config.py @@ -6,10 +6,12 @@ doc_base_url = "https://docs.aws.amazon.com" categories = { "hello": "Hello", + "basics": "Basics", "scenarios": "Scenarios", "actions": "Api", "cross": "Cross-service examples", } +basics_title_abbrev = "Learn the basics" entities = { "&AWS;": "AWS", "&aws_sec_sdk_use-federation-warning;": "", diff --git a/.tools/readmes/includes/code_examples.jinja2 b/.tools/readmes/includes/code_examples.jinja2 index ff58f51e8e1..16e9f5ed88a 100644 --- a/.tools/readmes/includes/code_examples.jinja2 +++ b/.tools/readmes/includes/code_examples.jinja2 @@ -8,6 +8,14 @@ {{ macs.list_examples(hello) }} {% endif %} +{% if basics %} + +### Basics + +Code examples that show you how to perform the essential operations within a service. + +{{ macs.list_examples(basics) }} +{% endif %} {% if actions %} ### Single actions diff --git a/.tools/readmes/includes/run_instructions.jinja2 b/.tools/readmes/includes/run_instructions.jinja2 index 463f3ab7716..4d5e05b2ea2 100644 --- a/.tools/readmes/includes/run_instructions.jinja2 +++ b/.tools/readmes/includes/run_instructions.jinja2 @@ -104,6 +104,44 @@ and to get help for running a scenario, use the following command: go run ./cmd -h ``` {% endif %} +{% for basic in basics %} +#### {{basic['title_abbrev']}} + +{% if basic['synopsis'] %} +This example shows you how to {{basic['synopsis']}} + +{% else %} +This example shows you how to do the following: + +{% endif %} +{% for syn in basic['synopsis_list'] %} +- {{syn}} +{% endfor %} + + +{% if customs['basic_prereqs'] %}{{ customs['basic_prereqs'][basic['id']] -}}{% endif %} + + +{% if lang_config['name'] == 'Python' and lang_config['sdk_ver'] == 3 and basic["file"].endswith(".py") %} +Start the example by running the following at a command prompt: + +``` +python {{basic['file']}} +``` + +{% elif lang_config['name'] == 'Ruby' and lang_config['sdk_ver'] == 3 %} +Start the example by running the following at a command prompt: + +``` +ruby {{basic['file']}} +``` +{% endif %} + + +{% if customs['basics'] %}{{ customs['basics'][basic['id']] -}}{% endif %} + + +{% endfor %} {% for scenario in scenarios %} #### {{scenario['title_abbrev']}} diff --git a/.tools/readmes/render.py b/.tools/readmes/render.py index 3a68fdf6451..c5b742af62e 100644 --- a/.tools/readmes/render.py +++ b/.tools/readmes/render.py @@ -164,6 +164,16 @@ def _transform_actions(self) -> List[Dict[str, str]]: del example["api"] return examples + def _transform_basics(self) -> List[Dict[str, str]]: + examples = self._transform_examples(self.scanner.basics) + for example in examples: + if not example["title_abbrev"]: + example["title_abbrev"] = config.basics_title_abbrev + example["file"] = example["run_file"] + del example["run_file"] + del example["api"] + return examples + def _transform_scenarios_and_crosses( self, ) -> Tuple[List[Dict[str, str]], List[Dict[str, str]]]: @@ -260,11 +270,12 @@ def render(self) -> RenderStatus: hello = self._transform_hellos() actions = self._transform_actions() + basics = self._transform_basics() scenarios, crosses = self._transform_scenarios_and_crosses() custom_cats = self._transform_custom_categories() if ( - len(hello) + len(actions) + len(scenarios) + len(custom_cats) + len(crosses) + len(hello) + len(actions) + len(basics) + len(scenarios) + len(custom_cats) + len(crosses) == 0 ): return RenderStatus.NO_EXAMPLES @@ -291,6 +302,7 @@ def render(self) -> RenderStatus: service=svc, hello=hello, actions=actions, + basics=basics, scenarios=scenarios, custom_cats=custom_cats, crosses=crosses, diff --git a/.tools/readmes/scanner.py b/.tools/readmes/scanner.py index 96de768ee6d..3907b67e685 100644 --- a/.tools/readmes/scanner.py +++ b/.tools/readmes/scanner.py @@ -29,6 +29,7 @@ def __init__(self, doc_gen: DocGen): self._build_examples() self.hellos: Dict[str, Example] = {} self.actions: Dict[str, Example] = {} + self.basics: Dict[str, Example] = {} self.scenarios: Dict[str, Example] = {} self.customs: Dict[str, Example] = {} self.crosses: Dict[str, Example] = {} @@ -68,6 +69,7 @@ def set_example(self, svc_name: str, language: str, sdk_ver: int): self.hellos.clear() self.actions.clear() + self.basics.clear() self.scenarios.clear() self.customs.clear() self.cross_scenarios.clear() @@ -85,6 +87,8 @@ def set_example(self, svc_name: str, language: str, sdk_ver: int): self.hellos[example.id] = example elif example.category == config.categories["actions"]: self.actions[example.id] = example + elif example.category == config.categories["basics"]: + self.basics[example.id] = example elif example.category == config.categories["scenarios"]: self.scenarios[example.id] = example elif example.category not in config.categories.values(): @@ -131,7 +135,13 @@ def snippet(self, example: Example, readme_folder, api_name: str): if "cross-services" in full_path: tag_path = "../cross-services/" + tag_path elif ex_ver.block_content: - tag_path = github + base_folder = f"{config.language[self.lang_name][self.sdk_ver]['base_folder']}/" + if base_folder in github: + tag_path = ( + self._lang_level_double_dots() + github.split(base_folder, 1)[1] + ) + else: + tag_path = github if tag and github is not None and tag_path is None: snippet = self.doc_gen.snippets[tag] if snippet is not None: @@ -143,3 +153,7 @@ def snippet(self, example: Example, readme_folder, api_name: str): if api_name != "": tag_path += f"#L{snippet.line_start + 1}" return tag_path + + def _lang_level_double_dots(self) -> str: + lang_config = config.language.get(self.lang_name, {}).get(self.sdk_ver, None) + return "../" * lang_config["service_folder"].count("/") diff --git a/aws-cli/bash-linux/dynamodb/README.md b/aws-cli/bash-linux/dynamodb/README.md index ff79f764e5e..2772cea0b0b 100644 --- a/aws-cli/bash-linux/dynamodb/README.md +++ b/aws-cli/bash-linux/dynamodb/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `aws-c +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenario_getting_started_movies.sh) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -46,13 +53,6 @@ Code excerpts that show you how to call individual service functions. - [Scan](dynamodb_operations.sh#L724) - [UpdateItem](dynamodb_operations.sh#L338) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with tables, items, and queries](scenario_getting_started_movies.sh) - @@ -66,8 +66,7 @@ functions within the same service. - -#### Get started with tables, items, and queries +#### Learn the basics This example shows you how to do the following: @@ -78,12 +77,13 @@ This example shows you how to do the following: - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - - + + + + + - - ### Tests diff --git a/aws-cli/bash-linux/ec2/README.md b/aws-cli/bash-linux/ec2/README.md index deb0495a6c3..100706234a8 100644 --- a/aws-cli/bash-linux/ec2/README.md +++ b/aws-cli/bash-linux/ec2/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `aws-c +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](get_started_with_ec2_instances.sh) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -52,13 +59,6 @@ Code excerpts that show you how to call individual service functions. - [StopInstances](ec2_operations.sh#L815) - [TerminateInstances](ec2_operations.sh#L1252) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with instances](get_started_with_ec2_instances.sh) - @@ -72,8 +72,7 @@ functions within the same service. - -#### Get started with instances +#### Learn the basics This example shows you how to do the following: @@ -83,12 +82,13 @@ This example shows you how to do the following: - Associate an Elastic IP address with your instance. - Connect to your instance with SSH, then clean up resources. - - + + + + + - - ### Tests diff --git a/aws-cli/bash-linux/s3/README.md b/aws-cli/bash-linux/s3/README.md index 3fd4ed175b8..ca72b1617f3 100644 --- a/aws-cli/bash-linux/s3/README.md +++ b/aws-cli/bash-linux/s3/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `aws-c +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](s3_getting_started.sh) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -43,13 +50,6 @@ Code excerpts that show you how to call individual service functions. - [ListObjectsV2](bucket-lifecycle-operations/awsdocs_general.sh#L94) - [PutObject](bucket-lifecycle-operations/bucket_operations.sh#L134) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with buckets and objects](s3_getting_started.sh) - @@ -63,8 +63,7 @@ functions within the same service. - -#### Get started with buckets and objects +#### Learn the basics This example shows you how to do the following: @@ -74,12 +73,13 @@ This example shows you how to do the following: - List the objects in a bucket. - Delete the bucket objects and the bucket. - - + + + + + - - ### Tests diff --git a/cpp/example_code/aurora/README.md b/cpp/example_code/aurora/README.md index 0839b462dd4..05a76476ea8 100644 --- a/cpp/example_code/aurora/README.md +++ b/cpp/example_code/aurora/README.md @@ -42,6 +42,13 @@ Next, for information on code example structures and how to build and run the ex - [Hello Aurora](hello_aurora/CMakeLists.txt#L4) (`DescribeDBClusters`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](getting_started_with_db_clusters.cpp) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -67,13 +74,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with DB clusters](getting_started_with_db_clusters.cpp) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create an Aurora Serverless work item tracker](../../example_code/cross-service/serverless-aurora) +- [Create an Aurora Serverless work item tracker](cpp/example_code/cross-service/serverless-aurora) @@ -104,8 +105,7 @@ folder. This example shows you how to get started using Aurora. - -#### Get started with DB clusters +#### Learn the basics This example shows you how to do the following: @@ -114,12 +114,25 @@ This example shows you how to do the following: - Create a DB instance that contains a database. - Take a snapshot of the DB cluster, then clean up resources. - - + + + + + + + + +#### Create an Aurora Serverless work item tracker + +This example shows you how to create a web application that tracks work items in an Amazon Aurora Serverless database and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + - - + + ### Tests diff --git a/cpp/example_code/dynamodb/README.md b/cpp/example_code/dynamodb/README.md index 9f1fc92124e..a211d75641c 100644 --- a/cpp/example_code/dynamodb/README.md +++ b/cpp/example_code/dynamodb/README.md @@ -42,6 +42,13 @@ Next, for information on code example structures and how to build and run the ex - [Hello DynamoDB](hello_dynamodb/CMakeLists.txt#L4) (`ListTables`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](dynamodb_utils.cpp) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -66,16 +73,10 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with tables, items, and queries](dynamodb_utils.cpp) +- [Create a serverless application to manage photos](cpp/example_code/cross-service/photo_asset_manager) - [Query a table by using batches of PartiQL statements](dynamodb_utils.cpp) - [Query a table using PartiQL](dynamodb_utils.cpp) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a serverless application to manage photos](../../example_code/cross-service/photo_asset_manager) - @@ -105,8 +106,7 @@ folder. This example shows you how to get started using DynamoDB. - -#### Get started with tables, items, and queries +#### Learn the basics This example shows you how to do the following: @@ -117,12 +117,25 @@ This example shows you how to do the following: - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - - + + + + + + + + +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + - - + + #### Query a table by using batches of PartiQL statements diff --git a/cpp/example_code/glue/README.md b/cpp/example_code/glue/README.md index 8a8aaa3ef6a..8ff1e7a1fae 100644 --- a/cpp/example_code/glue/README.md +++ b/cpp/example_code/glue/README.md @@ -43,6 +43,13 @@ Next, for information on code example structures and how to build and run the ex - [Hello AWS Glue](hello_glue/CMakeLists.txt#L4) (`ListJobs`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](glue_getting_started_scenario.cpp) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -61,13 +68,6 @@ Code excerpts that show you how to call individual service functions. - [StartCrawler](glue_getting_started_scenario.cpp#L235) - [StartJobRun](glue_getting_started_scenario.cpp#L403) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with crawlers and jobs](glue_getting_started_scenario.cpp) - @@ -97,8 +97,7 @@ folder. This example shows you how to get started using AWS Glue. - -#### Get started with crawlers and jobs +#### Learn the basics This example shows you how to do the following: @@ -107,36 +106,13 @@ This example shows you how to do the following: - Create a job to extract CSV data from the S3 bucket, transform the data, and load JSON-formatted output into another S3 bucket. - List information about job runs, view transformed data, and clean up resources. - - -You can create the resources needed for the example using the CDK script [resources/cdk/glue_role_bucket](../../../resources/cdk/glue_role_bucket). - -Note: The AWS CDK and npm must be installed to use the script. - -From the [resources/cdk/glue_role_bucket](../../../resources/cdk/glue_role_bucket) folder, run the commands: -```bash -npm install -cdk deploy -``` - -Use the following outputs in the example. - -```bash -doc-example-glue-scenario-stack.BucketName = doc-example-glue-scenario-s-docexampleglue1234567-890abcdef -doc-example-glue-scenario-stack.RoleName = AWSGlueServiceRole-DocExample - -``` - -The resources can be deleted with the following command: -```bash -cdk destroy -``` + + - + + - - ### Tests diff --git a/cpp/example_code/iot/README.md b/cpp/example_code/iot/README.md index 934265c5f84..9839fed6638 100644 --- a/cpp/example_code/iot/README.md +++ b/cpp/example_code/iot/README.md @@ -42,6 +42,13 @@ Next, for information on code example structures and how to build and run the ex - [Hello AWS IoT](hello_iot/CMakeLists.txt#L4) (`listThings`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](things_and_shadows_workflow/iot_things_and_shadows_workflow.cpp) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -61,13 +68,6 @@ Code excerpts that show you how to call individual service functions. - [UpdateIndexingConfiguration](update_indexing_configuration.cpp#L22) - [UpdateThing](update_thing.cpp#L23) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Work with device management use cases](things_and_shadows_workflow/iot_things_and_shadows_workflow.cpp) - @@ -97,19 +97,18 @@ folder. This example shows you how to get started using AWS IoT. +#### Learn the basics -#### Work with device management use cases +This example shows you how to work with AWS IoT device management. -This example shows you how to work with AWS IoT device management use cases using AWS IoT SDK + + - -To run this workflow, refer to the [README](things_and_shadows_workflow/README.md) - + + - - ### Tests diff --git a/cpp/example_code/lambda/README.md b/cpp/example_code/lambda/README.md index 3d587b2df6c..62a2bfa0e6c 100644 --- a/cpp/example_code/lambda/README.md +++ b/cpp/example_code/lambda/README.md @@ -59,14 +59,9 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. +- [Create a serverless application to manage photos](cpp/example_code/cross-service/photo_asset_manager) - [Get started with functions](get_started_with_functions_scenario.cpp) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a serverless application to manage photos](../../example_code/cross-service/photo_asset_manager) - @@ -97,6 +92,18 @@ This example shows you how to get started using Lambda. +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + + + + + + #### Get started with functions This example shows you how to do the following: diff --git a/cpp/example_code/rds/README.md b/cpp/example_code/rds/README.md index 5c4a303c74d..4889d6c2a52 100644 --- a/cpp/example_code/rds/README.md +++ b/cpp/example_code/rds/README.md @@ -42,6 +42,13 @@ Next, for information on code example structures and how to build and run the ex - [Hello Amazon RDS](hello_rds/CMakeLists.txt#L4) (`DescribeDBInstances`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](getting_started_with_db_instances.cpp) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -64,13 +71,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with DB instances](getting_started_with_db_instances.cpp) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create an Aurora Serverless work item tracker](../../example_code/cross-service/serverless-aurora) +- [Create an Aurora Serverless work item tracker](cpp/example_code/cross-service/serverless-aurora) @@ -101,8 +102,7 @@ folder. This example shows you how to get started using Amazon RDS. - -#### Get started with DB instances +#### Learn the basics This example shows you how to do the following: @@ -111,12 +111,25 @@ This example shows you how to do the following: - Take a snapshot of the instance. - Delete the instance and parameter group. - - + + + + + + + + +#### Create an Aurora Serverless work item tracker + +This example shows you how to create a web application that tracks work items in an Amazon Aurora Serverless database and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + - - + + ### Tests diff --git a/cpp/example_code/rekognition/README.md b/cpp/example_code/rekognition/README.md index e0d78cdbe96..ef400a0642b 100644 --- a/cpp/example_code/rekognition/README.md +++ b/cpp/example_code/rekognition/README.md @@ -48,11 +48,12 @@ Code excerpts that show you how to call individual service functions. - [DetectLabels](detect_labels.cpp#L22) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. -- [Create a serverless application to manage photos](../../example_code/cross-service/photo_asset_manager) +- [Create a serverless application to manage photos](cpp/example_code/cross-service/photo_asset_manager) @@ -84,6 +85,18 @@ This example shows you how to get started using Amazon Rekognition. +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/cpp/example_code/s3/README.md b/cpp/example_code/s3/README.md index aa784db1057..04c7b90a172 100644 --- a/cpp/example_code/s3/README.md +++ b/cpp/example_code/s3/README.md @@ -42,6 +42,13 @@ Next, for information on code example structures and how to build and run the ex - [Hello Amazon S3](hello_s3/CMakeLists.txt#L4) (`ListBuckets`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](s3_getting_started_scenario.cpp) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -77,15 +84,9 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create a presigned URL](presigned_get_object.cpp) -- [Get started with buckets and objects](s3_getting_started_scenario.cpp) +- [Create a serverless application to manage photos](cpp/example_code/cross-service/photo_asset_manager) - [Work with Amazon S3 object integrity](s3_object_integrity_workflow/s3_object_integrity_workflow.cpp) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a serverless application to manage photos](../../example_code/cross-service/photo_asset_manager) - @@ -115,6 +116,23 @@ folder. This example shows you how to get started using Amazon S3. +#### Learn the basics + +This example shows you how to do the following: + +- Create a bucket and upload a file to it. +- Download an object from a bucket. +- Copy an object to a subfolder in a bucket. +- List the objects in a bucket. +- Delete the bucket objects and the bucket. + + + + + + + + #### Create a presigned URL @@ -128,22 +146,17 @@ This example shows you how to create a presigned URL for Amazon S3 and upload an -#### Get started with buckets and objects +#### Create a serverless application to manage photos -This example shows you how to do the following: +This example shows you how to create a serverless application that lets users manage photos using labels. -- Create a bucket and upload a file to it. -- Download an object from a bucket. -- Copy an object to a subfolder in a bucket. -- List the objects in a bucket. -- Delete the bucket objects and the bucket. - - + + - - + + #### Work with Amazon S3 object integrity diff --git a/cpp/example_code/ses/README.md b/cpp/example_code/ses/README.md index ce8962c602e..a995c6a36d4 100644 --- a/cpp/example_code/ses/README.md +++ b/cpp/example_code/ses/README.md @@ -58,11 +58,12 @@ Code excerpts that show you how to call individual service functions. - [UpdateTemplate](update_template.cpp#L22) - [VerifyEmailIdentity](verify_email_identity.cpp#L21) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. -- [Create an Aurora Serverless work item tracker](../../example_code/cross-service/serverless-aurora) +- [Create an Aurora Serverless work item tracker](cpp/example_code/cross-service/serverless-aurora) @@ -90,6 +91,18 @@ folder. +#### Create an Aurora Serverless work item tracker + +This example shows you how to create a web application that tracks work items in an Amazon Aurora Serverless database and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/cpp/example_code/sns/README.md b/cpp/example_code/sns/README.md index e47fb6881e8..91fb5efe4ec 100644 --- a/cpp/example_code/sns/README.md +++ b/cpp/example_code/sns/README.md @@ -62,15 +62,10 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. +- [Create a serverless application to manage photos](cpp/example_code/cross-service/photo_asset_manager) - [Publish an SMS text message](publish_sms.cpp) - [Publish messages to queues](../cross-service/topics_and_queues/messaging_with_topics_and_queues.cpp) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a serverless application to manage photos](../../example_code/cross-service/photo_asset_manager) - @@ -101,6 +96,18 @@ This example shows you how to get started using Amazon SNS. +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + + + + + + #### Publish an SMS text message This example shows you how to publish SMS messages using Amazon SNS. diff --git a/dotnetv3/Aurora/README.md b/dotnetv3/Aurora/README.md index cedf29403d0..c1c97c5fa0a 100644 --- a/dotnetv3/Aurora/README.md +++ b/dotnetv3/Aurora/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3 - [Hello Aurora](Actions/HelloAurora.cs#L4) (`DescribeDBClusters`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Scenarios/AuroraScenario.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -59,12 +66,6 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with DB clusters](Scenarios/AuroraScenario.cs) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - - [Create an Aurora Serverless work item tracker](../cross-service/AuroraItemTracker) @@ -101,8 +102,7 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using Aurora. - -#### Get started with DB clusters +#### Learn the basics This example shows you how to do the following: @@ -111,12 +111,25 @@ This example shows you how to do the following: - Create a DB instance that contains a database. - Take a snapshot of the DB cluster, then clean up resources. - - + + + + + + + + +#### Create an Aurora Serverless work item tracker + +This example shows you how to create a web application that tracks work items in an Amazon Aurora Serverless database and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + - - + + ### Tests diff --git a/dotnetv3/AutoScaling/README.md b/dotnetv3/AutoScaling/README.md index bc4a3a2c787..30405c8e714 100644 --- a/dotnetv3/AutoScaling/README.md +++ b/dotnetv3/AutoScaling/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3 - [Hello Auto Scaling](Actions/HelloAutoScaling.cs#L4) (`DescribeAutoScalingGroups`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Scenarios/AutoScalingBasics/UIWrapper.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -56,7 +63,6 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Build and manage a resilient service](../cross-service/ResilientService/ResilientServiceWorkflow/ResilientServiceWorkflow.cs) -- [Manage groups and instances](Scenarios/AutoScalingBasics/UIWrapper.cs) @@ -92,26 +98,7 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using Auto Scaling. - -#### Build and manage a resilient service - -This example shows you how to create a load-balanced web service that returns book, movie, and song recommendations. The example shows how the service responds to failures, and how to restructure the service for more resilience when failures occur. - -- Use an Amazon EC2 Auto Scaling group to create Amazon Elastic Compute Cloud (Amazon EC2) instances based on a launch template and to keep the number of instances in a specified range. -- Handle and distribute HTTP requests with Elastic Load Balancing. -- Monitor the health of instances in an Auto Scaling group and forward requests only to healthy instances. -- Run a Python web server on each EC2 instance to handle HTTP requests. The web server responds with recommendations and health checks. -- Simulate a recommendation service with an Amazon DynamoDB table. -- Control web server response to requests and health checks by updating AWS Systems Manager parameters. - - - - - - - - -#### Manage groups and instances +#### Learn the basics This example shows you how to do the following: @@ -122,11 +109,11 @@ This example shows you how to do the following: - List scaling activities that occur in response to user requests and capacity changes. - Get statistics for CloudWatch metrics, then clean up resources. - - + + - + ##### Configuration settings This example uses several configuration settings that are stored in `settings.json` @@ -143,7 +130,26 @@ used to run the scenario. For information about how to get valid settings, see [ * `ServiceLinkedRoleArn` - The Amazon Resource Name (ARN) of a serivce-linked role that will be used to create the Auto Scaling group. - + + + +#### Build and manage a resilient service + +This example shows you how to create a load-balanced web service that returns book, movie, and song recommendations. The example shows how the service responds to failures, and how to restructure the service for more resilience when failures occur. + +- Use an Amazon EC2 Auto Scaling group to create Amazon Elastic Compute Cloud (Amazon EC2) instances based on a launch template and to keep the number of instances in a specified range. +- Handle and distribute HTTP requests with Elastic Load Balancing. +- Monitor the health of instances in an Auto Scaling group and forward requests only to healthy instances. +- Run a Python web server on each EC2 instance to handle HTTP requests. The web server responds with recommendations and health checks. +- Simulate a recommendation service with an Amazon DynamoDB table. +- Control web server response to requests and health checks by updating AWS Systems Manager parameters. + + + + + + + ### Tests diff --git a/dotnetv3/CloudWatch/README.md b/dotnetv3/CloudWatch/README.md index eb77055fa71..daedd16bdee 100644 --- a/dotnetv3/CloudWatch/README.md +++ b/dotnetv3/CloudWatch/README.md @@ -36,6 +36,13 @@ To enable billing metrics and statistics for these examples, make sure to - [Hello CloudWatch](Actions/HelloCloudWatch.cs#L4) (`ListMetrics`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Scenarios/CloudWatchScenario.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -60,13 +67,6 @@ Code excerpts that show you how to call individual service functions. - [PutMetricAlarm](Actions/CloudWatchWrapper.cs#L265) - [PutMetricData](Actions/CloudWatchWrapper.cs#L154) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with metrics, dashboards, and alarms](Scenarios/CloudWatchScenario.cs) - @@ -101,8 +101,7 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using CloudWatch. - -#### Get started with metrics, dashboards, and alarms +#### Learn the basics This example shows you how to do the following: @@ -114,12 +113,13 @@ This example shows you how to do the following: - Add an anomaly detector. - Get a metric image, then clean up resources. - - + + + + + - - ### Tests diff --git a/dotnetv3/Comprehend/README.md b/dotnetv3/Comprehend/README.md index 7c3cc587c9a..7d2235a8a1f 100644 --- a/dotnetv3/Comprehend/README.md +++ b/dotnetv3/Comprehend/README.md @@ -41,9 +41,10 @@ Code excerpts that show you how to call individual service functions. - [DetectSyntax](DetectingSyntaxExample/DetectingSyntaxExample/DetectingSyntax.cs#L6) - [StartTopicsDetectionJob](TopicModelingExample/TopicModelingExample/TopicModeling.cs#L6) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. - [Create an application to analyze customer feedback](../cross-service/FeedbackSentimentAnalyzer) @@ -78,6 +79,18 @@ Alternatively, you can run the example from within your IDE. +#### Create an application to analyze customer feedback + +This example shows you how to create an application that analyzes customer comment cards, translates them from their original language, determines their sentiment, and generates an audio file from the translated text. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/dotnetv3/EC2/README.md b/dotnetv3/EC2/README.md index 5efbf6f668c..8dc39763da6 100644 --- a/dotnetv3/EC2/README.md +++ b/dotnetv3/EC2/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3 - [Hello Amazon EC2](Actions/HelloEC2.cs#L4) (`DescribeSecurityGroups`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Scenarios/EC2_Basics/EC2Basics.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -70,7 +77,6 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Build and manage a resilient service](../cross-service/ResilientService/ResilientServiceWorkflow/ResilientServiceWorkflow.cs) -- [Get started with instances](Scenarios/EC2_Basics/EC2Basics.cs) @@ -106,6 +112,23 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using Amazon EC2. +#### Learn the basics + +This example shows you how to do the following: + +- Create a key pair and security group. +- Select an Amazon Machine Image (AMI) and compatible instance type, then create an instance. +- Stop and restart the instance. +- Associate an Elastic IP address with your instance. +- Connect to your instance with SSH, then clean up resources. + + + + + + + + #### Build and manage a resilient service @@ -125,23 +148,6 @@ This example shows you how to create a load-balanced web service that returns bo -#### Get started with instances - -This example shows you how to do the following: - -- Create a key pair and security group. -- Select an Amazon Machine Image (AMI) and compatible instance type, then create an instance. -- Stop and restart the instance. -- Associate an Elastic IP address with your instance. -- Connect to your instance with SSH, then clean up resources. - - - - - - - - ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/dotnetv3/EventBridge/README.md b/dotnetv3/EventBridge/README.md index 8806a5277dc..b3018b18d46 100644 --- a/dotnetv3/EventBridge/README.md +++ b/dotnetv3/EventBridge/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3 - [Hello EventBridge](Actions/HelloEventBridge.cs#L4) (`ListEventBuses`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Scenarios/EventBridgeScenario.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -50,13 +57,6 @@ Code excerpts that show you how to call individual service functions. - [PutTargets](Actions/EventBridgeWrapper.cs#L347) - [RemoveTargets](Actions/EventBridgeWrapper.cs#L391) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with rules and targets](Scenarios/EventBridgeScenario.cs) - @@ -91,8 +91,7 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using EventBridge. - -#### Get started with rules and targets +#### Learn the basics This example shows you how to do the following: @@ -101,12 +100,13 @@ This example shows you how to do the following: - List and update rules and targets. - Send events, then clean up resources. - - + + + + + - - ### Tests diff --git a/dotnetv3/Glue/README.md b/dotnetv3/Glue/README.md index e10814837ed..8c987fd39ca 100644 --- a/dotnetv3/Glue/README.md +++ b/dotnetv3/Glue/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3 - [Hello AWS Glue](Actions/HelloGlue.cs#L4) (`ListJobs`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Actions/GlueWrapper.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -53,13 +60,6 @@ Code excerpts that show you how to call individual service functions. - [StartCrawler](Actions/GlueWrapper.cs#L328) - [StartJobRun](Actions/GlueWrapper.cs#L348) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with crawlers and jobs](Actions/GlueWrapper.cs) - @@ -94,8 +94,7 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using AWS Glue. - -#### Get started with crawlers and jobs +#### Learn the basics This example shows you how to do the following: @@ -104,7 +103,7 @@ This example shows you how to do the following: - Create a job to extract CSV data from the S3 bucket, transform the data, and load JSON-formatted output into another S3 bucket. - List information about job runs, view transformed data, and clean up resources. - + This scenario requires the following scaffold resources: * An S3 bucket that can contain the Python ETL job script and receive output data. @@ -116,7 +115,7 @@ This scenario requires the following scaffold resources: You can deploy and destroy these resources by using the AWS Cloud Development Kit (AWS CDK). To do this, run `cdk deploy` or `cdk destroy` in the [/resources/cdk/glue_role_bucket](/resources/cdk/glue_role_bucket) folder. - + When the AWS CDK script reports the bucket name and the IAM role that was created, open the `settings.json` file and fill in the BucketName, RoleName, and ScriptURL values. @@ -136,11 +135,12 @@ Example: "JobName": "glue-mvp-job" - + + + + - - ### Tests diff --git a/dotnetv3/Keyspaces/README.md b/dotnetv3/Keyspaces/README.md index c802e62a682..67fac9271b1 100644 --- a/dotnetv3/Keyspaces/README.md +++ b/dotnetv3/Keyspaces/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3 - [Hello Amazon Keyspaces](Actions/HelloKeyspaces.cs#L4) (`ListKeyspaces`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Scenarios/KeyspacesBasics.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -49,13 +56,6 @@ Code excerpts that show you how to call individual service functions. - [RestoreTable](Actions/KeyspacesWrapper.cs#L163) - [UpdateTable](Actions/KeyspacesWrapper.cs#L188) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with keyspaces and tables](Scenarios/KeyspacesBasics.cs) - @@ -90,8 +90,7 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using Amazon Keyspaces. - -#### Get started with keyspaces and tables +#### Learn the basics This example shows you how to do the following: @@ -101,12 +100,13 @@ This example shows you how to do the following: - Update the table. Add a column to track watched movies. - Restore the table to its previous state and clean up resources. - - + + + + + - - ### Tests diff --git a/dotnetv3/Lambda/README.md b/dotnetv3/Lambda/README.md index 5b76f649b9c..b355c67bc69 100644 --- a/dotnetv3/Lambda/README.md +++ b/dotnetv3/Lambda/README.md @@ -51,14 +51,9 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with functions](Actions/LambdaWrapper.cs) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - - [Create a serverless application to manage photos](../cross-service/PhotoAssetManager) - [Create an application to analyze customer feedback](../cross-service/FeedbackSentimentAnalyzer) +- [Get started with functions](Actions/LambdaWrapper.cs) - [Transform data with S3 Object Lambda](../cross-service/S3ObjectLambdaFunction) @@ -96,6 +91,30 @@ This example shows you how to get started using Lambda. +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + + + + + + +#### Create an application to analyze customer feedback + +This example shows you how to create an application that analyzes customer comment cards, translates them from their original language, determines their sentiment, and generates an audio file from the translated text. + + + + + + + + + #### Get started with functions This example shows you how to do the following: @@ -132,6 +151,18 @@ The scenario includes the following settings in `settings.json`: * `PolicyArn` - The Amazon Resource Name (ARN) of a policy giving the IAM role permissions to access Lambda. +#### Transform data with S3 Object Lambda + +This example shows you how to transform data for your application with S3 Object Lambda. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/dotnetv3/Polly/README.md b/dotnetv3/Polly/README.md index 5623f955d1d..dbf4f1c835a 100644 --- a/dotnetv3/Polly/README.md +++ b/dotnetv3/Polly/README.md @@ -40,9 +40,10 @@ Code excerpts that show you how to call individual service functions. - [PutLexicon](PutLexiconExample/PutLexicon.cs#L6) - [SynthesizeSpeech](SynthesizeSpeechExample/SynthesizeSpeech.cs#L11) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. - [Create an application to analyze customer feedback](../cross-service/FeedbackSentimentAnalyzer) @@ -77,6 +78,18 @@ Alternatively, you can run the example from within your IDE. +#### Create an application to analyze customer feedback + +This example shows you how to create an application that analyzes customer comment cards, translates them from their original language, determines their sentiment, and generates an audio file from the translated text. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/dotnetv3/RDS/README.md b/dotnetv3/RDS/README.md index 5c92010f832..8a3c22e31b0 100644 --- a/dotnetv3/RDS/README.md +++ b/dotnetv3/RDS/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3 - [Hello Amazon RDS](Actions/HelloRDS.cs#L4) (`DescribeDBInstances`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Scenarios/RDSInstanceScenario/RDSInstanceScenario.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -56,12 +63,6 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with DB instances](Scenarios/RDSInstanceScenario/RDSInstanceScenario.cs) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - - [Create an Aurora Serverless work item tracker](../cross-service/AuroraItemTracker) @@ -98,8 +99,7 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using Amazon RDS. - -#### Get started with DB instances +#### Learn the basics This example shows you how to do the following: @@ -108,12 +108,25 @@ This example shows you how to do the following: - Take a snapshot of the instance. - Delete the instance and parameter group. - - + + + + + + + + +#### Create an Aurora Serverless work item tracker + +This example shows you how to create a web application that tracks work items in an Amazon Aurora Serverless database and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + - - + + ### Tests diff --git a/dotnetv3/Rekognition/README.md b/dotnetv3/Rekognition/README.md index 5b9c27b6bea..6e3248967e3 100644 --- a/dotnetv3/Rekognition/README.md +++ b/dotnetv3/Rekognition/README.md @@ -50,9 +50,10 @@ Code excerpts that show you how to call individual service functions. - [SearchFaces](SearchFacesMatchingIdExample/SearchFacesMatchingId.cs#L6) - [SearchFacesByImage](SearchFacesMatchingImageExample/SearchFacesMatchingImage.cs#L6) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. - [Create a serverless application to manage photos](../cross-service/PhotoAssetManager) - [Detect objects in images](../cross-service/PhotoAnalyzerApp) @@ -88,6 +89,30 @@ Alternatively, you can run the example from within your IDE. +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + + + + + + +#### Detect objects in images + +This example shows you how to build an app that uses Amazon Rekognition to detect objects by category in images. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/dotnetv3/S3/README.md b/dotnetv3/S3/README.md index a362f8d1dcf..174b8636141 100644 --- a/dotnetv3/S3/README.md +++ b/dotnetv3/S3/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3 +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](S3_Basics/S3_Basics.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -71,22 +78,16 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create a presigned URL](GenPresignedURLExample/GenPresignedUrl.cs) -- [Get started with buckets and objects](S3_Basics/S3_Basics.cs) +- [Create a serverless application to manage photos](../cross-service/PhotoAssetManager) +- [Detect objects in images](../cross-service/PhotoAnalyzerApp) - [Get started with encryption](SSEClientEncryptionExample/SSEClientEncryption.cs) - [Get started with tags](ObjectTagExample/ObjectTag.cs) - [Get the legal hold configuration of an object](scenarios/S3ObjectLockScenario/S3ObjectLockWorkflow/S3ActionsWrapper.cs) - [Lock Amazon S3 objects](scenarios/S3ObjectLockScenario/S3ObjectLockWorkflow/S3ObjectLockWorkflow.cs) - [Manage access control lists (ACLs)](ManageACLsExample/ManageACLs.cs) - [Perform a multipart copy](MPUapiCopyObjExample/MPUapiCopyObj.cs) -- [Upload or download large files](scenarios/TransferUtilityBasics/TransferUtilityBasics/TransferBasics.cs) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a serverless application to manage photos](../cross-service/PhotoAssetManager) -- [Detect objects in images](../cross-service/PhotoAnalyzerApp) - [Transform data with S3 Object Lambda](../cross-service/S3ObjectLambdaFunction) +- [Upload or download large files](scenarios/TransferUtilityBasics/TransferUtilityBasics/TransferBasics.cs) @@ -118,6 +119,23 @@ Alternatively, you can run the example from within your IDE. +#### Learn the basics + +This example shows you how to do the following: + +- Create a bucket and upload a file to it. +- Download an object from a bucket. +- Copy an object to a subfolder in a bucket. +- List the objects in a bucket. +- Delete the bucket objects and the bucket. + + + + + + + + #### Create a presigned URL @@ -131,22 +149,29 @@ This example shows you how to create a presigned URL for Amazon S3 and upload an -#### Get started with buckets and objects +#### Create a serverless application to manage photos -This example shows you how to do the following: +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + -- Create a bucket and upload a file to it. -- Download an object from a bucket. -- Copy an object to a subfolder in a bucket. -- List the objects in a bucket. -- Delete the bucket objects and the bucket. - - + + +#### Detect objects in images - - +This example shows you how to build an app that uses Amazon Rekognition to detect objects by category in images. + + + + + + + + #### Get started with encryption @@ -220,6 +245,18 @@ This example shows you how to perform a multipart copy of an Amazon S3 object. +#### Transform data with S3 Object Lambda + +This example shows you how to transform data for your application with S3 Object Lambda. + + + + + + + + + #### Upload or download large files This example shows you how to upload or download large files to and from Amazon S3. diff --git a/dotnetv3/SES/README.md b/dotnetv3/SES/README.md index 9a88223ff76..aba1daba8b7 100644 --- a/dotnetv3/SES/README.md +++ b/dotnetv3/SES/README.md @@ -44,9 +44,10 @@ Code excerpts that show you how to call individual service functions. - [SendTemplatedEmail](Actions/SESWrapper.cs#L301) - [VerifyEmailIdentity](Actions/SESWrapper.cs#L87) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. - [Create a web application to track DynamoDB data](../cross-service/DynamoDbItemTracker) - [Create an Aurora Serverless work item tracker](../cross-service/AuroraItemTracker) @@ -83,6 +84,42 @@ Alternatively, you can run the example from within your IDE. +#### Create a web application to track DynamoDB data + +This example shows you how to create a web application that tracks work items in an Amazon DynamoDB table and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + + + + + + +#### Create an Aurora Serverless work item tracker + +This example shows you how to create a web application that tracks work items in an Amazon Aurora Serverless database and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + + + + + + +#### Detect objects in images + +This example shows you how to build an app that uses Amazon Rekognition to detect objects by category in images. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/dotnetv3/SNS/README.md b/dotnetv3/SNS/README.md index 32ec39f4ba4..bad405dc534 100644 --- a/dotnetv3/SNS/README.md +++ b/dotnetv3/SNS/README.md @@ -53,15 +53,10 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Publish an SMS text message](SNSMessageExample/SNSMessageExample/SNSMessage.cs) -- [Publish messages to queues](../cross-service/TopicsAndQueues/Scenarios/TopicsAndQueuesScenario/TopicsAndQueues.cs) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - - [Building an Amazon SNS application](../cross-service/SubscribePublishTranslate) - [Create a serverless application to manage photos](../cross-service/PhotoAssetManager) +- [Publish an SMS text message](SNSMessageExample/SNSMessageExample/SNSMessage.cs) +- [Publish messages to queues](../cross-service/TopicsAndQueues/Scenarios/TopicsAndQueuesScenario/TopicsAndQueues.cs) @@ -98,6 +93,30 @@ This example shows you how to get started using Amazon SNS. +#### Building an Amazon SNS application + +This example shows you how to create an application that has subscription and publish functionality and translates messages. + + + + + + + + + +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + + + + + + #### Publish an SMS text message This example shows you how to publish SMS messages using Amazon SNS. diff --git a/dotnetv3/SQS/README.md b/dotnetv3/SQS/README.md index ce30264320f..818dfacd117 100644 --- a/dotnetv3/SQS/README.md +++ b/dotnetv3/SQS/README.md @@ -54,11 +54,6 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Publish messages to queues](../cross-service/TopicsAndQueues/Scenarios/TopicsAndQueuesScenario/TopicsAndQueues.cs) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - - [Use the AWS Message Processing Framework for .NET with Amazon SQS](../cross-service/MessageProcessingFramework) @@ -112,6 +107,18 @@ This example shows you how to do the following: +#### Use the AWS Message Processing Framework for .NET with Amazon SQS + +This example shows you how to create applications that publish and receive Amazon SQS messages using the AWS Message Processing Framework for .NET. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/dotnetv3/StepFunctions/README.md b/dotnetv3/StepFunctions/README.md index dc7157d735b..6f6af46e259 100644 --- a/dotnetv3/StepFunctions/README.md +++ b/dotnetv3/StepFunctions/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3 - [Hello Step Functions](Actions/HelloStepFunctions.cs#L4) (`ListStateMachines`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Scenarios/UIMethods.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -51,13 +58,6 @@ Code excerpts that show you how to call individual service functions. - [SendTaskSuccess](Actions/StepFunctionsWrapper.cs#L225) - [StartExecution](Actions/StepFunctionsWrapper.cs#L243) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with state machines](Scenarios/UIMethods.cs) - @@ -92,8 +92,7 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using Step Functions. - -#### Get started with state machines +#### Learn the basics This example shows you how to do the following: @@ -102,12 +101,13 @@ This example shows you how to do the following: - Run the state machine and respond to the activity with user input. - Get the final status and output after the run completes, then clean up resources. - - + + + + + - - ### Tests diff --git a/dotnetv3/Support/README.md b/dotnetv3/Support/README.md index ceb1ee447bb..0aa72d76e86 100644 --- a/dotnetv3/Support/README.md +++ b/dotnetv3/Support/README.md @@ -41,6 +41,13 @@ plan, the SubscriptionRequiredException error message appears. For information a - [Hello Support](Actions/HelloSupport.cs#L6) (`DescribeServices`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Scenarios/SupportCaseScenario.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -55,13 +62,6 @@ Code excerpts that show you how to call individual service functions. - [DescribeSeverityLevels](Actions/SupportWrapper.cs#L43) - [ResolveCase](Actions/SupportWrapper.cs#L241) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with cases](Scenarios/SupportCaseScenario.cs) - @@ -96,8 +96,7 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using Support. - -#### Get started with cases +#### Learn the basics This example shows you how to do the following: @@ -109,12 +108,13 @@ This example shows you how to do the following: - Resolve the case. - Get and display a list of resolved cases for the current day. - - + + + + + - - ### Tests diff --git a/dotnetv3/Translate/README.md b/dotnetv3/Translate/README.md index 80089352789..a4d3d895c61 100644 --- a/dotnetv3/Translate/README.md +++ b/dotnetv3/Translate/README.md @@ -39,9 +39,10 @@ Code excerpts that show you how to call individual service functions. - [StopTextTranslationJob](StopTextTranslationJobExample/StopTextTranslationJob.cs#L6) - [TranslateText](TranslateTextExample/TranslateText.cs#L6) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. - [Building an Amazon SNS application](../cross-service/SubscribePublishTranslate) - [Create an application to analyze customer feedback](../cross-service/FeedbackSentimentAnalyzer) @@ -77,6 +78,30 @@ Alternatively, you can run the example from within your IDE. +#### Building an Amazon SNS application + +This example shows you how to create an application that has subscription and publish functionality and translates messages. + + + + + + + + + +#### Create an application to analyze customer feedback + +This example shows you how to create an application that analyzes customer comment cards, translates them from their original language, determines their sentiment, and generates an audio file from the translated text. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/dotnetv3/dynamodb/README.md b/dotnetv3/dynamodb/README.md index c3855798993..dee06e0441e 100644 --- a/dotnetv3/dynamodb/README.md +++ b/dotnetv3/dynamodb/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `dotnetv3 - [Hello DynamoDB](scenarios/DynamoDB_Basics/DynamoDB_Actions/HelloDynamoDB.cs#L4) (`ListTables`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenarios/DynamoDB_Basics/DynamoDB_Basics_Scenario/DynamoDB_Basics.cs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -58,19 +65,13 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with tables, items, and queries](scenarios/DynamoDB_Basics/DynamoDB_Basics_Scenario/DynamoDB_Basics.cs) +- [Create a serverless application to manage photos](../cross-service/PhotoAssetManager) +- [Create a web application to track DynamoDB data](../cross-service/DynamoDbItemTracker) - [Query a table by using batches of PartiQL statements](scenarios/PartiQL_Batch_Scenario/PartiQL_Batch_Scenario/PartiQLBatchMethods.cs) - [Query a table using PartiQL](scenarios/PartiQL_Basics_Scenario/PartiQL_Basics_Scenario/PartiQLMethods.cs) - [Use a document model](mid-level-api/MidlevelItemCRUDExample/MidlevelItemCRUDExample/MidlevelItemCRUD.cs) - [Use a high-level object persistence model](high-level-api/HighLevelItemCRUDExample/HighLevelItemCRUDExample/HighLevelItemCRUD.cs) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a serverless application to manage photos](../cross-service/PhotoAssetManager) -- [Create a web application to track DynamoDB data](../cross-service/DynamoDbItemTracker) - @@ -114,8 +115,7 @@ Alternatively, you can run the example from within your IDE. This example shows you how to get started using DynamoDB. - -#### Get started with tables, items, and queries +#### Learn the basics This example shows you how to do the following: @@ -126,12 +126,37 @@ This example shows you how to do the following: - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - - + + + + + + + + +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + + + + + + +#### Create a web application to track DynamoDB data + +This example shows you how to create a web application that tracks work items in an Amazon DynamoDB table and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + - - + + #### Query a table by using batches of PartiQL statements diff --git a/gov2/aurora/README.md b/gov2/aurora/README.md index fdff52bee97..cfc12574a02 100644 --- a/gov2/aurora/README.md +++ b/gov2/aurora/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `gov2` fo - [Hello Aurora](hello/hello.go#L4) (`DescribeDBClusters`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenarios/get_started_clusters.go) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -54,13 +61,6 @@ Code excerpts that show you how to call individual service functions. - [DescribeOrderableDBInstanceOptions](actions/clusters.go#L330) - [ModifyDBClusterParameterGroup](actions/clusters.go#L117) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with DB clusters](scenarios/get_started_clusters.go) - @@ -89,8 +89,7 @@ and to get help for running a scenario, use the following command: ``` go run ./cmd -h ``` - -#### Get started with DB clusters +#### Learn the basics This example shows you how to do the following: @@ -99,12 +98,13 @@ This example shows you how to do the following: - Create a DB instance that contains a database. - Take a snapshot of the DB cluster, then clean up resources. - - + + + + + - - ### Tests diff --git a/gov2/dynamodb/README.md b/gov2/dynamodb/README.md index af1a180b3ff..31717fdcbea 100644 --- a/gov2/dynamodb/README.md +++ b/gov2/dynamodb/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `gov2` fo +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenarios/scenario_movie_table.go) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -52,7 +59,6 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with tables, items, and queries](scenarios/scenario_movie_table.go) - [Query a table by using batches of PartiQL statements](scenarios/scenario_partiql_batch.go) - [Query a table using PartiQL](scenarios/scenario_partiql_single.go) @@ -77,8 +83,7 @@ and to get help for running a scenario, use the following command: ``` go run ./cmd -h ``` - -#### Get started with tables, items, and queries +#### Learn the basics This example shows you how to do the following: @@ -89,12 +94,13 @@ This example shows you how to do the following: - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - - + + + + + - - #### Query a table by using batches of PartiQL statements diff --git a/gov2/rds/README.md b/gov2/rds/README.md index 6ebcdd29256..75678612544 100644 --- a/gov2/rds/README.md +++ b/gov2/rds/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `gov2` fo - [Hello Amazon RDS](hello/hello.go#L4) (`DescribeDBInstances`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenarios/get_started_instances.go) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -51,13 +58,6 @@ Code excerpts that show you how to call individual service functions. - [DescribeOrderableDBInstanceOptions](actions/instances.go#L269) - [ModifyDBParameterGroup](actions/instances.go#L119) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with DB instances](scenarios/get_started_instances.go) - @@ -86,8 +86,7 @@ and to get help for running a scenario, use the following command: ``` go run ./cmd -h ``` - -#### Get started with DB instances +#### Learn the basics This example shows you how to do the following: @@ -96,12 +95,13 @@ This example shows you how to do the following: - Take a snapshot of the instance. - Delete the instance and parameter group. - - + + + + + - - ### Tests diff --git a/gov2/s3/README.md b/gov2/s3/README.md index dae9e274747..eb066a590b2 100644 --- a/gov2/s3/README.md +++ b/gov2/s3/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `gov2` fo - [Hello Amazon S3](hello/hello.go#L4) (`ListBuckets`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](actions/bucket_basics.go) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -62,7 +69,6 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create a presigned URL](actions/presigner.go) -- [Get started with buckets and objects](actions/bucket_basics.go) - [Lock Amazon S3 objects](../workflows/s3_object_lock/workflows/s3_object_lock.go) - [Upload or download large files](actions/bucket_basics.go) @@ -111,6 +117,23 @@ and to get help for running a scenario, use the following command: ``` go run ./cmd -h ``` +#### Learn the basics + +This example shows you how to do the following: + +- Create a bucket and upload a file to it. +- Download an object from a bucket. +- Copy an object to a subfolder in a bucket. +- List the objects in a bucket. +- Delete the bucket objects and the bucket. + + + + + + + + #### Create a presigned URL @@ -127,26 +150,6 @@ go run ./cmd -scenario presigning ``` -#### Get started with buckets and objects - -This example shows you how to do the following: - -- Create a bucket and upload a file to it. -- Download an object from a bucket. -- Copy an object to a subfolder in a bucket. -- List the objects in a bucket. -- Delete the bucket objects and the bucket. - - - - - - -``` -go run ./cmd -scenario getstarted -``` - - #### Lock Amazon S3 objects This example shows you how to work with S3 object lock features. diff --git a/javascriptv3/example_code/dynamodb/README.md b/javascriptv3/example_code/dynamodb/README.md index 83776e13ea0..fb55d2ff3da 100644 --- a/javascriptv3/example_code/dynamodb/README.md +++ b/javascriptv3/example_code/dynamodb/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas - [Hello DynamoDB](hello.js#L6) (`ListTables`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenarios/basic.js) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -58,15 +65,9 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with tables, items, and queries](scenarios/basic.js) - [Query a table by using batches of PartiQL statements](scenarios/partiql-batch.js) - [Query a table using PartiQL](scenarios/partiql-single.js) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Use Step Functions to invoke Lambda functions](../../example_code/cross-services/lambda-step-functions) +- [Use Step Functions to invoke Lambda functions](javascriptv3/example_code/cross-services/lambda-step-functions) @@ -102,8 +103,7 @@ This example shows you how to get started using DynamoDB. node ./hello.js ``` - -#### Get started with tables, items, and queries +#### Learn the basics This example shows you how to do the following: @@ -114,12 +114,13 @@ This example shows you how to do the following: - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - - + + - - + + + #### Query a table by using batches of PartiQL statements @@ -153,6 +154,18 @@ This example shows you how to do the following: +#### Use Step Functions to invoke Lambda functions + +This example shows you how to create an AWS Step Functions state machine that invokes AWS Lambda functions in sequence. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/javascriptv3/example_code/ec2/README.md b/javascriptv3/example_code/ec2/README.md index 8c2cce16763..89d2450c401 100644 --- a/javascriptv3/example_code/ec2/README.md +++ b/javascriptv3/example_code/ec2/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas - [Hello Amazon EC2](hello.js#L6) (`DescribeSecurityGroups`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenarios/basic.js) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -74,7 +81,6 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Build and manage a resilient service](../cross-services/wkflw-resilient-service/index.js) -- [Get started with instances](scenarios/basic.js) @@ -110,6 +116,23 @@ This example shows you how to get started using Amazon EC2. node ./hello.js ``` +#### Learn the basics + +This example shows you how to do the following: + +- Create a key pair and security group. +- Select an Amazon Machine Image (AMI) and compatible instance type, then create an instance. +- Stop and restart the instance. +- Associate an Elastic IP address with your instance. +- Connect to your instance with SSH, then clean up resources. + + + + + + + + #### Build and manage a resilient service @@ -129,23 +152,6 @@ This example shows you how to create a load-balanced web service that returns bo -#### Get started with instances - -This example shows you how to do the following: - -- Create a key pair and security group. -- Select an Amazon Machine Image (AMI) and compatible instance type, then create an instance. -- Stop and restart the instance. -- Associate an Elastic IP address with your instance. -- Connect to your instance with SSH, then clean up resources. - - - - - - - - ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/javascriptv3/example_code/glue/README.md b/javascriptv3/example_code/glue/README.md index 94d7db3cce1..7400eab40c9 100644 --- a/javascriptv3/example_code/glue/README.md +++ b/javascriptv3/example_code/glue/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas - [Hello AWS Glue](hello.js#L6) (`ListJobs`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenarios/basic/steps/start-crawler.js) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -55,13 +62,6 @@ Code excerpts that show you how to call individual service functions. - [StartCrawler](actions/start-crawler.js#L6) - [StartJobRun](actions/start-job-run.js#L6) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with crawlers and jobs](scenarios/basic/steps/start-crawler.js) - @@ -96,8 +96,7 @@ This example shows you how to get started using AWS Glue. node ./hello.js ``` - -#### Get started with crawlers and jobs +#### Learn the basics This example shows you how to do the following: @@ -106,12 +105,13 @@ This example shows you how to do the following: - Create a job to extract CSV data from the S3 bucket, transform the data, and load JSON-formatted output into another S3 bucket. - List information about job runs, view transformed data, and clean up resources. - - + + + + + - - ### Tests diff --git a/javascriptv3/example_code/lambda/README.md b/javascriptv3/example_code/lambda/README.md index 27b30458bc6..f4e51c62df5 100644 --- a/javascriptv3/example_code/lambda/README.md +++ b/javascriptv3/example_code/lambda/README.md @@ -52,12 +52,7 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Get started with functions](../iam/actions/attach-role-policy.js) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Use Step Functions to invoke Lambda functions](../../example_code/cross-services/lambda-step-functions) +- [Use Step Functions to invoke Lambda functions](javascriptv3/example_code/cross-services/lambda-step-functions) @@ -111,6 +106,18 @@ This example shows you how to do the following: +#### Use Step Functions to invoke Lambda functions + +This example shows you how to create an AWS Step Functions state machine that invokes AWS Lambda functions in sequence. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/javascriptv3/example_code/s3/README.md b/javascriptv3/example_code/s3/README.md index 9d84e638bc4..453a5c17b07 100644 --- a/javascriptv3/example_code/s3/README.md +++ b/javascriptv3/example_code/s3/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas - [Hello Amazon S3](hello.js#L6) (`ListBuckets`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenarios/basic.js) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -70,7 +77,6 @@ functions within the same service. - [Create a presigned URL](scenarios/presigned-url-upload.js) - [Create a web page that lists Amazon S3 objects](../web/s3/list-objects/src/App.tsx) -- [Get started with buckets and objects](scenarios/basic.js) - [Get the legal hold configuration of an object](actions/get-object-legal-hold.js) - [Lock Amazon S3 objects](scenarios/object-locking/index.js) - [Upload or download large files](scenarios/multipart-upload.js) @@ -116,6 +122,23 @@ This example shows you how to get started using Amazon S3. node ./hello.js ``` +#### Learn the basics + +This example shows you how to do the following: + +- Create a bucket and upload a file to it. +- Download an object from a bucket. +- Copy an object to a subfolder in a bucket. +- List the objects in a bucket. +- Delete the bucket objects and the bucket. + + + + + + + + #### Create a presigned URL @@ -141,23 +164,6 @@ This example shows you how to list Amazon S3 objects in a web page. -#### Get started with buckets and objects - -This example shows you how to do the following: - -- Create a bucket and upload a file to it. -- Download an object from a bucket. -- Copy an object to a subfolder in a bucket. -- List the objects in a bucket. -- Delete the bucket objects and the bucket. - - - - - - - - #### Get the legal hold configuration of an object This example shows you how to get the legal hold configuration of an S3 bucket. diff --git a/javascriptv3/example_code/ses/README.md b/javascriptv3/example_code/ses/README.md index 81a051c3c7d..6b9f8ddd084 100644 --- a/javascriptv3/example_code/ses/README.md +++ b/javascriptv3/example_code/ses/README.md @@ -54,11 +54,12 @@ Code excerpts that show you how to call individual service functions. - [VerifyDomainIdentity](src/ses_verifydomainidentity.js#L15) - [VerifyEmailIdentity](src/ses_verifyemailidentity.js#L16) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. -- [Use Step Functions to invoke Lambda functions](../../example_code/cross-services/lambda-step-functions) +- [Use Step Functions to invoke Lambda functions](javascriptv3/example_code/cross-services/lambda-step-functions) @@ -88,6 +89,18 @@ node ./scenarios/ +#### Use Step Functions to invoke Lambda functions + +This example shows you how to create an AWS Step Functions state machine that invokes AWS Lambda functions in sequence. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/javascriptv3/example_code/sfn/README.md b/javascriptv3/example_code/sfn/README.md index 6c3315ec880..9981756926d 100644 --- a/javascriptv3/example_code/sfn/README.md +++ b/javascriptv3/example_code/sfn/README.md @@ -35,11 +35,12 @@ Code excerpts that show you how to call individual service functions. - [StartExecution](actions/start-execution.js) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. -- [Use Step Functions to invoke Lambda functions](../../example_code/cross-services/lambda-step-functions) +- [Use Step Functions to invoke Lambda functions](javascriptv3/example_code/cross-services/lambda-step-functions) @@ -69,6 +70,18 @@ node ./scenarios/ +#### Use Step Functions to invoke Lambda functions + +This example shows you how to create an AWS Step Functions state machine that invokes AWS Lambda functions in sequence. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/javascriptv3/example_code/support/README.md b/javascriptv3/example_code/support/README.md index 9d74b9a4220..0d28c0efbad 100644 --- a/javascriptv3/example_code/support/README.md +++ b/javascriptv3/example_code/support/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas - [Hello Support](hello.js#L6) (`DescribeServices`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenarios/basic.js) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -47,13 +54,6 @@ Code excerpts that show you how to call individual service functions. - [DescribeSeverityLevels](actions/describe-severity-levels.js#L6) - [ResolveCase](actions/resolve-case.js#L6) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with cases](scenarios/basic.js) - @@ -88,8 +88,7 @@ This example shows you how to get started using Support. node ./hello.js ``` - -#### Get started with cases +#### Learn the basics This example shows you how to do the following: @@ -101,12 +100,13 @@ This example shows you how to do the following: - Resolve the case. - Get and display a list of resolved cases for the current day. - - + + + + + - - ### Tests diff --git a/javav2/example_code/cloudwatch/README.md b/javav2/example_code/cloudwatch/README.md index 7fab9255f51..05909e57cda 100644 --- a/javav2/example_code/cloudwatch/README.md +++ b/javav2/example_code/cloudwatch/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello CloudWatch](src/main/java/com/example/cloudwatch/HelloService.java#L6) (`ListMetrics`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/cloudwatch/CloudWatchScenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -57,13 +64,6 @@ Code excerpts that show you how to call individual service functions. - [PutMetricAlarm](src/main/java/com/example/cloudwatch/CloudWatchScenario.java#L659) - [PutMetricData](src/main/java/com/example/cloudwatch/CloudWatchScenario.java#L530) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with metrics, dashboards, and alarms](src/main/java/com/example/cloudwatch/CloudWatchScenario.java) - @@ -81,8 +81,7 @@ functions within the same service. This example shows you how to get started using CloudWatch. - -#### Get started with metrics, dashboards, and alarms +#### Learn the basics This example shows you how to do the following: @@ -94,12 +93,13 @@ This example shows you how to do the following: - Add an anomaly detector. - Get a metric image, then clean up resources. - - + + + + + - - ### Tests diff --git a/javav2/example_code/dynamodb/README.md b/javav2/example_code/dynamodb/README.md index 967e0ef487b..3c3defb4299 100644 --- a/javav2/example_code/dynamodb/README.md +++ b/javav2/example_code/dynamodb/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello DynamoDB](src/main/java/com/example/dynamodb/ListTables.java#L6) (`ListTables`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/dynamodb/Scenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -56,7 +63,6 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with tables, items, and queries](src/main/java/com/example/dynamodb/Scenario.java) - [Query a table by using batches of PartiQL statements](src/main/java/com/example/dynamodb/ScenarioPartiQLBatch.java) - [Query a table using PartiQL](src/main/java/com/example/dynamodb/ScenarioPartiQ.java) @@ -77,8 +83,7 @@ functions within the same service. This example shows you how to get started using DynamoDB. - -#### Get started with tables, items, and queries +#### Learn the basics This example shows you how to do the following: @@ -89,12 +94,13 @@ This example shows you how to do the following: - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - - + + + + + - - #### Query a table by using batches of PartiQL statements diff --git a/javav2/example_code/ec2/README.md b/javav2/example_code/ec2/README.md index 017539272d7..b8d9ee83fe5 100644 --- a/javav2/example_code/ec2/README.md +++ b/javav2/example_code/ec2/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello Amazon EC2](src/main/java/com/example/ec2/EC2Scenario.java#L556) (`DescribeSecurityGroups`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/ec2/EC2Scenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -63,7 +70,6 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Build and manage a resilient service](../../usecases/resilient_service/src/main/java/com/example/resilient/Main.java) -- [Get started with instances](src/main/java/com/example/ec2/EC2Scenario.java) @@ -82,6 +88,23 @@ functions within the same service. This example shows you how to get started using Amazon EC2. +#### Learn the basics + +This example shows you how to do the following: + +- Create a key pair and security group. +- Select an Amazon Machine Image (AMI) and compatible instance type, then create an instance. +- Stop and restart the instance. +- Associate an Elastic IP address with your instance. +- Connect to your instance with SSH, then clean up resources. + + + + + + + + #### Build and manage a resilient service @@ -101,23 +124,6 @@ This example shows you how to create a load-balanced web service that returns bo -#### Get started with instances - -This example shows you how to do the following: - -- Create a key pair and security group. -- Select an Amazon Machine Image (AMI) and compatible instance type, then create an instance. -- Stop and restart the instance. -- Associate an Elastic IP address with your instance. -- Connect to your instance with SSH, then clean up resources. - - - - - - - - ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/javav2/example_code/ecr/README.md b/javav2/example_code/ecr/README.md index fb4adef17e5..ce73079daeb 100644 --- a/javav2/example_code/ecr/README.md +++ b/javav2/example_code/ecr/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello Amazon ECR](src/main/java/com/example/ecr/HelloECR.java#L6) (`listImages`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/ecr/scenario/ECRScenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -48,13 +55,6 @@ Code excerpts that show you how to call individual service functions. - [SetRepositoryPolicy](src/main/java/com/example/ecr/scenario/ECRActions.java#L396) - [StartLifecyclePolicyPreview](src/main/java/com/example/ecr/scenario/ECRActions.java#L244) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Learn Amazon ECR core operations](src/main/java/com/example/ecr/scenario/ECRScenario.java) - @@ -72,8 +72,7 @@ functions within the same service. This example shows you how to get started using Amazon ECR. - -#### Learn Amazon ECR core operations +#### Learn the basics This example shows you how to do the following: @@ -87,12 +86,13 @@ This example shows you how to do the following: - List Amazon ECR repositories for your account and get details about them. - Delete Amazon ECR repositories. - - + + + + + - - ### Tests diff --git a/javav2/example_code/eventbridge/README.md b/javav2/example_code/eventbridge/README.md index e1b6a380a97..2089f40fab1 100644 --- a/javav2/example_code/eventbridge/README.md +++ b/javav2/example_code/eventbridge/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello EventBridge](src/main/java/com/example/eventbridge/HelloEventBridge.java#L16) (`ListEventBuses`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/eventbridge/EventbridgeMVP.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -55,7 +62,6 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with rules and targets](src/main/java/com/example/eventbridge/EventbridgeMVP.java) - [Send event notifications to EventBridge](../s3/src/main/java/com/example/s3/PutBucketS3EventNotificationEventBridge.java) @@ -75,8 +81,7 @@ functions within the same service. This example shows you how to get started using EventBridge. - -#### Get started with rules and targets +#### Learn the basics This example shows you how to do the following: @@ -85,12 +90,13 @@ This example shows you how to do the following: - List and update rules and targets. - Send events, then clean up resources. - - + + + + + - - #### Send event notifications to EventBridge diff --git a/javav2/example_code/glue/README.md b/javav2/example_code/glue/README.md index a672b09b663..38e998832b9 100644 --- a/javav2/example_code/glue/README.md +++ b/javav2/example_code/glue/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello AWS Glue](src/main/java/com/example/glue/HelloGlue.java#L4) (`ListJobs`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/glue/GlueScenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -44,13 +51,6 @@ Code excerpts that show you how to call individual service functions. - [GetTables](src/main/java/com/example/glue/GetTable.java#L6) - [StartCrawler](src/main/java/com/example/glue/StartCrawler.java#L6) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with crawlers and jobs](src/main/java/com/example/glue/GlueScenario.java) - @@ -68,8 +68,7 @@ functions within the same service. This example shows you how to get started using AWS Glue. - -#### Get started with crawlers and jobs +#### Learn the basics This example shows you how to do the following: @@ -78,12 +77,13 @@ This example shows you how to do the following: - Create a job to extract CSV data from the S3 bucket, transform the data, and load JSON-formatted output into another S3 bucket. - List information about job runs, view transformed data, and clean up resources. - - + + + + + - - ### Tests diff --git a/javav2/example_code/iot/README.md b/javav2/example_code/iot/README.md index 740899c89b9..e77c9b3515a 100644 --- a/javav2/example_code/iot/README.md +++ b/javav2/example_code/iot/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello AWS IoT](src/main/java/com/example/iot/HelloIoT.java#L6) (`listThings`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/iot/scenario/IotScenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -51,13 +58,6 @@ Code excerpts that show you how to call individual service functions. - [SearchIndex](src/main/java/com/example/iot/scenario/IotActions.java#L533) - [UpdateThing](src/main/java/com/example/iot/scenario/IotActions.java#L269) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Work with device management use cases](src/main/java/com/example/iot/scenario/IotScenario.java) - @@ -75,18 +75,18 @@ functions within the same service. This example shows you how to get started using AWS IoT. +#### Learn the basics -#### Work with device management use cases +This example shows you how to work with AWS IoT device management. -This example shows you how to work with AWS IoT device management use cases using AWS IoT SDK + + - - + + - - ### Tests diff --git a/javav2/example_code/keyspaces/README.md b/javav2/example_code/keyspaces/README.md index 9434cbab7e0..f291c0b8410 100644 --- a/javav2/example_code/keyspaces/README.md +++ b/javav2/example_code/keyspaces/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello Amazon Keyspaces](src/main/java/com/example/keyspace/HelloKeyspaces.java#L6) (`ListKeyspaces`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/keyspace/ScenarioKeyspaces.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -49,13 +56,6 @@ Code excerpts that show you how to call individual service functions. - [RestoreTable](src/main/java/com/example/keyspace/ScenarioKeyspaces.java#L322) - [UpdateTable](src/main/java/com/example/keyspace/ScenarioKeyspaces.java#L369) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with keyspaces and tables](src/main/java/com/example/keyspace/ScenarioKeyspaces.java) - @@ -73,8 +73,7 @@ functions within the same service. This example shows you how to get started using Amazon Keyspaces. - -#### Get started with keyspaces and tables +#### Learn the basics This example shows you how to do the following: @@ -84,12 +83,13 @@ This example shows you how to do the following: - Update the table. Add a column to track watched movies. - Restore the table to its previous state and clean up resources. - - + + + + + - - ### Tests diff --git a/javav2/example_code/kms/README.md b/javav2/example_code/kms/README.md index 8787a074bd4..31ee5f2ec62 100644 --- a/javav2/example_code/kms/README.md +++ b/javav2/example_code/kms/README.md @@ -31,7 +31,14 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav ### Get started -- [Hello KMS key](src/main/java/com/example/kms/HelloKMS.java#L6) (`listKeysPaginator`) +- [Hello AWS KMS](src/main/java/com/example/kms/HelloKMS.java#L6) (`listKeysPaginator`) + + +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/kms/scenario/KMSScenario.java) ### Single actions @@ -56,13 +63,6 @@ Code excerpts that show you how to call individual service functions. - [Sign](src/main/java/com/example/kms/scenario/KMSScenario.java#L338) - [TagResource](src/main/java/com/example/kms/scenario/KMSScenario.java#L376) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Learn KMS key core operations](src/main/java/com/example/kms/scenario/KMSScenario.java) - @@ -75,13 +75,12 @@ functions within the same service. -#### Hello KMS key +#### Hello AWS KMS -This example shows you how to get started using KMS key. +This example shows you how to get started using AWS KMS. - -#### Learn KMS key core operations +#### Learn the basics This example shows you how to do the following: @@ -93,12 +92,13 @@ This example shows you how to do the following: - Tag keys. - Delete KMS keys. - - + + + + + - - ### Tests diff --git a/javav2/example_code/rds/README.md b/javav2/example_code/rds/README.md index d69a868a56d..3c8ad505fd5 100644 --- a/javav2/example_code/rds/README.md +++ b/javav2/example_code/rds/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello Amazon RDS](src/main/java/com/example/rds/DescribeDBInstances.java#L6) (`DescribeDBInstances`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/rds/RDSScenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -54,13 +61,6 @@ Code excerpts that show you how to call individual service functions. - [ModifyDBParameterGroup](src/main/java/com/example/rds/RDSScenario.java#L465) - [RebootDBInstance](src/main/java/com/example/rds/RebootDBInstance.java#L6) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with DB instances](src/main/java/com/example/rds/RDSScenario.java) - @@ -78,8 +78,7 @@ functions within the same service. This example shows you how to get started using Amazon RDS. - -#### Get started with DB instances +#### Learn the basics This example shows you how to do the following: @@ -88,12 +87,13 @@ This example shows you how to do the following: - Take a snapshot of the instance. - Delete the instance and parameter group. - - + + + + + - - ### Tests diff --git a/javav2/example_code/redshift/README.md b/javav2/example_code/redshift/README.md index a4d1519ada2..a9bf07adec0 100644 --- a/javav2/example_code/redshift/README.md +++ b/javav2/example_code/redshift/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello Amazon Redshift](src/main/java/com/example/redshift/HelloRedshift.java#L6) (`describeClusters`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/scenario/RedshiftScenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -48,13 +55,6 @@ Code excerpts that show you how to call individual service functions. - [ModifyCluster](src/main/java/com/example/scenario/RedshiftScenario.java#L356) - [Query](src/main/java/com/example/scenario/RedshiftScenario.java#L375) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with Amazon Redshift](src/main/java/com/example/scenario/RedshiftScenario.java) - @@ -72,18 +72,18 @@ functions within the same service. This example shows you how to get started using Amazon Redshift. - -#### Get started with Amazon Redshift +#### Learn the basics This example shows you how to work with Amazon Redshift tables, items, and queries. - - + + + + + - - ### Tests diff --git a/javav2/example_code/s3/README.md b/javav2/example_code/s3/README.md index fcbe5fda7dc..bffcc989c8a 100644 --- a/javav2/example_code/s3/README.md +++ b/javav2/example_code/s3/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello Amazon S3](src/main/java/com/example/s3/HelloS3.java#L6) (`ListBuckets`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/s3/S3Scenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -73,7 +80,6 @@ functions within the same service. - [Delete incomplete multipart uploads](src/main/java/com/example/s3/AbortMultipartUploadExamples.java) - [Download objects to a local directory](src/main/java/com/example/s3/transfermanager/DownloadToDirectory.java) -- [Get started with buckets and objects](src/main/java/com/example/s3/S3Scenario.java) - [Get the legal hold configuration of an object](src/main/java/com/example/s3/lockscenario/S3LockActions.java) - [Lock Amazon S3 objects](src/main/java/com/example/s3/lockscenario/S3ObjectLockWorkflow.java) - [Parse URIs](src/main/java/com/example/s3/ParseUri.java) @@ -105,6 +111,23 @@ functions within the same service. This example shows you how to get started using Amazon S3. +#### Learn the basics + +This example shows you how to do the following: + +- Create a bucket and upload a file to it. +- Download an object from a bucket. +- Copy an object to a subfolder in a bucket. +- List the objects in a bucket. +- Delete the bucket objects and the bucket. + + + + + + + + #### Delete incomplete multipart uploads @@ -130,23 +153,6 @@ This example shows you how to download all objects in an Amazon Simple Storage S -#### Get started with buckets and objects - -This example shows you how to do the following: - -- Create a bucket and upload a file to it. -- Download an object from a bucket. -- Copy an object to a subfolder in a bucket. -- List the objects in a bucket. -- Delete the bucket objects and the bucket. - - - - - - - - #### Get the legal hold configuration of an object This example shows you how to get the legal hold configuration of an S3 bucket. diff --git a/javav2/example_code/ssm/README.md b/javav2/example_code/ssm/README.md index 596fff26656..041da236a97 100644 --- a/javav2/example_code/ssm/README.md +++ b/javav2/example_code/ssm/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello Systems Manager](src/main/java/com/example/ssm/HelloSSM.java#L6) (`listThings`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/scenario/SSMScenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -50,13 +57,6 @@ Code excerpts that show you how to call individual service functions. - [UpdateMaintenanceWindow](src/main/java/com/example/scenario/SSMActions.java#L532) - [UpdateOpsItem](src/main/java/com/example/scenario/SSMActions.java#L170) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with Systems Manager](src/main/java/com/example/scenario/SSMScenario.java) - @@ -87,18 +87,18 @@ Define these values to successfully run the JUnit tests: This example shows you how to get started using Systems Manager. - -#### Get started with Systems Manager +#### Learn the basics This example shows you how to work with Systems Manager maintenance windows, documents, and OpsItems. - - + + + + + - - ### Tests diff --git a/javav2/example_code/support/README.md b/javav2/example_code/support/README.md index 6f7ae3ac326..e0ee59ce015 100644 --- a/javav2/example_code/support/README.md +++ b/javav2/example_code/support/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav - [Hello Support](src/main/java/com/example/support/HelloSupport.java#L6) (`DescribeServices`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/java/com/example/support/SupportScenario.java) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -48,13 +55,6 @@ Code excerpts that show you how to call individual service functions. - [DescribeSeverityLevels](src/main/java/com/example/support/SupportScenario.java#L358) - [ResolveCase](src/main/java/com/example/support/SupportScenario.java#L190) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with cases](src/main/java/com/example/support/SupportScenario.java) - @@ -72,8 +72,7 @@ functions within the same service. This example shows you how to get started using Support. - -#### Get started with cases +#### Learn the basics This example shows you how to do the following: @@ -85,12 +84,13 @@ This example shows you how to do the following: - Resolve the case. - Get and display a list of resolved cases for the current day. - - + + + + + - - ### Tests diff --git a/kotlin/services/cloudwatch/README.md b/kotlin/services/cloudwatch/README.md index dbb6a201a20..7bdcab5d33f 100644 --- a/kotlin/services/cloudwatch/README.md +++ b/kotlin/services/cloudwatch/README.md @@ -39,6 +39,13 @@ To run these examples, you must have the following three JSON files: jsonWidgets - [Hello CloudWatch](src/main/kotlin/com/kotlin/cloudwatch/HelloService.kt#L11) (`ListMetrics`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/kotlin/cloudwatch/CloudWatchScenario.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -62,13 +69,6 @@ Code excerpts that show you how to call individual service functions. - [PutMetricAlarm](src/main/kotlin/com/kotlin/cloudwatch/PutMetricAlarm.kt#L44) - [PutMetricData](src/main/kotlin/com/kotlin/cloudwatch/CloudWatchScenario.kt#L491) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with metrics, dashboards, and alarms](src/main/kotlin/com/kotlin/cloudwatch/CloudWatchScenario.kt) - @@ -86,8 +86,7 @@ functions within the same service. This example shows you how to get started using CloudWatch. - -#### Get started with metrics, dashboards, and alarms +#### Learn the basics This example shows you how to do the following: @@ -99,12 +98,13 @@ This example shows you how to do the following: - Add an anomaly detector. - Get a metric image, then clean up resources. - - + + + + + - - ### Tests diff --git a/kotlin/services/dynamodb/README.md b/kotlin/services/dynamodb/README.md index 9ed57aa5540..a3a622a5480 100644 --- a/kotlin/services/dynamodb/README.md +++ b/kotlin/services/dynamodb/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/kotlin/dynamodb/Scenario.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -48,7 +55,6 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with tables, items, and queries](src/main/kotlin/com/kotlin/dynamodb/Scenario.kt) - [Query a table by using batches of PartiQL statements](src/main/kotlin/com/kotlin/dynamodb/ScenarioPartiQLBatch.kt) - [Query a table using PartiQL](src/main/kotlin/com/kotlin/dynamodb/ScenarioPartiQ.kt) @@ -65,8 +71,7 @@ functions within the same service. - -#### Get started with tables, items, and queries +#### Learn the basics This example shows you how to do the following: @@ -77,12 +82,13 @@ This example shows you how to do the following: - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - - + + + + + - - #### Query a table by using batches of PartiQL statements diff --git a/kotlin/services/ec2/README.md b/kotlin/services/ec2/README.md index 056528e5807..5b06457fcf0 100644 --- a/kotlin/services/ec2/README.md +++ b/kotlin/services/ec2/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli - [Hello Amazon EC2](src/main/kotlin/com/kotlin/ec2/DescribeSecurityGroups.kt#L39) (`DescribeSecurityGroups`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/kotlin/ec2/EC2Scenario.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -56,13 +63,6 @@ Code excerpts that show you how to call individual service functions. - [StopInstances](src/main/kotlin/com/kotlin/ec2/EC2Scenario.kt#L337) - [TerminateInstances](src/main/kotlin/com/kotlin/ec2/TerminateInstance.kt#L38) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with instances](src/main/kotlin/com/kotlin/ec2/EC2Scenario.kt) - @@ -80,8 +80,7 @@ functions within the same service. This example shows you how to get started using Amazon EC2. - -#### Get started with instances +#### Learn the basics This example shows you how to do the following: @@ -91,12 +90,13 @@ This example shows you how to do the following: - Associate an Elastic IP address with your instance. - Connect to your instance with SSH, then clean up resources. - - + + + + + - - ### Tests diff --git a/kotlin/services/ecr/README.md b/kotlin/services/ecr/README.md index 1348225033b..8927f7f0cac 100644 --- a/kotlin/services/ecr/README.md +++ b/kotlin/services/ecr/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli - [Hello Amazon ECR](src/main/kotlin/com/example/ecr/HelloECR.kt#L6) (`listImages`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/example/ecr/scenario/ECRScenario.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -48,13 +55,6 @@ Code excerpts that show you how to call individual service functions. - [SetRepositoryPolicy](src/main/kotlin/com/example/ecr/scenario/ECRActions.kt#L155) - [StartLifecyclePolicyPreview](src/main/kotlin/com/example/ecr/scenario/ECRActions.kt#L299) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Learn Amazon ECR core operations](src/main/kotlin/com/example/ecr/scenario/ECRScenario.kt) - @@ -72,8 +72,7 @@ functions within the same service. This example shows you how to get started using Amazon ECR. - -#### Learn Amazon ECR core operations +#### Learn the basics This example shows you how to do the following: @@ -87,12 +86,13 @@ This example shows you how to do the following: - List Amazon ECR repositories for your account and get details about them. - Delete Amazon ECR repositories. - - + + + + + - - ### Tests diff --git a/kotlin/services/eventbridge/README.md b/kotlin/services/eventbridge/README.md index 2b217525b9c..0153a7cac2e 100644 --- a/kotlin/services/eventbridge/README.md +++ b/kotlin/services/eventbridge/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli - [Hello EventBridge](src/main/kotlin/com/kotlin/eventbridge/HelloEventBridge.kt#L5) (`ListEventBuses`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/kotlin/eventbridge/EventbridgeMVP.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -50,13 +57,6 @@ Code excerpts that show you how to call individual service functions. - [PutTargets](src/main/kotlin/com/kotlin/eventbridge/EventbridgeMVP.kt#L589) - [RemoveTargets](src/main/kotlin/com/kotlin/eventbridge/EventbridgeMVP.kt#L352) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with rules and targets](src/main/kotlin/com/kotlin/eventbridge/EventbridgeMVP.kt) - @@ -74,8 +74,7 @@ functions within the same service. This example shows you how to get started using EventBridge. - -#### Get started with rules and targets +#### Learn the basics This example shows you how to do the following: @@ -84,12 +83,13 @@ This example shows you how to do the following: - List and update rules and targets. - Send events, then clean up resources. - - + + + + + - - ### Tests diff --git a/kotlin/services/glue/README.md b/kotlin/services/glue/README.md index 8437f28afde..aee8a11ac47 100644 --- a/kotlin/services/glue/README.md +++ b/kotlin/services/glue/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/kotlin/glue/GlueScenario.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -38,13 +45,6 @@ Code excerpts that show you how to call individual service functions. - [GetDatabase](src/main/kotlin/com/kotlin/glue/GetDatabase.kt#L40) - [StartCrawler](src/main/kotlin/com/kotlin/glue/StartCrawler.kt#L38) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with crawlers and jobs](src/main/kotlin/com/kotlin/glue/GlueScenario.kt) - @@ -68,8 +68,7 @@ functions within the same service. - -#### Get started with crawlers and jobs +#### Learn the basics This example shows you how to do the following: @@ -78,12 +77,13 @@ This example shows you how to do the following: - Create a job to extract CSV data from the S3 bucket, transform the data, and load JSON-formatted output into another S3 bucket. - List information about job runs, view transformed data, and clean up resources. - - + + + + + - - ### Tests diff --git a/kotlin/services/iot/README.md b/kotlin/services/iot/README.md index 8161f3b1cdd..a20a8745d52 100644 --- a/kotlin/services/iot/README.md +++ b/kotlin/services/iot/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli - [Hello AWS IoT](src/main/kotlin/com/example/iot/HelloIoT.kt#L6) (`listThings`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/example/iot/IotScenario.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -51,13 +58,6 @@ Code excerpts that show you how to call individual service functions. - [SearchIndex](src/main/kotlin/com/example/iot/IotScenario.kt#L295) - [UpdateThing](src/main/kotlin/com/example/iot/IotScenario.kt#L429) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Work with device management use cases](src/main/kotlin/com/example/iot/IotScenario.kt) - @@ -75,18 +75,18 @@ functions within the same service. This example shows you how to get started using AWS IoT. +#### Learn the basics -#### Work with device management use cases +This example shows you how to work with AWS IoT device management. -This example shows you how to work with AWS IoT device management use cases using AWS IoT SDK + + - - + + - - ### Tests diff --git a/kotlin/services/keyspaces/README.md b/kotlin/services/keyspaces/README.md index 2286fc1c295..8f064f23243 100644 --- a/kotlin/services/keyspaces/README.md +++ b/kotlin/services/keyspaces/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli - [Hello Amazon Keyspaces](src/main/kotlin/com/example/keyspace/HelloKeyspaces.kt#L9) (`ListKeyspaces`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/example/keyspace/ScenarioKeyspaces.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -49,13 +56,6 @@ Code excerpts that show you how to call individual service functions. - [RestoreTable](src/main/kotlin/com/example/keyspace/ScenarioKeyspaces.kt#L306) - [UpdateTable](src/main/kotlin/com/example/keyspace/ScenarioKeyspaces.kt#L365) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with keyspaces and tables](src/main/kotlin/com/example/keyspace/ScenarioKeyspaces.kt) - @@ -73,8 +73,7 @@ functions within the same service. This example shows you how to get started using Amazon Keyspaces. - -#### Get started with keyspaces and tables +#### Learn the basics This example shows you how to do the following: @@ -84,12 +83,13 @@ This example shows you how to do the following: - Update the table. Add a column to track watched movies. - Restore the table to its previous state and clean up resources. - - + + + + + - - ### Tests diff --git a/kotlin/services/rds/README.md b/kotlin/services/rds/README.md index 81a5af10794..39b767f0c73 100644 --- a/kotlin/services/rds/README.md +++ b/kotlin/services/rds/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/kotlin/rds/RDSScenario.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -39,13 +46,6 @@ Code excerpts that show you how to call individual service functions. - [DescribeDBInstances](src/main/kotlin/com/kotlin/rds/DescribeDBInstances.kt#L22) - [ModifyDBInstance](src/main/kotlin/com/kotlin/rds/ModifyDBInstance.kt#L39) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with DB instances](src/main/kotlin/com/kotlin/rds/RDSScenario.kt) - @@ -63,8 +63,7 @@ functions within the same service. - -#### Get started with DB instances +#### Learn the basics This example shows you how to do the following: @@ -73,12 +72,13 @@ This example shows you how to do the following: - Take a snapshot of the instance. - Delete the instance and parameter group. - - + + + + + - - ### Tests diff --git a/kotlin/services/s3/README.md b/kotlin/services/s3/README.md index f29d8648d5d..b326e6c0d08 100644 --- a/kotlin/services/s3/README.md +++ b/kotlin/services/s3/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/kotlin/s3/S3Operations.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -52,7 +59,6 @@ functions within the same service. - [Create a presigned URL](src/main/kotlin/com/kotlin/s3/PresigningExamples.kt) - [Get an object from a Multi-Region Access Point](src/main/kotlin/com/kotlin/s3/MrapExample.kt) -- [Get started with buckets and objects](src/main/kotlin/com/kotlin/s3/S3Operations.kt) @@ -72,6 +78,23 @@ functions within the same service. +#### Learn the basics + +This example shows you how to do the following: + +- Create a bucket and upload a file to it. +- Download an object from a bucket. +- Copy an object to a subfolder in a bucket. +- List the objects in a bucket. +- Delete the bucket objects and the bucket. + + + + + + + + #### Create a presigned URL @@ -97,23 +120,6 @@ This example shows you how to get an object from a Multi-Region Access Point. -#### Get started with buckets and objects - -This example shows you how to do the following: - -- Create a bucket and upload a file to it. -- Download an object from a bucket. -- Copy an object to a subfolder in a bucket. -- List the objects in a bucket. -- Delete the bucket objects and the bucket. - - - - - - - - ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/kotlin/services/support/README.md b/kotlin/services/support/README.md index b45863485d4..68af9c67b81 100644 --- a/kotlin/services/support/README.md +++ b/kotlin/services/support/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `kotli - [Hello Support](src/main/kotlin/com/example/support/HelloSupport.kt#L9) (`DescribeServices`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/main/kotlin/com/example/support/SupportScenario.kt) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -48,13 +55,6 @@ Code excerpts that show you how to call individual service functions. - [DescribeSeverityLevels](src/main/kotlin/com/example/support/SupportScenario.kt#L272) - [ResolveCase](src/main/kotlin/com/example/support/SupportScenario.kt#L130) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with cases](src/main/kotlin/com/example/support/SupportScenario.kt) - @@ -72,8 +72,7 @@ functions within the same service. This example shows you how to get started using Support. - -#### Get started with cases +#### Learn the basics This example shows you how to do the following: @@ -85,12 +84,13 @@ This example shows you how to do the following: - Resolve the case. - Get and display a list of resolved cases for the current day. - - + + + + + - - ### Tests diff --git a/php/example_code/auto-scaling/README.md b/php/example_code/auto-scaling/README.md index b8ee999aafc..67f34f3c195 100644 --- a/php/example_code/auto-scaling/README.md +++ b/php/example_code/auto-scaling/README.md @@ -39,6 +39,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `php` - [Hello Auto Scaling](GettingStartedWithAutoScaling.php#L252) (`DescribeAutoScalingGroups`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](GettingStartedWithAutoScaling.php) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -54,13 +61,6 @@ Code excerpts that show you how to call individual service functions. - [TerminateInstanceInAutoScalingGroup](AutoScalingService.php#L85) - [UpdateAutoScalingGroup](AutoScalingService.php#L42) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Manage groups and instances](GettingStartedWithAutoScaling.php) - @@ -92,8 +92,7 @@ php Runner.php This example shows you how to get started using Auto Scaling. - -#### Manage groups and instances +#### Learn the basics This example shows you how to do the following: @@ -104,12 +103,13 @@ This example shows you how to do the following: - List scaling activities that occur in response to user requests and capacity changes. - Get statistics for CloudWatch metrics, then clean up resources. - - + + + + + - - ### Tests diff --git a/php/example_code/dynamodb/README.md b/php/example_code/dynamodb/README.md index 6224f77dde3..3e05b7c3046 100644 --- a/php/example_code/dynamodb/README.md +++ b/php/example_code/dynamodb/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `php` +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](dynamodb_basics/GettingStartedWithDynamoDB.php) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -51,16 +58,10 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with tables, items, and queries](dynamodb_basics/GettingStartedWithDynamoDB.php) +- [Create a serverless application to manage photos](php/applications/photo_asset_manager) - [Query a table by using batches of PartiQL statements](DynamoDBService.php) - [Query a table using PartiQL](DynamoDBService.php) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a serverless application to manage photos](../../applications/photo_asset_manager) - @@ -74,8 +75,7 @@ Sample applications that work across multiple AWS services. - -#### Get started with tables, items, and queries +#### Learn the basics This example shows you how to do the following: @@ -86,12 +86,25 @@ This example shows you how to do the following: - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - - + + + + + + + + +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + - - + + #### Query a table by using batches of PartiQL statements diff --git a/php/example_code/glue/README.md b/php/example_code/glue/README.md index 680c5a69a02..3f187603b72 100644 --- a/php/example_code/glue/README.md +++ b/php/example_code/glue/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `php` +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](GlueService.php) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -48,13 +55,6 @@ Code excerpts that show you how to call individual service functions. - [StartCrawler](GettingStartedWithGlue.php#L47) - [StartJobRun](GettingStartedWithGlue.php#L107) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with crawlers and jobs](GlueService.php) - @@ -68,8 +68,7 @@ functions within the same service. - -#### Get started with crawlers and jobs +#### Learn the basics This example shows you how to do the following: @@ -78,12 +77,13 @@ This example shows you how to do the following: - Create a job to extract CSV data from the S3 bucket, transform the data, and load JSON-formatted output into another S3 bucket. - List information about job runs, view transformed data, and clean up resources. - - + + + + + - - ### Tests diff --git a/php/example_code/lambda/README.md b/php/example_code/lambda/README.md index 3c757cab5c5..25c237c5295 100644 --- a/php/example_code/lambda/README.md +++ b/php/example_code/lambda/README.md @@ -46,14 +46,9 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. +- [Create a serverless application to manage photos](php/applications/photo_asset_manager) - [Get started with functions](GettingStartedWithLambda.php) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a serverless application to manage photos](../../applications/photo_asset_manager) - @@ -103,6 +98,18 @@ following: +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + + + + + + #### Get started with functions This example shows you how to do the following: diff --git a/php/example_code/s3/README.md b/php/example_code/s3/README.md index e12d049927b..ea7aa72861d 100644 --- a/php/example_code/s3/README.md +++ b/php/example_code/s3/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `php` - [Hello Amazon S3](helloS3.php#L5) (`ListBuckets`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](GettingStartedWithS3.php) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -52,13 +59,7 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create a presigned URL](PresignedURL.php) -- [Get started with buckets and objects](GettingStartedWithS3.php) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a serverless application to manage photos](../../applications/photo_asset_manager) +- [Create a serverless application to manage photos](php/applications/photo_asset_manager) @@ -77,6 +78,23 @@ Sample applications that work across multiple AWS services. This example shows you how to get started using Amazon S3. +#### Learn the basics + +This example shows you how to do the following: + +- Create a bucket and upload a file to it. +- Download an object from a bucket. +- Copy an object to a subfolder in a bucket. +- List the objects in a bucket. +- Delete the bucket objects and the bucket. + + + + + + + + #### Create a presigned URL @@ -90,22 +108,17 @@ This example shows you how to create a presigned URL for Amazon S3 and upload an -#### Get started with buckets and objects +#### Create a serverless application to manage photos -This example shows you how to do the following: +This example shows you how to create a serverless application that lets users manage photos using labels. -- Create a bucket and upload a file to it. -- Download an object from a bucket. -- Copy an object to a subfolder in a bucket. -- List the objects in a bucket. -- Delete the bucket objects and the bucket. - - + + - - + + ### Tests diff --git a/php/example_code/sns/README.md b/php/example_code/sns/README.md index f08dcf85fad..7acca6af487 100644 --- a/php/example_code/sns/README.md +++ b/php/example_code/sns/README.md @@ -53,14 +53,9 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. +- [Create a serverless application to manage photos](php/applications/photo_asset_manager) - [Publish an SMS text message](PublishTextSMS.php) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a serverless application to manage photos](../../applications/photo_asset_manager) - @@ -75,6 +70,18 @@ Sample applications that work across multiple AWS services. +#### Create a serverless application to manage photos + +This example shows you how to create a serverless application that lets users manage photos using labels. + + + + + + + + + #### Publish an SMS text message This example shows you how to publish SMS messages using Amazon SNS. diff --git a/python/example_code/acm/README.md b/python/example_code/acm/README.md index 4fc31837e5a..8c50b326688 100644 --- a/python/example_code/acm/README.md +++ b/python/example_code/acm/README.md @@ -34,6 +34,13 @@ python -m pip install -r requirements.txt +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](certificate_basics.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -49,13 +56,6 @@ Code excerpts that show you how to call individual service functions. - [RequestCertificate](certificate_basics.py#L242) - [ResendValidationEmail](certificate_basics.py#L293) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Manage certificates](certificate_basics.py) - @@ -69,8 +69,7 @@ functions within the same service. - -#### Manage certificates +#### Learn the basics This example shows you how to do the following: @@ -79,8 +78,8 @@ This example shows you how to do the following: - List and describe certificates. - Remove certificates. - - + + Start the example by running the following at a command prompt: @@ -89,8 +88,9 @@ python certificate_basics.py ``` - - + + + ### Tests diff --git a/python/example_code/api-gateway/README.md b/python/example_code/api-gateway/README.md index 4e13b5087e2..82d287054d8 100644 --- a/python/example_code/api-gateway/README.md +++ b/python/example_code/api-gateway/README.md @@ -54,16 +54,11 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. +- [Create a REST API to track COVID-19 data](python/cross_service/apigateway_covid-19_tracker) +- [Create a lending library REST API](python/cross_service/aurora_rest_lending_library) +- [Create a websocket chat application](python/cross_service/apigateway_websocket_chat) - [Create and deploy a REST API](aws_service/aws_service.py) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a REST API to track COVID-19 data](../../cross_service/apigateway_covid-19_tracker) -- [Create a lending library REST API](../../cross_service/aurora_rest_lending_library) -- [Create a websocket chat application](../../cross_service/apigateway_websocket_chat) -- [Use API Gateway to invoke a Lambda function](../../example_code/lambda) +- [Use API Gateway to invoke a Lambda function](python/example_code/lambda) @@ -79,6 +74,42 @@ Sample applications that work across multiple AWS services. +#### Create a REST API to track COVID-19 data + +This example shows you how to create a REST API that simulates a system to track daily cases of COVID-19 in the United States, using fictional data. + + + + + + + + + +#### Create a lending library REST API + +This example shows you how to create a lending library where patrons can borrow and return books by using a REST API backed by an Amazon Aurora database. + + + + + + + + + +#### Create a websocket chat application + +This example shows you how to create a chat application that is served by a websocket API built on Amazon API Gateway. + + + + + + + + + #### Create and deploy a REST API This example shows you how to do the following: @@ -103,6 +134,18 @@ For additional instructions on how to set up and run this example, see the [README](aws_service/README.md) in the `aws_service` folder. +#### Use API Gateway to invoke a Lambda function + +This example shows you how to create an AWS Lambda function invoked by Amazon API Gateway. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/python/example_code/aurora/README.md b/python/example_code/aurora/README.md index 712193ec6ff..605bccdd60f 100644 --- a/python/example_code/aurora/README.md +++ b/python/example_code/aurora/README.md @@ -39,6 +39,13 @@ python -m pip install -r requirements.txt - [Hello Aurora](hello/hello_aurora.py#L4) (`DescribeDBClusters`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenario_get_started_aurora.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -64,14 +71,8 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with DB clusters](scenario_get_started_aurora.py) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a lending library REST API](../../cross_service/aurora_rest_lending_library) -- [Create an Aurora Serverless work item tracker](../../cross_service/aurora_item_tracker) +- [Create a lending library REST API](python/cross_service/aurora_rest_lending_library) +- [Create an Aurora Serverless work item tracker](python/cross_service/aurora_item_tracker) @@ -93,8 +94,7 @@ This example shows you how to get started using Aurora. python hello/hello_aurora.py ``` - -#### Get started with DB clusters +#### Learn the basics This example shows you how to do the following: @@ -103,8 +103,8 @@ This example shows you how to do the following: - Create a DB instance that contains a database. - Take a snapshot of the DB cluster, then clean up resources. - - + + Start the example by running the following at a command prompt: @@ -113,8 +113,33 @@ python scenario_get_started_aurora.py ``` - - + + + + +#### Create a lending library REST API + +This example shows you how to create a lending library where patrons can borrow and return books by using a REST API backed by an Amazon Aurora database. + + + + + + + + + +#### Create an Aurora Serverless work item tracker + +This example shows you how to create a web application that tracks work items in an Amazon Aurora Serverless database and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + + + + + ### Tests diff --git a/python/example_code/auto-scaling/README.md b/python/example_code/auto-scaling/README.md index 774e9d7ce19..699f059dd85 100644 --- a/python/example_code/auto-scaling/README.md +++ b/python/example_code/auto-scaling/README.md @@ -39,6 +39,13 @@ python -m pip install -r requirements.txt - [Hello Auto Scaling](hello/hello_autoscaling.py#L4) (`DescribeAutoScalingGroups`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenario_groups_and_instances.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -61,7 +68,6 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Build and manage a resilient service](../../cross_service/resilient_service/runner.py) -- [Manage groups and instances](scenario_groups_and_instances.py) @@ -83,6 +89,30 @@ This example shows you how to get started using Auto Scaling. python hello/hello_autoscaling.py ``` +#### Learn the basics + +This example shows you how to do the following: + +- Create an Amazon EC2 Auto Scaling group with a launch template and Availability Zones, and get information about running instances. +- Enable Amazon CloudWatch metrics collection. +- Update the group's desired capacity and wait for an instance to start. +- Terminate an instance in the group. +- List scaling activities that occur in response to user requests and capacity changes. +- Get statistics for CloudWatch metrics, then clean up resources. + + + + +Start the example by running the following at a command prompt: + +``` +python scenario_groups_and_instances.py +``` + + + + + #### Build and manage a resilient service @@ -110,30 +140,6 @@ Complete details and instructions on how to run this example can be found in the [README](../../cross_service/resilient_service/README.md) for the example. -#### Manage groups and instances - -This example shows you how to do the following: - -- Create an Amazon EC2 Auto Scaling group with a launch template and Availability Zones, and get information about running instances. -- Enable Amazon CloudWatch metrics collection. -- Update the group's desired capacity and wait for an instance to start. -- Terminate an instance in the group. -- List scaling activities that occur in response to user requests and capacity changes. -- Get statistics for CloudWatch metrics, then clean up resources. - - - - -Start the example by running the following at a command prompt: - -``` -python scenario_groups_and_instances.py -``` - - - - - ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/python/example_code/comprehend/README.md b/python/example_code/comprehend/README.md index dd6c1308a88..cce0d08c29e 100644 --- a/python/example_code/comprehend/README.md +++ b/python/example_code/comprehend/README.md @@ -61,15 +61,10 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Detect document elements](comprehend_detect.py) +- [Detect entities in text extracted from an image](python/cross_service/textract_comprehend_notebook) - [Run a topic modeling job on sample data](comprehend_topic_modeler.py) - [Train a custom classifier and classify documents](comprehend_classifier.py) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Detect entities in text extracted from an image](../../cross_service/textract_comprehend_notebook) - @@ -106,6 +101,18 @@ python comprehend_detect.py +#### Detect entities in text extracted from an image + +This example shows you how to use Amazon Comprehend to detect entities in text extracted by Amazon Textract from an image that is stored in Amazon S3. + + + + + + + + + #### Run a topic modeling job on sample data This example shows you how to do the following: diff --git a/python/example_code/dynamodb/README.md b/python/example_code/dynamodb/README.md index 9a7379131a9..9773cbd00d1 100644 --- a/python/example_code/dynamodb/README.md +++ b/python/example_code/dynamodb/README.md @@ -39,6 +39,13 @@ python -m pip install -r requirements.txt - [Hello DynamoDB](hello/hello_dynamodb.py#L4) (`ListTables`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](GettingStarted/scenario_getting_started_movies.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -64,19 +71,13 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Accelerate reads with DynamoDB Accelerator](TryDax/01-create-table.py) -- [Get started with tables, items, and queries](GettingStarted/scenario_getting_started_movies.py) +- [Create a REST API to track COVID-19 data](python/cross_service/apigateway_covid-19_tracker) +- [Create a messenger application](python/cross_service/stepfunctions_messenger) +- [Create a web application to track DynamoDB data](python/cross_service/dynamodb_item_tracker) +- [Create a websocket chat application](python/cross_service/apigateway_websocket_chat) - [Query a table by using batches of PartiQL statements](partiql/scenario_partiql_batch.py) - [Query a table using PartiQL](partiql/scenario_partiql_single.py) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a REST API to track COVID-19 data](../../cross_service/apigateway_covid-19_tracker) -- [Create a messenger application](../../cross_service/stepfunctions_messenger) -- [Create a web application to track DynamoDB data](../../cross_service/dynamodb_item_tracker) -- [Create a websocket chat application](../../cross_service/apigateway_websocket_chat) - @@ -97,6 +98,30 @@ This example shows you how to get started using DynamoDB. python hello/hello_dynamodb.py ``` +#### Learn the basics + +This example shows you how to do the following: + +- Create a table that can hold movie data. +- Put, get, and update a single movie in the table. +- Write movie data to the table from a sample JSON file. +- Query for movies that were released in a given year. +- Scan for movies that were released in a range of years. +- Delete a movie from the table, then delete the table. + + + + +Start the example by running the following at a command prompt: + +``` +python GettingStarted/scenario_getting_started_movies.py +``` + + + + + #### Accelerate reads with DynamoDB Accelerator @@ -142,29 +167,53 @@ python 04-query-test.py YOUR-CLUSTER-NAME.111111.clustercfg.dax.usw2.cache.amazo ``` -#### Get started with tables, items, and queries +#### Create a REST API to track COVID-19 data -This example shows you how to do the following: +This example shows you how to create a REST API that simulates a system to track daily cases of COVID-19 in the United States, using fictional data. -- Create a table that can hold movie data. -- Put, get, and update a single movie in the table. -- Write movie data to the table from a sample JSON file. -- Query for movies that were released in a given year. -- Scan for movies that were released in a range of years. -- Delete a movie from the table, then delete the table. - - + + -Start the example by running the following at a command prompt: -``` -python GettingStarted/scenario_getting_started_movies.py -``` + + + +#### Create a messenger application + +This example shows you how to create an AWS Step Functions messenger application that retrieves message records from a database table. + + + + + + + + + +#### Create a web application to track DynamoDB data + +This example shows you how to create a web application that tracks work items in an Amazon DynamoDB table and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + + + + + + +#### Create a websocket chat application + +This example shows you how to create a chat application that is served by a websocket API built on Amazon API Gateway. + + + + - - + + #### Query a table by using batches of PartiQL statements diff --git a/python/example_code/ec2/README.md b/python/example_code/ec2/README.md index 249d67f1e49..25d6a2ddd7c 100644 --- a/python/example_code/ec2/README.md +++ b/python/example_code/ec2/README.md @@ -39,6 +39,13 @@ python -m pip install -r requirements.txt - [Hello Amazon EC2](hello/hello_ec2.py#L4) (`DescribeSecurityGroups`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenario_get_started_instances.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -76,7 +83,6 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Build and manage a resilient service](../../cross_service/resilient_service/runner.py) -- [Get started with instances](scenario_get_started_instances.py) @@ -98,6 +104,29 @@ This example shows you how to get started using Amazon EC2. python hello/hello_ec2.py ``` +#### Learn the basics + +This example shows you how to do the following: + +- Create a key pair and security group. +- Select an Amazon Machine Image (AMI) and compatible instance type, then create an instance. +- Stop and restart the instance. +- Associate an Elastic IP address with your instance. +- Connect to your instance with SSH, then clean up resources. + + + + +Start the example by running the following at a command prompt: + +``` +python scenario_get_started_instances.py +``` + + + + + #### Build and manage a resilient service @@ -125,29 +154,6 @@ Complete details and instructions on how to run this example can be found in the [README](../../cross_service/resilient_service/README.md) for the example. -#### Get started with instances - -This example shows you how to do the following: - -- Create a key pair and security group. -- Select an Amazon Machine Image (AMI) and compatible instance type, then create an instance. -- Stop and restart the instance. -- Associate an Elastic IP address with your instance. -- Connect to your instance with SSH, then clean up resources. - - - - -Start the example by running the following at a command prompt: - -``` -python scenario_get_started_instances.py -``` - - - - - ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/python/example_code/glue/README.md b/python/example_code/glue/README.md index 2240cd4cd80..38ea21a111d 100644 --- a/python/example_code/glue/README.md +++ b/python/example_code/glue/README.md @@ -39,6 +39,13 @@ python -m pip install -r requirements.txt - [Hello AWS Glue](hello/hello_glue.py#L4) (`ListJobs`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](glue_wrapper.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -58,13 +65,6 @@ Code excerpts that show you how to call individual service functions. - [StartCrawler](glue_wrapper.py#L92) - [StartJobRun](glue_wrapper.py#L196) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with crawlers and jobs](glue_wrapper.py) - @@ -85,8 +85,7 @@ This example shows you how to get started using AWS Glue. python hello/hello_glue.py ``` - -#### Get started with crawlers and jobs +#### Learn the basics This example shows you how to do the following: @@ -95,7 +94,7 @@ This example shows you how to do the following: - Create a job to extract CSV data from the S3 bucket, transform the data, and load JSON-formatted output into another S3 bucket. - List information about job runs, view transformed data, and clean up resources. - + This example requires the following scaffold resources that are defined in the accompanying AWS CloudFormation script `setup_scenario_getting_started.yaml`. @@ -122,7 +121,7 @@ Outputs: If you prefer, you can deploy and destroy scaffold resources by using the AWS Cloud Development Kit (AWS CDK). To do this, run `cdk deploy` or `cdk destroy` in the [/resources/cdk/glue_role_bucket](/resources/cdk/glue_role_bucket) folder. - + Start the example by running the following at a command prompt: @@ -131,13 +130,14 @@ python glue_wrapper.py ``` - + After the example is done, destroy scaffold resources at a command prompt. ``` python scaffold.py destroy ``` - + + ### Tests diff --git a/python/example_code/keyspaces/README.md b/python/example_code/keyspaces/README.md index f9ddc1f77d2..574785701ca 100644 --- a/python/example_code/keyspaces/README.md +++ b/python/example_code/keyspaces/README.md @@ -39,6 +39,13 @@ python -m pip install -r requirements.txt - [Hello Amazon Keyspaces](hello.py#L4) (`ListKeyspaces`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenario_get_started_keyspaces.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -54,13 +61,6 @@ Code excerpts that show you how to call individual service functions. - [RestoreTable](keyspace.py#L224) - [UpdateTable](keyspace.py#L199) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with keyspaces and tables](scenario_get_started_keyspaces.py) - @@ -81,8 +81,7 @@ This example shows you how to get started using Amazon Keyspaces. python hello.py ``` - -#### Get started with keyspaces and tables +#### Learn the basics This example shows you how to do the following: @@ -92,8 +91,8 @@ This example shows you how to do the following: - Update the table. Add a column to track watched movies. - Restore the table to its previous state and clean up resources. - - + + Start the example by running the following at a command prompt: @@ -102,8 +101,9 @@ python scenario_get_started_keyspaces.py ``` - - + + + ### Tests diff --git a/python/example_code/lambda/README.md b/python/example_code/lambda/README.md index ab3169a110d..1e4a34dfd93 100644 --- a/python/example_code/lambda/README.md +++ b/python/example_code/lambda/README.md @@ -56,18 +56,13 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. +- [Create a REST API to track COVID-19 data](python/cross_service/apigateway_covid-19_tracker) +- [Create a lending library REST API](python/cross_service/aurora_rest_lending_library) +- [Create a messenger application](python/cross_service/stepfunctions_messenger) +- [Create a websocket chat application](python/cross_service/apigateway_websocket_chat) - [Get started with functions](lambda_handler_basic.py) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a REST API to track COVID-19 data](../../cross_service/apigateway_covid-19_tracker) -- [Create a lending library REST API](../../cross_service/aurora_rest_lending_library) -- [Create a messenger application](../../cross_service/stepfunctions_messenger) -- [Create a websocket chat application](../../cross_service/apigateway_websocket_chat) -- [Use API Gateway to invoke a Lambda function](../../example_code/lambda) -- [Use scheduled events to invoke a Lambda function](../../example_code/lambda) +- [Use API Gateway to invoke a Lambda function](python/example_code/lambda) +- [Use scheduled events to invoke a Lambda function](python/example_code/lambda) @@ -90,6 +85,54 @@ python hello/hello_lambda.py ``` +#### Create a REST API to track COVID-19 data + +This example shows you how to create a REST API that simulates a system to track daily cases of COVID-19 in the United States, using fictional data. + + + + + + + + + +#### Create a lending library REST API + +This example shows you how to create a lending library where patrons can borrow and return books by using a REST API backed by an Amazon Aurora database. + + + + + + + + + +#### Create a messenger application + +This example shows you how to create an AWS Step Functions messenger application that retrieves message records from a database table. + + + + + + + + + +#### Create a websocket chat application + +This example shows you how to create a chat application that is served by a websocket API built on Amazon API Gateway. + + + + + + + + + #### Get started with functions This example shows you how to do the following: @@ -113,6 +156,30 @@ python lambda_handler_basic.py +#### Use API Gateway to invoke a Lambda function + +This example shows you how to create an AWS Lambda function invoked by Amazon API Gateway. + + + + + + + + + +#### Use scheduled events to invoke a Lambda function + +This example shows you how to create an AWS Lambda function invoked by an Amazon EventBridge scheduled event. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/python/example_code/rds/README.md b/python/example_code/rds/README.md index 046b754b8bd..6e6a148dcee 100644 --- a/python/example_code/rds/README.md +++ b/python/example_code/rds/README.md @@ -39,6 +39,13 @@ python -m pip install -r requirements.txt - [Hello Amazon RDS](hello/hello_rds.py#L4) (`DescribeDBInstances`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenario_get_started_instances.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -61,13 +68,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with DB instances](scenario_get_started_instances.py) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create an Aurora Serverless work item tracker](../../cross_service/aurora_item_tracker) +- [Create an Aurora Serverless work item tracker](python/cross_service/aurora_item_tracker) @@ -89,8 +90,7 @@ This example shows you how to get started using Amazon RDS. python hello/hello_rds.py ``` - -#### Get started with DB instances +#### Learn the basics This example shows you how to do the following: @@ -99,8 +99,8 @@ This example shows you how to do the following: - Take a snapshot of the instance. - Delete the instance and parameter group. - - + + Start the example by running the following at a command prompt: @@ -109,8 +109,21 @@ python scenario_get_started_instances.py ``` - - + + + + +#### Create an Aurora Serverless work item tracker + +This example shows you how to create a web application that tracks work items in an Amazon Aurora Serverless database and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + + + + + ### Tests diff --git a/python/example_code/redshift/README.md b/python/example_code/redshift/README.md index 689a5a5e30e..38cd31a3630 100644 --- a/python/example_code/redshift/README.md +++ b/python/example_code/redshift/README.md @@ -39,6 +39,13 @@ python -m pip install -r requirements.txt - [Hello Amazon Redshift](hello.py#L4) (`describeClusters`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](redshift_scenario.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -51,13 +58,6 @@ Code excerpts that show you how to call individual service functions. - [GetStatementResult](redshift_data.py#L115) - [ModifyCluster](redshift.py#L102) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with Amazon Redshift](redshift_scenario.py) - @@ -78,14 +78,13 @@ This example shows you how to get started using Amazon Redshift. python hello.py ``` - -#### Get started with Amazon Redshift +#### Learn the basics This example shows you how to work with Amazon Redshift tables, items, and queries. - - + + Start the example by running the following at a command prompt: @@ -94,8 +93,9 @@ python redshift_scenario.py ``` - - + + + ### Tests diff --git a/python/example_code/rekognition/README.md b/python/example_code/rekognition/README.md index 05d259bfffc..dbeb0129c3f 100644 --- a/python/example_code/rekognition/README.md +++ b/python/example_code/rekognition/README.md @@ -63,13 +63,8 @@ functions within the same service. - [Build a collection and find faces in it](rekognition_objects.py) - [Detect and display elements in images](rekognition_image_detection.py) - -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Detect objects in images](../../cross_service/photo_analyzer) -- [Detect people and objects in a video](../../example_code/rekognition) +- [Detect objects in images](python/cross_service/photo_analyzer) +- [Detect people and objects in a video](python/example_code/rekognition) @@ -127,6 +122,30 @@ python rekognition_image_detection.py +#### Detect objects in images + +This example shows you how to build an app that uses Amazon Rekognition to detect objects by category in images. + + + + + + + + + +#### Detect people and objects in a video + +This example shows you how to detect people and objects in a video with Amazon Rekognition. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/python/example_code/s3/README.md b/python/example_code/s3/README.md index d90a93b6b09..fa876ce1281 100644 --- a/python/example_code/s3/README.md +++ b/python/example_code/s3/README.md @@ -39,6 +39,13 @@ python -m pip install -r requirements.txt - [Hello Amazon S3](s3_basics/hello.py#L4) (`ListBuckets`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](s3_basics/scenario_getting_started.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -78,19 +85,18 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create a presigned URL](s3_basics/presigned_url.py) +<<<<<<< HEAD - [Get started with buckets and objects](s3_basics/scenario_getting_started.py) - [Manage versioned objects in batches with a Lambda function](python/example_code/s3/s3_versioning) +======= +- [Create an Amazon Textract explorer application](python/cross_service/textract_explorer) +- [Detect entities in text extracted from an image](python/cross_service/textract_comprehend_notebook) +- [Detect objects in images](python/cross_service/photo_analyzer) +- [Manage versioned objects in batches with a Lambda function](python/code_examples/s3_versioning) +>>>>>>> 80a2ce34d (Run WRITEME for recategorization.) - [Upload or download large files](file_transfer/file_transfer.py) - [Work with versioned objects](s3_versioning/versioning.py) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create an Amazon Textract explorer application](../../cross_service/textract_explorer) -- [Detect entities in text extracted from an image](../../cross_service/textract_comprehend_notebook) -- [Detect objects in images](../../cross_service/photo_analyzer) - @@ -111,6 +117,29 @@ This example shows you how to get started using Amazon S3. python s3_basics/hello.py ``` +#### Learn the basics + +This example shows you how to do the following: + +- Create a bucket and upload a file to it. +- Download an object from a bucket. +- Copy an object to a subfolder in a bucket. +- List the objects in a bucket. +- Delete the bucket objects and the bucket. + + + + +Start the example by running the following at a command prompt: + +``` +python s3_basics/scenario_getting_started.py +``` + + + + + #### Create a presigned URL @@ -130,28 +159,41 @@ python s3_basics/presigned_url.py -#### Get started with buckets and objects +#### Create an Amazon Textract explorer application -This example shows you how to do the following: +This example shows you how to explore Amazon Textract output through an interactive application. -- Create a bucket and upload a file to it. -- Download an object from a bucket. -- Copy an object to a subfolder in a bucket. -- List the objects in a bucket. -- Delete the bucket objects and the bucket. - - + + -Start the example by running the following at a command prompt: -``` -python s3_basics/scenario_getting_started.py -``` + + + +#### Detect entities in text extracted from an image + +This example shows you how to use Amazon Comprehend to detect entities in text extracted by Amazon Textract from an image that is stored in Amazon S3. + + + + + + + + + +#### Detect objects in images + +This example shows you how to build an app that uses Amazon Rekognition to detect objects by category in images. + + + + - - + + #### Manage versioned objects in batches with a Lambda function diff --git a/python/example_code/secretsmanager/README.md b/python/example_code/secretsmanager/README.md index 17712e8ef27..2faa1500921 100644 --- a/python/example_code/secretsmanager/README.md +++ b/python/example_code/secretsmanager/README.md @@ -41,9 +41,10 @@ Code excerpts that show you how to call individual service functions. - [BatchGetSecretValue](batch_get_secret_value.py#L17) - [GetSecretValue](get_secret_value.py#L16) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. - [Create a lending library REST API](../../cross_service/aurora_rest_lending_library) @@ -66,6 +67,18 @@ Next, after pulling AWS credentials, run one of the following commands: +#### Create a lending library REST API + +This example shows you how to create a lending library where patrons can borrow and return books by using a REST API backed by an Amazon Aurora database. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/python/example_code/ses/README.md b/python/example_code/ses/README.md index cfe8470932f..75a600e024e 100644 --- a/python/example_code/ses/README.md +++ b/python/example_code/ses/README.md @@ -65,17 +65,12 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Copy email and domain identities across Regions](ses_replicate_identities.py) +- [Create a web application to track DynamoDB data](python/cross_service/dynamodb_item_tracker) +- [Create an Aurora Serverless work item tracker](python/cross_service/aurora_item_tracker) +- [Detect objects in images](python/cross_service/photo_analyzer) - [Generate credentials to connect to an SMTP endpoint](ses_generate_smtp_credentials.py) - [Verify an email identity and send messages](ses_email.py) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a web application to track DynamoDB data](../../cross_service/dynamodb_item_tracker) -- [Create an Aurora Serverless work item tracker](../../cross_service/aurora_item_tracker) -- [Detect objects in images](../../cross_service/photo_analyzer) - @@ -108,6 +103,42 @@ python ses_replicate_identities.py +#### Create a web application to track DynamoDB data + +This example shows you how to create a web application that tracks work items in an Amazon DynamoDB table and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + + + + + + +#### Create an Aurora Serverless work item tracker + +This example shows you how to create a web application that tracks work items in an Amazon Aurora Serverless database and uses Amazon Simple Email Service (Amazon SES) (Amazon SES) to send reports. + + + + + + + + + +#### Detect objects in images + +This example shows you how to build an app that uses Amazon Rekognition to detect objects by category in images. + + + + + + + + + #### Generate credentials to connect to an SMTP endpoint This example shows you how to generate credentials to connect to an Amazon SES SMTP endpoint. diff --git a/python/example_code/sns/README.md b/python/example_code/sns/README.md index f4c769e3efb..1312f3066e3 100644 --- a/python/example_code/sns/README.md +++ b/python/example_code/sns/README.md @@ -52,15 +52,10 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. +- [Create an Amazon Textract explorer application](python/cross_service/textract_explorer) - [Create and publish to a FIFO topic](sns_fifo_topic.py) - [Publish an SMS text message](sns_basics.py) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create an Amazon Textract explorer application](../../cross_service/textract_explorer) - @@ -80,6 +75,18 @@ python sns_basics.py +#### Create an Amazon Textract explorer application + +This example shows you how to explore Amazon Textract output through an interactive application. + + + + + + + + + #### Create and publish to a FIFO topic This example shows you how to create and publish to a FIFO Amazon SNS topic. diff --git a/python/example_code/sqs/README.md b/python/example_code/sqs/README.md index 66cbbcd6604..87053704b3e 100644 --- a/python/example_code/sqs/README.md +++ b/python/example_code/sqs/README.md @@ -53,16 +53,11 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. +- [Create a messenger application](python/cross_service/stepfunctions_messenger) +- [Create an Amazon Textract explorer application](python/cross_service/textract_explorer) - [Create and publish to a FIFO topic](../sns/sns_fifo_topic.py) - [Send and receive batches of messages](message_wrapper.py) -### Cross-service examples - -Sample applications that work across multiple AWS services. - -- [Create a messenger application](../../cross_service/stepfunctions_messenger) -- [Create an Amazon Textract explorer application](../../cross_service/textract_explorer) - @@ -77,6 +72,30 @@ Sample applications that work across multiple AWS services. +#### Create a messenger application + +This example shows you how to create an AWS Step Functions messenger application that retrieves message records from a database table. + + + + + + + + + +#### Create an Amazon Textract explorer application + +This example shows you how to explore Amazon Textract output through an interactive application. + + + + + + + + + #### Create and publish to a FIFO topic This example shows you how to create and publish to a FIFO Amazon SNS topic. diff --git a/python/example_code/ssm/README.md b/python/example_code/ssm/README.md index 232ca9439f1..b294335d3b3 100644 --- a/python/example_code/ssm/README.md +++ b/python/example_code/ssm/README.md @@ -39,6 +39,13 @@ python -m pip install -r requirements.txt - [Hello Systems Manager](hello.py#L4) (`listThings`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](ssm_getting_started.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -55,13 +62,6 @@ Code excerpts that show you how to call individual service functions. - [UpdateMaintenanceWindow](maintenance_window.py#L97) - [UpdateOpsItem](ops_item.py#L126) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with Systems Manager](ssm_getting_started.py) - @@ -82,14 +82,13 @@ This example shows you how to get started using Systems Manager. python hello.py ``` - -#### Get started with Systems Manager +#### Learn the basics This example shows you how to work with Systems Manager maintenance windows, documents, and OpsItems. - - + + Start the example by running the following at a command prompt: @@ -98,8 +97,9 @@ python ssm_getting_started.py ``` - - + + + ### Tests diff --git a/python/example_code/support/README.md b/python/example_code/support/README.md index 5ee345d9003..b1ee5b59344 100644 --- a/python/example_code/support/README.md +++ b/python/example_code/support/README.md @@ -40,6 +40,13 @@ python -m pip install -r requirements.txt - [Hello Support](hello.py#L4) (`DescribeServices`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](get_started_support_cases.py) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -54,13 +61,6 @@ Code excerpts that show you how to call individual service functions. - [DescribeSeverityLevels](support_wrapper.py#L71) - [ResolveCase](support_wrapper.py#L274) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with cases](get_started_support_cases.py) - @@ -81,8 +81,7 @@ This example shows you how to get started using Support. python hello.py ``` - -#### Get started with cases +#### Learn the basics This example shows you how to do the following: @@ -94,8 +93,8 @@ This example shows you how to do the following: - Resolve the case. - Get and display a list of resolved cases for the current day. - - + + Start the example by running the following at a command prompt: @@ -104,8 +103,9 @@ python get_started_support_cases.py ``` - - + + + ### Tests diff --git a/python/example_code/textract/README.md b/python/example_code/textract/README.md index 98fd599e72d..65d0d2ad55e 100644 --- a/python/example_code/textract/README.md +++ b/python/example_code/textract/README.md @@ -44,12 +44,13 @@ Code excerpts that show you how to call individual service functions. - [StartDocumentAnalysis](textract_wrapper.py#L207) - [StartDocumentTextDetection](textract_wrapper.py#L145) -### Cross-service examples +### Scenarios -Sample applications that work across multiple AWS services. +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. -- [Create an Amazon Textract explorer application](../../cross_service/textract_explorer) -- [Detect entities in text extracted from an image](../../cross_service/textract_comprehend_notebook) +- [Create an Amazon Textract explorer application](python/cross_service/textract_explorer) +- [Detect entities in text extracted from an image](python/cross_service/textract_comprehend_notebook) @@ -65,6 +66,30 @@ Sample applications that work across multiple AWS services. +#### Create an Amazon Textract explorer application + +This example shows you how to explore Amazon Textract output through an interactive application. + + + + + + + + + +#### Detect entities in text extracted from an image + +This example shows you how to use Amazon Comprehend to detect entities in text extracted by Amazon Textract from an image that is stored in Amazon S3. + + + + + + + + + ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/ruby/example_code/dynamodb/README.md b/ruby/example_code/dynamodb/README.md index b848e8e5a97..94053f5536a 100644 --- a/ruby/example_code/dynamodb/README.md +++ b/ruby/example_code/dynamodb/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `ruby` - [Hello DynamoDB](hello/hello_dynamodb.rb#L4) (`ListTables`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scaffold.rb) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -57,7 +64,6 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Get started with tables, items, and queries](scaffold.rb) - [Query a table by using batches of PartiQL statements](partiql/scenario_partiql_batch.rb) - [Query a table using PartiQL](partiql/scenario_partiql_single.rb) @@ -81,8 +87,7 @@ This example shows you how to get started using DynamoDB. ruby hello/hello_dynamodb.rb ``` - -#### Get started with tables, items, and queries +#### Learn the basics This example shows you how to do the following: @@ -93,8 +98,8 @@ This example shows you how to do the following: - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - - + + Start the example by running the following at a command prompt: @@ -102,8 +107,9 @@ Start the example by running the following at a command prompt: ruby scaffold.rb ``` - - + + + #### Query a table by using batches of PartiQL statements diff --git a/ruby/example_code/glue/README.md b/ruby/example_code/glue/README.md index e147e3a30a8..f53311fad24 100644 --- a/ruby/example_code/glue/README.md +++ b/ruby/example_code/glue/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `ruby` - [Hello AWS Glue](hello/hello_glue.rb#L4) (`ListJobs`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](glue_wrapper.rb) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -53,13 +60,6 @@ Code excerpts that show you how to call individual service functions. - [StartCrawler](glue_wrapper.rb#L64) - [StartJobRun](glue_wrapper.rb#L144) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with crawlers and jobs](glue_wrapper.rb) - @@ -80,8 +80,7 @@ This example shows you how to get started using AWS Glue. ruby hello/hello_glue.rb ``` - -#### Get started with crawlers and jobs +#### Learn the basics This example shows you how to do the following: @@ -90,8 +89,8 @@ This example shows you how to do the following: - Create a job to extract CSV data from the S3 bucket, transform the data, and load JSON-formatted output into another S3 bucket. - List information about job runs, view transformed data, and clean up resources. - - + + Start the example by running the following at a command prompt: @@ -99,9 +98,9 @@ Start the example by running the following at a command prompt: ruby glue_wrapper.rb ``` - + + - ### Tests diff --git a/ruby/example_code/s3/README.md b/ruby/example_code/s3/README.md index 94bfc79f20a..236de7c0bf3 100644 --- a/ruby/example_code/s3/README.md +++ b/ruby/example_code/s3/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `ruby` - [Hello Amazon S3](hello/hello_s3.rb#L4) (`ListBuckets`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenario_getting_started.rb) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -61,7 +68,6 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create a presigned URL](object_presigned_url_upload.rb) -- [Get started with buckets and objects](scenario_getting_started.rb) @@ -84,45 +90,45 @@ This example shows you how to get started using Amazon S3. ruby hello/hello_s3.rb ``` +#### Learn the basics -#### Create a presigned URL - -This example shows you how to create a presigned URL for Amazon S3 and upload an object. +This example shows you how to do the following: +- Create a bucket and upload a file to it. +- Download an object from a bucket. +- Copy an object to a subfolder in a bucket. +- List the objects in a bucket. +- Delete the bucket objects and the bucket. - - + + Start the example by running the following at a command prompt: ``` -ruby object_presigned_url_upload.rb +ruby scenario_getting_started.rb ``` - - + + -#### Get started with buckets and objects -This example shows you how to do the following: +#### Create a presigned URL + +This example shows you how to create a presigned URL for Amazon S3 and upload an object. -- Create a bucket and upload a file to it. -- Download an object from a bucket. -- Copy an object to a subfolder in a bucket. -- List the objects in a bucket. -- Delete the bucket objects and the bucket. - - + + Start the example by running the following at a command prompt: ``` -ruby scenario_getting_started.rb +ruby object_presigned_url_upload.rb ``` - - + + ### Tests diff --git a/rustv1/examples/aurora/README.md b/rustv1/examples/aurora/README.md index 59a51080207..057deb218f2 100644 --- a/rustv1/examples/aurora/README.md +++ b/rustv1/examples/aurora/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv - [Hello Aurora](src/bin/hello-world.rs) (`DescribeDBClusters`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/aurora_scenario/mod.rs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -52,13 +59,6 @@ Code excerpts that show you how to call individual service functions. - [DescribeOrderableDBInstanceOptions](src/aurora_scenario/mod.rs#L179) - [ModifyDBClusterParameterGroup](src/aurora_scenario/mod.rs#L316) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with DB clusters](src/aurora_scenario/mod.rs) - @@ -76,8 +76,7 @@ functions within the same service. This example shows you how to get started using Aurora. - -#### Get started with DB clusters +#### Learn the basics This example shows you how to do the following: @@ -86,12 +85,13 @@ This example shows you how to do the following: - Create a DB instance that contains a database. - Take a snapshot of the DB cluster, then clean up resources. - - + + + + + - - ### Tests diff --git a/rustv1/examples/auto-scaling/README.md b/rustv1/examples/auto-scaling/README.md index 53fde5ea851..db0b7ae95de 100644 --- a/rustv1/examples/auto-scaling/README.md +++ b/rustv1/examples/auto-scaling/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv - [Hello Auto Scaling](src/bin/list-autoscaling-groups.rs#L22) (`DescribeAutoScalingGroups`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](Cargo.toml) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -49,13 +56,6 @@ Code excerpts that show you how to call individual service functions. - [TerminateInstanceInAutoScalingGroup](src/scenario.rs#L654) - [UpdateAutoScalingGroup](src/bin/update-autoscaling-group.rs#L30) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Manage groups and instances](Cargo.toml) - @@ -73,8 +73,7 @@ functions within the same service. This example shows you how to get started using Auto Scaling. - -#### Manage groups and instances +#### Learn the basics This example shows you how to do the following: @@ -85,12 +84,13 @@ This example shows you how to do the following: - List scaling activities that occur in response to user requests and capacity changes. - Get statistics for CloudWatch metrics, then clean up resources. - - + + + + + - - ### Tests diff --git a/rustv1/examples/ec2/README.md b/rustv1/examples/ec2/README.md index e716552b307..beb91a2d349 100644 --- a/rustv1/examples/ec2/README.md +++ b/rustv1/examples/ec2/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv - [Hello Amazon EC2](src/bin/ec2-helloworld.rs#L22) (`DescribeSecurityGroups`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/getting_started/scenario.rs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -63,13 +70,6 @@ Code excerpts that show you how to call individual service functions. - [StopInstances](src/ec2.rs#L356) - [TerminateInstances](src/ec2.rs#L410) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with instances](src/getting_started/scenario.rs) - @@ -87,8 +87,7 @@ functions within the same service. This example shows you how to get started using Amazon EC2. - -#### Get started with instances +#### Learn the basics This example shows you how to do the following: @@ -98,12 +97,13 @@ This example shows you how to do the following: - Associate an Elastic IP address with your instance. - Connect to your instance with SSH, then clean up resources. - - + + + + + - - ### Tests diff --git a/rustv1/examples/glue/README.md b/rustv1/examples/glue/README.md index 5925ca5e660..c159a48f1ed 100644 --- a/rustv1/examples/glue/README.md +++ b/rustv1/examples/glue/README.md @@ -34,6 +34,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv - [Hello AWS Glue](src/run.rs#L15) (`ListJobs`) +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/prepare.rs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -52,13 +59,6 @@ Code excerpts that show you how to call individual service functions. - [StartCrawler](src/prepare.rs#L79) - [StartJobRun](src/run.rs#L39) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with crawlers and jobs](src/prepare.rs) - @@ -76,8 +76,7 @@ functions within the same service. This example shows you how to get started using AWS Glue. - -#### Get started with crawlers and jobs +#### Learn the basics This example shows you how to do the following: @@ -86,12 +85,13 @@ This example shows you how to do the following: - Create a job to extract CSV data from the S3 bucket, transform the data, and load JSON-formatted output into another S3 bucket. - List information about job runs, view transformed data, and clean up resources. - - + + + + + - - ### Tests diff --git a/rustv1/examples/s3/README.md b/rustv1/examples/s3/README.md index a78d42777f8..c2896147456 100644 --- a/rustv1/examples/s3/README.md +++ b/rustv1/examples/s3/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](src/bin/s3-getting-started.rs) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -55,7 +62,6 @@ functions within the same service. - [Create a presigned URL](src/bin/put-object-presigned.rs) - [Get an object from a bucket if it has been modified](src/bin/if-modified-since.rs) -- [Get started with buckets and objects](src/bin/s3-getting-started.rs) - [Unit and integration test with an SDK](Cargo.toml) - [Upload or download large files](src/bin/s3-multipart-upload.rs) @@ -72,6 +78,23 @@ functions within the same service. +#### Learn the basics + +This example shows you how to do the following: + +- Create a bucket and upload a file to it. +- Download an object from a bucket. +- Copy an object to a subfolder in a bucket. +- List the objects in a bucket. +- Delete the bucket objects and the bucket. + + + + + + + + #### Create a presigned URL @@ -97,23 +120,6 @@ This example shows you how to read data from an object in an S3 bucket, but only -#### Get started with buckets and objects - -This example shows you how to do the following: - -- Create a bucket and upload a file to it. -- Download an object from a bucket. -- Copy an object to a subfolder in a bucket. -- List the objects in a bucket. -- Delete the bucket objects and the bucket. - - - - - - - - #### Unit and integration test with an SDK This example shows you how to examples for best-practice techniques when writing unit and integration tests using an AWS SDK. diff --git a/sap-abap/services/dyn/README.md b/sap-abap/services/dyn/README.md index 686eab95d7a..a2af18a5056 100644 --- a/sap-abap/services/dyn/README.md +++ b/sap-abap/services/dyn/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `sap-a +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](zcl_aws1_dyn_scenario.clas.abap) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -44,13 +51,6 @@ Code excerpts that show you how to call individual service functions. - [Scan](zcl_aws1_dyn_actions.clas.abap#L301) - [UpdateItem](zcl_aws1_dyn_actions.clas.abap#L337) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with tables, items, and queries](zcl_aws1_dyn_scenario.clas.abap) - @@ -64,8 +64,7 @@ functions within the same service. - -#### Get started with tables, items, and queries +#### Learn the basics This example shows you how to do the following: @@ -76,12 +75,13 @@ This example shows you how to do the following: - Scan for movies that were released in a range of years. - Delete a movie from the table, then delete the table. - - + + + + + - - ### Tests diff --git a/sap-abap/services/kinesis/README.md b/sap-abap/services/kinesis/README.md index cb360d0628d..fcbc51f9727 100644 --- a/sap-abap/services/kinesis/README.md +++ b/sap-abap/services/kinesis/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `sap-a +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](zcl_aws1_kns_scenario.clas.abap) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -41,13 +48,6 @@ Code excerpts that show you how to call individual service functions. - [PutRecord](zcl_aws1_kns_actions.clas.abap#L200) - [RegisterStreamConsumer](zcl_aws1_kns_actions.clas.abap#L238) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with data streams](zcl_aws1_kns_scenario.clas.abap) - @@ -61,8 +61,7 @@ functions within the same service. - -#### Get started with data streams +#### Learn the basics This example shows you how to do the following: @@ -70,12 +69,13 @@ This example shows you how to do the following: - Create a shard iterator. - Read the record, then clean up resources. - - + + + + + - - ### Tests diff --git a/sap-abap/services/s3/README.md b/sap-abap/services/s3/README.md index c79b2b89c47..31929047710 100644 --- a/sap-abap/services/s3/README.md +++ b/sap-abap/services/s3/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `sap-a +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](zcl_aws1_s3_scenario.clas.abap) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -41,13 +48,6 @@ Code excerpts that show you how to call individual service functions. - [ListObjectsV2](zcl_aws1_s3_actions.clas.abap#L191) - [PutObject](zcl_aws1_s3_actions.clas.abap#L211) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with buckets and objects](zcl_aws1_s3_scenario.clas.abap) - @@ -61,8 +61,7 @@ functions within the same service. - -#### Get started with buckets and objects +#### Learn the basics This example shows you how to do the following: @@ -72,12 +71,13 @@ This example shows you how to do the following: - List the objects in a bucket. - Delete the bucket objects and the bucket. - - + + + + + - - ### Tests diff --git a/swift/example_code/s3/README.md b/swift/example_code/s3/README.md index 3bac17f2f8f..54b50d7e92b 100644 --- a/swift/example_code/s3/README.md +++ b/swift/example_code/s3/README.md @@ -29,6 +29,13 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `swift +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](basics/Sources/ServiceHandler/ServiceHandler.swift) + + ### Single actions Code excerpts that show you how to call individual service functions. @@ -43,13 +50,6 @@ Code excerpts that show you how to call individual service functions. - [ListObjectsV2](basics/Sources/ServiceHandler/ServiceHandler.swift#L205) - [PutObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L71) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Get started with buckets and objects](basics/Sources/ServiceHandler/ServiceHandler.swift) - @@ -74,8 +74,7 @@ and run commands. - -#### Get started with buckets and objects +#### Learn the basics This example shows you how to do the following: @@ -85,12 +84,13 @@ This example shows you how to do the following: - List the objects in a bucket. - Delete the bucket objects and the bucket. - - + + + + + - - ### Tests From d881a660f97c02052dd79a0e96fda95d248239a0 Mon Sep 17 00:00:00 2001 From: Rachel Hagerman <110480692+rlhagerm@users.noreply.github.com> Date: Thu, 22 Aug 2024 08:24:43 -0500 Subject: [PATCH 39/98] Python: Improve Movies description for DynamoDb examples. (#6756) * Add example record to class declaration. --- .tools/readmes/config.py | 1 + .../scenario_getting_started_movies.py | 22 +++++++++++++- python/example_code/dynamodb/README.md | 30 +++++++++---------- 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/.tools/readmes/config.py b/.tools/readmes/config.py index a41f1a886b4..e203ede5862 100644 --- a/.tools/readmes/config.py +++ b/.tools/readmes/config.py @@ -136,6 +136,7 @@ "device-farm": "python/example_code/devicefarm", "elastic-load-balancing-v2": "python/example_code/elastic-load-balancing", "secrets-manager": "python/example_code/secretsmanager", + "dynamodb": "python/example_code/dynamodb" }, } }, diff --git a/python/example_code/dynamodb/GettingStarted/scenario_getting_started_movies.py b/python/example_code/dynamodb/GettingStarted/scenario_getting_started_movies.py index 88ba91bd66e..76a28591386 100644 --- a/python/example_code/dynamodb/GettingStarted/scenario_getting_started_movies.py +++ b/python/example_code/dynamodb/GettingStarted/scenario_getting_started_movies.py @@ -34,7 +34,27 @@ # snippet-start:[python.example_code.dynamodb.helper.Movies.class_full] # snippet-start:[python.example_code.dynamodb.helper.Movies.class_decl] class Movies: - """Encapsulates an Amazon DynamoDB table of movie data.""" + """Encapsulates an Amazon DynamoDB table of movie data. + + Example data structure for a movie record in this table: + { + "year": 1999, + "title": "For Love of the Game", + "info": { + "directors": ["Sam Raimi"], + "release_date": "1999-09-15T00:00:00Z", + "rating": 6.3, + "plot": "A washed up pitcher flashes through his career.", + "rank": 4987, + "running_time_secs": 8220, + "actors": [ + "Kevin Costner", + "Kelly Preston", + "John C. Reilly" + ] + } + } + """ def __init__(self, dyn_resource): """ diff --git a/python/example_code/dynamodb/README.md b/python/example_code/dynamodb/README.md index 9773cbd00d1..ba6dfeff760 100644 --- a/python/example_code/dynamodb/README.md +++ b/python/example_code/dynamodb/README.md @@ -52,18 +52,18 @@ Code excerpts that show you how to call individual service functions. - [BatchExecuteStatement](partiql/scenario_partiql_batch.py#L44) - [BatchGetItem](batching/dynamo_batching.py#L64) -- [BatchWriteItem](GettingStarted/scenario_getting_started_movies.py#L144) -- [CreateTable](GettingStarted/scenario_getting_started_movies.py#L80) -- [DeleteItem](GettingStarted/scenario_getting_started_movies.py#L322) -- [DeleteTable](GettingStarted/scenario_getting_started_movies.py#L343) -- [DescribeTable](GettingStarted/scenario_getting_started_movies.py#L50) +- [BatchWriteItem](GettingStarted/scenario_getting_started_movies.py#L164) +- [CreateTable](GettingStarted/scenario_getting_started_movies.py#L100) +- [DeleteItem](GettingStarted/scenario_getting_started_movies.py#L342) +- [DeleteTable](GettingStarted/scenario_getting_started_movies.py#L363) +- [DescribeTable](GettingStarted/scenario_getting_started_movies.py#L70) - [ExecuteStatement](partiql/scenario_partiql_single.py#L43) -- [GetItem](GettingStarted/scenario_getting_started_movies.py#L203) -- [ListTables](GettingStarted/scenario_getting_started_movies.py#L120) -- [PutItem](GettingStarted/scenario_getting_started_movies.py#L173) -- [Query](GettingStarted/scenario_getting_started_movies.py#L260) -- [Scan](GettingStarted/scenario_getting_started_movies.py#L283) -- [UpdateItem](GettingStarted/scenario_getting_started_movies.py#L228) +- [GetItem](GettingStarted/scenario_getting_started_movies.py#L223) +- [ListTables](GettingStarted/scenario_getting_started_movies.py#L140) +- [PutItem](GettingStarted/scenario_getting_started_movies.py#L193) +- [Query](GettingStarted/scenario_getting_started_movies.py#L280) +- [Scan](GettingStarted/scenario_getting_started_movies.py#L303) +- [UpdateItem](GettingStarted/scenario_getting_started_movies.py#L248) ### Scenarios @@ -71,10 +71,10 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Accelerate reads with DynamoDB Accelerator](TryDax/01-create-table.py) -- [Create a REST API to track COVID-19 data](python/cross_service/apigateway_covid-19_tracker) -- [Create a messenger application](python/cross_service/stepfunctions_messenger) -- [Create a web application to track DynamoDB data](python/cross_service/dynamodb_item_tracker) -- [Create a websocket chat application](python/cross_service/apigateway_websocket_chat) +- [Create a REST API to track COVID-19 data](../../cross_service/apigateway_covid-19_tracker) +- [Create a messenger application](../../cross_service/stepfunctions_messenger) +- [Create a web application to track DynamoDB data](../../cross_service/dynamodb_item_tracker) +- [Create a websocket chat application](../../cross_service/apigateway_websocket_chat) - [Query a table by using batches of PartiQL statements](partiql/scenario_partiql_batch.py) - [Query a table using PartiQL](partiql/scenario_partiql_single.py) From 4265f25081f8d5e6de79ab097cdf72b43430a7e0 Mon Sep 17 00:00:00 2001 From: Scott Macdonald <57190223+scmacdon@users.noreply.github.com> Date: Thu, 22 Aug 2024 12:52:48 -0400 Subject: [PATCH 40/98] Java V2 Add the AWS Batch Scout (#6714) * added eng spec for AWS Batch --- .doc_gen/metadata/batch_metadata.yaml | 198 +++++- basics_scenarios/batch_scenario/README.md | 41 ++ .../batch_scenario/SPECIFICATION.md | 324 ++++++++++ javav2/example_code/batch/README.md | 126 ++++ javav2/example_code/batch/pom.xml | 147 +++++ .../resources/cdk/batch_resources/README.md | 18 + .../resources/cdk/batch_resources/cdk.json | 64 ++ .../resources/cdk/batch_resources/pom.xml | 60 ++ .../cdk/batch_resources/template.yaml | 254 ++++++++ .../java/com/example/batch/HelloBatch.java | 79 +++ .../example/batch/scenario/BatchActions.java | 610 ++++++++++++++++++ .../example/batch/scenario/BatchScenario.java | 535 +++++++++++++++ .../batch/scenario/CloudFormationHelper.java | 138 ++++ .../main/resources/BatchRoles-template.yaml | 154 +++++ .../main/resources/BatchStack-template.yaml | 180 ++++++ .../src/main/resources/EcsStack-template.yaml | 185 ++++++ .../batch/src/main/resources/log4j2.xml | 15 + .../batch/src/test/java/BatchTest.java | 246 +++++++ 18 files changed, 3370 insertions(+), 4 deletions(-) create mode 100644 basics_scenarios/batch_scenario/README.md create mode 100644 basics_scenarios/batch_scenario/SPECIFICATION.md create mode 100644 javav2/example_code/batch/README.md create mode 100644 javav2/example_code/batch/pom.xml create mode 100644 javav2/example_code/batch/resources/cdk/batch_resources/README.md create mode 100644 javav2/example_code/batch/resources/cdk/batch_resources/cdk.json create mode 100644 javav2/example_code/batch/resources/cdk/batch_resources/pom.xml create mode 100644 javav2/example_code/batch/resources/cdk/batch_resources/template.yaml create mode 100644 javav2/example_code/batch/src/main/java/com/example/batch/HelloBatch.java create mode 100644 javav2/example_code/batch/src/main/java/com/example/batch/scenario/BatchActions.java create mode 100644 javav2/example_code/batch/src/main/java/com/example/batch/scenario/BatchScenario.java create mode 100644 javav2/example_code/batch/src/main/java/com/example/batch/scenario/CloudFormationHelper.java create mode 100644 javav2/example_code/batch/src/main/resources/BatchRoles-template.yaml create mode 100644 javav2/example_code/batch/src/main/resources/BatchStack-template.yaml create mode 100644 javav2/example_code/batch/src/main/resources/EcsStack-template.yaml create mode 100644 javav2/example_code/batch/src/main/resources/log4j2.xml create mode 100644 javav2/example_code/batch/src/test/java/BatchTest.java diff --git a/.doc_gen/metadata/batch_metadata.yaml b/.doc_gen/metadata/batch_metadata.yaml index 7bbdb47fcf1..e50b4b1594b 100644 --- a/.doc_gen/metadata/batch_metadata.yaml +++ b/.doc_gen/metadata/batch_metadata.yaml @@ -1,13 +1,203 @@ # zexi 0.4.0 +batch_Hello: + title: Hello &BATCH; + title_abbrev: Hello &BATCH; + synopsis: get started using &BATCH;. + category: Hello + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + sdkguide: + excerpts: + - description: + snippet_tags: + - batch.java2.hello.main + services: + batch: {listJobsPaginator} + +batch_DescribeJobs: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.retrieve.job.main + services: + batch: {DescribeJobs} +batch_SubmitJob: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.submit.job.main + services: + batch: {SubmitJob} +batch_UpdateComputeEnvironment: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.disable.compute.environment.main + services: + batch: {UpdateComputeEnvironment} +batch_DescribeJobQueues: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.describe.job.queue.main + services: + batch: {DescribeJobQueues} +batch_DeleteJobQueue: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.delete.job.queue.main + services: + batch: {DeleteJobQueue} +batch_UpdateJobQueue: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.disable.job.queue.main + services: + batch: {UpdateJobQueue} +batch_DeregisterJobDefinition: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.deregister.job.main + services: + batch: {DeregisterJobDefinition} +batch_RegisterJobDefinition: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.register.job.main + services: + batch: {RegisterJobDefinition} +batch_ListJobsPaginator: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.create.list.jobs.main + services: + batch: {ListJobsPaginator} +batch_CreateJobQueue: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.create.job.queue.main + services: + batch: {CreateJobQueue} batch_DescribeComputeEnvironments: languages: - Rust: + Java: versions: - - sdk_version: 1 - github: rustv1/examples/batch + - sdk_version: 2 + github: javav2/example_code/batch excerpts: - description: snippet_tags: - - batch.rust.batch-helloworld + - batch.java2.check.status.main services: batch: {DescribeComputeEnvironments} +batch_DeleteComputeEnvironment: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.delete_compute.main + services: + batch: {DeleteComputeEnvironment} +batch_CreateComputeEnvironment: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + excerpts: + - description: + snippet_tags: + - batch.java2.create_compute.main + services: + batch: {CreateComputeEnvironment} +batch_Scenario: + title: Learn core operations for'&BATCHlong; using an &AWS; SDK + title_abbrev: Learn &BATCH; core operations + synopsis_list: + - Create an &BATCH; compute environment. + - Check the status of the compute environment. + - Set up an &BATCH; job queue and job definition. + - Register a job definition. + - Submit an &BATCH; Job. + - Get a list of jobs applicable to the job queue. + - Check the status of job. + - Delete &BATCH; resources. + category: Scenarios + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/batch + sdkguide: + excerpts: + - description: Run an interactive scenario demonstrating &BATCH; features. + snippet_tags: + - batch.java2.scenario.main + - description: A wrapper class for &BATCH; SDK methods. + snippet_tags: + - batch.java2.actions.main + services: + batch: {CreateComputeEnvironment, DeleteComputeEnvironment, DescribeComputeEnvironments, CreateJobQueue, ListJobsPaginator, DescribeJobs, SubmitJob, UpdateComputeEnvironment, RegisterJobDefinition, DescribeJobQueues, DeleteJobQueue, DeregisterJobDefinition, UpdateJobQueue} diff --git a/basics_scenarios/batch_scenario/README.md b/basics_scenarios/batch_scenario/README.md new file mode 100644 index 00000000000..f3a4d3d7aeb --- /dev/null +++ b/basics_scenarios/batch_scenario/README.md @@ -0,0 +1,41 @@ +# AWS Batch Service Basic Scenario + +## Overview + + This AWS Batch Service basic scenario demonstrates how to interact with the AWS Batch service using an AWS SDK. The scenario covers various operations such as creating an AWS Batch compute environment, creating a job queue, creating a job defination, and submitting a job, and so on. + + Here are the top six service operations this scenario covers. + +1. **Create an AWS Batch computer environment**: Creates an AWS Batch computer environment. + +2. **Sets up a job queue**: Creates a job queue that will manage the submission of jobs. + +3. **Creates a job definition**: Creates a job definition that specifies how the jobs should be executed. + +4. **Registers a Job Definition**: Registers a job definition making it available for job submissions. + +5. **Submits a Batch Job**: Submits a job. + +6. **Checks the status of the job**: Checks the status of the job. + +Note: These steps are not the complete program, but summarizes the 5-6 high-level steps. See the Eng Spec for a complete listing of ECR operations. + +### Resources + +The basic scenario requires an IAM role that has AWS Batch permissions. A CloudFormation template is used to create the IAM role. + + +## Implementations + +This scenario example is implemented in the following language: + +- Java + + +## Additional reading + +- [AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/what-is-batch.html) + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 diff --git a/basics_scenarios/batch_scenario/SPECIFICATION.md b/basics_scenarios/batch_scenario/SPECIFICATION.md new file mode 100644 index 00000000000..505ad50d10e --- /dev/null +++ b/basics_scenarios/batch_scenario/SPECIFICATION.md @@ -0,0 +1,324 @@ +# AWS Batch Service Scenario Specification + +## Overview +This SDK Basics scenario demonstrates how to interact with AWS Batch using the AWS SDK. It demonstrates various tasks such as creating a compute environment, setting up a job queue, defining a job definition, submitting a job, and so on. Finally this scenario demonstrates how to clean up resources. Its purpose is to demonstrate how to get up and running with AWS Batch and the AWS SDK. + +## Resources +The required resources for this Basics scenario are two IAM roles. The IAM roles must have permission to interact with the AWS Batch service. This Basics scenario uses a CloudFormation template to create the IAM roles and delete the IAM roles at the end of the program. + +This scenario submits a job that pulls a Docker image from Amazon ECR to Amazon Fargate. To place a Docker image on Amazon ECR, run the follow Basics scenario. See [Amazon ECR code examples for the SDK for Java 2.x](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/ecr) + +## Hello AWS Batch +This program is intended for users not familiar with the AWS Batch SDK to easily get up and running. The logic is to show use of `listJobsPaginator()`. + +## Scenario Program Flow +The AWS Batch Basics scenario executes the following operations. + +**Creates two IAM roles using a CloudFormation template** + +This operation uses AWS CloudFormation to create two IAM roles that are required for AWS Batch operations. The first role is for the compute environment and grants the necessary permissions for the instances to perform tasks such as reading from Amazon S3 or writing logs to CloudWatch. The second role is for the AWS Batch service to interact with other AWS services. + +**Creates a Batch compute environment** + +This operation sets up a compute environment where AWS Batch jobs will be executed. The compute environment is essentially a collection of EC2 instances or ECS containers that AWS Batch can scale based on job requirements. + + +**Checks the status of the compute Environment** + +This operation retrieves the current status of the compute environment to ensure it is active and ready to accept jobs. + +**Sets up a job queue and job definition** + +This operation involves creating a job queue that will manage the submission of jobs and a job definition that specifies how the jobs should be executed. + +**Registers a Job Definition** + +This operation registers a new job definition with AWS Batch, making it available for job submissions. + +**Submits a Batch Job** + +This operation submits a job to the AWS Batch job queue for execution. + +**Describes a Job** +This operation retrieves detailed information about a specific job, including its status and execution details. + +**Deregisters the Job Definition** +his operation removes a job definition from AWS Batch, making it unavailable for future job submissions. + +**Describes the Job Queue** + +This operation retrieves information about a specific job queue, including its status and associated compute environments. + +**Disables and deletes the Job Queue** +This operation disables a job queue to stop it from accepting new jobs and then deletes it from AWS Batch. + +**Disables and deletes the Compute Environment** +This operation disables a compute environment to prevent it from executing new jobs and then deletes it from AWS Batch. + + +### Program execution +The following shows the output of the AWS Batch program in the console. + +``` +AWS Batch is a fully managed batch processing service that dynamically provisions the required compute +resources for batch computing workloads. The Java V2 `BatchAsyncClient` allows +developers to automate the submission, monitoring, and management of batch jobs. + +This scenario provides an example of setting up a compute environment, job queue and job definition, +and then submitting a job. + +Let's get started... + +You have two choices: + +1 - Run the entire program. +2 - Delete an existing Compute Environment (created from a previous execution of +this program that did not complete). + +1 +Continuing with the program... + +-------------------------------------------------------------------------------- + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Use AWS CloudFormation to create two IAM roles that are required for this scenario. +Stack creation requested, ARN is arn:aws:cloudformation:us-east-1:814548047983:stack/BatchStack4/a3f75c50-54d1-11ef-b797-0e1c1efd9fe3 +Stack created successfully +Stack creation requested, ARN is arn:aws:cloudformation:us-east-1:814548047983:stack/EcsStack/c8f19bb0-54d1-11ef-8454-0eebf7f4997f +Stack created successfully +The IAM role needed to interact wit AWS Batch is arn:aws:iam::814548047983:role/BatchStack4-RoleBatch15CD9C03-KWhgI3rvSIbY +The second IAM role needed to interact wit AWS ECR is arn:aws:iam::814548047983:role/EcsStack-RoleEcsB0CD5AAE-RaUPyHZuoa1L + +Enter 'c' followed by to continue: +c +Continuing with the program... + +-------------------------------------------------------------------------------- +1. Create a Batch compute environment +A compute environment is a resource where you can run your batch jobs. +After creating a compute environment, you can define job queues and job definitions to submit jobs for +execution. + +The benefit of creating a compute environment is it allows you to easily configure and manage the compute +resources that will be used to run your Batch jobs. By separating the compute environment from the job definitions, +you can easily scale your compute resources up or down as needed, without having to modify your job definitions. +This makes it easier to manage your Batch workloads and ensures that your jobs have the necessary +compute resources to run efficiently. + + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Compute environment created successfully. +Compute Environment ARN: arn:aws:batch:us-east-1:814548047983:compute-environment/my-compute-environment + +Enter 'c' followed by to continue: +c +Continuing with the program... + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +2. Check the status of the my-compute-environment Compute Environment. + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Compute environment status retrieved successfully. +Compute Environment Status: VALID + +Enter 'c' followed by to continue: +c +Continuing with the program... + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +3. Create a job queue +A job queue is an essential component that helps manage the execution of your batch jobs. +It acts as a buffer, where jobs are placed and then scheduled for execution based on their +priority and the available resources in the compute environment. + + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Job queue created successfully. +Job Queue ARN: arn:aws:batch:us-east-1:814548047983:job-queue/my-job-queue + +Enter 'c' followed by to continue: +c +Continuing with the program... + +-------------------------------------------------------------------------------- +4. Register a Job Definition. +Registering a job in AWS Batch using the Fargate launch type ensures that all +necessary parameters, such as the execution role, command to run, and so on +are specified and reused across multiple job submissions. + + The job definition pulls a Docker image from Amazon ECR and executes the Docker image. + + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Job ARN: arn:aws:batch:us-east-1:814548047983:job-definition/my-job-definition:63 +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +5. Submit an AWS Batch job from a job definition. + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Job submitted successfully. Job ID: 5a7af03d-2659-4e96-a714-94beaacce600 +The job id is 5a7af03d-2659-4e96-a714-94beaacce600 + +Enter 'c' followed by to continue: +c +Continuing with the program... + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +6. Get a list of jobs applicable to the job queue. + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Job ID: e3a2b1de-01b6-4330-8a2e-f1f921a87acb, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: e7618984-49a0-44b8-85e3-e331e0cdca9a, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: b3c19bb0-65db-4097-8871-c95544a4efdb, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 611b04a3-6c1e-415d-a733-83798c8b9d40, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: c81941d3-b3ba-4b2a-8bf2-470ff8f467aa, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 353e105d-ca38-43cc-b4f8-52bd75418b5b, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 77571838-dd64-454f-8b34-73fcb41ffa7c, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 2b80159f-46d5-4d8c-ac73-6a94f19a7c74, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: fad2a2e6-a66a-4b93-ab7b-e81b833d2f6f, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 358747fe-2c50-4d85-a965-dccd221791b7, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 6eb60b65-5039-4da4-ae74-c5fa1d2ac633, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 87e8798f-1104-4d8b-b9dc-fee65413bc64, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: c834a6dc-133d-47ef-80f8-f1b3b0f35408, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 45ed52c7-4caf-462f-b713-378892b7ec77, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 5983149a-a735-4b17-8fc3-addc7f7dee1f, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 480c1331-af47-4485-9162-c60c241873e7, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: bb04c5b1-0913-408e-b09b-f6dbdd731d12, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: b41d72d8-f241-4335-88cc-0adf531670e8, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 4782196d-1749-483c-b367-86281cbaf310, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 10d617d7-b769-476e-a1be-16a68f11ee83, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: dd9b05d0-755c-4f9b-a4e4-d92bbc85b415, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: a67cd644-8d9f-4847-8192-78e9e018e020, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: aea93597-cbb3-447c-8174-c83307847b58, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 0f4c6dce-0498-4c7d-85a0-31517634bd7f, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 7173bf10-4c58-4d05-8028-620d71a89ff8, Job Name: my-job-definition, Job Status: SUCCEEDED +Job ID: 40354da2-7f7d-42df-9e84-888b1e4e5007, Job Name: my-job-definition, Job Status: SUCCEEDED + +Enter 'c' followed by to continue: +c +Continuing with the program... + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +7. Check the status of job 5a7af03d-2659-4e96-a714-94beaacce600 + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Job status retrieved successfully. Status: STARTING +Job Status: STARTING + +Enter 'c' followed by to continue: +c +Continuing with the program... + +-------------------------------------------------------------------------------- +8. Delete Batch resources +When deleting an AWS Batch compute environment, it does not happen instantaneously. +There is typically a delay, similar to some other AWS resources. +AWS Batch starts the deletion process. + +Would you like to delete the AWS Batch resources such as the compute environment? (y/n) +y +You selected to delete the AWS ECR resources. +First, we will deregister the Job Definition. + +Enter 'c' followed by to continue: +c +Continuing with the program... + +arn:aws:batch:us-east-1:814548047983:job-definition/my-job-definition:63 was successfully deregistered +Second, we will disable and then delete the Job Queue. + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Job queue update initiated: UpdateJobQueueResponse(JobQueueName=my-job-queue, JobQueueArn=arn:aws:batch:us-east-1:814548047983:job-queue/my-job-queue) +Job queue is now disabled. + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Lets wait 2 mins for the job queue to be deleted +02:00Job queue deleted: DeleteJobQueueResponse() +00:00Countdown complete! + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Third, we will delete the Compute Environment. + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Compute environment disabled: my-compute-environment +Compute environment status retrieved successfully. +Current State: UPDATING +Lets wait 1 min for the compute environment to be deleted +00:00Countdown complete! +Compute environment was successfully deleted + +Enter 'c' followed by to continue: +c +Continuing with the program... + +Delete stack requested .... +Stack deleted successfully. +Delete stack requested .... +Stack deleted successfully. +-------------------------------------------------------------------------------- +This concludes the AWS Batch SDK scenario +-------------------------------------------------------------------------------- + +``` + +## SOS Tags + +The following table describes the metadata used in this Basics Scenario. + + +| action | metadata file | metadata key | +|------------------------------|------------------------------|---------------------------------------- | +| `describeJobs` | batch_metadata.yaml | batch_DescribeJobs | +| `updateComputeEnvironment` | batch_metadata.yaml | batch_UpdateComputeEnvironment | +| `describeJobQueues` | batch_metadata.yaml | batch_DescribeJobQueues | +| `DeleteJobQueue` | batch_metadata.yaml | batch_DeleteJobQueue | +| `updateJobQueue` | batch_metadata.yaml | batch_UpdateJobQueue | +| `deregisterJobDefinition` | batch_metadata.yaml | batch_DeregisterJobDefinition | +| `registerJobDefinition` | batch_metadata.yaml | batch_RegisterJobDefinition | +| `listJobsPaginator` | batch_metadata.yaml | batch_ListJobsPaginator | +| `createJobQueue` | batch_metadata.yaml | batch_CreateJobQueue | +| `DescribeComputeEnvironments`| batch_metadata.yaml | batch_DescribeComputeEnvironments | +| `deleteComputeEnvironment` | batch_metadata.yaml | batch_DeleteComputeEnvironment | +| `CreateComputeEnvironment` | batch_metadata.yaml | batch_CreateComputeEnvironment | +| `scenario | batch_metadata.yaml | batch_Scenario | + diff --git a/javav2/example_code/batch/README.md b/javav2/example_code/batch/README.md new file mode 100644 index 00000000000..91c66ea73bd --- /dev/null +++ b/javav2/example_code/batch/README.md @@ -0,0 +1,126 @@ +# AWS Batch code examples for the SDK for Java 2.x + +## Overview + +Shows how to use the AWS SDK for Java 2.x to work with AWS Batch. + + + + +_AWS Batch enables you to run batch computing workloads on the AWS Cloud._ + +## ⚠ Important + +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + + + + +## Code examples + +### Prerequisites + +For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav2` folder. + + + + + +### Get started + +- [Hello AWS Batch](src/main/java/com/example/batch/HelloBatch.java#L6) (`listJobsPaginator`) + + +### Single actions + +Code excerpts that show you how to call individual service functions. + +- [CreateComputeEnvironment](src/main/java/com/example/batch/scenario/BatchActions.java#L102) +- [CreateJobQueue](src/main/java/com/example/batch/scenario/BatchActions.java#L193) +- [DeleteComputeEnvironment](src/main/java/com/example/batch/scenario/BatchActions.java#L142) +- [DeleteJobQueue](src/main/java/com/example/batch/scenario/BatchActions.java#L370) +- [DeregisterJobDefinition](src/main/java/com/example/batch/scenario/BatchActions.java#L323) +- [DescribeComputeEnvironments](src/main/java/com/example/batch/scenario/BatchActions.java#L162) +- [DescribeJobQueues](src/main/java/com/example/batch/scenario/BatchActions.java#L394) +- [DescribeJobs](src/main/java/com/example/batch/scenario/BatchActions.java#L490) +- [ListJobsPaginator](src/main/java/com/example/batch/scenario/BatchActions.java#L230) +- [RegisterJobDefinition](src/main/java/com/example/batch/scenario/BatchActions.java#L257) +- [SubmitJob](src/main/java/com/example/batch/scenario/BatchActions.java#L463) +- [UpdateComputeEnvironment](src/main/java/com/example/batch/scenario/BatchActions.java#L439) +- [UpdateJobQueue](src/main/java/com/example/batch/scenario/BatchActions.java#L347) + +### Scenarios + +Code examples that show you how to accomplish a specific task by calling multiple +functions within the same service. + +- [Learn AWS Batch core operations](src/main/java/com/example/batch/scenario/BatchScenario.java) + + + + + +## Run the examples + +### Instructions + + + + + +#### Hello AWS Batch + +This example shows you how to get started using AWS Batch. + + + +#### Learn AWS Batch core operations + +This example shows you how to do the following: + +- Create an AWS Batch compute environment. +- Check the status of the compute environment. +- Set up an AWS Batch job queue and job definition. +- Register a job definition. +- Submit an AWS Batch Job. +- Get a list of jobs applicable to the job queue. +- Check the status of job. +- Delete AWS Batch resources. + + + + + + + + +### Tests + +⚠ Running tests might result in charges to your AWS account. + + +To find instructions for running these tests, see the [README](../../README.md#Tests) +in the `javav2` folder. + + + + + + +## Additional resources + +- [AWS Batch User Guide](https://docs.aws.amazon.com/batch/latest/userguide/what-is-batch.html) +- [AWS Batch API Reference](https://docs.aws.amazon.com/batch/latest/APIReference/Welcome.html) +- [SDK for Java 2.x AWS Batch reference](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/ec2/package-summary.html) + + + + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/javav2/example_code/batch/pom.xml b/javav2/example_code/batch/pom.xml new file mode 100644 index 00000000000..2bb76a80628 --- /dev/null +++ b/javav2/example_code/batch/pom.xml @@ -0,0 +1,147 @@ + + + 4.0.0 + org.example + batch + 1.0-SNAPSHOT + + UTF-8 + 17 + 17 + 17 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.1 + + IntegrationTest + + + + + + + + software.amazon.awssdk + bom + 2.26.15 + pom + import + + + org.apache.logging.log4j + log4j-bom + 2.23.1 + pom + import + + + + + + org.junit.jupiter + junit-jupiter-api + 5.9.2 + test + + + software.amazon.awssdk + netty-nio-client + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + test + + + org.junit.platform + junit-platform-commons + 1.9.2 + + + software.amazon.awssdk + secretsmanager + + + com.google.code.gson + gson + 2.10.1 + + + software.amazon.awssdk + cloudformation + + + software.amazon.awssdk + sts + + + org.junit.platform + junit-platform-launcher + 1.9.2 + test + + + com.fasterxml.jackson.core + jackson-databind + 2.17.0 + + + software.amazon.awssdk + kms + + + software.amazon.awssdk + batch + + + software.amazon.awssdk + ec2 + + + software.amazon.awssdk + sso + + + software.amazon.awssdk + ssooidc + + + org.apache.logging.log4j + log4j-core + + + org.slf4j + slf4j-api + 2.0.13 + + + org.apache.logging.log4j + log4j-slf4j2-impl + + + org.apache.logging.log4j + log4j-1.2-api + + + software.amazon.awssdk + url-connection-client + 2.18.13 + + + \ No newline at end of file diff --git a/javav2/example_code/batch/resources/cdk/batch_resources/README.md b/javav2/example_code/batch/resources/cdk/batch_resources/README.md new file mode 100644 index 00000000000..516ef71a25f --- /dev/null +++ b/javav2/example_code/batch/resources/cdk/batch_resources/README.md @@ -0,0 +1,18 @@ +# Welcome to your CDK Java project! + +This is a blank project for CDK development with Java. + +The `cdk.json` file tells the CDK Toolkit how to execute your app. + +It is a [Maven](https://maven.apache.org/) based project, so you can open this project with any Maven compatible Java IDE to build and run tests. + +## Useful commands + + * `mvn package` compile and run tests + * `cdk ls` list all stacks in the app + * `cdk synth` emits the synthesized CloudFormation template + * `cdk deploy` deploy this stack to your default AWS account/region + * `cdk diff` compare deployed stack with current state + * `cdk docs` open CDK documentation + +Enjoy! diff --git a/javav2/example_code/batch/resources/cdk/batch_resources/cdk.json b/javav2/example_code/batch/resources/cdk/batch_resources/cdk.json new file mode 100644 index 00000000000..397464dee3f --- /dev/null +++ b/javav2/example_code/batch/resources/cdk/batch_resources/cdk.json @@ -0,0 +1,64 @@ +{ + "app": "mvn -e -q compile exec:java", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "target", + "pom.xml", + "src/test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-iam:standardizedServicePrincipals": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-efs:denyAnonymousAccess": true, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, + "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, + "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, + "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, + "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, + "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true + } +} diff --git a/javav2/example_code/batch/resources/cdk/batch_resources/pom.xml b/javav2/example_code/batch/resources/cdk/batch_resources/pom.xml new file mode 100644 index 00000000000..8a7d19a86c1 --- /dev/null +++ b/javav2/example_code/batch/resources/cdk/batch_resources/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + com.myorg + batch-cdk + 0.1 + + + UTF-8 + 2.135.0 + [10.0.0,11.0.0) + 5.7.1 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + com.myorg.BatchApp + + + + + + + + + software.amazon.awscdk + aws-cdk-lib + ${cdk.version} + + + + software.constructs + constructs + ${constructs.version} + + + + org.junit.jupiter + junit-jupiter + ${junit.version} + test + + + diff --git a/javav2/example_code/batch/resources/cdk/batch_resources/template.yaml b/javav2/example_code/batch/resources/cdk/batch_resources/template.yaml new file mode 100644 index 00000000000..631220c6f12 --- /dev/null +++ b/javav2/example_code/batch/resources/cdk/batch_resources/template.yaml @@ -0,0 +1,254 @@ +Resources: + RoleBatch1F0C40377: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: ecs-tasks.amazonaws.com + Version: "2012-10-17" + ManagedPolicyArns: + - Fn::Join: + - "" + - - "arn:" + - Ref: AWS::Partition + - :iam::aws:policy/AWSBatchFullAccess + Metadata: + aws:cdk:path: BatchStack4/RoleBatch1/Resource + RoleBatch1DefaultPolicyA383370F: + Type: AWS::IAM::Policy + Properties: + PolicyDocument: + Statement: + - Action: + - batch:CreateComputeEnvironment + - batch:DeleteComputeEnvironment + - batch:DescribeComputeEnvironments + - batch:DescribeJobDefinitions + - batch:DescribeJobQueues + - batch:DescribeJobs + - batch:SubmitJob + - batch:UpdateComputeEnvironment + - ec2:DescribeSubnets + - ecs:CreateCluster + - ecs:DeleteCluster + - ecs:DeregisterTaskDefinition + - ecs:DescribeClusters + - ecs:DescribeContainerInstances + - ecs:DescribeServices + - ecs:DescribeTaskDefinitions + - ecs:DescribeTasks + - ecs:ListClusters + - ecs:ListContainerInstances + - ecs:ListServices + - ecs:ListTaskDefinitions + - ecs:ListTasks + - ecs:RegisterTaskDefinition + - ecs:RunTask + - ecs:StartTask + - ecs:StopTask + - ecs:SubmitContainerStateChange + - ecs:SubmitTaskStateChange + - ecs:UpdateService + - iam:PassRole + - logs:CreateLogGroup + - logs:CreateLogStream + - logs:DescribeLogGroups + - logs:DescribeLogStreams + - logs:PutLogEvents + - sts:AssumeRole + Effect: Allow + Resource: "*" + Version: "2012-10-17" + PolicyName: RoleBatch1DefaultPolicyA383370F + Roles: + - Ref: RoleBatch1F0C40377 + Metadata: + aws:cdk:path: BatchStack4/RoleBatch1/DefaultPolicy/Resource + RoleBatch15CD9C03: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: batch.amazonaws.com + Version: "2012-10-17" + ManagedPolicyArns: + - Fn::Join: + - "" + - - "arn:" + - Ref: AWS::Partition + - :iam::aws:policy/AWSBatchFullAccess + Metadata: + aws:cdk:path: BatchStack4/RoleBatch/Resource + RoleBatchDefaultPolicyCC6915A6: + Type: AWS::IAM::Policy + Properties: + PolicyDocument: + Statement: + - Action: + - batch:CreateComputeEnvironment + - batch:DeleteComputeEnvironment + - batch:DescribeComputeEnvironments + - batch:DescribeJobDefinitions + - batch:DescribeJobQueues + - batch:DescribeJobs + - batch:SubmitJob + - batch:UpdateComputeEnvironment + - ec2:DescribeSubnets + - ecs:CreateCluster + - ecs:DeleteCluster + - ecs:DeregisterTaskDefinition + - ecs:DescribeClusters + - ecs:DescribeContainerInstances + - ecs:DescribeServices + - ecs:DescribeTaskDefinitions + - ecs:DescribeTasks + - ecs:ListClusters + - ecs:ListContainerInstances + - ecs:ListServices + - ecs:ListTaskDefinitions + - ecs:ListTasks + - ecs:RegisterTaskDefinition + - ecs:RunTask + - ecs:StartTask + - ecs:StopTask + - ecs:SubmitContainerStateChange + - ecs:SubmitTaskStateChange + - ecs:UpdateService + - iam:PassRole + - logs:CreateLogGroup + - logs:CreateLogStream + - logs:DescribeLogGroups + - logs:DescribeLogStreams + - logs:PutLogEvents + - sts:AssumeRole + Effect: Allow + Resource: "*" + Version: "2012-10-17" + PolicyName: RoleBatchDefaultPolicyCC6915A6 + Roles: + - Ref: RoleBatch15CD9C03 + Metadata: + aws:cdk:path: BatchStack4/RoleBatch/DefaultPolicy/Resource + CDKMetadata: + Type: AWS::CDK::Metadata + Properties: + Analytics: v2:deflate64:H4sIAAAAAAAA/zPSMzQ21TNQTCwv1k1OydbNyUzSqw4uSUzO1kksL47PTMzVqw7Kz0nVcU7LA9MB+TmZyZUgLoRVqxOUWpxfWpQMVuJfWlJQWgJWjCTqnJ+XklmSmZ9Xq+OVWJaob2iuZ6BnaKSYVZyZqVtUmleSmZuqFwShAeLZ8oGRAAAA + Metadata: + aws:cdk:path: BatchStack4/CDKMetadata/Default + Condition: CDKMetadataAvailable +Outputs: + BatchRoleArn: + Description: The ARN of the Batch Role + Value: + Fn::GetAtt: + - RoleBatch15CD9C03 + - Arn + Batchecr: + Description: The ARN of the Batch Role + Value: + Fn::GetAtt: + - RoleBatch1F0C40377 + - Arn +Conditions: + CDKMetadataAvailable: + Fn::Or: + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - af-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-east-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ap-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ca-central-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-north-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-northwest-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - eu-central-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-north-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-south-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-2 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-3 + - Fn::Equals: + - Ref: AWS::Region + - il-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-south-1 + - Fn::Equals: + - Ref: AWS::Region + - sa-east-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - us-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-2 + - Fn::Equals: + - Ref: AWS::Region + - us-west-1 + - Fn::Equals: + - Ref: AWS::Region + - us-west-2 +Parameters: + BootstrapVersion: + Type: AWS::SSM::Parameter::Value + Default: /cdk-bootstrap/hnb659fds/version + Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip] +Rules: + CheckBootstrapVersion: + Assertions: + - Assert: + Fn::Not: + - Fn::Contains: + - - "1" + - "2" + - "3" + - "4" + - "5" + - Ref: BootstrapVersion + AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI. + diff --git a/javav2/example_code/batch/src/main/java/com/example/batch/HelloBatch.java b/javav2/example_code/batch/src/main/java/com/example/batch/HelloBatch.java new file mode 100644 index 00000000000..c0585ab619e --- /dev/null +++ b/javav2/example_code/batch/src/main/java/com/example/batch/HelloBatch.java @@ -0,0 +1,79 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.batch; + +// snippet-start:[batch.java2.hello.main] +import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; +import software.amazon.awssdk.core.retry.RetryPolicy; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.batch.BatchAsyncClient; +import software.amazon.awssdk.services.batch.model.JobStatus; +import software.amazon.awssdk.services.batch.model.JobSummary; +import software.amazon.awssdk.services.batch.model.ListJobsRequest; +import software.amazon.awssdk.services.batch.paginators.ListJobsPublisher; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class HelloBatch { + private static BatchAsyncClient batchClient; + + public static void main(String[] args) { + List jobs = listJobs("my-job-queue"); + jobs.forEach(job -> + System.out.printf("Job ID: %s, Job Name: %s, Job Status: %s%n", + job.jobId(), job.jobName(), job.status()) + ); + } + + public static List listJobs(String jobQueue) { + if (jobQueue == null || jobQueue.isEmpty()) { + throw new IllegalArgumentException("Job queue cannot be null or empty"); + } + + ListJobsRequest listJobsRequest = ListJobsRequest.builder() + .jobQueue(jobQueue) + .jobStatus(JobStatus.SUCCEEDED) + .build(); + + List jobSummaries = new ArrayList<>(); + ListJobsPublisher listJobsPaginator = getAsyncClient().listJobsPaginator(listJobsRequest); + CompletableFuture future = listJobsPaginator.subscribe(response -> { + jobSummaries.addAll(response.jobSummaryList()); + }); + + future.join(); + return jobSummaries; + } + + private static BatchAsyncClient getAsyncClient() { + SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() + .maxConcurrency(100) // Increase max concurrency to handle more simultaneous connections. + .connectionTimeout(Duration.ofSeconds(60)) // Set the connection timeout. + .readTimeout(Duration.ofSeconds(60)) // Set the read timeout. + .writeTimeout(Duration.ofSeconds(60)) // Set the write timeout. + .build(); + + ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() + .apiCallTimeout(Duration.ofMinutes(2)) // Set the overall API call timeout. + .apiCallAttemptTimeout(Duration.ofSeconds(90)) // Set the individual call attempt timeout. + .retryPolicy(RetryPolicy.builder() // Add a retry policy to handle transient errors. + .numRetries(3) // Number of retry attempts. + .build()) + .build(); + + if (batchClient == null) { + batchClient = BatchAsyncClient.builder() + .region(Region.US_EAST_1) + .httpClient(httpClient) + .overrideConfiguration(overrideConfig) + .build(); + } + return batchClient; + } +} +// snippet-end:[batch.java2.hello.main] \ No newline at end of file diff --git a/javav2/example_code/batch/src/main/java/com/example/batch/scenario/BatchActions.java b/javav2/example_code/batch/src/main/java/com/example/batch/scenario/BatchActions.java new file mode 100644 index 00000000000..61fa54d9123 --- /dev/null +++ b/javav2/example_code/batch/src/main/java/com/example/batch/scenario/BatchActions.java @@ -0,0 +1,610 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.batch.scenario; +// snippet-start:[batch.java2.actions.main] +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; +import software.amazon.awssdk.core.retry.RetryPolicy; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.batch.BatchAsyncClient; +import software.amazon.awssdk.services.batch.BatchClient; +import software.amazon.awssdk.services.batch.model.AssignPublicIp; +import software.amazon.awssdk.services.batch.model.BatchException; +import software.amazon.awssdk.services.batch.model.CEState; +import software.amazon.awssdk.services.batch.model.CEType; +import software.amazon.awssdk.services.batch.model.CRType; +import software.amazon.awssdk.services.batch.model.ComputeEnvironmentOrder; +import software.amazon.awssdk.services.batch.model.ComputeResource; +import software.amazon.awssdk.services.batch.model.ContainerProperties; +import software.amazon.awssdk.services.batch.model.CreateComputeEnvironmentRequest; +import software.amazon.awssdk.services.batch.model.CreateComputeEnvironmentResponse; +import software.amazon.awssdk.services.batch.model.CreateJobQueueRequest; +import software.amazon.awssdk.services.batch.model.DeleteComputeEnvironmentRequest; +import software.amazon.awssdk.services.batch.model.DeleteComputeEnvironmentResponse; +import software.amazon.awssdk.services.batch.model.DeleteJobQueueRequest; +import software.amazon.awssdk.services.batch.model.DeleteJobQueueResponse; +import software.amazon.awssdk.services.batch.model.DeregisterJobDefinitionRequest; +import software.amazon.awssdk.services.batch.model.DeregisterJobDefinitionResponse; +import software.amazon.awssdk.services.batch.model.DescribeComputeEnvironmentsRequest; +import software.amazon.awssdk.services.batch.model.DescribeComputeEnvironmentsResponse; +import software.amazon.awssdk.services.batch.model.DescribeJobQueuesRequest; +import software.amazon.awssdk.services.batch.model.DescribeJobQueuesResponse; +import software.amazon.awssdk.services.batch.model.DescribeJobsRequest; +import software.amazon.awssdk.services.batch.model.DescribeJobsResponse; +import software.amazon.awssdk.services.batch.model.JQState; +import software.amazon.awssdk.services.batch.model.JobDefinitionType; +import software.amazon.awssdk.services.batch.model.JobDetail; +import software.amazon.awssdk.services.batch.model.JobQueueDetail; +import software.amazon.awssdk.services.batch.model.JobStatus; +import software.amazon.awssdk.services.batch.model.JobSummary; +import software.amazon.awssdk.services.batch.model.ListJobsRequest; +import software.amazon.awssdk.services.batch.model.RegisterJobDefinitionResponse; +import software.amazon.awssdk.services.batch.model.NetworkConfiguration; +import software.amazon.awssdk.services.batch.model.PlatformCapability; +import software.amazon.awssdk.services.batch.model.RegisterJobDefinitionRequest; +import software.amazon.awssdk.services.batch.model.ResourceRequirement; +import software.amazon.awssdk.services.batch.model.ResourceType; +import software.amazon.awssdk.services.batch.model.RuntimePlatform; +import software.amazon.awssdk.services.batch.model.SubmitJobRequest; +import software.amazon.awssdk.services.batch.model.CreateJobQueueResponse; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicBoolean; +import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; +import software.amazon.awssdk.services.batch.model.SubmitJobResponse; +import software.amazon.awssdk.services.batch.model.UpdateComputeEnvironmentRequest; +import software.amazon.awssdk.services.batch.model.UpdateComputeEnvironmentResponse; +import software.amazon.awssdk.services.batch.model.UpdateJobQueueRequest; +import software.amazon.awssdk.services.batch.model.UpdateJobQueueResponse; +import software.amazon.awssdk.services.batch.paginators.ListJobsPublisher; +import software.amazon.awssdk.services.sts.StsAsyncClient; +import software.amazon.awssdk.services.sts.model.GetCallerIdentityResponse; + +public class BatchActions { + private static BatchAsyncClient batchClient; + + private static final Logger logger = LoggerFactory.getLogger(BatchActions.class); + + private static BatchAsyncClient getAsyncClient() { + if (batchClient == null) { + SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() + .maxConcurrency(100) + .connectionTimeout(Duration.ofSeconds(60)) + .readTimeout(Duration.ofSeconds(60)) + .writeTimeout(Duration.ofSeconds(60)) + .build(); + + ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() + .apiCallTimeout(Duration.ofMinutes(2)) + .apiCallAttemptTimeout(Duration.ofSeconds(90)) + .retryPolicy(RetryPolicy.builder() + .numRetries(3) + .build()) + .build(); + + batchClient = BatchAsyncClient.builder() + .region(Region.US_EAST_1) + .httpClient(httpClient) + .overrideConfiguration(overrideConfig) + .build(); + } + return batchClient; + } + + // snippet-start:[batch.java2.create_compute.main] + /** + * Asynchronously creates a new compute environment in AWS Batch. + * + * @param computeEnvironmentName the name of the compute environment to create + * @param batchIAMRole the IAM role to be used by the compute environment + * @param subnet the subnet ID to be used for the compute environment + * @param secGroup the security group ID to be used for the compute environment + * @return a {@link CompletableFuture} representing the asynchronous operation, which will complete with the + * {@link CreateComputeEnvironmentResponse} when the compute environment has been created + * @throws BatchException if there is an error creating the compute environment + * @throws RuntimeException if there is an unexpected error during the operation + */ + public CompletableFuture createComputeEnvironmentAsync( + String computeEnvironmentName, String batchIAMRole, String subnet, String secGroup) { + CreateComputeEnvironmentRequest environmentRequest = CreateComputeEnvironmentRequest.builder() + .computeEnvironmentName(computeEnvironmentName) + .type(CEType.MANAGED) + .state(CEState.ENABLED) + .computeResources(ComputeResource.builder() + .type(CRType.FARGATE) + .maxvCpus(256) + .subnets(Collections.singletonList(subnet)) + .securityGroupIds(Collections.singletonList(secGroup)) + .build()) + .serviceRole(batchIAMRole) + .build(); + + CompletableFuture response = getAsyncClient().createComputeEnvironment(environmentRequest); + response.whenComplete((resp, ex) -> { + if (ex != null) { + String errorMessage = "Unexpected error occurred: " + ex.getMessage(); + throw new RuntimeException(errorMessage, ex); + } + }); + + return response; + } + // snippet-end:[batch.java2.create_compute.main] + + // snippet-start:[batch.java2.delete_compute.main] + public CompletableFuture deleteComputeEnvironmentAsync(String computeEnvironmentName) { + DeleteComputeEnvironmentRequest deleteComputeEnvironment = DeleteComputeEnvironmentRequest.builder() + .computeEnvironment(computeEnvironmentName) + .build(); + + return getAsyncClient().deleteComputeEnvironment(deleteComputeEnvironment) + .whenComplete((response, ex) -> { + if (ex != null) { + Throwable cause = ex.getCause(); + if (cause instanceof BatchException) { + throw new RuntimeException(cause); + } else { + throw new RuntimeException("Unexpected error: " + cause.getMessage(), cause); + } + } + }); + } + // snippet-end:[batch.java2.delete_compute.main] + + // snippet-start:[batch.java2.check.status.main] + /** + * Checks the status of the specified compute environment. + * + * @param computeEnvironmentName the name of the compute environment to check + * @return a CompletableFuture containing the status of the compute environment, or "ERROR" if an exception occurs + */ + public CompletableFuture checkComputeEnvironmentsStatus(String computeEnvironmentName) { + if (computeEnvironmentName == null || computeEnvironmentName.isEmpty()) { + throw new IllegalArgumentException("Compute environment name cannot be null or empty"); + } + + DescribeComputeEnvironmentsRequest environmentsRequest = DescribeComputeEnvironmentsRequest.builder() + .computeEnvironments(computeEnvironmentName) + .build(); + + CompletableFuture response = getAsyncClient().describeComputeEnvironments(environmentsRequest); + response.whenComplete((resp, ex) -> { + if (ex != null) { + String errorMessage = "Unexpected error occurred: " + ex.getMessage(); + throw new RuntimeException(errorMessage, ex); + } + }); + + return response.thenApply(resp -> resp.computeEnvironments().stream() + .map(env -> env.statusAsString()) + .findFirst() + .orElse("UNKNOWN")); + } + // snippet-end:[batch.java2.check.status.main] + + // snippet-start:[batch.java2.create.job.queue.main] + /** + * Creates a job queue asynchronously. + * + * @param jobQueueName the name of the job queue to create + * @param computeEnvironmentName the name of the compute environment to associate with the job queue + * @return a CompletableFuture that completes with the Amazon Resource Name (ARN) of the job queue + */ + public CompletableFuture createJobQueueAsync(String jobQueueName, String computeEnvironmentName) { + if (jobQueueName == null || jobQueueName.isEmpty()) { + throw new IllegalArgumentException("Job queue name cannot be null or empty"); + } + if (computeEnvironmentName == null || computeEnvironmentName.isEmpty()) { + throw new IllegalArgumentException("Compute environment name cannot be null or empty"); + } + + CreateJobQueueRequest request = CreateJobQueueRequest.builder() + .jobQueueName(jobQueueName) + .priority(1) + .computeEnvironmentOrder(ComputeEnvironmentOrder.builder() + .computeEnvironment(computeEnvironmentName) + .order(1) + .build()) + .build(); + + CompletableFuture response = getAsyncClient().createJobQueue(request); + response.whenComplete((resp, ex) -> { + if (ex != null) { + String errorMessage = "Unexpected error occurred: " + ex.getMessage(); + throw new RuntimeException(errorMessage, ex); + } + }); + + return response.thenApply(CreateJobQueueResponse::jobQueueArn); + } + // snippet-end:[batch.java2.create.job.queue.main] + + // snippet-start:[batch.java2.create.list.jobs.main] + /** + * Asynchronously lists the jobs in the specified job queue with the given job status. + * + * @param jobQueue the name of the job queue to list jobs from + * @return a List that contains the jobs that succeeded + */ + public List listJobsAsync(String jobQueue) { + if (jobQueue == null || jobQueue.isEmpty()) { + throw new IllegalArgumentException("Job queue cannot be null or empty"); + } + + ListJobsRequest listJobsRequest = ListJobsRequest.builder() + .jobQueue(jobQueue) + .jobStatus(JobStatus.SUCCEEDED) // Filter jobs by status. + .build(); + + List jobSummaries = new ArrayList<>(); + ListJobsPublisher listJobsPaginator = getAsyncClient().listJobsPaginator(listJobsRequest); + CompletableFuture future = listJobsPaginator.subscribe(response -> { + jobSummaries.addAll(response.jobSummaryList()); + }); + future.join(); + return jobSummaries; + } + // snippet-end:[batch.java2.create.list.jobs.main] + + // snippet-start:[batch.java2.register.job.main] + /** + * Registers a new job definition asynchronously in AWS Batch. + *

+ * When using Fargate as the compute environment, it is crucial to set the + * {@link NetworkConfiguration} with {@link AssignPublicIp#ENABLED} to + * ensure proper networking configuration for the Fargate tasks. This + * allows the tasks to communicate with external services, access the + * internet, or communicate within a VPC. + * + * @param jobDefinitionName the name of the job definition to be registered + * @param executionRoleARN the ARN (Amazon Resource Name) of the execution role + * that provides permissions for the containers in the job + * @param cpuArch a value of either X86_64 or ARM64 required for the service call + * @return a CompletableFuture that completes with the ARN of the registered + * job definition upon successful execution, or completes exceptionally with + * an error if the registration fails + */ + public CompletableFuture registerJobDefinitionAsync(String jobDefinitionName, String executionRoleARN, String image, String cpuArch) { + NetworkConfiguration networkConfiguration = NetworkConfiguration.builder() + .assignPublicIp(AssignPublicIp.ENABLED) + .build(); + + ContainerProperties containerProperties = ContainerProperties.builder() + .image(image) + .executionRoleArn(executionRoleARN) + .resourceRequirements( + Arrays.asList( + ResourceRequirement.builder() + .type(ResourceType.VCPU) + .value("1") + .build(), + ResourceRequirement.builder() + .type(ResourceType.MEMORY) + .value("2048") + .build() + ) + ) + .networkConfiguration(networkConfiguration) + .runtimePlatform(b -> b + .cpuArchitecture(cpuArch) + .operatingSystemFamily("LINUX")) + .build(); + + RegisterJobDefinitionRequest request = RegisterJobDefinitionRequest.builder() + .jobDefinitionName(jobDefinitionName) + .type(JobDefinitionType.CONTAINER) + .containerProperties(containerProperties) + .platformCapabilities(PlatformCapability.FARGATE) + .build(); + + CompletableFuture future = new CompletableFuture<>(); + getAsyncClient().registerJobDefinition(request) + .thenApply(RegisterJobDefinitionResponse::jobDefinitionArn) + .whenComplete((result, ex) -> { + if (ex != null) { + future.completeExceptionally(ex); + } else { + future.complete(result); + } + }); + + return future; + } + // snippet-end:[batch.java2.register.job.main] + + // snippet-start:[batch.java2.deregister.job.main] + /** + * Deregisters a job definition asynchronously. + * + * @param jobDefinition the name of the job definition to be deregistered + * @return a CompletableFuture that completes when the job definition has been deregistered + * or an exception has occurred + */ + public CompletableFuture deregisterJobDefinitionAsync(String jobDefinition) { + DeregisterJobDefinitionRequest jobDefinitionRequest = DeregisterJobDefinitionRequest.builder() + .jobDefinition(jobDefinition) + .build(); + + CompletableFuture responseFuture = getAsyncClient().deregisterJobDefinition(jobDefinitionRequest); + responseFuture.whenComplete((response, ex) -> { + if (ex != null) { + throw new RuntimeException("Unexpected error occurred: " + ex.getMessage(), ex); + } + }); + + return responseFuture; + } + // snippet-end:[batch.java2.deregister.job.main] + + // snippet-start:[batch.java2.disable.job.queue.main] + /** + * Disables the specified job queue asynchronously. + * + * @param jobQueueArn the Amazon Resource Name (ARN) of the job queue to be disabled + * @return a {@link CompletableFuture} that completes when the job queue update operation is complete, + * or completes exceptionally if an error occurs during the operation + */ + public CompletableFuture disableJobQueueAsync(String jobQueueArn) { + UpdateJobQueueRequest updateRequest = UpdateJobQueueRequest.builder() + .jobQueue(jobQueueArn) + .state(JQState.DISABLED) + .build(); + + CompletableFuture responseFuture = getAsyncClient().updateJobQueue(updateRequest); + return responseFuture.whenComplete((updateResponse, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to update job queue: " + ex.getMessage(), ex); + } + }).thenApply(updateResponse -> null); + } + // snippet-end:[batch.java2.disable.job.queue.main] + + // snippet-start:[batch.java2.delete.job.queue.main] + /** + * Deletes a Batch job queue asynchronously. + * + * @param jobQueueArn The Amazon Resource Name (ARN) of the job queue to delete. + * @return A CompletableFuture that represents the asynchronous deletion of the job queue. + * The future completes when the job queue has been successfully deleted or if an error occurs. + * If successful, the future will be completed with a {@code Void} value. + * If an error occurs, the future will be completed exceptionally with the thrown exception. + */ + public CompletableFuture deleteJobQueueAsync(String jobQueueArn) { + DeleteJobQueueRequest deleteRequest = DeleteJobQueueRequest.builder() + .jobQueue(jobQueueArn) + .build(); + + CompletableFuture responseFuture = getAsyncClient().deleteJobQueue(deleteRequest); + return responseFuture.whenComplete((deleteResponse, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to delete job queue: " + ex.getMessage(), ex); + } + }).thenApply(deleteResponse -> null); + } + // snippet-end:[batch.java2.delete.job.queue.main] + + // snippet-start:[batch.java2.describe.job.queue.main] + /** + * Asynchronously describes the job queue associated with the specified compute environment. + * + * @param computeEnvironmentName the name of the compute environment to find the associated job queue for + * @return a {@link CompletableFuture} that, when completed, contains the job queue ARN associated with the specified compute environment + * @throws RuntimeException if the job queue description fails + */ + public CompletableFuture describeJobQueueAsync(String computeEnvironmentName) { + DescribeJobQueuesRequest describeJobQueuesRequest = DescribeJobQueuesRequest.builder() + .build(); + + CompletableFuture responseFuture = getAsyncClient().describeJobQueues(describeJobQueuesRequest); + return responseFuture.whenComplete((describeJobQueuesResponse, ex) -> { + if (describeJobQueuesResponse != null) { + String jobQueueARN; + for (JobQueueDetail jobQueueDetail : describeJobQueuesResponse.jobQueues()) { + for (ComputeEnvironmentOrder computeEnvironmentOrder : jobQueueDetail.computeEnvironmentOrder()) { + String computeEnvironment = computeEnvironmentOrder.computeEnvironment(); + String name = getComputeEnvironmentName(computeEnvironment); + if (name.equals(computeEnvironmentName)) { + jobQueueARN = jobQueueDetail.jobQueueArn(); + logger.info("Job queue ARN associated with the compute environment: " + jobQueueARN); + } + } + } + } else { + throw new RuntimeException("Failed to describe job queue: " + ex.getMessage(), ex); + } + }).thenApply(describeJobQueuesResponse -> { + String jobQueueARN = ""; + for (JobQueueDetail jobQueueDetail : describeJobQueuesResponse.jobQueues()) { + for (ComputeEnvironmentOrder computeEnvironmentOrder : jobQueueDetail.computeEnvironmentOrder()) { + String computeEnvironment = computeEnvironmentOrder.computeEnvironment(); + String name = getComputeEnvironmentName(computeEnvironment); + if (name.equals(computeEnvironmentName)) { + jobQueueARN = jobQueueDetail.jobQueueArn(); + } + } + } + return jobQueueARN; + }); + } + // snippet-end:[batch.java2.describe.job.queue.main] + + // snippet-start:[batch.java2.disable.compute.environment.main] + /** + * Disables the specified compute environment asynchronously. + * + * @param computeEnvironmentName the name of the compute environment to disable + * @return a CompletableFuture that completes when the compute environment is disabled + */ + public CompletableFuture disableComputeEnvironmentAsync(String computeEnvironmentName) { + UpdateComputeEnvironmentRequest updateRequest = UpdateComputeEnvironmentRequest.builder() + .computeEnvironment(computeEnvironmentName) + .state(CEState.DISABLED) + .build(); + + CompletableFuture responseFuture = getAsyncClient().updateComputeEnvironment(updateRequest); + responseFuture.whenComplete((response, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to disable compute environment: " + ex.getMessage(), ex); + } + }); + + return responseFuture; + } + // snippet-end:[batch.java2.disable.compute.environment.main + + // snippet-start:[batch.java2.submit.job.main] + /** + * Submits a job asynchronously to the AWS Batch service. + * + * @param jobDefinitionName the name of the job definition to use + * @param jobQueueName the name of the job queue to submit the job to + * @param jobARN the Amazon Resource Name (ARN) of the job definition + * @return a CompletableFuture that, when completed, contains the job ID of the submitted job + */ + public CompletableFuture submitJobAsync(String jobDefinitionName, String jobQueueName, String jobARN) { + SubmitJobRequest jobRequest = SubmitJobRequest.builder() + .jobDefinition(jobARN) + .jobName(jobDefinitionName) + .jobQueue(jobQueueName) + .build(); + + CompletableFuture responseFuture = getAsyncClient().submitJob(jobRequest); + responseFuture.whenComplete((response, ex) -> { + if (ex != null) { + throw new RuntimeException("Unexpected error occurred: " + ex.getMessage(), ex); + } + }); + + return responseFuture.thenApply(SubmitJobResponse::jobId); + } + // snippet-end:[batch.java2.submit.job.main] + + // snippet-start:[batch.java2.retrieve.job.main] + /** + * Asynchronously retrieves the status of a specific job. + * + * @param jobId the ID of the job to retrieve the status for + * @return a CompletableFuture that completes with the job status + */ + public CompletableFuture describeJobAsync(String jobId) { + DescribeJobsRequest describeJobsRequest = DescribeJobsRequest.builder() + .jobs(jobId) + .build(); + + CompletableFuture responseFuture = getAsyncClient().describeJobs(describeJobsRequest); + return responseFuture.whenComplete((response, ex) -> { + if (ex != null) { + throw new RuntimeException("Unexpected error occurred: " + ex.getMessage(), ex); + } + }).thenApply(response -> response.jobs().get(0).status().toString()); + } + // snippet-end:[batch.java2.retrieve.job.main] + + /** + * Disables the specific job queue using the asynchronous Java client. + * + * @param jobQueueArn the Amazon Resource Name (ARN) of the job queue to wait for + * @return a {@link CompletableFuture} that completes when the job queue is disabled + */ + public CompletableFuture waitForJobQueueToBeDisabledAsync(String jobQueueArn) { + AtomicBoolean isDisabled = new AtomicBoolean(false); + return CompletableFuture.runAsync(() -> { + while (!isDisabled.get()) { + DescribeJobQueuesRequest describeRequest = DescribeJobQueuesRequest.builder() + .jobQueues(jobQueueArn) + .build(); + + CompletableFuture responseFuture = getAsyncClient().describeJobQueues(describeRequest); + responseFuture.whenComplete((describeResponse, ex) -> { + if (describeResponse != null) { + for (JobQueueDetail jobQueue : describeResponse.jobQueues()) { + if (jobQueue.jobQueueArn().equals(jobQueueArn) && jobQueue.state() == JQState.DISABLED) { + isDisabled.set(true); + break; + } + } + } else { + throw new RuntimeException("Error describing job queues", ex); + } + }).join(); + + if (!isDisabled.get()) { + try { + logger.info("Waiting for job queue to be disabled..."); + Thread.sleep(5000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("Thread interrupted while waiting for job queue to be disabled", e); + } + } + } + }).whenComplete((result, throwable) -> { + if (throwable != null) { + throw new RuntimeException("Error while waiting for job queue to be disabled", throwable); + } + }); + } + + public CompletableFuture getJobQueueARN(String jobQueueName) { + // Describe the job queue asynchronously + CompletableFuture describeJobQueuesFuture = batchClient.describeJobQueues( + DescribeJobQueuesRequest.builder() + .jobQueues(jobQueueName) + .build() + ); + + // Handle the asynchronous response and return the Job Queue ARN in the CompletableFuture + CompletableFuture jobQueueArnFuture = new CompletableFuture<>(); + describeJobQueuesFuture.whenComplete((response, error) -> { + if (error != null) { + if (error instanceof BatchException) { + logger.info("Batch error: " + ((BatchException) error).awsErrorDetails().errorMessage()); + } else { + logger.info("Error describing job queue: " + error.getMessage()); + } + jobQueueArnFuture.completeExceptionally(new RuntimeException("Failed to retrieve Job Queue ARN", error)); + } else { + if (response.jobQueues().isEmpty()) { + jobQueueArnFuture.completeExceptionally(new RuntimeException("Job queue not found: " + jobQueueName)); + } else { + // Assuming only one job queue is returned for the given name + String jobQueueArn = response.jobQueues().get(0).jobQueueArn(); + jobQueueArnFuture.complete(jobQueueArn); + } + } + }); + + return jobQueueArnFuture; + } + + private static String getComputeEnvironmentName(String computeEnvironment) { + String[] parts = computeEnvironment.split("/"); + if (parts.length == 2) { + return parts[1]; + } + return null; + } + + public CompletableFuture getAccountId() { + StsAsyncClient stsAsyncClient = StsAsyncClient.builder() + .region(Region.US_EAST_1) + .build(); + + return stsAsyncClient.getCallerIdentity() + .thenApply(GetCallerIdentityResponse::account); + } + + +} +// snippet-end:[batch.java2.actions.main] + + + diff --git a/javav2/example_code/batch/src/main/java/com/example/batch/scenario/BatchScenario.java b/javav2/example_code/batch/src/main/java/com/example/batch/scenario/BatchScenario.java new file mode 100644 index 00000000000..07e1194b2ac --- /dev/null +++ b/javav2/example_code/batch/src/main/java/com/example/batch/scenario/BatchScenario.java @@ -0,0 +1,535 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.batch.scenario; + +// snippet-start:[batch.java2.scenario.main] +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.services.batch.model.BatchException; +import software.amazon.awssdk.services.batch.model.ClientException; +import software.amazon.awssdk.services.batch.model.CreateComputeEnvironmentResponse; +import software.amazon.awssdk.services.batch.model.JobSummary; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; +import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsRequest; +import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsResponse; +import software.amazon.awssdk.services.ec2.model.DescribeSubnetsRequest; +import software.amazon.awssdk.services.ec2.model.DescribeSubnetsResponse; +import software.amazon.awssdk.services.ec2.model.DescribeVpcsRequest; +import software.amazon.awssdk.services.ec2.model.Filter; +import software.amazon.awssdk.services.ec2.model.SecurityGroup; +import software.amazon.awssdk.services.ec2.model.Subnet; +import software.amazon.awssdk.services.ec2.model.Vpc; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.List; +import java.util.Map; +import java.util.Scanner; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; + +/** + * Before running this Java V2 code example, set up your development + * environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html + * + * NOTE + * This scenario submits a job that pulls a Docker image named echo-text from Amazon ECR to Amazon Fargate. + * + * To place this Docker image on Amazon ECR, run the following Basics scenario. + * + * https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/ecr + * + */ +public class BatchScenario { + public static final String DASHES = new String(new char[80]).replace("\0", "-"); + + // Define two stacks used in this Basics Scenario. + private static final String ROLES_STACK = "RolesStack"; + private static String defaultSubnet; + private static String defaultSecurityGroup; + + private static final Logger logger = LoggerFactory.getLogger(BatchScenario.class); + + public static void main(String[] args) throws InterruptedException { + + BatchActions batchActions = new BatchActions(); + Scanner scanner = new Scanner(System.in); + String computeEnvironmentName = "my-compute-environment"; + String jobQueueName = "my-job-queue"; + String jobDefinitionName = "my-job-definition"; + + + // See the NOTE in this Java code example (at start). + String dockerImage = "dkr.ecr.us-east-1.amazonaws.com/echo-text:echo-text"; + + logger.info(""" + AWS Batch is a fully managed batch processing service that dynamically provisions the required compute + resources for batch computing workloads. The Java V2 `BatchAsyncClient` allows + developers to automate the submission, monitoring, and management of batch jobs. + + This scenario provides an example of setting up a compute environment, job queue and job definition, + and then submitting a job. + + This scenario submits a job that pulls a Docker image named echo-text from Amazon ECR to Amazon Fargate. + + To place this Docker image on Amazon ECR, run the following Basics scenario. + + https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/ecr + + Let's get started... + + You have two choices: + + 1 - Run the entire program. + 2 - Delete an existing Compute Environment (created from a previous execution of + this program that did not complete). + """); + + while (true) { + String input = scanner.nextLine(); + if (input.trim().equalsIgnoreCase("1")) { + logger.info("Continuing with the program..."); + // logger.info(""); + break; + } else if (input.trim().equalsIgnoreCase("2")) { + String jobQueueARN = String.valueOf(batchActions. describeJobQueueAsync(computeEnvironmentName)); + if (!jobQueueARN.isEmpty()) { + batchActions.disableJobQueueAsync(jobQueueARN); + countdown(1); + batchActions.deleteJobQueueAsync(jobQueueARN); + } + + try { + batchActions.disableComputeEnvironmentAsync(computeEnvironmentName) + .exceptionally(ex -> { + logger.info("Disable compute environment failed: " + ex.getMessage()); + return null; + }) + .join(); + } catch (CompletionException ex) { + logger.info("Failed to disable compute environment: " + ex.getMessage()); + } + countdown(2); + batchActions.deleteComputeEnvironmentAsync(computeEnvironmentName).join(); + return; + } else { + // Handle invalid input. + logger.info("Invalid input. Please try again."); + } + } + System.out.println(DASHES); + + waitForInputToContinue(scanner); + // Get an AWS Account id used to retrieve the docker image from Amazon ECR. + // Create a single-element array to store the `accountId` value. + String[] accId = new String[1]; + CompletableFuture accountIdFuture = batchActions.getAccountId(); + accountIdFuture.thenAccept(accountId -> { + logger.info("Account ID: " + accountId); + accId[0] = accountId; + }).join(); + + dockerImage = accId[0]+"."+dockerImage; + + // Get a default subnet and default security associated with the default VPC. + getSubnetSecurityGroup(); + + logger.info("Use AWS CloudFormation to create two IAM roles that are required for this scenario."); + CloudFormationHelper.deployCloudFormationStack(ROLES_STACK); + + Map stackOutputs = CloudFormationHelper.getStackOutputs(ROLES_STACK); + String batchIAMRole = stackOutputs.get("BatchRoleArn"); + String executionRoleARN = stackOutputs.get("EcsRoleArn"); + + logger.info("The IAM role needed to interact with AWS Batch is "+batchIAMRole); + waitForInputToContinue(scanner); + + logger.info(DASHES); + logger.info("1. Create a Batch compute environment"); + logger.info(""" + A compute environment is a resource where you can run your batch jobs. + After creating a compute environment, you can define job queues and job definitions to submit jobs for + execution. + + The benefit of creating a compute environment is it allows you to easily configure and manage the compute + resources that will be used to run your Batch jobs. By separating the compute environment from the job definitions, + you can easily scale your compute resources up or down as needed, without having to modify your job definitions. + This makes it easier to manage your Batch workloads and ensures that your jobs have the necessary + compute resources to run efficiently. + """); + + waitForInputToContinue(scanner); + try { + CompletableFuture future = batchActions.createComputeEnvironmentAsync(computeEnvironmentName, batchIAMRole, defaultSubnet, defaultSecurityGroup); + CreateComputeEnvironmentResponse response = future.join(); + logger.info("Compute Environment ARN: " + response.computeEnvironmentArn()); + } catch (RuntimeException rte) { + Throwable cause = rte.getCause(); + if (cause instanceof ClientException batchExceptionEx) { + String myErrorCode = batchExceptionEx.awsErrorDetails().errorMessage(); + if ("Object already exists".contains(myErrorCode)) { + logger.info("The compute environment '" + computeEnvironmentName + "' already exists. Moving on..."); + } else { + logger.info("Batch error occurred: {} (Code: {})", batchExceptionEx.getMessage(), batchExceptionEx.awsErrorDetails().errorCode()); + return; + } + } else { + logger.info("An unexpected error occurred: {}", (cause != null ? cause.getMessage() : rte.getMessage())); + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("2. Check the status of the "+computeEnvironmentName +" Compute Environment."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = batchActions.checkComputeEnvironmentsStatus(computeEnvironmentName); + String status = future.join(); + logger.info("Compute Environment Status: " + status); + + } catch (RuntimeException rte) { + Throwable cause = rte.getCause(); + if (cause instanceof ClientException batchExceptionEx) { + logger.info("Batch error occurred: {} (Code: {})", batchExceptionEx.getMessage(), batchExceptionEx.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: " + (cause != null ? cause.getMessage() : rte.getMessage())); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("3. Create a job queue"); + logger.info(""" + A job queue is an essential component that helps manage the execution of your batch jobs. + It acts as a buffer, where jobs are placed and then scheduled for execution based on their + priority and the available resources in the compute environment. + """); + waitForInputToContinue(scanner); + + String jobQueueArn = null; + try { + CompletableFuture jobQueueFuture = batchActions.createJobQueueAsync(jobQueueName, computeEnvironmentName); + jobQueueArn = jobQueueFuture.join(); + logger.info("Job Queue ARN: " + jobQueueArn); + + } catch (RuntimeException rte) { + Throwable cause = rte.getCause(); + if (cause instanceof BatchException batchExceptionEx) { + String myErrorCode = batchExceptionEx.awsErrorDetails().errorMessage(); + if ("Object already exists".contains(myErrorCode)) { + logger.info("The job queue '" + jobQueueName + "' already exists. Moving on..."); + // Retrieve the ARN of the job queue. + CompletableFuture jobQueueArnFuture = batchActions.getJobQueueARN(jobQueueName); + jobQueueArn = jobQueueArnFuture.join(); + logger.info("Job Queue ARN: " + jobQueueArn); + } else { + logger.info("Batch error occurred: {} (Code: {})", batchExceptionEx.getMessage(), batchExceptionEx.awsErrorDetails().errorCode()); + return; + } + } else { + logger.info("An unexpected error occurred: " + (cause != null ? cause.getMessage() : rte.getMessage())); + return; // End the execution + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info("4. Register a Job Definition."); + logger.info(""" + Registering a job in AWS Batch using the Fargate launch type ensures that all + necessary parameters, such as the execution role, command to run, and so on + are specified and reused across multiple job submissions. + + The job definition pulls a Docker image from Amazon ECR and executes the Docker image. + """); + + waitForInputToContinue(scanner); + String jobARN; + try { + String platform = ""; + while (true) { + logger.info(""" + On which platform/CPU architecture combination did you build the Docker image?: + 1. Windows X86_64 + 2. Mac or Linux ARM64 + 3. Mac or Linux X86_64 + + Please select 1, 2, or 3. + """); + String platAns = scanner.nextLine().trim(); + if (platAns.equals("1")) { + platform = "X86_64"; + break; // Exit loop since a valid option is selected + } else if (platAns.equals("2")) { + platform = "ARM64"; + break; // Exit loop since a valid option is selected + } else if (platAns.equals("3")) { + platform = "X86_64"; + break; // Exit loop since a valid option is selected + } else { + System.out.println("Invalid input. Please select either 1 or 2."); + } + } + + jobARN = batchActions.registerJobDefinitionAsync(jobDefinitionName, executionRoleARN, dockerImage, platform) + .exceptionally(ex -> { + System.err.println("Register job definition failed: " + ex.getMessage()); + return null; + }) + .join(); + if (jobARN != null) { + logger.info("Job ARN: " + jobARN); + } + } catch (RuntimeException rte) { + logger.error("A Batch exception occurred while registering the job: {}", rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage()); + return; + } + logger.info(DASHES); + + logger.info(DASHES); + logger.info("5. Submit an AWS Batch job from a job definition."); + waitForInputToContinue(scanner); + String jobId; + try { + jobId = batchActions.submitJobAsync(jobDefinitionName, jobQueueName, jobARN) + .exceptionally(ex -> { + System.err.println("Submit job failed: " + ex.getMessage()); + return null; + }) + .join(); + + logger.info("The job id is "+jobId); + logger.info("Let's wait 2 minutes for the job to complete"); + countdown(2); + + } catch (RuntimeException rte) { + logger.error("A Batch exception occurred while submitting the job: {}", rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage()); + return; + } + waitForInputToContinue(scanner); + System.out.println(DASHES); + + logger.info(DASHES); + logger.info("6. Get a list of jobs applicable to the job queue."); + + waitForInputToContinue(scanner); + try { + List jobs = batchActions.listJobsAsync(jobQueueName); + jobs.forEach(job -> + logger.info("Job ID: {}, Job Name: {}, Job Status: {}", job.jobId(), job.jobName(), job.status())); + + } catch (RuntimeException rte) { + logger.info("A Batch exception occurred while submitting the job: {}", rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage()); + return; + } + + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("7. Check the status of job "+jobId); + waitForInputToContinue(scanner); + try { + CompletableFuture future = batchActions.describeJobAsync(jobId); + String jobStatus = future.join(); + logger.info("Job Status: " + jobStatus); + + } catch (RuntimeException rte) { + logger.info("A Batch exception occurred while submitting the job: {}", rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage()); + return; + } + + waitForInputToContinue(scanner); + System.out.println(DASHES); + + logger.info("8. Delete Batch resources"); + logger.info( + """ + When deleting an AWS Batch compute environment, it does not happen instantaneously. + There is typically a delay, similar to some other AWS resources. + AWS Batch starts the deletion process. + """); + logger.info("Would you like to delete the AWS Batch resources such as the compute environment? (y/n)"); + String delAns = scanner.nextLine().trim(); + if (delAns.equalsIgnoreCase("y")) { + logger.info("You selected to delete the AWS ECR resources."); + logger.info("First, we will deregister the Job Definition."); + waitForInputToContinue(scanner); + try { + batchActions.deregisterJobDefinitionAsync(jobARN) + .exceptionally(ex -> { + logger.info("Deregister job definition failed: " + ex.getMessage()); + return null; + }) + .join(); + logger.info(jobARN + " was deregistered"); + } catch (RuntimeException rte) { + logger.error("A Batch exception occurred: {}", rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage()); + return; + } + + logger.info("Second, we will disable and then delete the Job Queue."); + waitForInputToContinue(scanner); + try { + batchActions.disableJobQueueAsync(jobQueueArn) + .exceptionally(ex -> { + logger.info("Disable job queue failed: " + ex.getMessage()); + return null; + }) + .join(); + logger.info(jobQueueArn + " was disabled"); + } catch (RuntimeException rte) { + logger.info("A Batch exception occurred: {}", rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage()); + return; + } + + batchActions.waitForJobQueueToBeDisabledAsync(jobQueueArn); + try { + CompletableFuture future = batchActions.waitForJobQueueToBeDisabledAsync(jobQueueArn); + future.join(); + logger.info("Job queue is now disabled."); + } catch (RuntimeException rte) { + logger.info("A Batch exception occurred: {}", rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage()); + return; + } + + waitForInputToContinue(scanner); + try { + batchActions.deleteJobQueueAsync(jobQueueArn); + logger.info(jobQueueArn +" was deleted"); + } catch (RuntimeException rte) { + logger.info("A Batch exception occurred: {}", rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage()); + return; + } + logger.info("Let's wait 2 minutes for the job queue to be deleted"); + countdown(2); + waitForInputToContinue(scanner); + + logger.info("Third, we will delete the Compute Environment."); + waitForInputToContinue(scanner); + try { + batchActions.disableComputeEnvironmentAsync(computeEnvironmentName) + .exceptionally(ex -> { + System.err.println("Disable compute environment failed: " + ex.getMessage()); + return null; + }) + .join(); + logger.info("Compute environment disabled") ; + } catch (RuntimeException rte) { + logger.info("A Batch exception occurred: {}", rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage()); + return; + } + + batchActions.checkComputeEnvironmentsStatus(computeEnvironmentName).thenAccept(state -> { + logger.info("Current State: " + state); + }).join(); + + logger.info("Lets wait 1 min for the compute environment to be deleted"); + countdown(1); + + try { + batchActions.deleteComputeEnvironmentAsync(computeEnvironmentName).join(); + logger.info(computeEnvironmentName +" was deleted."); + + } catch (RuntimeException rte) { + logger.info("A Batch exception occurred: {}", rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage()); + return; + } + waitForInputToContinue(scanner); + CloudFormationHelper.destroyCloudFormationStack(ROLES_STACK); + } + + logger.info(DASHES); + logger.info("This concludes the AWS Batch SDK scenario"); + logger.info(DASHES); + } + + private static void waitForInputToContinue(Scanner scanner) { + while (true) { + logger.info(""); + logger.info("Enter 'c' followed by to continue:"); + String input = scanner.nextLine(); + + if (input.trim().equalsIgnoreCase("c")) { + logger.info("Continuing with the program..."); + logger.info(""); + break; + } else { + // Handle invalid input. + logger.info("Invalid input. Please try again."); + } + } + } + + public static void countdown(int minutes) throws InterruptedException { + int seconds = 0; + for (int i = minutes * 60 + seconds; i >= 0; i--) { + int displayMinutes = i / 60; + int displaySeconds = i % 60; + System.out.print(String.format("\r%02d:%02d", displayMinutes, displaySeconds)); + Thread.sleep(1000); // Wait for 1 second + } + logger.info("Countdown complete!"); + } + + private static void getSubnetSecurityGroup() { + try (Ec2AsyncClient ec2Client = Ec2AsyncClient.create()) { + CompletableFuture defaultVpcFuture = ec2Client.describeVpcs(DescribeVpcsRequest.builder() + .filters(Filter.builder() + .name("is-default") + .values("true") + .build()) + .build()) + .thenApply(response -> response.vpcs().stream() + .findFirst() + .orElseThrow(() -> new RuntimeException("Default VPC not found"))); + + CompletableFuture defaultSubnetFuture = defaultVpcFuture + .thenCompose(vpc -> ec2Client.describeSubnets(DescribeSubnetsRequest.builder() + .filters(Filter.builder() + .name("vpc-id") + .values(vpc.vpcId()) + .build(), + Filter.builder() + .name("default-for-az") + .values("true") + .build()) + .build()) + .thenApply(DescribeSubnetsResponse::subnets) + .thenApply(subnets -> subnets.stream() + .findFirst() + .map(Subnet::subnetId) + .orElseThrow(() -> new RuntimeException("No default subnet found")))); + + CompletableFuture defaultSecurityGroupFuture = defaultVpcFuture + .thenCompose(vpc -> ec2Client.describeSecurityGroups(DescribeSecurityGroupsRequest.builder() + .filters(Filter.builder() + .name("group-name") + .values("default") + .build(), + Filter.builder() + .name("vpc-id") + .values(vpc.vpcId()) + .build()) + .build()) + .thenApply(DescribeSecurityGroupsResponse::securityGroups) + .thenApply(securityGroups -> securityGroups.stream() + .findFirst() + .map(SecurityGroup::groupId) + .orElseThrow(() -> new RuntimeException("No default security group found")))); + + defaultSubnet = defaultSubnetFuture.join(); + defaultSecurityGroup = defaultSecurityGroupFuture.join(); + } + } +} +// snippet-end:[batch.java2.scenario.main] diff --git a/javav2/example_code/batch/src/main/java/com/example/batch/scenario/CloudFormationHelper.java b/javav2/example_code/batch/src/main/java/com/example/batch/scenario/CloudFormationHelper.java new file mode 100644 index 00000000000..a20930afa7c --- /dev/null +++ b/javav2/example_code/batch/src/main/java/com/example/batch/scenario/CloudFormationHelper.java @@ -0,0 +1,138 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.batch.scenario; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.cloudformation.CloudFormationAsyncClient; +import software.amazon.awssdk.services.cloudformation.CloudFormationClient; +import software.amazon.awssdk.services.cloudformation.model.Capability; +import software.amazon.awssdk.services.cloudformation.model.CloudFormationException; +import software.amazon.awssdk.services.cloudformation.model.DescribeStacksRequest; +import software.amazon.awssdk.services.cloudformation.model.DescribeStacksResponse; +import software.amazon.awssdk.services.cloudformation.model.Output; +import software.amazon.awssdk.services.cloudformation.model.Stack; +import software.amazon.awssdk.services.cloudformation.waiters.CloudFormationAsyncWaiter; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +public class CloudFormationHelper { + private static final String CFN_TEMPLATE = "BatchRoles-template.yaml"; + private static final Logger logger = LoggerFactory.getLogger(CloudFormationHelper.class); + + private static CloudFormationAsyncClient getCloudFormationClient() { + CloudFormationAsyncClient cfClient = CloudFormationAsyncClient.builder() + .region(Region.US_EAST_1) + .build(); + + return cfClient; + } + + public static void deployCloudFormationStack(String stackName) { + String templateBody; + boolean doesExist = describeStack(stackName); + if (!doesExist) { + try { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Path filePath = Paths.get(classLoader.getResource(CFN_TEMPLATE).toURI()); + templateBody = Files.readString(filePath); + } catch (IOException | URISyntaxException e) { + throw new RuntimeException(e); + } + + getCloudFormationClient().createStack(b -> b.stackName(stackName) + .templateBody(templateBody) + .capabilities(Capability.CAPABILITY_IAM)) + .whenComplete((csr, t) -> { + if (csr != null) { + System.out.println("Stack creation requested, ARN is " + csr.stackId()); + try (CloudFormationAsyncWaiter waiter = getCloudFormationClient().waiter()) { + waiter.waitUntilStackCreateComplete(request -> request.stackName(stackName)) + .whenComplete((dsr, th) -> { + if (th != null) { + System.out.println("Error waiting for stack creation: " + th.getMessage()); + } else { + dsr.matched().response().orElseThrow(() -> new RuntimeException("Failed to deploy")); + System.out.println("Stack created successfully"); + } + }).join(); + } + } else { + System.out.format("Error creating stack: " + t.getMessage(), t); + throw new RuntimeException(t.getCause().getMessage(), t); + } + }).join(); + } else { + logger.info("{} stack already exists", CFN_TEMPLATE); + } + } + + // Check to see if the Stack exists before deploying it + + public static Boolean describeStack(String stackName) { + try { + CompletableFuture future = getCloudFormationClient().describeStacks(); + DescribeStacksResponse stacksResponse = (DescribeStacksResponse) future.join(); + List stacks = stacksResponse.stacks(); + for (Stack myStack :stacks) { + if (myStack.stackName().compareTo(stackName)==0){ + return true; + } + } + } catch (CloudFormationException e) { + System.err.println(e.getMessage()); + } + return false; + } + static void destroyCloudFormationStack(String stackName) { + getCloudFormationClient().deleteStack(b -> b.stackName(stackName)) + .whenComplete((dsr, t) -> { + if (dsr != null) { + System.out.println("Delete stack requested ...."); + try (CloudFormationAsyncWaiter waiter = getCloudFormationClient().waiter()) { + waiter.waitUntilStackDeleteComplete(request -> request.stackName(stackName)) + .whenComplete((waiterResponse, throwable) -> + System.out.println("Stack deleted successfully.")) + .join(); + } + } else { + System.out.format("Error deleting stack: " + t.getMessage(), t); + throw new RuntimeException(t.getCause().getMessage(), t); + } + }).join(); + } + + public static Map getStackOutputs(String stackName) { + CloudFormationClient cfClient = CloudFormationClient.create(); + DescribeStacksRequest describeStacksRequest = DescribeStacksRequest.builder() + .stackName(stackName) + .build(); + + DescribeStacksResponse describeStacksResponse = cfClient.describeStacks(describeStacksRequest); + List stacks = describeStacksResponse.stacks(); + + if (stacks.isEmpty()) { + throw new RuntimeException("Stack not found: " + stackName); + } + + Stack stack = stacks.get(0); + Map outputs = new HashMap<>(); + for (Output output : stack.outputs()) { + outputs.put(output.outputKey(), output.outputValue()); + } + + return outputs; + } +} + + diff --git a/javav2/example_code/batch/src/main/resources/BatchRoles-template.yaml b/javav2/example_code/batch/src/main/resources/BatchRoles-template.yaml new file mode 100644 index 00000000000..b4963e9f823 --- /dev/null +++ b/javav2/example_code/batch/src/main/resources/BatchRoles-template.yaml @@ -0,0 +1,154 @@ +Resources: + MyEcsTaskExecutionRoleBFF3BC3D: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: ecs-tasks.amazonaws.com + Version: "2012-10-17" + ManagedPolicyArns: + - Fn::Join: + - "" + - - "arn:" + - Ref: AWS::Partition + - :iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy + Metadata: + aws:cdk:path: RolesStack/MyEcsTaskExecutionRole/Resource + MyBatchServiceRole4FA3334D: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: batch.amazonaws.com + Version: "2012-10-17" + ManagedPolicyArns: + - Fn::Join: + - "" + - - "arn:" + - Ref: AWS::Partition + - :iam::aws:policy/service-role/AWSBatchServiceRole + Metadata: + aws:cdk:path: RolesStack/MyBatchServiceRole/Resource + CDKMetadata: + Type: AWS::CDK::Metadata + Properties: + Analytics: v2:deflate64:H4sIAAAAAAAA/zPSMzQ21TNQTCwv1k1OydbNyUzSqw4uSUzO1gEKxWcm5upVB+XnpOo4p+WB6FqdoNTi/NKiZLCIf2lJQWkJWA5J1Dk/LyWzJDM/r1bHK7EsUd/QXM9Az9BQMas4M1O3qDSvJDM3VS8IQgMA9yOLeIAAAAA= + Metadata: + aws:cdk:path: RolesStack/CDKMetadata/Default + Condition: CDKMetadataAvailable +Outputs: + EcsRoleArn: + Description: The ARN of the ECS Role + Value: + Fn::GetAtt: + - MyEcsTaskExecutionRoleBFF3BC3D + - Arn + BatchRoleArn: + Description: The ARN of the Batch Role + Value: + Fn::GetAtt: + - MyBatchServiceRole4FA3334D + - Arn +Conditions: + CDKMetadataAvailable: + Fn::Or: + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - af-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-east-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ap-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ca-central-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-north-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-northwest-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - eu-central-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-north-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-south-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-2 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-3 + - Fn::Equals: + - Ref: AWS::Region + - il-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-south-1 + - Fn::Equals: + - Ref: AWS::Region + - sa-east-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - us-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-2 + - Fn::Equals: + - Ref: AWS::Region + - us-west-1 + - Fn::Equals: + - Ref: AWS::Region + - us-west-2 +Parameters: + BootstrapVersion: + Type: AWS::SSM::Parameter::Value + Default: /cdk-bootstrap/hnb659fds/version + Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip] +Rules: + CheckBootstrapVersion: + Assertions: + - Assert: + Fn::Not: + - Fn::Contains: + - - "1" + - "2" + - "3" + - "4" + - "5" + - Ref: BootstrapVersion + AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI. + diff --git a/javav2/example_code/batch/src/main/resources/BatchStack-template.yaml b/javav2/example_code/batch/src/main/resources/BatchStack-template.yaml new file mode 100644 index 00000000000..7bdcaf477aa --- /dev/null +++ b/javav2/example_code/batch/src/main/resources/BatchStack-template.yaml @@ -0,0 +1,180 @@ +Resources: + RoleBatch15CD9C03: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: batch.amazonaws.com + Version: "2012-10-17" + ManagedPolicyArns: + - Fn::Join: + - "" + - - "arn:" + - Ref: AWS::Partition + - :iam::aws:policy/AWSBatchFullAccess + Metadata: + aws:cdk:path: BatchStack4/RoleBatch/Resource + RoleBatchDefaultPolicyCC6915A6: + Type: AWS::IAM::Policy + Properties: + PolicyDocument: + Statement: + - Action: + - batch:CreateComputeEnvironment + - batch:DeleteComputeEnvironment + - batch:DescribeComputeEnvironments + - batch:DescribeJobDefinitions + - batch:DescribeJobQueues + - batch:DescribeJobs + - batch:SubmitJob + - batch:UpdateComputeEnvironment + - ec2:DescribeSubnets + - ecs:CreateCluster + - ecs:DeleteCluster + - ecs:DeregisterTaskDefinition + - ecs:DescribeClusters + - ecs:DescribeContainerInstances + - ecs:DescribeServices + - ecs:DescribeTaskDefinitions + - ecs:DescribeTasks + - ecs:ListClusters + - ecs:ListContainerInstances + - ecs:ListServices + - ecs:ListTaskDefinitions + - ecs:ListTasks + - ecs:RegisterTaskDefinition + - ecs:RunTask + - ecs:StartTask + - ecs:StopTask + - ecs:SubmitContainerStateChange + - ecs:SubmitTaskStateChange + - ecs:UpdateService + - iam:PassRole + - logs:CreateLogGroup + - logs:CreateLogStream + - logs:DescribeLogGroups + - logs:DescribeLogStreams + - logs:PutLogEvents + - sts:AssumeRole + Effect: Allow + Resource: "*" + Version: "2012-10-17" + PolicyName: RoleBatchDefaultPolicyCC6915A6 + Roles: + - Ref: RoleBatch15CD9C03 + Metadata: + aws:cdk:path: BatchStack4/RoleBatch/DefaultPolicy/Resource + CDKMetadata: + Type: AWS::CDK::Metadata + Properties: + Analytics: v2:deflate64:H4sIAAAAAAAA/zPSMzQ21TNQTCwv1k1OydbNyUzSqw4uSUzO1kksL47PTMzVqw7Kz0nVcU7LA9MB+TmZyZUgLoRVqxOUWpxfWpQMVuJfWlJQWgJWjCTqnJ+XklmSmZ9Xq+OVWJaob2iuZ6BnaKSYVZyZqVtUmleSmZuqFwShAeLZ8oGRAAAA + Metadata: + aws:cdk:path: BatchStack4/CDKMetadata/Default + Condition: CDKMetadataAvailable +Outputs: + BatchRoleArn: + Description: The ARN of the Batch Role + Value: + Fn::GetAtt: + - RoleBatch15CD9C03 + - Arn +Conditions: + CDKMetadataAvailable: + Fn::Or: + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - af-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-east-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ap-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ca-central-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-north-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-northwest-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - eu-central-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-north-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-south-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-2 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-3 + - Fn::Equals: + - Ref: AWS::Region + - il-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-south-1 + - Fn::Equals: + - Ref: AWS::Region + - sa-east-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - us-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-2 + - Fn::Equals: + - Ref: AWS::Region + - us-west-1 + - Fn::Equals: + - Ref: AWS::Region + - us-west-2 +Parameters: + BootstrapVersion: + Type: AWS::SSM::Parameter::Value + Default: /cdk-bootstrap/hnb659fds/version + Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip] +Rules: + CheckBootstrapVersion: + Assertions: + - Assert: + Fn::Not: + - Fn::Contains: + - - "1" + - "2" + - "3" + - "4" + - "5" + - Ref: BootstrapVersion + AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI. + diff --git a/javav2/example_code/batch/src/main/resources/EcsStack-template.yaml b/javav2/example_code/batch/src/main/resources/EcsStack-template.yaml new file mode 100644 index 00000000000..2791ce563f0 --- /dev/null +++ b/javav2/example_code/batch/src/main/resources/EcsStack-template.yaml @@ -0,0 +1,185 @@ +Resources: + RoleEcsB0CD5AAE: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: ecs-tasks.amazonaws.com + Version: "2012-10-17" + ManagedPolicyArns: + - Fn::Join: + - "" + - - "arn:" + - Ref: AWS::Partition + - :iam::aws:policy/AWSBatchFullAccess + Metadata: + aws:cdk:path: EcsStack/RoleEcs/Resource + RoleEcsDefaultPolicy76E250EE: + Type: AWS::IAM::Policy + Properties: + PolicyDocument: + Statement: + - Action: + - batch:CreateComputeEnvironment + - batch:DeleteComputeEnvironment + - batch:DescribeComputeEnvironments + - batch:DescribeJobDefinitions + - batch:DescribeJobQueues + - batch:DescribeJobs + - batch:SubmitJob + - batch:UpdateComputeEnvironment + - ec2:DescribeSubnets + - ecr:BatchGetImage + - ecr:DescribeRepositories + - ecr:GetAuthorizationToken + - ecr:GetDownloadUrlForLayer + - ecr:ListImages + - ecs:CreateCluster + - ecs:DeleteCluster + - ecs:DeregisterTaskDefinition + - ecs:DescribeClusters + - ecs:DescribeContainerInstances + - ecs:DescribeServices + - ecs:DescribeTaskDefinitions + - ecs:DescribeTasks + - ecs:ListClusters + - ecs:ListContainerInstances + - ecs:ListServices + - ecs:ListTaskDefinitions + - ecs:ListTasks + - ecs:RegisterTaskDefinition + - ecs:RunTask + - ecs:StartTask + - ecs:StopTask + - ecs:SubmitContainerStateChange + - ecs:SubmitTaskStateChange + - ecs:UpdateService + - iam:PassRole + - logs:CreateLogGroup + - logs:CreateLogStream + - logs:DescribeLogGroups + - logs:DescribeLogStreams + - logs:PutLogEvents + - sts:AssumeRole + Effect: Allow + Resource: "*" + Version: "2012-10-17" + PolicyName: RoleEcsDefaultPolicy76E250EE + Roles: + - Ref: RoleEcsB0CD5AAE + Metadata: + aws:cdk:path: EcsStack/RoleEcs/DefaultPolicy/Resource + CDKMetadata: + Type: AWS::CDK::Metadata + Properties: + Analytics: v2:deflate64:H4sIAAAAAAAA/zPSMzQ21TNQTCwv1k1OydbNyUzSqw4uSUzO1kksL47PTMzVqw7Kz0nVcU7LA9MB+TmZyZUgLoRVqxOUWpxfWpQMVuJfWlJQWgJWjCTqnJ+XklmSmZ9Xq+OVWJaob2iuZ6BnaKSYVZyZqVtUmleSmZuqFwShAeLZ8oGRAAAA + Metadata: + aws:cdk:path: EcsStack/CDKMetadata/Default + Condition: CDKMetadataAvailable +Outputs: + EcsRoleArn: + Description: The ARN of the ECS Role + Value: + Fn::GetAtt: + - RoleEcsB0CD5AAE + - Arn +Conditions: + CDKMetadataAvailable: + Fn::Or: + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - af-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-east-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-northeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ap-south-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-1 + - Fn::Equals: + - Ref: AWS::Region + - ap-southeast-2 + - Fn::Equals: + - Ref: AWS::Region + - ca-central-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-north-1 + - Fn::Equals: + - Ref: AWS::Region + - cn-northwest-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - eu-central-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-north-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-south-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-1 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-2 + - Fn::Equals: + - Ref: AWS::Region + - eu-west-3 + - Fn::Equals: + - Ref: AWS::Region + - il-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-central-1 + - Fn::Equals: + - Ref: AWS::Region + - me-south-1 + - Fn::Equals: + - Ref: AWS::Region + - sa-east-1 + - Fn::Or: + - Fn::Equals: + - Ref: AWS::Region + - us-east-1 + - Fn::Equals: + - Ref: AWS::Region + - us-east-2 + - Fn::Equals: + - Ref: AWS::Region + - us-west-1 + - Fn::Equals: + - Ref: AWS::Region + - us-west-2 +Parameters: + BootstrapVersion: + Type: AWS::SSM::Parameter::Value + Default: /cdk-bootstrap/hnb659fds/version + Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip] +Rules: + CheckBootstrapVersion: + Assertions: + - Assert: + Fn::Not: + - Fn::Contains: + - - "1" + - "2" + - "3" + - "4" + - "5" + - Ref: BootstrapVersion + AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI. + diff --git a/javav2/example_code/batch/src/main/resources/log4j2.xml b/javav2/example_code/batch/src/main/resources/log4j2.xml new file mode 100644 index 00000000000..4d900326937 --- /dev/null +++ b/javav2/example_code/batch/src/main/resources/log4j2.xml @@ -0,0 +1,15 @@ + + + + + + %msg%n + + + + + + + + + \ No newline at end of file diff --git a/javav2/example_code/batch/src/test/java/BatchTest.java b/javav2/example_code/batch/src/test/java/BatchTest.java new file mode 100644 index 00000000000..30d6c0536f3 --- /dev/null +++ b/javav2/example_code/batch/src/test/java/BatchTest.java @@ -0,0 +1,246 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import com.example.batch.scenario.BatchActions; +import com.google.gson.Gson; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestMethodOrder; +import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.batch.model.CreateComputeEnvironmentResponse; +import software.amazon.awssdk.services.batch.model.JobSummary; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class BatchTest { + private static String computeEnvironmentName = "my-compute-environment" ; + private static String jobQueueName = "my-job-queue"; + private static String jobDefinitionName = "my-job-definition"; + private static String dockerImage = "dkr.ecr.us-east-1.amazonaws.com/echo-text:echo-text"; + private static String subnet = "" ; + private static String secGroup = "" ; + private static BatchActions batchActions = new BatchActions(); + + private static String batchIAMRole = ""; + private static String executionRoleARN = ""; + + private static String jobId = ""; + + static String jobQueueArn =""; + + static String jobARN = ""; + + @BeforeAll + public static void setUp() { + String[] accId = new String[1]; + CompletableFuture accountIdFuture = batchActions.getAccountId(); + accountIdFuture.thenAccept(accountId -> { + System.out.println("Account ID: " + accountId); + accId[0] = accountId; + }); + + dockerImage = accId[0]+"."+dockerImage; + + // Get the values to run these tests from AWS Secrets Manager. + Gson gson = new Gson(); + String json = getSecretValues(); + SecretValues values = gson.fromJson(json, SecretValues.class); + subnet = values.getSubnet(); + secGroup = values.getSecGroup(); + batchIAMRole = values.getBatchIAMRole(); + executionRoleARN = values.getExecutionRoleARN(); + } + + @Test + @Tag("IntegrationTest") + @Order(1) + public void testCreateComputeEnvironment() { + CompletableFuture future = batchActions.createComputeEnvironmentAsync(computeEnvironmentName, batchIAMRole, subnet, secGroup); + CreateComputeEnvironmentResponse response = future.join(); + System.out.println("Compute Environment ARN: " + response.computeEnvironmentArn()); + System.out.println("Test 1 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(2) + public void testGetStatus() { + try { + Thread.sleep(60_000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + CompletableFuture future = batchActions.checkComputeEnvironmentsStatus(computeEnvironmentName); + String status = future.join(); + System.out.println("Compute Environment Status: " + status); + System.out.println("Test 2 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(3) + public void testCreateJobQueue() { + CompletableFuture jobQueueFuture = batchActions.createJobQueueAsync(jobQueueName, computeEnvironmentName); + jobQueueArn = jobQueueFuture.join(); + assertNotNull(jobQueueArn, "Job Queue ARN should not be null"); + System.out.println("Job Queue ARN: " + jobQueueArn); + System.out.println("Test 3 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(4) + public void testRegisterJobDefinition() { + jobARN = batchActions.registerJobDefinitionAsync(jobDefinitionName, executionRoleARN, dockerImage, "X86_64").join(); + assertNotNull(jobARN, "Job ARN should not be null"); + System.out.println("Job ARN: " + jobARN); + System.out.println("Test 4 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(5) + public void testSubmitJob() { + try { + // Pause the execution for 1 minute (60,000 milliseconds) + Thread.sleep(60_000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + jobId = batchActions.submitJobAsync(jobDefinitionName, jobQueueName, jobARN).join(); + System.out.println("Job Id: " + jobId); + System.out.println("Test 5 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(6) + public void testGetJobs() { + List jobs = batchActions.listJobsAsync(jobQueueName); + jobs.forEach(job -> + System.out.printf("Job ID: %s, Job Name: %s, Job Status: %s%n", + job.jobId(), job.jobName(), job.status()) + ); + System.out.println("Test 6 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(7) + public void testJobStatus() { + CompletableFuture future = batchActions.describeJobAsync(jobId); + String jobStatus = future.join(); + System.out.println("Job Status: " + jobStatus); + System.out.println("Test 7 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(7) + public void testRegisterJobQueue() { + batchActions.deregisterJobDefinitionAsync(jobARN); + batchActions.disableJobQueueAsync(jobQueueArn); + System.out.println("Test 7 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(8) + public void testDeleteJobQueue() { + try { + Thread.sleep(120_000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + batchActions.deleteJobQueueAsync(jobQueueArn); + System.out.println("Test 8 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(9) + public void testDisableComputeEnvironment() { + try { + Thread.sleep(120_000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + batchActions.disableComputeEnvironmentAsync(computeEnvironmentName); + try { + Thread.sleep(120_000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + } + + @Test + @Tag("IntegrationTest") + @Order(10) + public void testDeleteComputeEnvironment() { + try { + Thread.sleep(120_000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + batchActions.deleteComputeEnvironmentAsync(computeEnvironmentName); + System.out.println("Test 10 passed"); + } + + private static String getSecretValues() { + SecretsManagerClient secretClient = SecretsManagerClient.builder() + .region(Region.US_EAST_1) + .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) + .build(); + String secretName = "test/batch"; + + GetSecretValueRequest valueRequest = GetSecretValueRequest.builder() + .secretId(secretName) + .build(); + + GetSecretValueResponse valueResponse = secretClient.getSecretValue(valueRequest); + return valueResponse.secretString(); + } + + @Nested + @DisplayName("A class used to get test values from test/batch (an AWS Secrets Manager secret)") + class SecretValues { + private String subnet; + private String secGroup; + private String batchIAMRole; + + private String executionRoleARN; + + public String getSubnet() { + return subnet; + } + + public String getSecGroup() { + return secGroup; + } + + public String getBatchIAMRole() { + return batchIAMRole; + } + + public String getExecutionRoleARN() { + return executionRoleARN; + } + } +} From fcb928b7e8660bb88b7d7b46f204d00c4e18f2d5 Mon Sep 17 00:00:00 2001 From: David Souther Date: Thu, 22 Aug 2024 14:16:24 -0400 Subject: [PATCH 41/98] Rust: Add WRITEME folder config overrides. (#6745) --- .tools/readmes/config.py | 8 ++ rustv1/examples/apigateway/README.md | 21 ++-- .../examples/apigatewaymanagement/README.md | 102 ++++++++++-------- .../examples/applicationautoscaling/README.md | 92 ++++++++++------ .../cognitoidentityprovider/README.md | 92 ++++++++++------ rustv1/examples/cognitosync/README.md | 21 ++-- rustv1/examples/rdsdata/README.md | 21 ++-- rustv1/examples/route53/README.md | 92 ++++++++++------ rustv1/examples/secretsmanager/README.md | 21 ++-- 9 files changed, 287 insertions(+), 183 deletions(-) diff --git a/.tools/readmes/config.py b/.tools/readmes/config.py index e203ede5862..67c125b1a3a 100644 --- a/.tools/readmes/config.py +++ b/.tools/readmes/config.py @@ -156,6 +156,14 @@ "service_folder": 'rustv1/examples/{{service["name"]}}', "sdk_api_ref": 'https://docs.rs/aws-sdk-{{service["name"]}}/latest/aws_sdk_{{service["name"]}}/', "service_folder_overrides": { + "api-gateway": "rustv1/examples/apigateway", + "apigatewaymanagementapi": "rustv1/examples/apigatewaymanagement", + "application-auto-scaling": "rustv1/examples/applicationautoscaling", + "cognito-identity-provider": "rustv1/examples/cognitoidentityprovider", + "cognito-sync": "rustv1/examples/cognitosync", + "rds-data": "rustv1/examples/rdsdata", + "route-53": "rustv1/examples/route53", + "secrets-manager": "rustv1/examples/secretsmanager", "sesv2": "rustv1/examples/ses", "ses": "rustv1/examples/_NONE_", }, diff --git a/rustv1/examples/apigateway/README.md b/rustv1/examples/apigateway/README.md index 1011499a4b0..4a4fe2c00a0 100644 --- a/rustv1/examples/apigateway/README.md +++ b/rustv1/examples/apigateway/README.md @@ -1,4 +1,3 @@ - # API Gateway code examples for the SDK for Rust ## Overview @@ -8,11 +7,11 @@ Shows how to use the AWS SDK for Rust to work with Amazon API Gateway. -*API Gateway enables you to create and deploy your own REST and WebSocket APIs at any scale.* +_API Gateway enables you to create and deploy your own REST and WebSocket APIs at any scale._ ## ⚠ Important -* Running this code might result in charges to your AWS account. +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). * Running the tests might result in charges to your AWS account. * We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). * This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). @@ -24,7 +23,7 @@ Shows how to use the AWS SDK for Rust to work with Amazon API Gateway. ### Prerequisites -For prerequisites, see the [README](../README.md#Prerequisites) in the `rustv1` folder. +For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv1` folder. @@ -34,7 +33,11 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `rustv1` Code excerpts that show you how to call individual service functions. -* [List REST APIs](src/bin/get_rest_apis.rs#L28) (`GetRestApis`) +- [GetRestApis](src/bin/get_rest_apis.rs#L26) + + + + ## Run the examples @@ -51,7 +54,7 @@ Code excerpts that show you how to call individual service functions. ⚠ Running tests might result in charges to your AWS account. -To find instructions for running these tests, see the [README](../README.md#Tests) +To find instructions for running these tests, see the [README](../../README.md#Tests) in the `rustv1` folder. @@ -61,9 +64,9 @@ in the `rustv1` folder. ## Additional resources -* [API Gateway Developer Guide](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) -* [API Gateway API Reference](https://docs.aws.amazon.com/apigateway/latest/api/API_Operations.html) -* [SDK for Rust API Gateway reference](https://docs.rs/aws-sdk-api-gateway/latest/aws_sdk_api-gateway/) +- [API Gateway Developer Guide](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) +- [API Gateway API Reference](https://docs.aws.amazon.com/apigateway/latest/api/API_Operations.html) +- [SDK for Rust API Gateway reference](https://docs.rs/aws-sdk-api-gateway/latest/aws_sdk_api-gateway/) diff --git a/rustv1/examples/apigatewaymanagement/README.md b/rustv1/examples/apigatewaymanagement/README.md index 8609fea92b0..a061f5ee9c1 100644 --- a/rustv1/examples/apigatewaymanagement/README.md +++ b/rustv1/examples/apigatewaymanagement/README.md @@ -1,66 +1,78 @@ -# AWS SDK for Rust code examples for API Gateway Management API +# API Gateway Management API code examples for the SDK for Rust -## Purpose +## Overview -These examples demonstrate how to perform several Amazon API Gateway Management API (API Gateway Management API) operations using the AWS SDK for Rust. +Shows how to use the AWS SDK for Rust to work with Amazon API Gateway Management API. -The Amazon API Gateway Management API allows you to directly manage runtime aspects of your deployed APIs. To use it, -you must explicitly set the SDK's endpoint to point to the endpoint of your deployed API. The endpoint must be of the -form `https://[api-id].execute-api.[region].amazonaws.com/[stage]` where: + + -- `api-id` is the ID of your API. -- `region` is the Region of your API. -- `stage` is the deployment stage of your API, - or the endpoint corresponding to your API's - custom domain and base path. +_API Gateway Management API allows you to directly manage runtime aspects of your deployed APIs._ + +## ⚠ Important + +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + + + ## Code examples -- [Get log events](src/bin/get-log-events.rs) (GetLogEvents) +### Prerequisites + +For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv1` folder. -## ⚠ Important -- We recommend that you grant this code least privilege, - or at most the minimum permissions required to perform the task. - For more information, see - [Grant Least Privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) - in the AWS Identity and Access Management User Guide. -- This code has not been tested in all AWS Regions. - Some AWS services are available only in specific - [Regions](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). -- Running this code might result in charges to your AWS account. + + -## Running the code examples +### Single actions + +Code excerpts that show you how to call individual service functions. + +- [PostToConnection](src/bin/post_to_connection.rs#L45) + + + + + +## Run the examples + +### Instructions + + + + + + + +### Tests + +⚠ Running tests might result in charges to your AWS account. -### Prerequisites -You must have an AWS account, and have configured your default credentials and AWS Region as described in [https://github.com/awslabs/aws-sdk-rust](https://github.com/awslabs/aws-sdk-rust). +To find instructions for running these tests, see the [README](../../README.md#Tests) +in the `rustv1` folder. -### post_to_connection -This example sends data to a connection. -`cargo run --bin post_to_connection -- -a APP-ID -s STAGE -c CONNECTION-ID -d DATA [-r REGION] [-v]` + + -- _APP-ID_ is the API ID for your API. -- _STAGE_ is the deployment stage for your API. -- _CONNECTION-ID_ is the ID of the connection where the data is sent. -- _DATA_ is the data to send to the connection. -- _REGION_ is name of the Region in which the client is created. - If not supplied, uses the value of the **AWS_REGION** environment variable. - If the environment variable is not set, defaults to **us-west-2**. -- **-v** displays additional information. +## Additional resources -## Resources +- [API Gateway Management API Developer Guide](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) +- [API Gateway Management API API Reference](https://docs.aws.amazon.com/apigateway/latest/api/API_Operations.html) +- [SDK for Rust API Gateway Management API reference](https://docs.rs/aws-sdk-apigatewaymanagementapi/latest/aws_sdk_apigatewaymanagementapi/) -- [AWS SDK for Rust repo](https://github.com/awslabs/aws-sdk-rust) -- [AWS SDK for Rust API Reference for API Gateway Management API](https://docs.rs/aws-sdk-apigatewaymanagement) -- [AWS SDK for Rust Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg) + + -## Contributing +--- -To propose a new code example to the AWS documentation team, -see [CONTRIBUTING.md](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/CONTRIBUTING.md). -The team prefers to create code examples that show broad scenarios rather than individual API calls. +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 +SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/rustv1/examples/applicationautoscaling/README.md b/rustv1/examples/applicationautoscaling/README.md index ed09487fdcc..416686a69b9 100644 --- a/rustv1/examples/applicationautoscaling/README.md +++ b/rustv1/examples/applicationautoscaling/README.md @@ -1,54 +1,78 @@ -# AWS SDK for Rust code examples for Application Auto Scaling +# Application Auto Scaling code examples for the SDK for Rust -## Purpose +## Overview -These examples demonstrate how to perform several AWS Application Auto Scaling (Application Auto Scaling) operations using the AWS SDK for Rust. +Shows how to use the AWS SDK for Rust to work with AWS Application Auto Scaling. -Application Auto Scaling enables auto scaling for resources beyond just EC2, either with scaling policies or with scheduled scaling. + + -## Code examples - -- [Lists your Application Auto Scaling policies](src/bin/describe-scaling-policies.rs) (DescribeScalingPolicies) +_Application Auto Scaling configures auto scaling for resources beyond just EC2, either with scaling policies or with scheduled scaling._ ## ⚠ Important -- We recommend that you grant this code least privilege, - or at most the minimum permissions required to perform the task. - For more information, see - [Grant Least Privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) - in the AWS Identity and Access Management User Guide. -- This code has not been tested in all AWS Regions. - Some AWS services are available only in specific - [Regions](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). -- Running this code might result in charges to your AWS account. +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + + + -## Running the code examples +## Code examples ### Prerequisites -You must have an AWS account, and have configured your default credentials and AWS Region as described in [https://github.com/awslabs/aws-sdk-rust](https://github.com/awslabs/aws-sdk-rust). +For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv1` folder. + + + + + +### Single actions + +Code excerpts that show you how to call individual service functions. + +- [DescribeScalingPolicies](src/bin/describe-scaling-policies.rs#L23) + + + + + +## Run the examples + +### Instructions + + + + + + + +### Tests + +⚠ Running tests might result in charges to your AWS account. + + +To find instructions for running these tests, see the [README](../../README.md#Tests) +in the `rustv1` folder. -### describe-scaling-policies -This example lists your Application Auto Scaling policies in the Region. -`cargo run --bin describe-scaling-policies -- [-r REGION] [-v]` + + -- _REGION_ is name of the Region where the stacks are located. - If not supplied, uses the value of the **AWS_REGION** environment variable. - If the environment variable is not set, defaults to **us-west-2**. -- **-v** displays additional information. +## Additional resources -## Resources +- [Application Auto Scaling User Guide](https://docs.aws.amazon.com/autoscaling/application/userguide/what-is-application-auto-scaling.html) +- [Application Auto Scaling API Reference](https://docs.aws.amazon.com/autoscaling/application/APIReference/Welcome.html) +- [SDK for Rust Application Auto Scaling reference](https://docs.rs/aws-sdk-application-auto-scaling/latest/aws_sdk_application-auto-scaling/) -- [AWS SDK for Rust repo](https://github.com/awslabs/aws-sdk-rust) -- [AWS SDK for Rust API Reference for Application Auto Scaling](https://docs.rs/aws-sdk-applicationautoscaling) -- [AWS SDK for Rust Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg) + + -## Contributing +--- -To propose a new code example to the AWS documentation team, -see [CONTRIBUTING.md](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/CONTRIBUTING.md). -The team prefers to create code examples that show broad scenarios rather than individual API calls. +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 +SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/rustv1/examples/cognitoidentityprovider/README.md b/rustv1/examples/cognitoidentityprovider/README.md index 2f3805cf4b8..a1736e4b4da 100644 --- a/rustv1/examples/cognitoidentityprovider/README.md +++ b/rustv1/examples/cognitoidentityprovider/README.md @@ -1,54 +1,78 @@ -# AWS SDK for Rust code examples for Amazon Cognito user pools +# Amazon Cognito Identity Provider code examples for the SDK for Rust -## Purpose +## Overview -This code example demonstrate how to perform an Amazon Cognito user pool operation using the AWS SDK for Rust. +Shows how to use the AWS SDK for Rust to work with Amazon Cognito Identity Provider. -Amazon Cognito user pools enable you to sign in to your web or mobile app through Amazon Cognito. + + -## Code examples - -- [List user pools](src/bin/list-user-pools.rs) (ListUserPools) +_Amazon Cognito Identity Provider handles user authentication and authorization for your web and mobile apps._ ## ⚠ Important -- We recommend that you grant this code least privilege, - or at most the minimum permissions required to perform the task. - For more information, see - [Grant Least Privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) - in the AWS Identity and Access Management User Guide. -- This code has not been tested in all AWS Regions. - Some AWS services are available only in specific - [Regions](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). -- Running this code might result in charges to your AWS account. +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + + + -## Running the code examples +## Code examples ### Prerequisites -You must have an AWS account, and have configured your default credentials and AWS Region as described in [https://github.com/awslabs/aws-sdk-rust](https://github.com/awslabs/aws-sdk-rust). +For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv1` folder. + + + + + +### Single actions + +Code excerpts that show you how to call individual service functions. + +- [ListUserPools](src/bin/list-user-pools.rs#L26) + + + + + +## Run the examples + +### Instructions + + + + + + + +### Tests + +⚠ Running tests might result in charges to your AWS account. + + +To find instructions for running these tests, see the [README](../../README.md#Tests) +in the `rustv1` folder. -### list-user-pools -This example lists your Amazon Cognito user pools in the Region. -`cargo run --bin list-user-pools -- [-r REGION] [-v]` + + -- _DEFAULT-REGION_ is name of the Region in which the client is created. - If not supplied, uses the value of the **AWS_REGION** environment variable. - If the environment variable is not set, defaults to **us-west-2**. -- **-v** displays additional information. +## Additional resources -## Resources +- [Amazon Cognito Identity Provider Developer Guide](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html) +- [Amazon Cognito Identity Provider API Reference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html) +- [SDK for Rust Amazon Cognito Identity Provider reference](https://docs.rs/aws-sdk-cognito-identity-provider/latest/aws_sdk_cognito-identity-provider/) -- [AWS SDK for Rust repo](https://github.com/awslabs/aws-sdk-rust) -- [AWS SDK for Rust API Reference for Amazon Cognito User Pools](https://docs.rs/aws-sdk-cognitoidentityprovider) -- [AWS SDK for Rust Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg) + + -## Contributing +--- -To propose a new code example to the AWS documentation team, -see [CONTRIBUTING.md](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/CONTRIBUTING.md). -The team prefers to create code examples that show broad scenarios rather than individual API calls. +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 +SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/rustv1/examples/cognitosync/README.md b/rustv1/examples/cognitosync/README.md index 2081f900b2a..969775e21fa 100644 --- a/rustv1/examples/cognitosync/README.md +++ b/rustv1/examples/cognitosync/README.md @@ -1,4 +1,3 @@ - # Amazon Cognito Sync code examples for the SDK for Rust ## Overview @@ -8,11 +7,11 @@ Shows how to use the AWS SDK for Rust to work with Amazon Cognito Sync. -*Amazon Cognito Sync makes it possible to sync application-related user data across devices.* +_Amazon Cognito Sync makes it possible to sync application-related user data across devices._ ## ⚠ Important -* Running this code might result in charges to your AWS account. +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). * Running the tests might result in charges to your AWS account. * We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). * This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). @@ -24,7 +23,7 @@ Shows how to use the AWS SDK for Rust to work with Amazon Cognito Sync. ### Prerequisites -For prerequisites, see the [README](../README.md#Prerequisites) in the `rustv1` folder. +For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv1` folder. @@ -34,7 +33,11 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `rustv1` Code excerpts that show you how to call individual service functions. -* [List identity pools](src/bin/list-identity-pool-usage.rs#L28) (`ListIdentityPoolUsage`) +- [ListIdentityPoolUsage](src/bin/list-identity-pool-usage.rs#L26) + + + + ## Run the examples @@ -51,7 +54,7 @@ Code excerpts that show you how to call individual service functions. ⚠ Running tests might result in charges to your AWS account. -To find instructions for running these tests, see the [README](../README.md#Tests) +To find instructions for running these tests, see the [README](../../README.md#Tests) in the `rustv1` folder. @@ -61,9 +64,9 @@ in the `rustv1` folder. ## Additional resources -* [Amazon Cognito Sync Developer Guide](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-sync.html) -* [Amazon Cognito Sync API Reference](https://docs.aws.amazon.com/cognitosync/latest/APIReference/Welcome.html) -* [SDK for Rust Amazon Cognito Sync reference](https://docs.rs/aws-sdk-cognito-sync/latest/aws_sdk_cognito-sync/) +- [Amazon Cognito Sync Developer Guide](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-sync.html) +- [Amazon Cognito Sync API Reference](https://docs.aws.amazon.com/cognitosync/latest/APIReference/Welcome.html) +- [SDK for Rust Amazon Cognito Sync reference](https://docs.rs/aws-sdk-cognito-sync/latest/aws_sdk_cognito-sync/) diff --git a/rustv1/examples/rdsdata/README.md b/rustv1/examples/rdsdata/README.md index 22603466ca5..04a305c38f6 100644 --- a/rustv1/examples/rdsdata/README.md +++ b/rustv1/examples/rdsdata/README.md @@ -1,4 +1,3 @@ - # Amazon RDS Data Service code examples for the SDK for Rust ## Overview @@ -8,11 +7,11 @@ Shows how to use the AWS SDK for Rust to work with Amazon Relational Database Se -*Amazon RDS Data Service provides an HTTP endpoint to run SQL statements on an Amazon Aurora Serverless v1 DB cluster.* +_Amazon RDS Data Service provides an HTTP endpoint to run SQL statements on an Amazon Aurora Serverless v1 DB cluster._ ## ⚠ Important -* Running this code might result in charges to your AWS account. +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). * Running the tests might result in charges to your AWS account. * We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). * This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). @@ -24,7 +23,7 @@ Shows how to use the AWS SDK for Rust to work with Amazon Relational Database Se ### Prerequisites -For prerequisites, see the [README](../README.md#Prerequisites) in the `rustv1` folder. +For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv1` folder. @@ -34,7 +33,11 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `rustv1` Code excerpts that show you how to call individual service functions. -* [Run an SQL statement](src/bin/rdsdata-helloworld.rs#L36) (`ExecuteStatement`) +- [ExecuteStatement](src/bin/rdsdata-helloworld.rs#L34) + + + + ## Run the examples @@ -51,7 +54,7 @@ Code excerpts that show you how to call individual service functions. ⚠ Running tests might result in charges to your AWS account. -To find instructions for running these tests, see the [README](../README.md#Tests) +To find instructions for running these tests, see the [README](../../README.md#Tests) in the `rustv1` folder. @@ -61,9 +64,9 @@ in the `rustv1` folder. ## Additional resources -* [Amazon RDS Data Service User Guide](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) -* [Amazon RDS Data Service API Reference](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/Welcome.html) -* [SDK for Rust Amazon RDS Data Service reference](https://docs.rs/aws-sdk-rds-data/latest/aws_sdk_rds-data/) +- [Amazon RDS Data Service User Guide](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) +- [Amazon RDS Data Service API Reference](https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/Welcome.html) +- [SDK for Rust Amazon RDS Data Service reference](https://docs.rs/aws-sdk-rds-data/latest/aws_sdk_rds-data/) diff --git a/rustv1/examples/route53/README.md b/rustv1/examples/route53/README.md index dedc548f005..9a76ad2d5bd 100644 --- a/rustv1/examples/route53/README.md +++ b/rustv1/examples/route53/README.md @@ -1,54 +1,78 @@ -# AWS SDK for Rust code examples for Amazon Route 53 +# Route 53 code examples for the SDK for Rust -## Purpose +## Overview -These examples demonstrate how to perform several Amazon Route 53 operations using the AWS SDK for Rust. +Shows how to use the AWS SDK for Rust to work with Amazon Route 53. -Amazon Route 53 is a highly available and scalable Domain Name System (DNS) web service. + + -## Code examples - -- [Displays the IDs and names of the hosted zones](src/bin/route53-helloworld.rs) (GetHostedZoneCount, ListHostedZones) +_Route 53 is a highly available and scalable Domain Name System (DNS) web service._ ## ⚠ Important -- We recommend that you grant this code least privilege, - or at most the minimum permissions required to perform the task. - For more information, see - [Grant Least Privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) - in the AWS Identity and Access Management User Guide. -- This code has not been tested in all AWS Regions. - Some AWS services are available only in specific - [Regions](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). -- Running this code might result in charges to your AWS account. +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + + + -## Running the code examples +## Code examples ### Prerequisites -You must have an AWS account, and have configured your default credentials and AWS Region as described in [Getting started with the AWS SDK for Rust](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/getting-started.html). +For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv1` folder. + + + + + +### Single actions + +Code excerpts that show you how to call individual service functions. + +- [ListHostedZones](src/bin/route53-helloworld.rs#L22) + + + + + +## Run the examples + +### Instructions + + + + + + + +### Tests + +⚠ Running tests might result in charges to your AWS account. + + +To find instructions for running these tests, see the [README](../../README.md#Tests) +in the `rustv1` folder. -### route53-helloworld -This example displays the IDs and names of the hosted zones in the Region. -`cargo run --bin route53-helloworld -- [-r REGION] [-v]` + + -- _REGION_ is the Region in which the client is created. - If not supplied, uses the value of the **AWS_REGION** environment variable. - If the environment variable is not set, defaults to **us-west-2**. -- **-v** displays additional information. +## Additional resources -## Resources +- [Route 53 Developer Guide](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) +- [Route 53 API Reference](https://docs.aws.amazon.com/Route53/latest/APIReference/Welcome.html) +- [SDK for Rust Route 53 reference](https://docs.rs/aws-sdk-route-53/latest/aws_sdk_route-53/) -- [AWS SDK for Rust repo](https://github.com/awslabs/aws-sdk-rust) -- [AWS SDK for Rust API Reference for Amazon Route 53](https://docs.rs/aws-sdk-route53) -- [AWS SDK for Rust Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg) + + -## Contributing +--- -To propose a new code example to the AWS documentation team, -see [CONTRIBUTING.md](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/CONTRIBUTING.md). -The team prefers to create code examples that show broad scenarios rather than individual API calls. +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 +SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/rustv1/examples/secretsmanager/README.md b/rustv1/examples/secretsmanager/README.md index d16a92ab3c2..c00661b5aa0 100644 --- a/rustv1/examples/secretsmanager/README.md +++ b/rustv1/examples/secretsmanager/README.md @@ -1,4 +1,3 @@ - # Secrets Manager code examples for the SDK for Rust ## Overview @@ -8,11 +7,11 @@ Shows how to use the AWS SDK for Rust to work with AWS Secrets Manager. -*Secrets Manager helps you to securely encrypt, store, and retrieve credentials for your databases and other services.* +_Secrets Manager helps you to securely encrypt, store, and retrieve credentials for your databases and other services._ ## ⚠ Important -* Running this code might result in charges to your AWS account. +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). * Running the tests might result in charges to your AWS account. * We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). * This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). @@ -24,7 +23,7 @@ Shows how to use the AWS SDK for Rust to work with AWS Secrets Manager. ### Prerequisites -For prerequisites, see the [README](../README.md#Prerequisites) in the `rustv1` folder. +For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv1` folder. @@ -34,7 +33,11 @@ For prerequisites, see the [README](../README.md#Prerequisites) in the `rustv1` Code excerpts that show you how to call individual service functions. -* [Get a secret value](src/bin/get-secret-value.rs#L28) (`GetSecretValue`) +- [GetSecretValue](src/bin/get-secret-value.rs#L26) + + + + ## Run the examples @@ -51,7 +54,7 @@ Code excerpts that show you how to call individual service functions. ⚠ Running tests might result in charges to your AWS account. -To find instructions for running these tests, see the [README](../README.md#Tests) +To find instructions for running these tests, see the [README](../../README.md#Tests) in the `rustv1` folder. @@ -61,9 +64,9 @@ in the `rustv1` folder. ## Additional resources -* [Secrets Manager User Guide](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) -* [Secrets Manager API Reference](https://docs.aws.amazon.com/secretsmanager/latest/apireference/Welcome.html) -* [SDK for Rust Secrets Manager reference](https://docs.rs/aws-sdk-secrets-manager/latest/aws_sdk_secrets-manager/) +- [Secrets Manager User Guide](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) +- [Secrets Manager API Reference](https://docs.aws.amazon.com/secretsmanager/latest/apireference/Welcome.html) +- [SDK for Rust Secrets Manager reference](https://docs.rs/aws-sdk-secrets-manager/latest/aws_sdk_secrets-manager/) From d56cddf2645019cc032ae4c255cd4b3512b1666b Mon Sep 17 00:00:00 2001 From: Steven Meyer <108885656+meyertst-aws@users.noreply.github.com> Date: Thu, 22 Aug 2024 16:17:13 -0400 Subject: [PATCH 42/98] Python:SSM:AI metadata (#6761) Add AI metadata --- .doc_gen/metadata/ssm_metadata.yaml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.doc_gen/metadata/ssm_metadata.yaml b/.doc_gen/metadata/ssm_metadata.yaml index 950d539b347..388f164611a 100644 --- a/.doc_gen/metadata/ssm_metadata.yaml +++ b/.doc_gen/metadata/ssm_metadata.yaml @@ -17,7 +17,7 @@ ssm_Hello: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -92,7 +92,7 @@ ssm_CreateOpsItem: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -115,7 +115,7 @@ ssm_UpdateMaintenanceWindow: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -138,7 +138,7 @@ ssm_CreateMaintenanceWindow: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -161,7 +161,7 @@ ssm_SendCommand: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -175,7 +175,7 @@ ssm_ListCommandInvocations: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -198,7 +198,7 @@ ssm_CreateDocument: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -221,7 +221,7 @@ ssm_DescribeOpsItems: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -235,7 +235,7 @@ ssm_DeleteOpsItem: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -258,7 +258,7 @@ ssm_DeleteMaintenanceWindow: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -281,7 +281,7 @@ ssm_DeleteDocument: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -304,7 +304,7 @@ ssm_UpdateOpsItem: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: snippet_tags: @@ -332,7 +332,7 @@ ssm_Scenario: versions: - sdk_version: 3 github: python/example_code/ssm - sdkguide: + genai: some excerpts: - description: Run an interactive scenario at a command prompt. snippet_tags: From ca65fc56c83f283e6e74ded4301538050bd77972 Mon Sep 17 00:00:00 2001 From: Steven Meyer <108885656+meyertst-aws@users.noreply.github.com> Date: Fri, 23 Aug 2024 08:53:53 -0400 Subject: [PATCH 43/98] Revert - Revert "Removing old JS examples" #6765 (#6767) Removing old JS examples (cross-service Transcription and Step Functions) Co-authored-by: Brian Murray <40031786+brmur@users.noreply.github.com> --- ...s_ServerlessWorkflows_JavaScript_block.xml | 21 - ...ross_TranscriptionApp_JavaScript_block.xml | 19 - .doc_gen/metadata/cross_metadata.yaml | 20 - .../lambda-step-functions/README.md | 25 - .../lambda-step-functions/package.json | 24 - .../lambda-step-functions/setup.yaml | 205 - .../src/lambda1/getid.js | 28 - .../src/lambda2/additem.js | 72 - .../src/lambda3/sendemail.js | 70 - .../src/libs/dynamoClient.js | 25 - .../src/libs/sesClient.js | 24 - .../transcription-app/README.md | 25 - .../transcription-app/package.json | 41 - .../transcription-app/setup.yaml | 377 - .../transcription-app/src/helper.js | 89 - .../transcription-app/src/index.html | 55 - .../transcription-app/src/index.js | 283 - .../transcription-app/src/recorder.css | 66 - .../transcription-app/src/recorder.js | 69 - .../cdk.json | 10 - .../package-lock.json | 18523 ---------------- .../package.json | 29 - .../setup.ts | 212 - .../tsconfig.json | 23 - .../cdk/lambda_api_step_functions/cdk.json | 10 - .../lambda_api_step_functions/package.json | 30 - .../cdk/lambda_api_step_functions/setup.ts | 143 - .../lambda_api_step_functions/tsconfig.json | 23 - 28 files changed, 20541 deletions(-) delete mode 100644 .doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml delete mode 100644 .doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/README.md delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/package.json delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js delete mode 100644 javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/README.md delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/package.json delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/setup.yaml delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/helper.js delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/index.html delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/index.js delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/recorder.css delete mode 100644 javascriptv3/example_code/cross-services/transcription-app/src/recorder.js delete mode 100644 resources/cdk/javascript_example_code_transcribe_demo/cdk.json delete mode 100644 resources/cdk/javascript_example_code_transcribe_demo/package-lock.json delete mode 100644 resources/cdk/javascript_example_code_transcribe_demo/package.json delete mode 100644 resources/cdk/javascript_example_code_transcribe_demo/setup.ts delete mode 100644 resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json delete mode 100644 resources/cdk/lambda_api_step_functions/cdk.json delete mode 100644 resources/cdk/lambda_api_step_functions/package.json delete mode 100644 resources/cdk/lambda_api_step_functions/setup.ts delete mode 100644 resources/cdk/lambda_api_step_functions/tsconfig.json diff --git a/.doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml b/.doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml deleted file mode 100644 index 5869e6b626a..00000000000 --- a/.doc_gen/cross-content/cross_ServerlessWorkflows_JavaScript_block.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - %phrases-shared; -]> - - - Shows how to create an &AWS; serverless workflow by using &SFNlong; and the &JSBlong;. - Each workflow step is implemented using an &LAMlong; function. - - &LAM; is a compute service that enables you to run code without provisioning or managing servers. - &SFN; is a serverless orchestration service that lets you combine &LAM; functions and other &AWS; - services to build business-critical applications. - - - For complete source code and instructions on how to set up and run, see the full example on - GitHub. - - This example is also available in the - &JSBlong; v3 developer guide. - \ No newline at end of file diff --git a/.doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml b/.doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml deleted file mode 100644 index 19ec9bc0f77..00000000000 --- a/.doc_gen/cross-content/cross_TranscriptionApp_JavaScript_block.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - %phrases-shared; -]> - - - Create an app that uses &TSClong; to transcribe and display voice recordings in the browser. The app uses - two &S3long; (&S3;) buckets, one to host the application code, and another to store transcriptions. The app uses - an &COGlong; user pool to authenticate your users. Authenticated users have &IAMlong; (&IAM;) permissions to - access the required &AWS; services. - - - For complete source code and instructions on how to set up and run, see the full example on - GitHub. - - This example is also available in the - &JSBlong; v3 developer guide. - diff --git a/.doc_gen/metadata/cross_metadata.yaml b/.doc_gen/metadata/cross_metadata.yaml index b4d9c7f8fc3..f32e659be8c 100644 --- a/.doc_gen/metadata/cross_metadata.yaml +++ b/.doc_gen/metadata/cross_metadata.yaml @@ -443,32 +443,12 @@ cross_ServerlessWorkflows: versions: - sdk_version: 2 block_content: cross_ServerlessWorkflows_Java_block.xml - JavaScript: - versions: - - sdk_version: 3 - github: javascriptv3/example_code/cross-services/lambda-step-functions - block_content: cross_ServerlessWorkflows_JavaScript_block.xml service_main: sfn services: dynamodb: lambda: ses: sfn: -cross_TranscriptionApp: - title: Build an &TSC; app - title_abbrev: Build an &TSC; app - synopsis: use &TSClong; to transcribe and display voice recordings in the browser. - category: Scenarios - languages: - JavaScript: - versions: - - sdk_version: 3 - block_content: cross_TranscriptionApp_JavaScript_block.xml - service_main: transcribe - services: - cognito-identity: - s3: - transcribe: cross_TranscriptionStreamingApp: title: Build an &TSC; streaming app title_abbrev: Build an &TSC; streaming app diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/README.md b/javascriptv3/example_code/cross-services/lambda-step-functions/README.md deleted file mode 100644 index 8319df67117..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# JavaScript environment for tutorial to create an AWS serverless workflow using AWS SDK for JavaScript and AWS Step Functions - -This is a workspace where you can find an AWS SDK for JavaScript version 3 (v3) tutorial that demonstrates how to -create AWS serverless workflows using AWS Step Functions. - -For instructions on implementing this example, see [Creating AWS serverless workflows using AWS SDK for JavaScript](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-step-functions-example.html) in the _AWS SDK for JavaScript v3 Developer Guide_. - -# Getting started - -1. Clone the [AWS Code Examples Repository](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. - See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for - instructions. - -1. Install the dependencies listed in the [root]/javascriptv3/example_code/cross-services/lambda-step-functions/package.json. - -**Note**: These include the AWS SDK for JavaScript v3 client modules for the AWS services required in this example, -which include _@aws-sdk/client-dynamodb_ and _@aws-sdk/client-ses_. - -They also include third-party Node.js modules, including webpack. - -``` -npm install node -g -cd javascriptv3/example_code/cross-services/lambda-step-functions -npm install -``` diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/package.json b/javascriptv3/example_code/cross-services/lambda-step-functions/package.json deleted file mode 100644 index 43d46da3fd2..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@aws-doc-sdk-examples/lambda-api-gateway-example", - "version": "1.0.0", - "description": "Using the AWS SDK for JavaScript V3 to build and deploy Lambda functions on API Gateway.", - "main": "index.js", - "repository": "git@github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/iam.git", - "author": "brmur", - "license": "Apache 2.0", - "scripts": { - "build-lambda-1": "webpack getid.js --mode development --target node --devtool false --output-library-target umd -o index.js", - "build-lambda-2": "webpack additem.js --mode development --target node --devtool false --output-library-target umd -o index.js", - "build-lambda-3": "webpack sendemail.js --mode development --target node --devtool false --output-library-target umd -o index.js", - "build-cdk": "aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM", - "test": "exit 0" - }, - "dependencies": { - "@aws-sdk/client-dynamodb": "^3.32.0", - "@aws-sdk/client-ses": "^3.7.0" - }, - "devDependencies": { - "webpack": "^4.42.0", - "webpack-cli": "^3.3.11" - } -} diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml b/javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml deleted file mode 100644 index 854a3543338..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/setup.yaml +++ /dev/null @@ -1,205 +0,0 @@ -Resources: - ExampleIdentityPool: - Type: AWS::Cognito::IdentityPool - Properties: - AllowUnauthenticatedIdentities: true - Metadata: - aws:cdk:path: stepfunctions/ExampleIdentityPool - LambdaRole3A44B857: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRoleWithWebIdentity - Condition: - StringEquals: - cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPool - ForAnyValue:StringLike: - cognito-identity.amazonaws.com:amr: unauthenticated - Effect: Allow - Principal: - Federated: cognito-identity.amazonaws.com - - Action: sts:AssumeRole - Effect: Allow - Principal: - Service: lambda.amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: stepfunctions/LambdaRole/Resource - LambdaRoleDefaultPolicy75625A82: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: - - lambda:InvokeFunction - - mobileanalytics:PutEvents - - cognito-sync:* - Effect: Allow - Resource: "*" - - Action: dynamodb:* - Effect: Allow - Resource: "*" - - Action: ses:* - Effect: Allow - Resource: "*" - Version: "2012-10-17" - PolicyName: LambdaRoleDefaultPolicy75625A82 - Roles: - - Ref: LambdaRole3A44B857 - Metadata: - aws:cdk:path: stepfunctions/LambdaRole/DefaultPolicy/Resource - DefaultValid: - Type: AWS::Cognito::IdentityPoolRoleAttachment - Properties: - IdentityPoolId: - Ref: ExampleIdentityPool - Roles: - unauthenticated: - Fn::GetAtt: - - LambdaRole3A44B857 - - Arn - Metadata: - aws:cdk:path: stepfunctions/DefaultValid - ExampleIdentityPoolWorkflow: - Type: AWS::Cognito::IdentityPool - Properties: - AllowUnauthenticatedIdentities: true - Metadata: - aws:cdk:path: stepfunctions/ExampleIdentityPoolWorkflow - WorkflowRole21EC4257: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRoleWithWebIdentity - Condition: - StringEquals: - cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPoolWorkflow - ForAnyValue:StringLike: - cognito-identity.amazonaws.com:amr: unauthenticated - Effect: Allow - Principal: - Federated: cognito-identity.amazonaws.com - - Action: sts:AssumeRole - Effect: Allow - Principal: - Service: - Fn::Join: - - "" - - - states. - - Ref: AWS::Region - - .amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: stepfunctions/WorkflowRole/Resource - WorkflowRoleDefaultPolicyB4C63B85: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: - - lambda:InvokeFunction - - mobileanalytics:PutEvents - - cognito-sync:* - Effect: Allow - Resource: "*" - Version: "2012-10-17" - PolicyName: WorkflowRoleDefaultPolicyB4C63B85 - Roles: - - Ref: WorkflowRole21EC4257 - Metadata: - aws:cdk:path: stepfunctions/WorkflowRole/DefaultPolicy/Resource - DefaultValidWorkflow: - Type: AWS::Cognito::IdentityPoolRoleAttachment - Properties: - IdentityPoolId: - Ref: ExampleIdentityPoolWorkflow - Roles: - unauthenticated: - Fn::GetAtt: - - WorkflowRole21EC4257 - - Arn - Metadata: - aws:cdk:path: stepfunctions/DefaultValidWorkflow - CDKMetadata: - Type: AWS::CDK::Metadata - Properties: - Modules: aws-cdk=1.109.0,@aws-cdk/assets=1.84.0,@aws-cdk/aws-applicationautoscaling=1.84.0,@aws-cdk/aws-autoscaling-common=1.84.0,@aws-cdk/aws-cloudwatch=1.84.0,@aws-cdk/aws-codeguruprofiler=1.84.0,@aws-cdk/aws-cognito=1.84.0,@aws-cdk/aws-ec2=1.84.0,@aws-cdk/aws-ecr=1.84.0,@aws-cdk/aws-ecr-assets=1.84.0,@aws-cdk/aws-events=1.84.0,@aws-cdk/aws-iam=1.84.0,@aws-cdk/aws-kms=1.84.0,@aws-cdk/aws-lambda=1.84.0,@aws-cdk/aws-logs=1.84.0,@aws-cdk/aws-s3=1.84.0,@aws-cdk/aws-s3-assets=1.84.0,@aws-cdk/aws-sqs=1.84.0,@aws-cdk/aws-ssm=1.84.0,@aws-cdk/cloud-assembly-schema=1.84.0,@aws-cdk/core=1.84.0,@aws-cdk/custom-resources=1.84.0,@aws-cdk/cx-api=1.84.0,@aws-cdk/region-info=1.84.0,jsii-runtime=node.js/v14.7.0 - Metadata: - aws:cdk:path: stepfunctions/CDKMetadata/Default - Condition: CDKMetadataAvailable -Outputs: - Lambdasupportrole: - Value: - Ref: LambdaRole3A44B857 - Workflowsupportrole: - Value: - Ref: WorkflowRole21EC4257 -Conditions: - CDKMetadataAvailable: - Fn::Or: - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - ap-east-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ap-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ca-central-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-north-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-northwest-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-central-1 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - eu-north-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-2 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-3 - - Fn::Equals: - - Ref: AWS::Region - - me-south-1 - - Fn::Equals: - - Ref: AWS::Region - - sa-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-2 - - Fn::Equals: - - Ref: AWS::Region - - us-west-1 - - Fn::Equals: - - Ref: AWS::Region - - us-west-2 diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js deleted file mode 100644 index 4d431497495..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda1/getid.js +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-workflows-using-step-functions.html. - -Purpose: -getid.js is part of a tutorial demonstrates how to create an AWS serverless workflow by using the AWS SDK for JavaScript (v3) -and AWS Step Functions. - -*/ - -// snippet-start:[lambda.JavaScript.lambda-step-functions.getid] - -exports.handler = async (event) => { - // Create a support case using the input as the case ID, then return a confirmation message - try { - const myCaseID = event.inputCaseID; - var myMessage = "Case " + myCaseID + ": opened..."; - var result = { Case: myCaseID, Message: myMessage }; - console.log(result); - } catch (err) { - console.log("Error", err); - } -}; -// snippet-end:[lambda.JavaScript.lambda-step-functions.getid] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js deleted file mode 100644 index d5267e6e6dd..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda2/additem.js +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-workflows-using-step-functions.html. - -Purpose: -additem.js is part of a tutorial demonstrates how to create an AWS serverless workflow by using the AWS SDK for JavaScript (v3) -and AWS Step Functions. - -Inputs: -- RECEIVER_EMAIL_ADDRESS: A valid Amazon Simple Notification Services (Amazon SNS) email address. - -*/ -// snippet-start:[lambda.JavaScript.lambda-step-functions.additem] - -"use strict"; -// Load the required clients and commands. -const { PutItemCommand } = require ( "@aws-sdk/client-dynamodb" ); -const { dynamoClient } = require ( "../libs/dynamoClient" ); - -exports.handler = async (event) => { - try { - // Helper function to send message using Amazon SNS. - const val = event; - //PersistCase adds an item to a DynamoDB table - const tmp = Math.random() <= 0.5 ? 1 : 2; - console.log(tmp); - if (tmp == 1) { - const params = { - TableName: "Case", - Item: { - id: { N: val.Case }, - empEmail: { S: "brmur@amazon.com" }, - name: { S: "Tom Blue" }, - }, - }; - console.log("adding item for tom"); - try { - const data = await dynamoClient.send(new PutItemCommand(params)); - console.log(data); - } catch (err) { - console.error(err); - } - var result = { Email: params.Item.empEmail }; - return result; - } else { - const params = { - TableName: "Case", - Item: { - id: { N: val.Case }, - empEmail: { S: "RECEIVER_EMAIL_ADDRESS" }, // Valid Amazon Simple Notification Services (Amazon SNS) email address. - name: { S: "Sarah White" }, - }, - }; - console.log("adding item for sarah"); - try { - const data = await dynamoClient.send(new PutItemCommand(params)); - console.log(data); - } catch (err) { - console.error(err); - } - return params.Item.empEmail; - var result = { Email: params.Item.empEmail }; - } - } catch (err) { - console.log("Error", err); - } -}; -// snippet-end:[lambda.JavaScript.lambda-step-functions.additem] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js deleted file mode 100644 index 62aa3c2e1c4..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/src/lambda3/sendemail.js +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-workflows-using-step-functions.html. - -Purpose: -sendemail.js is part of a tutorial demonstrates how to create an AWS serverless workflow by using the AWS SDK for JavaScript (v3) -and AWS Step Functions. - -*/ -// snippet-start:[lambda.JavaScript.lambda-step-functions.sendemail] - -// Load the required clients and commands. -const { SendEmailCommand } = require ( "@aws-sdk/client-ses" ); -const { sesClient } = require ( "../libs/sesClient" ); - -exports.handler = async (event) => { - // Enter a sender email address. This address must be verified. - const senderEmail = "SENDER_EMAIL" - const sender = "Sender Name <" + senderEmail + ">"; - - // AWS Step Functions passes the employee's email to the event. - // This address must be verified. - const recepient = event.S; - - // The subject line for the email. - const subject = "New case"; - - // The email body for recipients with non-HTML email clients. - const body_text = - "Hello,\r\n" + "Please check the database for new ticket assigned to you."; - - // The HTML body of the email. - const body_html = `

Hello!

Please check the database for new ticket assigned to you.

`; - - // The character encoding for the email. - const charset = "UTF-8"; - var params = { - Source: sender, - Destination: { - ToAddresses: [recepient], - }, - Message: { - Subject: { - Data: subject, - Charset: charset, - }, - Body: { - Text: { - Data: body_text, - Charset: charset, - }, - Html: { - Data: body_html, - Charset: charset, - }, - }, - }, - }; - try { - const data = await sesClient.send(new SendEmailCommand(params)); - console.log(data); - } catch (err) { - console.error(err); - } -}; -// snippet-end:[lambda.JavaScript.lambda-step-functions.sendemail] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js deleted file mode 100644 index bba165579ce..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/dynamoClient.js +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-step-functions-example.html. - -Purpose: -dynamoClient.js is a helper function that creates an Amazon DynamoDB service client. - -Inputs (replace in code): --REGION - -*/ -// snippet-start:[dynamodb.JavaScript.step-functions.createclientv3] - -const { DynamoDBClient } = require ( "@aws-sdk/client-dynamodb" ); -// Set the AWS Region. -const REGION = "REGION"; //e.g. "us-east-1" -// Create an Amazon DynamoDB service client object. -const dynamoClient = new DynamoDBClient({ region: REGION }); - -module.exports = { dynamoClient }; -// snippet-end:[dynamodb.JavaScript.step-functions.createclientv3] diff --git a/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js b/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js deleted file mode 100644 index cfc7f5d4db2..00000000000 --- a/javascriptv3/example_code/cross-services/lambda-step-functions/src/libs/sesClient.js +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/serverless-step-functions-example.html. - -Purpose: -sesClient.js is a helper function that creates an Amazon Simple Email Service (Amazon SES) service client. - -Inputs (replace in code): --REGION - -*/ -// snippet-start:[ses.JavaScript.step-functions.createclientv3] - -const { SESClient } = require ( "@aws-sdk/client-ses" ); -// Set the AWS Region. -const REGION = "REGION"; //e.g. "us-east-1" -// Create an Amazon SNS service client object. -const sesClient = new SESClient({ region: REGION }); -module.exports = { sesClient }; -// snippet-end:[ses.JavaScript.step-functions.createclientv3] diff --git a/javascriptv3/example_code/cross-services/transcription-app/README.md b/javascriptv3/example_code/cross-services/transcription-app/README.md deleted file mode 100644 index 00c142558aa..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# JavaScript environment for the Transcription App tutorial - -This is a workspace where you can find the following AWS SDK for JavaScript version 3 (v3) 'Transcription app' tutorial. - -For instructions on implementing this example, see [Build a transcription app with authenticated users](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html) in the -_AWS SDK for JavaScript v3 Developer Guide_. - -# Getting started - -1. Clone the [AWS Code Examples Repository](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. - See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for - instructions. - -1. Install the dependencies listed in the [root]/javascriptv3/example_code/cross-services/transcription-app/package.json. - -**Note**: These include the AWS SDK for JavaScript v3 client modules for the AWS services required in this example, -which are _@aws-sdk/client-iam_, _@aws-sdk/client-cognito-identity_, _@aws-sdk/credential-provider-cognito-identity_, _@aws-sdk/s3-request-presigner_, -_@aws-sdk/client-dynamodb_, _@aws-sdk/util-create-request_, _@aws-sdk/util-format-url_, _@aws-sdk/client-transcribe_ and _@aws-sdk/client-s3_. -They also include third-party Node.js modules, path, node-fetch, and webpack. - -``` -npm install node -g -cd javascriptv3/example_code/cross-services/transcription-app -npm install -``` diff --git a/javascriptv3/example_code/cross-services/transcription-app/package.json b/javascriptv3/example_code/cross-services/transcription-app/package.json deleted file mode 100644 index a49002b2b89..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "@aws-doc-sdk-examples/recording-app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "build:frontend": "webpack index.js --mode development --target web --devtool false -o main.js", - "test": "exit 0" - }, - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "json-loader": "^0.5.7", - "raw-loader": "^4.0.2", - "webpack": "^4.42.0", - "webpack-cli": "^3.3.11" - }, - "dependencies": { - "@aws-sdk/client-cognito-identity": "^3.32.0", - "@aws-sdk/client-iam": "^3.32.0", - "@aws-sdk/client-s3": "^3.32.0", - "@aws-sdk/client-transcribe": "^3.32.0", - "@aws-sdk/credential-provider-cognito-identity": "^3.32.0", - "@aws-sdk/s3-request-presigner": "^3.32.0", - "@aws-sdk/util-create-request": "^3.32.0", - "@aws-sdk/util-format-url": "^3.32.0", - "aws-sdk": "^2.793.0", - "babel-cli": "6.24.1", - "babel-core": "6.25.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-preset-env": "1.5.2", - "babel-preset-react": "6.24.1", - "fetch": "^1.1.0", - "file-system": "^2.2.2", - "node-fetch": "^2.6.1", - "stream": "0.0.2", - "stream-to-string": "^1.2.0", - "ts-node": "^9.0.0" - } -} diff --git a/javascriptv3/example_code/cross-services/transcription-app/setup.yaml b/javascriptv3/example_code/cross-services/transcription-app/setup.yaml deleted file mode 100644 index 9b4b539eba1..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/setup.yaml +++ /dev/null @@ -1,377 +0,0 @@ -Resources: - transcriptionsB38FCF73: - Type: AWS::S3::Bucket - Properties: - AccessControl: PublicRead - CorsConfiguration: - CorsRules: - - AllowedHeaders: - - "*" - AllowedMethods: - - GET - - POST - - PUT - - DELETE - AllowedOrigins: - - "*" - UpdateReplacePolicy: Delete - DeletionPolicy: Delete - Metadata: - aws:cdk:path: SetupStack/transcriptions/Resource - transcriptionsPolicy3F622C3C: - Type: AWS::S3::BucketPolicy - Properties: - Bucket: - Ref: transcriptionsB38FCF73 - PolicyDocument: - Statement: - - Action: s3:* - Condition: - Bool: - aws:SecureTransport: "false" - Effect: Deny - Principal: - AWS: "*" - Resource: - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - Fn::Join: - - "" - - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - /* - - Action: s3:GetObject - Effect: Allow - Principal: - AWS: "*" - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - /* - - Action: "*" - Effect: Allow - Principal: - AWS: - Fn::Join: - - "" - - - "arn:" - - Ref: AWS::Partition - - ":iam::" - - Ref: AWS::AccountId - - :root - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - /* - - Action: s3:PutObject - Effect: Allow - Principal: - AWS: "*" - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - /* - - Action: s3:DeleteObject - Effect: Allow - Principal: - AWS: "*" - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - transcriptionsB38FCF73 - - Arn - - /* - Version: "2012-10-17" - Metadata: - aws:cdk:path: SetupStack/transcriptions/Policy/Resource - appbucket8B6BC946: - Type: AWS::S3::Bucket - Properties: - PublicAccessBlockConfiguration: - BlockPublicAcls: true - BlockPublicPolicy: false - IgnorePublicAcls: true - RestrictPublicBuckets: false - WebsiteConfiguration: - ErrorDocument: index.html - IndexDocument: index.html - UpdateReplacePolicy: Delete - DeletionPolicy: Delete - Metadata: - aws:cdk:path: SetupStack/appbucket/Resource - appbucketPolicy820C1410: - Type: AWS::S3::BucketPolicy - Properties: - Bucket: - Ref: appbucket8B6BC946 - PolicyDocument: - Statement: - - Action: s3:* - Condition: - Bool: - aws:SecureTransport: "false" - Effect: Deny - Principal: - AWS: "*" - Resource: - - Fn::GetAtt: - - appbucket8B6BC946 - - Arn - - Fn::Join: - - "" - - - Fn::GetAtt: - - appbucket8B6BC946 - - Arn - - /* - - Action: s3:GetObject - Effect: Allow - Principal: - AWS: "*" - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - appbucket8B6BC946 - - Arn - - /* - - Action: s3:PutObject - Effect: Allow - Principal: - AWS: "*" - Resource: - Fn::Join: - - "" - - - Fn::GetAtt: - - appbucket8B6BC946 - - Arn - - /* - Version: "2012-10-17" - Metadata: - aws:cdk:path: SetupStack/appbucket/Policy/Resource - exampleuserpoolid164CBD80: - Type: AWS::Cognito::UserPool - Properties: - AccountRecoverySetting: - RecoveryMechanisms: - - Name: verified_phone_number - Priority: 1 - - Name: verified_email - Priority: 2 - AdminCreateUserConfig: - AllowAdminCreateUserOnly: false - AutoVerifiedAttributes: - - email - EmailVerificationMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} - EmailVerificationSubject: Verify your email for our awesome app! - Schema: - - Mutable: false - Name: email - Required: true - SmsVerificationMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} - UserPoolName: ExampleUserPoolName-3962209636 - VerificationMessageTemplate: - DefaultEmailOption: CONFIRM_WITH_CODE - EmailMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} - EmailSubject: Verify your email for our awesome app! - SmsMessage: Hello, Thanks for signing up to our awesome app! Your verification code is {####} - UpdateReplacePolicy: Retain - DeletionPolicy: Retain - Metadata: - aws:cdk:path: SetupStack/exampleuserpoolid/Resource - exampleuserpoolidCognitoDomain6126F7CC: - Type: AWS::Cognito::UserPoolDomain - Properties: - Domain: exampleuserpoolname-9212204094 - UserPoolId: - Ref: exampleuserpoolid164CBD80 - Metadata: - aws:cdk:path: SetupStack/exampleuserpoolid/CognitoDomain/Resource - ExampleUserPoolClientA3BAC0B9: - Type: AWS::Cognito::UserPoolClient - Properties: - UserPoolId: - Ref: exampleuserpoolid164CBD80 - AllowedOAuthFlows: - - implicit - - code - AllowedOAuthFlowsUserPoolClient: true - AllowedOAuthScopes: - - profile - - phone - - email - - openid - - aws.cognito.signin.user.admin - CallbackURLs: - - Fn::Join: - - "" - - - https://s3. - - Ref: AWS::Region - - "." - - Ref: AWS::URLSuffix - - / - - Ref: appbucket8B6BC946 - - /index.html - ClientName: ExampleUserPoolName-1269134866 - SupportedIdentityProviders: - - COGNITO - Metadata: - aws:cdk:path: SetupStack/ExampleUserPoolClient/Resource - ExampleIdentityPool: - Type: AWS::Cognito::IdentityPool - Properties: - AllowUnauthenticatedIdentities: false - CognitoIdentityProviders: - - ClientId: - Ref: ExampleUserPoolClientA3BAC0B9 - ProviderName: - Fn::GetAtt: - - exampleuserpoolid164CBD80 - - ProviderName - Metadata: - aws:cdk:path: SetupStack/ExampleIdentityPool - ExampleCognitoDefaultAuthenticatedRole37F17AF0: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRoleWithWebIdentity - Condition: - StringEquals: - cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPool - ForAnyValue:StringLike: - cognito-identity.amazonaws.com:amr: authenticated - Effect: Allow - Principal: - Federated: cognito-identity.amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: SetupStack/ExampleCognitoDefaultAuthenticatedRole/Resource - ExampleCognitoDefaultAuthenticatedRoleDefaultPolicy7CE891FB: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: - - mobileanalytics:PutEvents - - cognito-sync:* - - cognito-identity:* - Effect: Allow - Resource: "*" - - Action: sns:* - Effect: Allow - Resource: "*" - - Action: - - transcribe:StartTranscriptionJob - - transcribe:GetTranscriptionJob - Effect: Allow - Resource: "*" - Version: "2012-10-17" - PolicyName: ExampleCognitoDefaultAuthenticatedRoleDefaultPolicy7CE891FB - Roles: - - Ref: ExampleCognitoDefaultAuthenticatedRole37F17AF0 - Metadata: - aws:cdk:path: SetupStack/ExampleCognitoDefaultAuthenticatedRole/DefaultPolicy/Resource - DefaultValid: - Type: AWS::Cognito::IdentityPoolRoleAttachment - Properties: - IdentityPoolId: - Ref: ExampleIdentityPool - Roles: - authenticated: - Fn::GetAtt: - - ExampleCognitoDefaultAuthenticatedRole37F17AF0 - - Arn - Metadata: - aws:cdk:path: SetupStack/DefaultValid - CDKMetadata: - Type: AWS::CDK::Metadata - Properties: - Analytics: v2:deflate64:H4sIAAAAAAAA/01POw7CMAw9C3swLTAwAmVhQ0UcoEoNmLaxlKQgFOXuJP3QTu/j5yc7hXWyhWSxLz5mKctq5SRrBHe1haxExspY3UorsrvK0XCrJUYeBiVZYuVFXHRmA+7Yygq75MB6uHBN8jvZvfZC8kORZXA3g/rCXMfIn4/kxE1Baj4anFFmNaGy88DknMtAyH7H9rnOucaDDV8+m2B6QUUDLprdqxGnw4eTvReKS4SXWb3THaRrSBcvQ7TUbahtEPIef4oL19tUAQAA - Metadata: - aws:cdk:path: SetupStack/CDKMetadata/Default - Condition: CDKMetadataAvailable -Conditions: - CDKMetadataAvailable: - Fn::Or: - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - af-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-east-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ap-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ca-central-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-north-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-northwest-1 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - eu-central-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-north-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-south-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-2 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-3 - - Fn::Equals: - - Ref: AWS::Region - - me-south-1 - - Fn::Equals: - - Ref: AWS::Region - - sa-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-2 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - us-west-1 - - Fn::Equals: - - Ref: AWS::Region - - us-west-2 diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/helper.js b/javascriptv3/example_code/cross-services/transcription-app/src/helper.js deleted file mode 100644 index f9ddd5a7eeb..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/src/helper.js +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -Purpose: -helper.js is part of a tutorial demonstrating how to build and deploy an app that transcribes and displays -voice recordings for authenticated users. To run the full tutorial, see -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -Running the code: -For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -*/ -// This file contains vanilla JavaScript helper functions for user interface. - -// snippet-start:[transcribe.JavaScript.recording-app.helper] - -window.downloadInnerHtml = function (filename, elId, mimeType) { - var elHtml = document.getElementById(elId).innerHTML; - var link = document.createElement("a"); - mimeType = mimeType || "text/plain"; - link.setAttribute("download", filename); - link.setAttribute( - "href", - "data:" + mimeType + ";charset=utf-8," + encodeURIComponent(elHtml) - ); - link.click(); -}; - -// Delete a row from the user interface. -window.deleteRow = function (rowid) { - const row = document.getElementById(rowid); - row.parentNode.removeChild(row); -}; - -// Display transcription details on user interface. -window.displayTranscriptionDetails = function ( - i, - outputJSONTime, - jobName, - outputJSON -) { - var table = document.getElementById("myTable"); - var row = table.insertRow(1); - var cell1 = row.insertCell(0); - var cell2 = row.insertCell(1); - var cell3 = row.insertCell(2); - var cell4 = row.insertCell(3); - cell1.innerHTML = "

"; - cell2.innerHTML = "

"; - cell3.innerHTML = ""; - cell4.innerHTML = ""; - document.getElementById(i).innerHTML = outputJSON; - row.setAttribute("id", "row" + i); - document - .getElementById("download") - .setAttribute( - "onclick", - "downloadInnerHtml('output.txt','" + i + "','text')" - ); - document.getElementById("dateTime").innerHTML = outputJSONTime; - document - .getElementById("delete") - .setAttribute( - "onclick", - "deleteRow(" + "'" + "row" + i + "'); deleteJSON(" + "'" + jobName + "')" - ); -}; - -// Strips the token ID from the app URL after authentication. -window.getToken = function () { - var idtoken = window.location.href; - var idtoken1 = idtoken.split("=")[1]; - var idtoken2 = idtoken1.split("&")[0]; - var idtoken3 = idtoken2.split("&")[0]; - return idtoken3; -}; - -window.getAccessToken = function () { - var accesstoken = window.location.href; - var accesstoken1 = accesstoken.split("=")[2]; - var accesstoken2 = accesstoken1.split("&")[0]; - return accesstoken2; -}; -// snippet-end:[transcribe.JavaScript.recording-app.helper] diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/index.html b/javascriptv3/example_code/cross-services/transcription-app/src/index.html deleted file mode 100644 index 97ca500615c..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/src/index.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - title - - - - -

Record

-

- - -

- - -

- -

- -

My transcriptions

-
- - - - - - - -
Time createdTransciptionDownloadDelete
- - - - - diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/index.js b/javascriptv3/example_code/cross-services/transcription-app/src/index.js deleted file mode 100644 index e16bb76f2c5..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/src/index.js +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -Purpose: -index.js is part of a tutorial demonstrating how to build and deploy an app that transcribes and displays -voice recordings for authenticated users. To run the full tutorial, see -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -Inputs (replace in code): -- COGNITO_ID -- ID_TOKEN -- BUCKET -- REGION -- IDENTITY_POOL_ID - -Running the code: -For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -[Outputs | Returns]: - -*/ -// snippet-start:[transcribe.JavaScript.recording-app.config] -// Import the required AWS SDK clients and commands for Node.js -import "./helper.js"; -import "./recorder.js"; -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { - CognitoIdentityProviderClient, - GetUserCommand, -} from "@aws-sdk/client-cognito-identity-provider"; -import { S3RequestPresigner } from "@aws-sdk/s3-request-presigner"; -import { createRequest } from "@aws-sdk/util-create-request"; -import { formatUrl } from "@aws-sdk/util-format-url"; -import { - TranscribeClient, - StartTranscriptionJobCommand, -} from "@aws-sdk/client-transcribe"; -import { - S3Client, - PutObjectCommand, - GetObjectCommand, - ListObjectsCommand, - DeleteObjectCommand, -} from "@aws-sdk/client-s3"; -import fetch from "node-fetch"; - -// Set the parameters. -// 'COGINTO_ID' has the format 'cognito-idp.eu-west-1.amazonaws.com/COGNITO_ID'. -let COGNITO_ID = "COGNITO_ID"; -// Get the Amazon Cognito ID token for the user. 'getToken()' is in 'helper.js'. -let idToken = getToken(); -let loginData = { - [COGNITO_ID]: idToken, -}; - -const params = { - Bucket: "BUCKET", // The Amazon Simple Storage Solution (S3) bucket to store the transcriptions. - Region: "REGION", // The AWS Region - identityPoolID: "IDENTITY_POOL_ID", // Amazon Cognito Identity Pool ID. -}; - -// Create an Amazon Transcribe service client object. -const client = new TranscribeClient({ - region: params.Region, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: params.Region }), - identityPoolId: params.identityPoolID, - logins: loginData, - }), -}); - -// Create an Amazon S3 client object. -const s3Client = new S3Client({ - region: params.Region, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: params.Region }), - identityPoolId: params.identityPoolID, - logins: loginData, - }), -}); -// snippet-end:[transcribe.JavaScript.recording-app.config] -// snippet-start:[transcribe.JavaScript.recording-app.onload] -window.onload = async () => { - // Set the parameters. - const userParams = { - // Get the access token. 'GetAccessToken()' is in 'helper.js'. - AccessToken: getAccessToken(), - }; - // Create a CognitoIdentityProviderClient client object. - const client = new CognitoIdentityProviderClient({ region: params.Region }); - try { - const data = await client.send(new GetUserCommand(userParams)); - const username = data.Username; - // Export username for use in 'recorder.js'. - exports.username = username; - try { - // If this is user's first sign-in, create a folder with user's name in Amazon S3 bucket. - // Otherwise, no effect. - const Key = `${username}/`; - try { - const data = await s3Client.send( - new PutObjectCommand({ Key: Key, Bucket: params.Bucket }) - ); - console.log("Folder created for user ", data.Username); - } catch (err) { - console.log("Error", err); - } - try { - // Get a list of the objects in the Amazon S3 bucket. - const data = await s3Client.send( - new ListObjectsCommand({ Bucket: params.Bucket, Prefix: username }) - ); - // Create a variable for the list of objects in the Amazon S3 bucket. - const output = data.Contents; - // Loop through the objects, populating a row on the user interface for each object. - for (var i = 0; i < output.length; i++) { - var obj = output[i]; - const objectParams = { - Bucket: params.Bucket, - Key: obj.Key, - }; - // Get the name of the object from the Amazon S3 bucket. - const data = await s3Client.send(new GetObjectCommand(objectParams)); - // Extract the body contents, a readable stream, from the returned data. - const result = data.Body; - // Create a variable for the string version of the readable stream. - let stringResult = ""; - // Use 'yieldUnit8Chunks' to convert the readable streams into JSON. - for await (let chunk of yieldUint8Chunks(result)) { - stringResult += String.fromCharCode.apply(null, chunk); - } - // The setTimeout function waits while readable stream is converted into JSON. - setTimeout(function () { - // Parse JSON into human readable transcript, which will be displayed on user interface (UI). - const outputJSON = - JSON.parse(stringResult).results.transcripts[0].transcript; - // Create name for transcript, which will be displayed. - const outputJSONTime = JSON.parse(stringResult) - .jobName.split("/")[0] - .replace("-job", ""); - i++; - // - // Display the details for the transcription on the UI. - // 'displayTranscriptionDetails()' is in 'helper.js'. - displayTranscriptionDetails( - i, - outputJSONTime, - objectParams.Key, - outputJSON - ); - }, 1000); - } - } catch (err) { - console.log("Error", err); - } - } catch (err) { - console.log("Error creating presigned URL", err); - } - } catch (err) { - console.log("Error", err); - } -}; - -// Convert readable streams. -async function* yieldUint8Chunks(data) { - const reader = data.getReader(); - try { - while (true) { - const { done, value } = await reader.read(); - if (done) return; - yield value; - } - } finally { - reader.releaseLock(); - } -} -// snippet-end:[transcribe.JavaScript.recording-app.onload] -// snippet-start:[transcribe.JavaScript.recording-app.create-transcriptions] - -// Upload recordings to Amazon S3 bucket -window.upload = async function (blob, userName) { - // Set the parameters for the recording recording. - const Key = `${userName}/test-object-${Math.ceil(Math.random() * 10 ** 10)}`; - let signedUrl; - - // Create a presigned URL to upload the transcription to the Amazon S3 bucket when it is ready. - try { - // Create an Amazon S3RequestPresigner object. - const signer = new S3RequestPresigner({ ...s3Client.config }); - // Create the request. - const request = await createRequest( - s3Client, - new PutObjectCommand({ Key, Bucket: params.Bucket }) - ); - // Define the duration until expiration of the presigned URL. - const expiration = new Date(Date.now() + 60 * 60 * 1000); - // Create and format the presigned URL. - signedUrl = formatUrl(await signer.presign(request, expiration)); - console.log(`\nPutting "${Key}"`); - } catch (err) { - console.log("Error creating presigned URL", err); - } - try { - // Upload the object to the Amazon S3 bucket using a presigned URL. - response = await fetch(signedUrl, { - method: "PUT", - headers: { - "content-type": "application/octet-stream", - }, - body: blob, - }); - // Create the transcription job name. In this case, it's the current date and time. - const today = new Date(); - const date = - today.getFullYear() + - "-" + - (today.getMonth() + 1) + - "-" + - today.getDate(); - const time = - today.getHours() + "-" + today.getMinutes() + "-" + today.getSeconds(); - const jobName = date + "-time-" + time; - - // Call the "createTranscriptionJob()" function. - createTranscriptionJob( - "s3://" + params.Bucket + "/" + Key, - jobName, - params.Bucket, - Key - ); - } catch (err) { - console.log("Error uploading object", err); - } -}; - -// Create the AWS Transcribe transcription job. -const createTranscriptionJob = async (recording, jobName, bucket, key) => { - // Set the parameters for transcriptions job - const params = { - TranscriptionJobName: jobName + "-job", - LanguageCode: "en-US", // For example, 'en-US', - OutputBucketName: bucket, - OutputKey: key, - Media: { - MediaFileUri: recording, // For example, "https://transcribe-demo.s3-REGION.amazonaws.com/hello_world.wav" - }, - }; - try { - // Start the transcription job. - const data = await client.send(new StartTranscriptionJobCommand(params)); - console.log("Success - transcription submitted", data); - } catch (err) { - console.log("Error", err); - } -}; -// snippet-end:[transcribe.JavaScript.recording-app.create-transcriptions] -// snippet-start:[transcribe.JavaScript.recording-app.delete-transcriptions] -// Delete a transcription from the Amazon S3 bucket. -window.deleteJSON = async (jsonFileName) => { - try { - await s3Client.send( - new DeleteObjectCommand({ - Bucket: params.Bucket, - Key: jsonFileName, - }) - ); - console.log("Success - JSON deleted"); - } catch (err) { - console.log("Error", err); - } -}; -// Delete a row from the user interface. -window.deleteRow = function (rowid) { - const row = document.getElementById(rowid); - row.parentNode.removeChild(row); -}; -// snippet-end:[transcribe.JavaScript.recording-app.delete-transcriptions] diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/recorder.css b/javascriptv3/example_code/cross-services/transcription-app/src/recorder.css deleted file mode 100644 index 00fd49556a4..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/src/recorder.css +++ /dev/null @@ -1,66 +0,0 @@ -#record { - background-color: red; - border-width: medium; - border-color: black; - color: white; - padding: 20px; - text-align: center; - text-decoration: none; - display: inline-block; - font-size: 16px; - margin: 4px 2px; - cursor: pointer; - max-width: 50%; - max-height: 15%; - border-radius: 50%; - left: 100px; - right: 100px; - position: relative; -} -#stopRecord { - background-color: green; - border-width: medium; - border-color: black; - color: white; - padding: 20px; - text-align: center; - text-decoration: none; - display: inline-block; - font-size: 16px; - margin: 4px 2px; - cursor: pointer; - max-width: 50%; - max-height: 15%; - border-radius: 50%; - left: 100px; - right: 100px; - position: relative; -} -#convertRecord { - background-color: brown; /* Green */ - border-width: medium; - border-color: black; - color: white; - padding: 20px; - text-align: center; - text-decoration: none; - display: inline-block; - font-size: 16px; - margin: 4px 2px; - cursor: pointer; - max-width: 50%; - max-height: 15%; - border-radius: 50%; - left: 100px; - right: 100px; - position: relative; -} -h2 { - left: 100px; - position: relative; -} -#recordedAudio { - left: 100px; - right: 100px; - position: relative; -} diff --git a/javascriptv3/example_code/cross-services/transcription-app/src/recorder.js b/javascriptv3/example_code/cross-services/transcription-app/src/recorder.js deleted file mode 100644 index 51bb79841dc..00000000000 --- a/javascriptv3/example_code/cross-services/transcription-app/src/recorder.js +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/transcribe-app.html. - -Purpose: -recorder.js is part of a tutorial demonstrating how to build and deploy an app that transcribes and displays -voice recordings for authenticated users. To run the full tutorial, see -https://docs.aws.amazon.comsdk-for-javascript/v3/developer-guide/transcribe-app.html. - -*/ - -// snippet-start:[transcribe.JavaScript.recording-app.recorder] - -// Functions for recording transcriptions. -// Enable microphone on browser. -import "./helper.js"; -import index from "./index.js"; -navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { - handlerFunction(stream); -}); - -// This is a handler function to manage recordings. -function handlerFunction(stream) { - let rec; - rec = new MediaRecorder(stream); - rec.ondataavailable = (e) => { - audioChunks.push(e.data); - if (rec.state == "inactive") { - let blob = new Blob(audioChunks, { type: "audio/mpeg-3" }); - var recordedAudio = document.getElementById("recordedAudio"); - recordedAudio.src = URL.createObjectURL(blob); - recordedAudio.controls = true; - recordedAudio.autoplay = true; - // Take username from 'index.js'. - var username = index.username; - // The upload function is in 'index.js'. - upload(blob, username); - alert("Refresh page in ~1 min to view your transcription."); - } - }; -} - -// Start recording. -window.startRecord = function () { - console.log("Recording started"); - var record = document.getElementById("record"); - var stop = document.getElementById("stopRecord"); - record.disabled = true; - record.style.backgroundColor = "blue"; - stop.disabled = false; - rec.start(); -}; - -// Stop recording. -window.stopRecord = function () { - console.log("Recording stopped"); - var record = document.getElementById("record"); - var stop = document.getElementById("stopRecord"); - record.disabled = false; - stop.disabled = true; - record.style.backgroundColor = "red"; - rec.stop(); -}; - -// snippet-end:[transcribe.JavaScript.recording-app.recorder] diff --git a/resources/cdk/javascript_example_code_transcribe_demo/cdk.json b/resources/cdk/javascript_example_code_transcribe_demo/cdk.json deleted file mode 100644 index 90acb5637f9..00000000000 --- a/resources/cdk/javascript_example_code_transcribe_demo/cdk.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "app": "npx ts-node --prefer-ts-exts setup.ts", - "context": { - "@aws-cdk/core:enableStackNameDuplicates": "true", - "aws-cdk:enableDiffNoFail": "true", - "@aws-cdk/core:stackRelativeExports": "true", - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true - } -} diff --git a/resources/cdk/javascript_example_code_transcribe_demo/package-lock.json b/resources/cdk/javascript_example_code_transcribe_demo/package-lock.json deleted file mode 100644 index 69ab87d0513..00000000000 --- a/resources/cdk/javascript_example_code_transcribe_demo/package-lock.json +++ /dev/null @@ -1,18523 +0,0 @@ -{ - "name": "setup", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "setup", - "version": "0.1.0", - "dependencies": { - "@aws-cdk/aws-cognito": "^1.204.0", - "@aws-cdk/aws-iam": "^1.204.0", - "@aws-cdk/core": "^1.204.0", - "source-map-support": "^0.5.16" - }, - "bin": { - "setup": "setup.js" - }, - "devDependencies": { - "@aws-cdk/assert": "1.79.0", - "@types/jest": "^26.0.10", - "@types/node": "10.17.27", - "aws-cdk": "1.77.0", - "jest": "^26.4.2", - "ts-jest": "^26.2.0", - "ts-node": "^9.0.0", - "typescript": "~3.9.7" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@aws-cdk/assert": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/assert/-/assert-1.79.0.tgz", - "integrity": "sha512-wCiMyxhtUz82blUlSnfoqpHdSjgFOkjpunjgxT2aG5Y6RTN0ExOOm9pdKDdXnul0zml6ZvfOL51wDG0Udg7zFg==", - "dev": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "@aws-cdk/cloudformation-diff": "1.79.0", - "@aws-cdk/core": "1.79.0", - "@aws-cdk/cx-api": "1.79.0", - "constructs": "^3.2.0" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.79.0", - "constructs": "^3.2.0", - "jest": "^26.6.3" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.79.0.tgz", - "integrity": "sha512-I+2GbQfbPy6TewnGbviE1W8cUhgBEA1mQLYm5gBj/Rzix1tCyaNvfYsBU3ipg3jIATpHsg1CzUq0zrumUnmnTg==", - "bundleDependencies": [ - "fs-extra", - "minimatch", - "@balena/dockerignore", - "ignore" - ], - "dev": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "@aws-cdk/cx-api": "1.79.0", - "@aws-cdk/region-info": "1.79.0", - "@balena/dockerignore": "^1.0.2", - "constructs": "^3.2.0", - "fs-extra": "^9.0.1", - "ignore": "^5.1.8", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "@aws-cdk/cx-api": "1.79.0", - "@aws-cdk/region-info": "1.79.0", - "constructs": "^3.2.0" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/@balena/dockerignore": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/balanced-match": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/fs-extra": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/graceful-fs": { - "version": "4.2.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/ignore": { - "version": "5.1.8", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/jsonfile": { - "version": "6.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/minimatch": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/core/node_modules/universalify": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-cdk/assert/node_modules/@aws-cdk/region-info": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.79.0.tgz", - "integrity": "sha512-klnXCc1Cd/krE4VOXJ1Blvey8ucPRzuwgGacPsCV2ugMSlaJSbdGqKzTUNxcK2o8g9PaEuJ5lNjfwqqyvp571g==", - "dev": true, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - } - }, - "node_modules/@aws-cdk/assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/assets/-/assets-1.204.0.tgz", - "integrity": "sha512-rY9YHZ3gUWr+dLwTwSUWYbIfk/AXy4JZRkhLbunrtzjQhH+QMm/2IWIebfBGu+A5AlVRaFbRLonReuGP5WZoUQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/assets/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-acmpca": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-acmpca/-/aws-acmpca-1.204.0.tgz", - "integrity": "sha512-2zyuQZwynwkz2qiuFDp088tglWXKX3q7saWRDqeuq2n2HE6PGuQRjd4zjl9nDGUVxQYtzzXyEuPyaEta8fg9lQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-applicationautoscaling": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.204.0.tgz", - "integrity": "sha512-sEe2NODKUowJx2guM2SPfs/20gGdBq1C09M32b8c1im7K+PqQkHkE156nyz5Ml0hpsNeCZlRS17oKZ042aZevQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-autoscaling-common": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-autoscaling-common": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-autoscaling-common": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.204.0.tgz", - "integrity": "sha512-P+PwbTaj28Eg9+/U9ZTXTh1gA7L9Z45GL+9xcEZvEqAkJt9MNgzZICavVZu1sMD74foK1r1ZOBXTsqV6wEiltQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-certificatemanager": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.204.0.tgz", - "integrity": "sha512-ZLykfAOb5Zbg/MFtzA+eHhMAK1xL32+oHKSK6tAYrgvv2aS42wJE4zSBV6jGCjnCkhcliUd5pwnACEl3ib0KLw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-acmpca": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-route53": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-acmpca": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-route53": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-cloudformation": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.204.0.tgz", - "integrity": "sha512-9PkZa9mKLneB0My8wJC7lLZmPJsnOxNYy57ZZlRCQhK0eO6Jc9eVqrI29537W+3ireaEjCLEitkb8NO1FN/kQA==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-cloudformation/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-cloudwatch": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.204.0.tgz", - "integrity": "sha512-ADT2D+4FtB9Zcy/TlF2tswQmjmrPVgORYTkznQQ2SniCODHWzz558+G1RV+IVvWRdH7nYQtV0UEuGZKpffWh2w==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-codeguruprofiler": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.204.0.tgz", - "integrity": "sha512-IrgY4SmVf9p5POfHm8BsPzaAO5lQTG7nhb5qN5AzS6zKCTuEjjTNHjx1TOfPV12mMIDAIVsK91mjDlAR88Mjbg==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-codestarnotifications": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codestarnotifications/-/aws-codestarnotifications-1.204.0.tgz", - "integrity": "sha512-t//hSpC5/uVW2321YlbGabNVzhWayvqz+xSnagADGcT9qiq3KQR/uUlrgpHv1/eHRMk7EMrY9prlXeZpfzZ+cw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-cognito": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cognito/-/aws-cognito-1.204.0.tgz", - "integrity": "sha512-7QIbExW9dn1fktpDOh2nMHmor2S3uuHtIX5y33lc9OKg3xUuYw4AZ67MKapunN7QUBlffTlNzoUqlHoNSab+Zg==", - "bundleDependencies": [ - "punycode" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-certificatemanager": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69", - "punycode": "^2.3.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-certificatemanager": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-cognito/node_modules/punycode": { - "version": "2.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@aws-cdk/aws-ec2": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ec2/-/aws-ec2-1.204.0.tgz", - "integrity": "sha512-SoqZEgzdfPW0aa+FQ0CjzbDG+X+sDu6/BnLL2O10lxpa+9Dc1iyArAqNKFJG5KXGJe9ibvQXyNQqEjeGRFc22Q==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-ssm": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-ssm": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-ecr": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr/-/aws-ecr-1.204.0.tgz", - "integrity": "sha512-oCts9e+ackWoFHeyn/3oKm3X1lSizleWNNXHp5WGM38lpNVrtCLMKSShu5iXJBhqRH2Mz1AcA4fDMWhe8DvJFA==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.204.0.tgz", - "integrity": "sha512-2GHD3pZdDoPxq3HhD4czANuI7TMoxpjszbzsQAc2wbdMX1j+K4vIL+PBpj3altfscPqcvy1v70lBjbG5rcBIkQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ecr-assets/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-efs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-efs/-/aws-efs-1.204.0.tgz", - "integrity": "sha512-FB6nHgCuzYF5K9ywqYPEPjL2G1ATLIR9dJp1p4ydcEUuXDb4KSEVN4Bgx+q1e7EkWGIq+9glr+ckheEcTvETgw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-events": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-events/-/aws-events-1.204.0.tgz", - "integrity": "sha512-KnfUmtv+4RhydD9+5CHFxNJxtgn7+Xftwfwg1G7qV/tWYPFHcNIvhlSOgwDrQPa+pTo1MmkiUN0lAR0G8B/cbw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-iam": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-iam/-/aws-iam-1.204.0.tgz", - "integrity": "sha512-Fh2egW3v/uDdw3m4jvcupS7COL/+sJl2NHjz9l298ddyMxqDwJD2NQwE8mvgPLK4rDtAtDnE0c8RS6d+NWiC+w==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-iam/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-kms": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-kms/-/aws-kms-1.204.0.tgz", - "integrity": "sha512-iryZQ428L1VUVQ0zE96XTWWX7ANVtDrb6x+ZXXLTVUEPgjEd/W6zlcp++Qi0A3a9HLNd4PbEhK9rs0UKNTylzw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-lambda": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda/-/aws-lambda-1.204.0.tgz", - "integrity": "sha512-r0XXovrLAx8Q8Fz915SwzyQM/KLhEB6YCp3CsWliFGSOHEjRP8yX8UZdEJqe5kYD7Th9JAhUVzKgyv20P7g5Tg==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-applicationautoscaling": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codeguruprofiler": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-ecr-assets": "1.204.0", - "@aws-cdk/aws-efs": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-signer": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-applicationautoscaling": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codeguruprofiler": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-ecr-assets": "1.204.0", - "@aws-cdk/aws-efs": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-signer": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-lambda/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-logs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-logs/-/aws-logs-1.204.0.tgz", - "integrity": "sha512-PuHsDSkX6JFBgldxViGw91eFLageJ2cX89/RyLbWaJJUV4tlUKXSmmkVgOaBmvil0QKuGqbOzLXcXCoIK9Sg3A==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-logs/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-route53": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-route53/-/aws-route53-1.204.0.tgz", - "integrity": "sha512-wQpGUXqc2y7yJFTipfuVxWy/VGeshyGlfGl4evusQK9Md0DMpVmG8kRgazLk1myqUSNSfi643UwvDJqNbYmdnA==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-route53/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-s3": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3/-/aws-s3-1.204.0.tgz", - "integrity": "sha512-jsQ4n1L4MdPYDirBoOYgg7yzSk1TaFYo4dnwDlKiLJ5LcHG3Nai1cHb9XQbCy/9KKqbWsbd3WlkH+vcWEl8EUA==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-s3-assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.204.0.tgz", - "integrity": "sha512-3MQbVZ95wW29Bl63tqu0Bz0td3osLyGg352l5G7Ztf3nK35FpuQlgxO4kcu74+s2sRwdd/R4KFV6eWhhPk+J7g==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3-assets/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-s3/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/aws-signer": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-signer/-/aws-signer-1.204.0.tgz", - "integrity": "sha512-AI26FhWF3+f/vDh3mleQa2CXv2/CmSerXgyk4XHMVVTTCjnlYGGmHmGlzYhqOSw6ALpQNdOSw8GVxU/ySpQCaw==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-sns": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sns/-/aws-sns-1.204.0.tgz", - "integrity": "sha512-KoWxqKT/dTjt9Pk0a3kJLcd6xZHvrwbZDC0mrLtxdRNhQoHmnURAHW2UqX/lefrCU1GcUFf4L58N9ehBTunAFQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codestarnotifications": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codestarnotifications": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-sqs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sqs/-/aws-sqs-1.204.0.tgz", - "integrity": "sha512-dVzuGMh6d5/X9P9jel1w2Wgdy5MuSE35+eBSFxN+S7oJRoVSARpyKMNYAPMCW+2OJCDw7fIqO1rWbsZBT1Gq8g==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-ssm": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ssm/-/aws-ssm-1.204.0.tgz", - "integrity": "sha512-yYx7HZ8cWNXDAmX/99WkB477QhLoV2rcB8orei8aj7nRkNq5TMjeox0IJaZVgU+edNEDOi1fVX3flh0SAMiUrg==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/cfnspec": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-1.79.0.tgz", - "integrity": "sha512-rbBhox7hzXPXk2n+1BDjsmiz/0W9ZHv3NeCKiq94WfHW6Jj4mSjtGs7ZUBFq8JkkgYVsE9ktH1634wt9A9fbRg==", - "dev": true, - "dependencies": { - "md5": "^2.3.0" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.79.0.tgz", - "integrity": "sha512-n2ARtOXIUq3FdJ1EBuHzsM0DQau6ZwHprPhpk1xc5bv21s7D5X5ECe06eC0K5xC5ZyfC13BDWu1f+xFh+krnYA==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "dev": true, - "dependencies": { - "jsonschema": "^1.4.0", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/cloudformation-diff": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-1.79.0.tgz", - "integrity": "sha512-GsX8Br7E0/2W2ugntO4zXodbApVi2C+AP/6QtTX6fasZbgZSwe8gjiXYPQ6EvtgjlWnYxPTn6vHRlb53vDFzMg==", - "dev": true, - "dependencies": { - "@aws-cdk/cfnspec": "1.79.0", - "colors": "^1.4.0", - "diff": "^5.0.0", - "fast-deep-equal": "^3.1.3", - "string-width": "^4.2.0", - "table": "^6.0.4" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - } - }, - "node_modules/@aws-cdk/core": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.204.0.tgz", - "integrity": "sha512-yO/flJ9ihpzRhLTEqlbdbuPGtyyghHiiQPkUTLslwUM5vThVTbpgvW4UQHSGqytyst4MYXrN2jQn2RkwIRU57g==", - "bundleDependencies": [ - "fs-extra", - "minimatch", - "@balena/dockerignore", - "ignore" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "@balena/dockerignore": "^1.0.2", - "constructs": "^3.3.69", - "fs-extra": "^9.1.0", - "ignore": "^5.2.4", - "minimatch": "^3.1.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "bundleDependencies": [ - "semver" - ], - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.204.0" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cx-api/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/core/node_modules/@balena/dockerignore": { - "version": "1.0.2", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/@aws-cdk/core/node_modules/at-least-node": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@aws-cdk/core/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@aws-cdk/core/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@aws-cdk/core/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@aws-cdk/core/node_modules/fs-extra": { - "version": "9.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/core/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@aws-cdk/core/node_modules/ignore": { - "version": "5.2.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@aws-cdk/core/node_modules/jsonfile": { - "version": "6.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@aws-cdk/core/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/core/node_modules/universalify": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-cdk/custom-resources": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/custom-resources/-/custom-resources-1.204.0.tgz", - "integrity": "sha512-0w3oi7LnAtMZpf7uUBDH6aT2Oo1EBQrqD+VTvPZDX8PJFAox8ol7buZ9sSTpIXgv9j/GK9yaPTIHt4m8ok9kVQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "dependencies": { - "@aws-cdk/aws-cloudformation": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@aws-cdk/aws-cloudformation": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "node_modules/@aws-cdk/cx-api": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.79.0.tgz", - "integrity": "sha512-ymQOqHcPzYhrcQ4swMgw5JzAaOm+PehH1cepsxi/Wq2zNOXkyN9o6Hw6l+eDpezFvNIKFy4mMAo6FR9xRCUiow==", - "bundleDependencies": [ - "semver" - ], - "dev": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "1.79.0" - } - }, - "node_modules/@aws-cdk/cx-api/node_modules/semver": { - "version": "7.3.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@aws-cdk/region-info": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.204.0.tgz", - "integrity": "sha512-lPkYJNoN4Gjlf0Fdfgcd1RTm5RD9qtfaFMwVvTn2KGTr7ZqmFskGQ9FqIcd5vd6GmsbAL8OrFOToLr1AHDuOiQ==", - "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "node-notifier": "^8.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "26.0.24", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", - "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", - "dev": true, - "dependencies": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "node_modules/@types/node": { - "version": "10.17.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.27.tgz", - "integrity": "sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/aws-cdk": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-1.77.0.tgz", - "integrity": "sha512-DM0ELcihYV9K7EtEeZZrViwjQUHb/G3CDFPSPQ39d5XuCEcQmnDSuJ6LQ2jFUbZE+Qsj+lmUp+WM1j66kJT9HA==", - "dev": true, - "hasShrinkwrap": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "@aws-cdk/cloudformation-diff": "1.77.0", - "@aws-cdk/cx-api": "1.77.0", - "@aws-cdk/region-info": "1.77.0", - "@aws-cdk/yaml-cfn": "1.77.0", - "archiver": "^5.1.0", - "aws-sdk": "^2.804.0", - "camelcase": "^6.2.0", - "cdk-assets": "1.77.0", - "colors": "^1.4.0", - "decamelize": "^4.0.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "json-diff": "^0.5.4", - "minimatch": ">=3.0", - "promptly": "^3.2.0", - "proxy-agent": "^4.0.0", - "semver": "^7.3.2", - "source-map-support": "^0.5.19", - "table": "^6.0.4", - "uuid": "^8.3.1", - "wrap-ansi": "^7.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "cdk": "bin/cdk" - }, - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - } - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/cfnspec": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "md5": "^2.3.0" - } - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "jsonschema": "^1.4.0", - "semver": "^7.3.2" - } - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/cloudformation-diff": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "@aws-cdk/cfnspec": "1.77.0", - "colors": "^1.4.0", - "diff": "^5.0.0", - "fast-deep-equal": "^3.1.3", - "string-width": "^4.2.0", - "table": "^6.0.4" - } - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/cx-api": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "semver": "^7.3.2" - } - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/region-info": { - "version": "1.77.0", - "dev": true - }, - "node_modules/aws-cdk/node_modules/@aws-cdk/yaml-cfn": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "yaml": "1.10.0" - } - }, - "node_modules/aws-cdk/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - } - }, - "node_modules/aws-cdk/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/aws-cdk/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - } - }, - "node_modules/aws-cdk/node_modules/archiver": { - "version": "5.1.0", - "resolved": "https://registry.yarnpkg.com/archiver/-/archiver-5.1.0.tgz#05b0f6f7836f3e6356a0532763d2bb91017a7e37", - "integrity": "sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA==", - "dev": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.1.4", - "zip-stream": "^4.0.4" - } - }, - "node_modules/aws-cdk/node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - } - }, - "node_modules/aws-cdk/node_modules/archiver/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/archiver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/archiver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/aws-cdk/node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - } - }, - "node_modules/aws-cdk/node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/aws-sdk": { - "version": "2.804.0", - "resolved": "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.804.0.tgz#ff7e6f91b86b4878ec69e3de895c10eb8203fc4b", - "integrity": "sha512-a02pZdjL06MunElAZPPEjpghOp/ZA+16f+t4imh1k9FCDpsNVQrT23HRq/PMvRADA5uZZRkYwX8r9o6oH/1RlA==", - "dev": true, - "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - } - }, - "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/buffer/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/aws-sdk/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/bl": { - "version": "4.0.3", - "resolved": "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/aws-cdk/node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/bl/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/bl/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/aws-cdk/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/aws-cdk/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/aws-cdk/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/cdk-assets": { - "version": "1.77.0", - "dev": true, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "@aws-cdk/cx-api": "1.77.0", - "archiver": "^5.1.0", - "aws-sdk": "^2.804.0", - "glob": "^7.1.6", - "yargs": "^16.2.0" - } - }, - "node_modules/aws-cdk/node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/cli-color": { - "version": "0.1.7", - "resolved": "https://registry.yarnpkg.com/cli-color/-/cli-color-0.1.7.tgz#adc3200fa471cc211b0da7f566b71e98b9d67347", - "integrity": "sha1-rcMgD6RxzCEbDaf1ZrcemLnWc0c=", - "dev": true, - "dependencies": { - "es5-ext": "0.8.x" - } - }, - "node_modules/aws-cdk/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/aws-cdk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - } - }, - "node_modules/aws-cdk/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/compress-commons": { - "version": "4.0.2", - "resolved": "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.0.2.tgz#d6896be386e52f37610cef9e6fa5defc58c31bd7", - "integrity": "sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A==", - "dev": true, - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/aws-cdk/node_modules/compress-commons/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/compress-commons/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/compress-commons/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/aws-cdk/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/crc-32": { - "version": "1.2.0", - "resolved": "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "dev": true, - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "node_modules/aws-cdk/node_modules/crc32-stream": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.1.tgz#0f047d74041737f8a55e86837a1b826bd8ab0067", - "integrity": "sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - } - }, - "node_modules/aws-cdk/node_modules/crc32-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/crc32-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/crc32-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/aws-cdk/node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/debug": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - } - }, - "node_modules/aws-cdk/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/degenerator": { - "version": "2.2.0", - "resolved": "https://registry.yarnpkg.com/degenerator/-/degenerator-2.2.0.tgz#49e98c11fa0293c5b26edfbb52f15729afcdb254", - "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", - "dev": true, - "dependencies": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0" - } - }, - "node_modules/aws-cdk/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/difflib": { - "version": "0.2.4", - "resolved": "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e", - "integrity": "sha1-teMDYabbAjF21WKJLbhZQKcY9H4=", - "dev": true, - "dependencies": { - "heap": ">= 0.2.0" - } - }, - "node_modules/aws-cdk/node_modules/dreamopt": { - "version": "0.6.0", - "resolved": "https://registry.yarnpkg.com/dreamopt/-/dreamopt-0.6.0.tgz#d813ccdac8d39d8ad526775514a13dda664d6b4b", - "integrity": "sha1-2BPM2sjTnYrVJndVFKE92mZNa0s=", - "dev": true, - "dependencies": { - "wordwrap": ">=0.0.2" - } - }, - "node_modules/aws-cdk/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/aws-cdk/node_modules/es5-ext": { - "version": "0.8.2", - "resolved": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.8.2.tgz#aba8d9e1943a895ac96837a62a39b3f55ecd94ab", - "integrity": "sha1-q6jZ4ZQ6iVrJaDemKjmz9V7NlKs=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - } - }, - "node_modules/aws-cdk/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "node_modules/aws-cdk/node_modules/fs-extra/node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/ftp": { - "version": "0.3.10", - "resolved": "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "dev": true, - "dependencies": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - } - }, - "node_modules/aws-cdk/node_modules/ftp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/ftp/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/aws-cdk/node_modules/ftp/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/get-uri": { - "version": "3.0.2", - "resolved": "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - } - }, - "node_modules/aws-cdk/node_modules/get-uri/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/aws-cdk/node_modules/get-uri/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/get-uri/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "node_modules/aws-cdk/node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/heap": { - "version": "0.2.6", - "resolved": "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac", - "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "node_modules/aws-cdk/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "node_modules/aws-cdk/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - } - }, - "node_modules/aws-cdk/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "node_modules/aws-cdk/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/aws-cdk/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/jmespath": { - "version": "0.15.0", - "resolved": "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/json-diff": { - "version": "0.5.4", - "resolved": "https://registry.yarnpkg.com/json-diff/-/json-diff-0.5.4.tgz#7bc8198c441756632aab66c7d9189d365a7a035a", - "integrity": "sha512-q5Xmx9QXNOzOzIlMoYtLrLiu4Jl/Ce2bn0CNcv54PhyH89CI4GWlGVDye8ei2Ijt9R3U+vsWPsXpLUNob8bs8Q==", - "dev": true, - "dependencies": { - "cli-color": "~0.1.6", - "difflib": "~0.2.1", - "dreamopt": "~0.6.0" - } - }, - "node_modules/aws-cdk/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - } - }, - "node_modules/aws-cdk/node_modules/jsonschema": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2", - "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.5" - } - }, - "node_modules/aws-cdk/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "node_modules/aws-cdk/node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/aws-cdk/node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/aws-cdk/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - } - }, - "node_modules/aws-cdk/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/netmask": { - "version": "1.0.6", - "resolved": "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/aws-cdk/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "node_modules/aws-cdk/node_modules/pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz#66883eeabadc915fc5e95457324cb0f0ac78defb", - "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" - } - }, - "node_modules/aws-cdk/node_modules/pac-resolver": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-4.1.0.tgz#4b12e7d096b255a3b84e53f6831f32e9c7e5fe95", - "integrity": "sha512-d6lf2IrZJJ7ooVHr7BfwSjRO1yKSJMaiiWYSHcrxSIUtZrCa4KKGwcztdkZ/E9LFleJfjoi1yl+XLR7AX24nbQ==", - "dev": true, - "dependencies": { - "degenerator": "^2.2.0", - "ip": "^1.1.5", - "netmask": "^1.0.6" - } - }, - "node_modules/aws-cdk/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/printj": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/promptly": { - "version": "3.2.0", - "resolved": "https://registry.yarnpkg.com/promptly/-/promptly-3.2.0.tgz#a5517fbbf59bd31c1751d4e1d9bef1714f42b9d8", - "integrity": "sha512-WnR9obtgW+rG4oUV3hSnNGl1pHm3V1H/qD9iJBumGSmVsSC5HpZOLuu8qdMb6yCItGfT7dcRszejr/5P3i9Pug==", - "dev": true, - "dependencies": { - "read": "^1.0.4" - } - }, - "node_modules/aws-cdk/node_modules/proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-4.0.0.tgz#a92976af3fbc7d846f2e850e2ac5ac6ca3fb74c7", - "integrity": "sha512-8P0Y2SkwvKjiGU1IkEfYuTteioMIDFxPL4/j49zzt5Mz3pG1KO+mIrDG1qH0PQUHTTczjwGcYl+EzfXiFj5vUQ==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^4.1.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" - } - }, - "node_modules/aws-cdk/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/raw-body": { - "version": "2.4.1", - "resolved": "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "node_modules/aws-cdk/node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "dependencies": { - "mute-stream": "~0.0.4" - } - }, - "node_modules/aws-cdk/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/aws-cdk/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "node_modules/aws-cdk/node_modules/smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/socks": { - "version": "2.5.0", - "resolved": "https://registry.yarnpkg.com/socks/-/socks-2.5.0.tgz#3a7c286db114f67864a4bd8b4207a91d1db3d6db", - "integrity": "sha512-00OqQHp5SCbwm9ecOMJj9aQtMSjwi1uVuGQoxnpKCS50VKZcOZ8z11CTKypmR8sEy7nZimy/qXY7rYJYbRlXmA==", - "dev": true, - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "node_modules/aws-cdk/node_modules/socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - } - }, - "node_modules/aws-cdk/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/aws-cdk/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/aws-cdk/node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/aws-cdk/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - } - }, - "node_modules/aws-cdk/node_modules/table": { - "version": "6.0.4", - "resolved": "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d", - "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "lodash": "^4.17.20", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - } - }, - "node_modules/aws-cdk/node_modules/tar-stream": { - "version": "2.1.4", - "resolved": "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa", - "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "node_modules/aws-cdk/node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/tar-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/tar-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/aws-cdk/node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/tslib": { - "version": "2.0.3", - "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - } - }, - "node_modules/aws-cdk/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/aws-cdk/node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/aws-cdk/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/uuid": { - "version": "8.3.1", - "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/aws-cdk/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "node_modules/aws-cdk/node_modules/xml2js/node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/xregexp": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", - "dev": true - }, - "node_modules/aws-cdk/node_modules/y18n": { - "version": "5.0.5", - "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/yaml": { - "version": "1.10.0", - "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "node_modules/aws-cdk/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/zip-stream": { - "version": "4.0.4", - "resolved": "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a", - "integrity": "sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw==", - "dev": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.0.2", - "readable-stream": "^3.6.0" - } - }, - "node_modules/aws-cdk/node_modules/zip-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "node_modules/aws-cdk/node_modules/zip-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/aws-cdk/node_modules/zip-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "dependencies": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001505", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001505.tgz", - "integrity": "sha512-jaAOR5zVtxHfL0NjZyflVTtXm3D3J9P15zSJ7HmQF8dSKGA6tqzQq+0ZI3xkjyQj46I4/M0K2GbMpcAFOcbr3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/constructs": { - "version": "3.4.329", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.329.tgz", - "integrity": "sha512-uj62KOOmaX6i10KcBLzXcXgcFRZpP+XoCiEqT8tg1zXIGSY3iQ6n6wzw/44laG9L4qrWvCtMna6wACW8CejKkQ==", - "engines": { - "node": ">= 16.14.0" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.434", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.434.tgz", - "integrity": "sha512-5Gvm09UZTQRaWrimRtWRO5rvaX6Kpk5WHAPKDa7A4Gj6NIPuJ8w8WNpnxCXdd+CJJt6RBU6tUw0KyULoW6XuHw==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", - "dev": true, - "optional": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "optional": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "dependencies": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "fsevents": "^2.1.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "dependencies": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "dependencies": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node_modules/node-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - }, - "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", - "dev": true - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true, - "engines": { - "node": "6.* || >= 7.*" - } - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", - "dev": true, - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/sane/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/sane/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-jest": { - "version": "26.5.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", - "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "jest": ">=26 <27", - "typescript": ">=3.8 <5.0" - } - }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@aws-cdk/assert": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/assert/-/assert-1.79.0.tgz", - "integrity": "sha512-wCiMyxhtUz82blUlSnfoqpHdSjgFOkjpunjgxT2aG5Y6RTN0ExOOm9pdKDdXnul0zml6ZvfOL51wDG0Udg7zFg==", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "@aws-cdk/cloudformation-diff": "1.79.0", - "@aws-cdk/core": "1.79.0", - "@aws-cdk/cx-api": "1.79.0", - "constructs": "^3.2.0" - }, - "dependencies": { - "@aws-cdk/core": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.79.0.tgz", - "integrity": "sha512-I+2GbQfbPy6TewnGbviE1W8cUhgBEA1mQLYm5gBj/Rzix1tCyaNvfYsBU3ipg3jIATpHsg1CzUq0zrumUnmnTg==", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "@aws-cdk/cx-api": "1.79.0", - "@aws-cdk/region-info": "1.79.0", - "@balena/dockerignore": "^1.0.2", - "constructs": "^3.2.0", - "fs-extra": "^9.0.1", - "ignore": "^5.1.8", - "minimatch": "^3.0.4" - }, - "dependencies": { - "@balena/dockerignore": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "fs-extra": { - "version": "9.0.1", - "bundled": true, - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "bundled": true, - "dev": true - }, - "ignore": { - "version": "5.1.8", - "bundled": true, - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "universalify": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "@aws-cdk/region-info": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.79.0.tgz", - "integrity": "sha512-klnXCc1Cd/krE4VOXJ1Blvey8ucPRzuwgGacPsCV2ugMSlaJSbdGqKzTUNxcK2o8g9PaEuJ5lNjfwqqyvp571g==", - "dev": true - } - } - }, - "@aws-cdk/assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/assets/-/assets-1.204.0.tgz", - "integrity": "sha512-rY9YHZ3gUWr+dLwTwSUWYbIfk/AXy4JZRkhLbunrtzjQhH+QMm/2IWIebfBGu+A5AlVRaFbRLonReuGP5WZoUQ==", - "requires": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-acmpca": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-acmpca/-/aws-acmpca-1.204.0.tgz", - "integrity": "sha512-2zyuQZwynwkz2qiuFDp088tglWXKX3q7saWRDqeuq2n2HE6PGuQRjd4zjl9nDGUVxQYtzzXyEuPyaEta8fg9lQ==", - "requires": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-applicationautoscaling": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.204.0.tgz", - "integrity": "sha512-sEe2NODKUowJx2guM2SPfs/20gGdBq1C09M32b8c1im7K+PqQkHkE156nyz5Ml0hpsNeCZlRS17oKZ042aZevQ==", - "requires": { - "@aws-cdk/aws-autoscaling-common": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-autoscaling-common": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.204.0.tgz", - "integrity": "sha512-P+PwbTaj28Eg9+/U9ZTXTh1gA7L9Z45GL+9xcEZvEqAkJt9MNgzZICavVZu1sMD74foK1r1ZOBXTsqV6wEiltQ==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-certificatemanager": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.204.0.tgz", - "integrity": "sha512-ZLykfAOb5Zbg/MFtzA+eHhMAK1xL32+oHKSK6tAYrgvv2aS42wJE4zSBV6jGCjnCkhcliUd5pwnACEl3ib0KLw==", - "requires": { - "@aws-cdk/aws-acmpca": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-route53": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-cloudformation": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.204.0.tgz", - "integrity": "sha512-9PkZa9mKLneB0My8wJC7lLZmPJsnOxNYy57ZZlRCQhK0eO6Jc9eVqrI29537W+3ireaEjCLEitkb8NO1FN/kQA==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-cloudwatch": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.204.0.tgz", - "integrity": "sha512-ADT2D+4FtB9Zcy/TlF2tswQmjmrPVgORYTkznQQ2SniCODHWzz558+G1RV+IVvWRdH7nYQtV0UEuGZKpffWh2w==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-codeguruprofiler": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.204.0.tgz", - "integrity": "sha512-IrgY4SmVf9p5POfHm8BsPzaAO5lQTG7nhb5qN5AzS6zKCTuEjjTNHjx1TOfPV12mMIDAIVsK91mjDlAR88Mjbg==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-codestarnotifications": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codestarnotifications/-/aws-codestarnotifications-1.204.0.tgz", - "integrity": "sha512-t//hSpC5/uVW2321YlbGabNVzhWayvqz+xSnagADGcT9qiq3KQR/uUlrgpHv1/eHRMk7EMrY9prlXeZpfzZ+cw==", - "requires": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-cognito": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cognito/-/aws-cognito-1.204.0.tgz", - "integrity": "sha512-7QIbExW9dn1fktpDOh2nMHmor2S3uuHtIX5y33lc9OKg3xUuYw4AZ67MKapunN7QUBlffTlNzoUqlHoNSab+Zg==", - "requires": { - "@aws-cdk/aws-certificatemanager": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69", - "punycode": "^2.3.0" - }, - "dependencies": { - "punycode": { - "version": "2.3.0", - "bundled": true - } - } - }, - "@aws-cdk/aws-ec2": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ec2/-/aws-ec2-1.204.0.tgz", - "integrity": "sha512-SoqZEgzdfPW0aa+FQ0CjzbDG+X+sDu6/BnLL2O10lxpa+9Dc1iyArAqNKFJG5KXGJe9ibvQXyNQqEjeGRFc22Q==", - "requires": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-ssm": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-ecr": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr/-/aws-ecr-1.204.0.tgz", - "integrity": "sha512-oCts9e+ackWoFHeyn/3oKm3X1lSizleWNNXHp5WGM38lpNVrtCLMKSShu5iXJBhqRH2Mz1AcA4fDMWhe8DvJFA==", - "requires": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-ecr-assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.204.0.tgz", - "integrity": "sha512-2GHD3pZdDoPxq3HhD4czANuI7TMoxpjszbzsQAc2wbdMX1j+K4vIL+PBpj3altfscPqcvy1v70lBjbG5rcBIkQ==", - "requires": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-efs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-efs/-/aws-efs-1.204.0.tgz", - "integrity": "sha512-FB6nHgCuzYF5K9ywqYPEPjL2G1ATLIR9dJp1p4ydcEUuXDb4KSEVN4Bgx+q1e7EkWGIq+9glr+ckheEcTvETgw==", - "requires": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-events": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-events/-/aws-events-1.204.0.tgz", - "integrity": "sha512-KnfUmtv+4RhydD9+5CHFxNJxtgn7+Xftwfwg1G7qV/tWYPFHcNIvhlSOgwDrQPa+pTo1MmkiUN0lAR0G8B/cbw==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-iam": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-iam/-/aws-iam-1.204.0.tgz", - "integrity": "sha512-Fh2egW3v/uDdw3m4jvcupS7COL/+sJl2NHjz9l298ddyMxqDwJD2NQwE8mvgPLK4rDtAtDnE0c8RS6d+NWiC+w==", - "requires": { - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-kms": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-kms/-/aws-kms-1.204.0.tgz", - "integrity": "sha512-iryZQ428L1VUVQ0zE96XTWWX7ANVtDrb6x+ZXXLTVUEPgjEd/W6zlcp++Qi0A3a9HLNd4PbEhK9rs0UKNTylzw==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-lambda": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda/-/aws-lambda-1.204.0.tgz", - "integrity": "sha512-r0XXovrLAx8Q8Fz915SwzyQM/KLhEB6YCp3CsWliFGSOHEjRP8yX8UZdEJqe5kYD7Th9JAhUVzKgyv20P7g5Tg==", - "requires": { - "@aws-cdk/aws-applicationautoscaling": "1.204.0", - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codeguruprofiler": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-ecr": "1.204.0", - "@aws-cdk/aws-ecr-assets": "1.204.0", - "@aws-cdk/aws-efs": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/aws-signer": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-logs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-logs/-/aws-logs-1.204.0.tgz", - "integrity": "sha512-PuHsDSkX6JFBgldxViGw91eFLageJ2cX89/RyLbWaJJUV4tlUKXSmmkVgOaBmvil0QKuGqbOzLXcXCoIK9Sg3A==", - "requires": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3-assets": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-route53": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-route53/-/aws-route53-1.204.0.tgz", - "integrity": "sha512-wQpGUXqc2y7yJFTipfuVxWy/VGeshyGlfGl4evusQK9Md0DMpVmG8kRgazLk1myqUSNSfi643UwvDJqNbYmdnA==", - "requires": { - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/custom-resources": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-s3": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3/-/aws-s3-1.204.0.tgz", - "integrity": "sha512-jsQ4n1L4MdPYDirBoOYgg7yzSk1TaFYo4dnwDlKiLJ5LcHG3Nai1cHb9XQbCy/9KKqbWsbd3WlkH+vcWEl8EUA==", - "requires": { - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-s3-assets": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.204.0.tgz", - "integrity": "sha512-3MQbVZ95wW29Bl63tqu0Bz0td3osLyGg352l5G7Ztf3nK35FpuQlgxO4kcu74+s2sRwdd/R4KFV6eWhhPk+J7g==", - "requires": { - "@aws-cdk/assets": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-s3": "1.204.0", - "@aws-cdk/core": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/aws-signer": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-signer/-/aws-signer-1.204.0.tgz", - "integrity": "sha512-AI26FhWF3+f/vDh3mleQa2CXv2/CmSerXgyk4XHMVVTTCjnlYGGmHmGlzYhqOSw6ALpQNdOSw8GVxU/ySpQCaw==", - "requires": { - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-sns": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sns/-/aws-sns-1.204.0.tgz", - "integrity": "sha512-KoWxqKT/dTjt9Pk0a3kJLcd6xZHvrwbZDC0mrLtxdRNhQoHmnURAHW2UqX/lefrCU1GcUFf4L58N9ehBTunAFQ==", - "requires": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-codestarnotifications": "1.204.0", - "@aws-cdk/aws-events": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/aws-sqs": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-sqs": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sqs/-/aws-sqs-1.204.0.tgz", - "integrity": "sha512-dVzuGMh6d5/X9P9jel1w2Wgdy5MuSE35+eBSFxN+S7oJRoVSARpyKMNYAPMCW+2OJCDw7fIqO1rWbsZBT1Gq8g==", - "requires": { - "@aws-cdk/aws-cloudwatch": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/aws-ssm": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ssm/-/aws-ssm-1.204.0.tgz", - "integrity": "sha512-yYx7HZ8cWNXDAmX/99WkB477QhLoV2rcB8orei8aj7nRkNq5TMjeox0IJaZVgU+edNEDOi1fVX3flh0SAMiUrg==", - "requires": { - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-kms": "1.204.0", - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - } - } - }, - "@aws-cdk/cfnspec": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-1.79.0.tgz", - "integrity": "sha512-rbBhox7hzXPXk2n+1BDjsmiz/0W9ZHv3NeCKiq94WfHW6Jj4mSjtGs7ZUBFq8JkkgYVsE9ktH1634wt9A9fbRg==", - "dev": true, - "requires": { - "md5": "^2.3.0" - } - }, - "@aws-cdk/cloud-assembly-schema": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.79.0.tgz", - "integrity": "sha512-n2ARtOXIUq3FdJ1EBuHzsM0DQau6ZwHprPhpk1xc5bv21s7D5X5ECe06eC0K5xC5ZyfC13BDWu1f+xFh+krnYA==", - "dev": true, - "requires": { - "jsonschema": "^1.4.0", - "semver": "^7.3.2" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.0", - "bundled": true, - "dev": true - }, - "semver": { - "version": "7.3.2", - "bundled": true, - "dev": true - } - } - }, - "@aws-cdk/cloudformation-diff": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-1.79.0.tgz", - "integrity": "sha512-GsX8Br7E0/2W2ugntO4zXodbApVi2C+AP/6QtTX6fasZbgZSwe8gjiXYPQ6EvtgjlWnYxPTn6vHRlb53vDFzMg==", - "dev": true, - "requires": { - "@aws-cdk/cfnspec": "1.79.0", - "colors": "^1.4.0", - "diff": "^5.0.0", - "fast-deep-equal": "^3.1.3", - "string-width": "^4.2.0", - "table": "^6.0.4" - } - }, - "@aws-cdk/core": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.204.0.tgz", - "integrity": "sha512-yO/flJ9ihpzRhLTEqlbdbuPGtyyghHiiQPkUTLslwUM5vThVTbpgvW4UQHSGqytyst4MYXrN2jQn2RkwIRU57g==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "@aws-cdk/cx-api": "1.204.0", - "@aws-cdk/region-info": "1.204.0", - "@balena/dockerignore": "^1.0.2", - "constructs": "^3.3.69", - "fs-extra": "^9.1.0", - "ignore": "^5.2.4", - "minimatch": "^3.1.2" - }, - "dependencies": { - "@aws-cdk/cloud-assembly-schema": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", - "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", - "requires": { - "jsonschema": "^1.4.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jsonschema": { - "version": "1.4.1", - "bundled": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@aws-cdk/cx-api": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", - "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.204.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "@balena/dockerignore": { - "version": "1.0.2", - "bundled": true - }, - "at-least-node": { - "version": "1.0.0", - "bundled": true - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "fs-extra": { - "version": "9.1.0", - "bundled": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "bundled": true - }, - "ignore": { - "version": "5.2.4", - "bundled": true - }, - "jsonfile": { - "version": "6.1.0", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "universalify": { - "version": "2.0.0", - "bundled": true - } - } - }, - "@aws-cdk/custom-resources": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/custom-resources/-/custom-resources-1.204.0.tgz", - "integrity": "sha512-0w3oi7LnAtMZpf7uUBDH6aT2Oo1EBQrqD+VTvPZDX8PJFAox8ol7buZ9sSTpIXgv9j/GK9yaPTIHt4m8ok9kVQ==", - "requires": { - "@aws-cdk/aws-cloudformation": "1.204.0", - "@aws-cdk/aws-ec2": "1.204.0", - "@aws-cdk/aws-iam": "1.204.0", - "@aws-cdk/aws-lambda": "1.204.0", - "@aws-cdk/aws-logs": "1.204.0", - "@aws-cdk/aws-sns": "1.204.0", - "@aws-cdk/core": "1.204.0", - "constructs": "^3.3.69" - } - }, - "@aws-cdk/cx-api": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.79.0.tgz", - "integrity": "sha512-ymQOqHcPzYhrcQ4swMgw5JzAaOm+PehH1cepsxi/Wq2zNOXkyN9o6Hw6l+eDpezFvNIKFy4mMAo6FR9xRCUiow==", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.79.0", - "semver": "^7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "bundled": true, - "dev": true - } - } - }, - "@aws-cdk/region-info": { - "version": "1.204.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.204.0.tgz", - "integrity": "sha512-lPkYJNoN4Gjlf0Fdfgcd1RTm5RD9qtfaFMwVvTn2KGTr7ZqmFskGQ9FqIcd5vd6GmsbAL8OrFOToLr1AHDuOiQ==" - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", - "dev": true - }, - "@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", - "dev": true, - "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - } - }, - "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - } - }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - } - }, - "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - } - }, - "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } - } - }, - "@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.24", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", - "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", - "dev": true, - "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "@types/node": { - "version": "10.17.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.27.tgz", - "integrity": "sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-cdk": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-1.77.0.tgz", - "integrity": "sha512-DM0ELcihYV9K7EtEeZZrViwjQUHb/G3CDFPSPQ39d5XuCEcQmnDSuJ6LQ2jFUbZE+Qsj+lmUp+WM1j66kJT9HA==", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "@aws-cdk/cloudformation-diff": "1.77.0", - "@aws-cdk/cx-api": "1.77.0", - "@aws-cdk/region-info": "1.77.0", - "@aws-cdk/yaml-cfn": "1.77.0", - "archiver": "^5.1.0", - "aws-sdk": "^2.804.0", - "camelcase": "^6.2.0", - "cdk-assets": "1.77.0", - "colors": "^1.4.0", - "decamelize": "^4.0.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "json-diff": "^0.5.4", - "minimatch": ">=3.0", - "promptly": "^3.2.0", - "proxy-agent": "^4.0.0", - "semver": "^7.3.2", - "source-map-support": "^0.5.19", - "table": "^6.0.4", - "uuid": "^8.3.1", - "wrap-ansi": "^7.0.0", - "yargs": "^16.2.0" - }, - "dependencies": { - "@aws-cdk/cfnspec": { - "version": "1.77.0", - "dev": true, - "requires": { - "md5": "^2.3.0" - } - }, - "@aws-cdk/cloud-assembly-schema": { - "version": "1.77.0", - "dev": true, - "requires": { - "jsonschema": "^1.4.0", - "semver": "^7.3.2" - } - }, - "@aws-cdk/cloudformation-diff": { - "version": "1.77.0", - "dev": true, - "requires": { - "@aws-cdk/cfnspec": "1.77.0", - "colors": "^1.4.0", - "diff": "^5.0.0", - "fast-deep-equal": "^3.1.3", - "string-width": "^4.2.0", - "table": "^6.0.4" - } - }, - "@aws-cdk/cx-api": { - "version": "1.77.0", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "semver": "^7.3.2" - } - }, - "@aws-cdk/region-info": { - "version": "1.77.0", - "dev": true - }, - "@aws-cdk/yaml-cfn": { - "version": "1.77.0", - "dev": true, - "requires": { - "yaml": "1.10.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "archiver": { - "version": "5.1.0", - "resolved": "https://registry.yarnpkg.com/archiver/-/archiver-5.1.0.tgz#05b0f6f7836f3e6356a0532763d2bb91017a7e37", - "integrity": "sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA==", - "dev": true, - "requires": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.1.4", - "zip-stream": "^4.0.4" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - } - }, - "ast-types": { - "version": "0.13.4", - "resolved": "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "aws-sdk": { - "version": "2.804.0", - "resolved": "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.804.0.tgz#ff7e6f91b86b4878ec69e3de895c10eb8203fc4b", - "integrity": "sha512-a02pZdjL06MunElAZPPEjpghOp/ZA+16f+t4imh1k9FCDpsNVQrT23HRq/PMvRADA5uZZRkYwX8r9o6oH/1RlA==", - "dev": true, - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bl": { - "version": "4.0.3", - "resolved": "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "cdk-assets": { - "version": "1.77.0", - "dev": true, - "requires": { - "@aws-cdk/cloud-assembly-schema": "1.77.0", - "@aws-cdk/cx-api": "1.77.0", - "archiver": "^5.1.0", - "aws-sdk": "^2.804.0", - "glob": "^7.1.6", - "yargs": "^16.2.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "cli-color": { - "version": "0.1.7", - "resolved": "https://registry.yarnpkg.com/cli-color/-/cli-color-0.1.7.tgz#adc3200fa471cc211b0da7f566b71e98b9d67347", - "integrity": "sha1-rcMgD6RxzCEbDaf1ZrcemLnWc0c=", - "dev": true, - "requires": { - "es5-ext": "0.8.x" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "compress-commons": { - "version": "4.0.2", - "resolved": "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.0.2.tgz#d6896be386e52f37610cef9e6fa5defc58c31bd7", - "integrity": "sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A==", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "crc-32": { - "version": "1.2.0", - "resolved": "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "dev": true, - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "crc32-stream": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.1.tgz#0f047d74041737f8a55e86837a1b826bd8ab0067", - "integrity": "sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, - "data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "degenerator": { - "version": "2.2.0", - "resolved": "https://registry.yarnpkg.com/degenerator/-/degenerator-2.2.0.tgz#49e98c11fa0293c5b26edfbb52f15729afcdb254", - "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", - "dev": true, - "requires": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "difflib": { - "version": "0.2.4", - "resolved": "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e", - "integrity": "sha1-teMDYabbAjF21WKJLbhZQKcY9H4=", - "dev": true, - "requires": { - "heap": ">= 0.2.0" - } - }, - "dreamopt": { - "version": "0.6.0", - "resolved": "https://registry.yarnpkg.com/dreamopt/-/dreamopt-0.6.0.tgz#d813ccdac8d39d8ad526775514a13dda664d6b4b", - "integrity": "sha1-2BPM2sjTnYrVJndVFKE92mZNa0s=", - "dev": true, - "requires": { - "wordwrap": ">=0.0.2" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "es5-ext": { - "version": "0.8.2", - "resolved": "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.8.2.tgz#aba8d9e1943a895ac96837a62a39b3f55ecd94ab", - "integrity": "sha1-q6jZ4ZQ6iVrJaDemKjmz9V7NlKs=", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - }, - "dependencies": { - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "dev": true, - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-uri": { - "version": "3.0.2", - "resolved": "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "heap": { - "version": "0.2.6", - "resolved": "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac", - "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", - "dev": true - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", - "dev": true - }, - "json-diff": { - "version": "0.5.4", - "resolved": "https://registry.yarnpkg.com/json-diff/-/json-diff-0.5.4.tgz#7bc8198c441756632aab66c7d9189d365a7a035a", - "integrity": "sha512-q5Xmx9QXNOzOzIlMoYtLrLiu4Jl/Ce2bn0CNcv54PhyH89CI4GWlGVDye8ei2Ijt9R3U+vsWPsXpLUNob8bs8Q==", - "dev": true, - "requires": { - "cli-color": "~0.1.6", - "difflib": "~0.2.1", - "dreamopt": "~0.6.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "universalify": "^2.0.0" - } - }, - "jsonschema": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2", - "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz#66883eeabadc915fc5e95457324cb0f0ac78defb", - "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" - } - }, - "pac-resolver": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-4.1.0.tgz#4b12e7d096b255a3b84e53f6831f32e9c7e5fe95", - "integrity": "sha512-d6lf2IrZJJ7ooVHr7BfwSjRO1yKSJMaiiWYSHcrxSIUtZrCa4KKGwcztdkZ/E9LFleJfjoi1yl+XLR7AX24nbQ==", - "dev": true, - "requires": { - "degenerator": "^2.2.0", - "ip": "^1.1.5", - "netmask": "^1.0.6" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "printj": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promptly": { - "version": "3.2.0", - "resolved": "https://registry.yarnpkg.com/promptly/-/promptly-3.2.0.tgz#a5517fbbf59bd31c1751d4e1d9bef1714f42b9d8", - "integrity": "sha512-WnR9obtgW+rG4oUV3hSnNGl1pHm3V1H/qD9iJBumGSmVsSC5HpZOLuu8qdMb6yCItGfT7dcRszejr/5P3i9Pug==", - "dev": true, - "requires": { - "read": "^1.0.4" - } - }, - "proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-4.0.0.tgz#a92976af3fbc7d846f2e850e2ac5ac6ca3fb74c7", - "integrity": "sha512-8P0Y2SkwvKjiGU1IkEfYuTteioMIDFxPL4/j49zzt5Mz3pG1KO+mIrDG1qH0PQUHTTczjwGcYl+EzfXiFj5vUQ==", - "dev": true, - "requires": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^4.1.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true - }, - "socks": { - "version": "2.5.0", - "resolved": "https://registry.yarnpkg.com/socks/-/socks-2.5.0.tgz#3a7c286db114f67864a4bd8b4207a91d1db3d6db", - "integrity": "sha512-00OqQHp5SCbwm9ecOMJj9aQtMSjwi1uVuGQoxnpKCS50VKZcOZ8z11CTKypmR8sEy7nZimy/qXY7rYJYbRlXmA==", - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "table": { - "version": "6.0.4", - "resolved": "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d", - "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "lodash": "^4.17.20", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - } - }, - "tar-stream": { - "version": "2.1.4", - "resolved": "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa", - "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "8.3.1", - "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - }, - "dependencies": { - "sax": { - "version": "1.2.4", - "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - } - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", - "dev": true - }, - "y18n": { - "version": "5.0.5", - "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "zip-stream": { - "version": "4.0.4", - "resolved": "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a", - "integrity": "sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw==", - "dev": true, - "requires": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.0.2", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - } - } - }, - "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - } - } - }, - "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001505", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001505.tgz", - "integrity": "sha512-jaAOR5zVtxHfL0NjZyflVTtXm3D3J9P15zSJ7HmQF8dSKGA6tqzQq+0ZI3xkjyQj46I4/M0K2GbMpcAFOcbr3A==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "constructs": { - "version": "3.4.329", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.329.tgz", - "integrity": "sha512-uj62KOOmaX6i10KcBLzXcXgcFRZpP+XoCiEqT8tg1zXIGSY3iQ6n6wzw/44laG9L4qrWvCtMna6wACW8CejKkQ==" - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "electron-to-chromium": { - "version": "1.4.434", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.434.tgz", - "integrity": "sha512-5Gvm09UZTQRaWrimRtWRO5rvaX6Kpk5WHAPKDa7A4Gj6NIPuJ8w8WNpnxCXdd+CJJt6RBU6tUw0KyULoW6XuHw==", - "dev": true - }, - "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", - "dev": true, - "optional": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - } - }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - } - }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } - }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - } - }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - } - }, - "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - } - }, - "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - } - }, - "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - } - }, - "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - } - }, - "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - } - }, - "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - } - }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - } - }, - "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - } - } - }, - "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "ts-jest": { - "version": "26.5.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", - "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true - } - } - }, - "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "dev": true - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - }, - "v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/resources/cdk/javascript_example_code_transcribe_demo/package.json b/resources/cdk/javascript_example_code_transcribe_demo/package.json deleted file mode 100644 index f22cd5fbbd2..00000000000 --- a/resources/cdk/javascript_example_code_transcribe_demo/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "setup", - "version": "0.1.0", - "bin": { - "setup": "setup.js" - }, - "scripts": { - "build": "tsc", - "watch": "tsc -w", - "test": "jest", - "cdk": "cdk" - }, - "devDependencies": { - "@aws-cdk/assert": "1.79.0", - "@types/jest": "^26.0.10", - "@types/node": "10.17.27", - "aws-cdk": "1.77.0", - "jest": "^26.4.2", - "ts-jest": "^26.2.0", - "ts-node": "^9.0.0", - "typescript": "~3.9.7" - }, - "dependencies": { - "@aws-cdk/aws-cognito": "^1.204.0", - "@aws-cdk/aws-iam": "^1.204.0", - "@aws-cdk/core": "^1.204.0", - "source-map-support": "^0.5.16" - } -} diff --git a/resources/cdk/javascript_example_code_transcribe_demo/setup.ts b/resources/cdk/javascript_example_code_transcribe_demo/setup.ts deleted file mode 100644 index b03c0f6b773..00000000000 --- a/resources/cdk/javascript_example_code_transcribe_demo/setup.ts +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/env node -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Purpose: This AWS Cloud Development Kit (AWS CDK) app -// creates the following AWS resources: -// -// This AWS CDK app creates the following resources: -// -// - An Amazon Cognito identity pool with an authenticated user role. -// - An IAM policy with permissions for the Amazon S3 and Amazon Transcribe is -// attached to the authenticated user role. -// - An Amazon Cognito user pool that enables users to sign up and sign in to the -// app. -// - An Amazon S3 bucket to host the application files. -// - An Amazon S3 bucket to to store the transcriptions. -// -// For instructions on how to run any of these apps, see -// https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/resources/cdk/README.md#Running-a-CDK-app - -import * as cdk from "@aws-cdk/core"; -import * as cognito from "@aws-cdk/aws-cognito"; -import * as iam from "@aws-cdk/aws-iam"; -import { Effect, PolicyStatement } from "@aws-cdk/aws-iam"; -import * as s3 from "@aws-cdk/aws-s3"; -import { - Bucket, - BucketAccessControl, - BlockPublicAccess, - BlockPublicAccessOptions, -} from "@aws-cdk/aws-s3"; - -export class SetupStackTranscription extends cdk.Stack { - constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { - super(scope, id, props); - - const transcriptionBucket = new Bucket(this, "transcriptions", { - enforceSSL: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - publicReadAccess: true, - accessControl: BucketAccessControl.PUBLIC_READ, - }); - - transcriptionBucket.addToResourcePolicy( - new iam.PolicyStatement({ - effect: Effect.ALLOW, - actions: ["*"], - resources: [transcriptionBucket.arnForObjects("*")], - principals: [new iam.AccountRootPrincipal()], - }) - ); - transcriptionBucket.grantPublicAccess("*", "s3:GetObject"); - transcriptionBucket.grantPublicAccess("*", "s3:PutObject"); - transcriptionBucket.grantPublicAccess("*", "s3:DeleteObject"); - - const cfnBucket = transcriptionBucket.node.findChild( - "Resource" - ) as s3.CfnBucket; - cfnBucket.addPropertyOverride("CorsConfiguration", { - CorsRules: [ - { - AllowedHeaders: ["*"], - AllowedMethods: ["GET", "POST", "PUT", "DELETE"], - AllowedOrigins: ["*"], - }, - ], - }); - - const appBucket = new s3.Bucket(this, "appbucket", { - enforceSSL: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - websiteIndexDocument: "index.html", - websiteErrorDocument: "index.html", - blockPublicAccess: { - blockPublicAcls: true, - blockPublicPolicy: false, - ignorePublicAcls: true, - restrictPublicBuckets: false, - }, - }); - appBucket.grantPublicAccess("*", "s3:GetObject"); - appBucket.grantPublicAccess("*", "s3:PutObject"); - - const randomUserPoolName = `ExampleUserPoolName-${Math.ceil( - Math.random() * 10 ** 10 - )}`; - - const myUserPool = new cognito.UserPool(this, "exampleuserpoolid", { - userPoolName: randomUserPoolName, - selfSignUpEnabled: true, - autoVerify: { - email: true, - }, - userVerification: { - emailSubject: "Verify your email for our awesome app!", - emailBody: - "Hello, Thanks for signing up to our awesome app! Your verification code is {####}", - smsMessage: - "Hello, Thanks for signing up to our awesome app! Your verification code is {####}", - }, - standardAttributes: { - email: { - required: true, - mutable: false, - }, - }, - }); - - const randomUserPoolClientName = `ExampleUserPoolName-${Math.ceil( - Math.random() * 10 ** 10 - )}`; - - const userPoolClient = new cognito.UserPoolClient( - this, - "ExampleUserPoolClient", - { - userPool: myUserPool, - userPoolClientName: randomUserPoolClientName, - oAuth: { - callbackUrls: [appBucket.urlForObject("index.html")], - }, - } - ); - - const randomDomain = `exampleuserpoolname-${Math.ceil( - Math.random() * 10 ** 10 - )}`; - - myUserPool.addDomain("CognitoDomain", { - cognitoDomain: { - domainPrefix: randomDomain, - }, - }); - - const myIdentityPool = new cognito.CfnIdentityPool( - this, - "ExampleIdentityPool", - { - allowUnauthenticatedIdentities: false, - cognitoIdentityProviders: [ - { - clientId: userPoolClient.userPoolClientId, - providerName: myUserPool.userPoolProviderName, - }, - ], - } - ); - const authenticatedRole = new iam.Role( - this, - "ExampleCognitoDefaultAuthenticatedRole", - { - assumedBy: new iam.FederatedPrincipal( - "cognito-identity.amazonaws.com", - { - StringEquals: { - "cognito-identity.amazonaws.com:aud": myIdentityPool.ref, - }, - "ForAnyValue:StringLike": { - "cognito-identity.amazonaws.com:amr": "authenticated", - }, - }, - "sts:AssumeRoleWithWebIdentity" - ), - } - ); - authenticatedRole.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: [ - "mobileanalytics:PutEvents", - "cognito-sync:*", - "cognito-identity:*", - ], - resources: ["*"], - }) - ); - - authenticatedRole.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ["sns:*"], - resources: ["*"], - }) - ); - authenticatedRole.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: [ - "transcribe:StartTranscriptionJob", - "transcribe:GetTranscriptionJob", - ], - resources: ["*"], - }) - ); - const defaultPolicy = new cognito.CfnIdentityPoolRoleAttachment( - this, - "DefaultValid", - { - identityPoolId: myIdentityPool.ref, - roles: { - authenticated: authenticatedRole.roleArn, - }, - } - ); - } -} - -const stackName = "SetupStack"; - -const app = new cdk.App(); - -new SetupStackTranscription(app, stackName); diff --git a/resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json b/resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json deleted file mode 100644 index ec75123ce65..00000000000 --- a/resources/cdk/javascript_example_code_transcribe_demo/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2018", - "module": "commonjs", - "lib": ["es2018"], - "declaration": true, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": false, - "inlineSourceMap": true, - "inlineSources": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "typeRoots": ["./node_modules/@types"] - }, - "exclude": ["cdk.out"] -} diff --git a/resources/cdk/lambda_api_step_functions/cdk.json b/resources/cdk/lambda_api_step_functions/cdk.json deleted file mode 100644 index 90acb5637f9..00000000000 --- a/resources/cdk/lambda_api_step_functions/cdk.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "app": "npx ts-node --prefer-ts-exts setup.ts", - "context": { - "@aws-cdk/core:enableStackNameDuplicates": "true", - "aws-cdk:enableDiffNoFail": "true", - "@aws-cdk/core:stackRelativeExports": "true", - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true - } -} diff --git a/resources/cdk/lambda_api_step_functions/package.json b/resources/cdk/lambda_api_step_functions/package.json deleted file mode 100644 index d968b45ddb7..00000000000 --- a/resources/cdk/lambda_api_step_functions/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "setup", - "version": "0.1.0", - "bin": { - "setup": "setup.js" - }, - "scripts": { - "build": "tsc", - "watch": "tsc -w", - "test": "jest", - "cdk": "cdk" - }, - "devDependencies": { - "@aws-cdk/assert": "1.87.1", - "@types/jest": "^26.0.10", - "@types/node": "10.17.27", - "aws-cdk": "1.87.1", - "jest": "^26.4.2", - "ts-jest": "^26.2.0", - "ts-node": "^9.0.0", - "typescript": "~3.9.7" - }, - "dependencies": { - "@aws-cdk/aws-lambda": "^1.87.1", - "@aws-cdk/aws-cognito": "^1.87.1", - "@aws-cdk/aws-iam": "^1.87.1", - "@aws-cdk/core": "^1.87.1", - "source-map-support": "^0.5.16" - } -} diff --git a/resources/cdk/lambda_api_step_functions/setup.ts b/resources/cdk/lambda_api_step_functions/setup.ts deleted file mode 100644 index a6dd76a5375..00000000000 --- a/resources/cdk/lambda_api_step_functions/setup.ts +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env node -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -import "source-map-support/register"; -import * as cdk from "@aws-cdk/core"; -import { CfnOutput } from "@aws-cdk/core"; -import * as cognito from "@aws-cdk/aws-cognito"; -import * as iam from "@aws-cdk/aws-iam"; -import { Effect, PolicyStatement } from "@aws-cdk/aws-iam"; - -export class stepfunctions extends cdk.Stack { - constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { - super(scope, id, props); - - const myIdentityPool = new cognito.CfnIdentityPool( - this, - "ExampleIdentityPool", - { - allowUnauthenticatedIdentities: true, - } - ); - - const lambda_support_role = new iam.Role(this, "LambdaRole", { - assumedBy: new iam.FederatedPrincipal( - "cognito-identity.amazonaws.com", - { - StringEquals: { - "cognito-identity.amazonaws.com:aud": myIdentityPool.ref, - }, - "ForAnyValue:StringLike": { - "cognito-identity.amazonaws.com:amr": "unauthenticated", - }, - }, - "sts:AssumeRoleWithWebIdentity" - ), - }); - - lambda_support_role.assumeRolePolicy?.addStatements( - new iam.PolicyStatement({ - effect: iam.Effect.ALLOW, - principals: [new iam.ServicePrincipal("lambda.amazonaws.com")], - actions: ["sts:AssumeRole"], - }) - ); - - lambda_support_role.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: [ - "lambda:InvokeFunction", - "mobileanalytics:PutEvents", - "cognito-sync:*", - ], - resources: ["*"], - }) - ); - lambda_support_role.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ["dynamodb:*"], - resources: ["*"], - }) - ); - lambda_support_role.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ["ses:*"], - resources: ["*"], - }) - ); - const defaultPolicy = new cognito.CfnIdentityPoolRoleAttachment( - this, - "DefaultValid", - { - identityPoolId: myIdentityPool.ref, - roles: { - unauthenticated: lambda_support_role.roleArn, - }, - } - ); - const myIdentityPool_workflow = new cognito.CfnIdentityPool( - this, - "ExampleIdentityPoolWorkflow", - { - allowUnauthenticatedIdentities: true, - } - ); - const workflow_support_role = new iam.Role(this, "WorkflowRole", { - assumedBy: new iam.FederatedPrincipal( - "cognito-identity.amazonaws.com", - { - StringEquals: { - "cognito-identity.amazonaws.com:aud": myIdentityPool_workflow.ref, - }, - "ForAnyValue:StringLike": { - "cognito-identity.amazonaws.com:amr": "unauthenticated", - }, - }, - "sts:AssumeRoleWithWebIdentity" - ), - }); - workflow_support_role.assumeRolePolicy?.addStatements( - new iam.PolicyStatement({ - effect: iam.Effect.ALLOW, - principals: [new iam.ServicePrincipal("states.amazonaws.com")], - actions: ["sts:AssumeRole"], - }) - ); - - workflow_support_role.addToPolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: [ - "lambda:InvokeFunction", - "mobileanalytics:PutEvents", - "cognito-sync:*", - ], - resources: ["*"], - }) - ); - - const defaultPolicyworkflow = new cognito.CfnIdentityPoolRoleAttachment( - this, - "DefaultValidWorkflow", - { - identityPoolId: myIdentityPool_workflow.ref, - roles: { - unauthenticated: workflow_support_role.roleArn, - }, - } - ); - new CfnOutput(this, "Lambda support role", { - value: lambda_support_role.roleName, - }); - new CfnOutput(this, "Workflow support role", { - value: workflow_support_role.roleName, - }); - } -} - -const app = new cdk.App(); -new stepfunctions(app, "stepfunctions"); diff --git a/resources/cdk/lambda_api_step_functions/tsconfig.json b/resources/cdk/lambda_api_step_functions/tsconfig.json deleted file mode 100644 index ec75123ce65..00000000000 --- a/resources/cdk/lambda_api_step_functions/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2018", - "module": "commonjs", - "lib": ["es2018"], - "declaration": true, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": false, - "inlineSourceMap": true, - "inlineSources": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "typeRoots": ["./node_modules/@types"] - }, - "exclude": ["cdk.out"] -} From 9665b48eb02911201ade09d5087d8f56093bfe95 Mon Sep 17 00:00:00 2001 From: David Souther Date: Mon, 26 Aug 2024 10:09:58 -0400 Subject: [PATCH 44/98] Release -tools 2024-08-26-A validation (#6775) Test for -tools release 2024-08-26-A --- .github/workflows/validate-doc-metadata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index f0385a2e979..8e8a4cc96c7 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@2024-08-19-A + uses: awsdocs/aws-doc-sdk-examples-tools@2024-08-26-A with: doc_gen_only: "False" strict_titles: "True" From 1cd2252547e06f024723198f4bb7e3c31d61fa70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 09:12:31 -0500 Subject: [PATCH 45/98] Bump rexml from 3.3.3 to 3.3.6 in /ruby (#6766) Bumps [rexml](https://github.com/ruby/rexml) from 3.3.3 to 3.3.6. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.3.3...v3.3.6) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ruby/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock index 9b99149cfdf..075c4f7ab92 100644 --- a/ruby/Gemfile.lock +++ b/ruby/Gemfile.lock @@ -1443,7 +1443,7 @@ GEM rainbow (3.1.1) rake (13.0.6) regexp_parser (2.8.0) - rexml (3.3.3) + rexml (3.3.6) strscan rspec (3.12.0) rspec-core (~> 3.12.0) From e47091b9fd3f4339008d912fc943fc5b0e2676c7 Mon Sep 17 00:00:00 2001 From: Steven Meyer <108885656+meyertst-aws@users.noreply.github.com> Date: Mon, 26 Aug 2024 12:24:11 -0400 Subject: [PATCH 46/98] Cpp:SDK customization, logging (#6774) Add snippets --- .../override_default_logger.cpp | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/cpp/example_code/sdk-customization/override_default_logger.cpp b/cpp/example_code/sdk-customization/override_default_logger.cpp index a55a9ad0aa9..9f70402b07e 100644 --- a/cpp/example_code/sdk-customization/override_default_logger.cpp +++ b/cpp/example_code/sdk-customization/override_default_logger.cpp @@ -20,44 +20,45 @@ #include #include + /* * This class overrides the default log system and allows temporary logging to a * 'SimpleStreamBuf'. */ - +// snippet-start:[cpp.example_code.sdk_customization.override_logger.LogSystem] class LogSystemOverride : public Aws::Utils::Logging::DefaultLogSystem { public: explicit LogSystemOverride(Aws::Utils::Logging::LogLevel logLevel, const Aws::String &logPrefix) - : DefaultLogSystem(logLevel, logPrefix), m_OverrideLog(false) {} + : DefaultLogSystem(logLevel, logPrefix), mLogToStreamBuf(false) {} const Aws::Utils::Stream::SimpleStreamBuf &GetStreamBuf() const { - return m_StreamBuf; + return mStreamBuf; } - void setOverrideLog(bool overrideLog) { - m_OverrideLog = overrideLog; + void setLogToStreamBuf(bool logToStreamBuf) { + mLogToStreamBuf = logToStreamBuf; } protected: - virtual void ProcessFormattedStatement(Aws::String &&statement) override { - if (m_OverrideLog) { - std::lock_guard lock(m_StreamMutex); - m_StreamBuf.sputn(statement.c_str(), statement.length()); - } - else { - DefaultLogSystem::ProcessFormattedStatement(std::move(statement)); + void ProcessFormattedStatement(Aws::String &&statement) override { + if (mLogToStreamBuf) { + std::lock_guard lock(mStreamMutex); + mStreamBuf.sputn(statement.c_str(), statement.length()); } + + DefaultLogSystem::ProcessFormattedStatement(std::move(statement)); } private: - Aws::Utils::Stream::SimpleStreamBuf m_StreamBuf; + Aws::Utils::Stream::SimpleStreamBuf mStreamBuf; // Use a mutex when writing to the buffer because // ProcessFormattedStatement can be called from multiple threads. - std::mutex m_StreamMutex; - std::atomic m_OverrideLog; + std::mutex mStreamMutex; + std::atomic mLogToStreamBuf; }; +// snippet-end:[cpp.example_code.sdk_customization.override_logger.LogSystem] /* * @@ -66,19 +67,18 @@ class LogSystemOverride : public Aws::Utils::Logging::DefaultLogSystem { * Usage: 'run_override_default_logger' * */ - +// snippet-start:[cpp.example_code..sdk_customization.override_logger.Use] int main(int argc, char **argv) { - Aws::SDKOptions options; options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Trace; auto logSystemOverride = Aws::MakeShared("AllocationTag", options.loggingOptions.logLevel, options.loggingOptions.defaultLogPrefix); options.loggingOptions.logger_create_fn = [logSystemOverride]() { - return logSystemOverride; + return logSystemOverride; }; - Aws::InitAPI(options); + Aws::InitAPI(options); // Call Aws::InitAPI only once in an application. { Aws::Client::ClientConfiguration clientConfig; // Optional: Set to the AWS Region (overrides config file). @@ -86,12 +86,15 @@ int main(int argc, char **argv) { Aws::S3::S3Client s3Client(clientConfig); - logSystemOverride->setOverrideLog(true); + logSystemOverride->setLogToStreamBuf(true); auto outcome = s3Client.ListBuckets(); - if (outcome.IsSuccess()) { - std::cout << "ListBuckets succeeded:" << std::endl; + if (!outcome.IsSuccess()) { + std::cerr << "ListBuckets error: " << + outcome.GetError().GetExceptionName() << " " << + outcome.GetError().GetMessage() << std::endl; } - logSystemOverride->setOverrideLog(false); + + logSystemOverride->setLogToStreamBuf(false); std::cout << "Log for ListBuckets" << std::endl; std::cout << logSystemOverride->GetStreamBuf().str() << std::endl; @@ -101,3 +104,4 @@ int main(int argc, char **argv) { return 0; } +// snippet-end:[cpp.example_code..sdk_customization.override_logger.Use] From d779d5238403e528123e7b162a9d48cfed0ef947 Mon Sep 17 00:00:00 2001 From: David Souther Date: Tue, 27 Aug 2024 10:34:53 -0400 Subject: [PATCH 47/98] -tools release 2024-08-26-B (#6777) Test -tools release 2024-08-26-B --- .github/workflows/validate-doc-metadata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index 8e8a4cc96c7..a90e3d3af70 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@2024-08-26-A + uses: awsdocs/aws-doc-sdk-examples-tools@release/2024-08-26-B with: doc_gen_only: "False" strict_titles: "True" From b3ee36d865fa71c7ffbb5d80d0d879bac788f0a6 Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Tue, 27 Aug 2024 11:59:04 -0400 Subject: [PATCH 48/98] JavaScript (v3): EC2 - Standardize EC2 actions and basic scenario. (#6770) * JavaScript (v3): EC2 - Standardize EC2 actions and basic scenario. --- .doc_gen/metadata/ec2_metadata.yaml | 17 +- javascriptv3/example_code/ec2/README.md | 48 +- .../ec2/actions/allocate-address.js | 22 +- .../ec2/actions/associate-address.js | 53 +- .../authorize-security-group-ingress.js | 51 +- .../ec2/actions/create-key-pair.js | 47 +- .../ec2/actions/create-security-group.js | 39 +- .../ec2/actions/delete-key-pair.js | 34 +- .../ec2/actions/delete-security-group.js | 34 +- .../ec2/actions/describe-addresses.js | 37 +- .../ec2/actions/describe-images.js | 72 +- .../ec2/actions/describe-instance-types.js | 62 +- .../ec2/actions/describe-instances.js | 84 +- .../ec2/actions/describe-key-pairs.js | 35 +- .../ec2/actions/describe-regions.js | 62 +- .../ec2/actions/describe-security-groups.js | 50 +- .../ec2/actions/disassociate-address.js | 38 +- .../ec2/actions/monitor-instances.js | 40 +- .../ec2/actions/reboot-instances.js | 41 +- .../ec2/actions/release-address.js | 37 +- .../example_code/ec2/actions/run-instances.js | 97 ++- .../ec2/actions/start-instances.js | 39 +- .../ec2/actions/stop-instances.js | 39 +- .../ec2/actions/terminate-instances.js | 39 +- .../ec2/actions/unmonitor-instances.js | 38 +- javascriptv3/example_code/ec2/hello.js | 12 +- javascriptv3/example_code/ec2/libs/client.js | 8 - javascriptv3/example_code/ec2/package.json | 6 +- .../example_code/ec2/scenarios/basic.js | 614 +++---------- .../example_code/ec2/scenarios/steps.js | 815 ++++++++++++++++++ .../ec2/tests/allocate-address.unit.test.js | 20 +- .../ec2/tests/associate-address.unit.test.js | 21 +- ...horize-security-group-ingress.unit.test.js | 26 +- .../ec2/tests/basic.integration.test.js | 11 + .../ec2/tests/create-key-pair.unit.test.js | 21 +- .../tests/create-security-group.unit.test.js | 26 +- .../ec2/tests/delete-key-pair.unit.test.js | 26 +- .../tests/delete-security-group.unit.test.js | 24 +- .../ec2/tests/describe-addresses.unit.test.js | 21 +- .../ec2/tests/describe-images.unit.test.js | 40 +- .../describe-instance-types.unit.test.js | 41 +- .../ec2/tests/describe-instances.unit.test.js | 42 +- .../ec2/tests/describe-key-pairs.unit.test.js | 23 +- .../ec2/tests/describe-regions.unit.test.js | 21 +- .../describe-security-groups.unit.test.js | 38 +- .../tests/disassociate-address.unit.test.js | 23 +- .../ec2/tests/monitor-instances.unit.test.js | 21 +- .../ec2/tests/reboot-instances.unit.test.js | 23 +- .../ec2/tests/release-address.unit.test.js | 23 +- .../ec2/tests/run-instances.unit.test.js | 43 +- .../ec2/tests/start-instances.unit.test.js | 25 +- .../ec2/tests/stop-instances.unit.test.js | 25 +- .../tests/terminate-instances.unit.test.js | 37 +- .../tests/unmonitor-instances.unit.test.js | 21 +- .../example_code/libs/scenario/scenario.js | 131 +-- 55 files changed, 2300 insertions(+), 1083 deletions(-) delete mode 100644 javascriptv3/example_code/ec2/libs/client.js create mode 100644 javascriptv3/example_code/ec2/scenarios/steps.js create mode 100644 javascriptv3/example_code/ec2/tests/basic.integration.test.js diff --git a/.doc_gen/metadata/ec2_metadata.yaml b/.doc_gen/metadata/ec2_metadata.yaml index adeaa9a12ef..5c4052fe81a 100644 --- a/.doc_gen/metadata/ec2_metadata.yaml +++ b/.doc_gen/metadata/ec2_metadata.yaml @@ -47,8 +47,8 @@ ec2_Hello: sdkguide: excerpts: - description: - snippet_tags: - - javascript.v3.ec2.scenarios.Hello + snippet_files: + - javascriptv3/example_code/ec2/hello.js C++: versions: - sdk_version: 1 @@ -704,8 +704,8 @@ ec2_AllocateAddress: sdkguide: excerpts: - description: - snippet_tags: - - ec2.JavaScript.Addresses.allocateAddressV3 + snippet_files: + - javascriptv3/example_code/ec2/actions/allocate-address.js SAP ABAP: versions: - sdk_version: 1 @@ -2215,9 +2215,12 @@ ec2_Scenario_GetStartedInstances: github: javascriptv3/example_code/ec2 sdkguide: excerpts: - - description: Run an interactive scenario at a command prompt. - snippet_tags: - - javascript.v3.ec2.scenarios.basic + - description: | + This file contains a list of common actions used with EC2. The steps are constructed + with a Scenario framework that simplifies running an interactive example. For the full + context, visit the GitHub repository. + snippet_files: + - javascriptv3/example_code/ec2/scenarios/steps.js Bash: versions: - sdk_version: 2 diff --git a/javascriptv3/example_code/ec2/README.md b/javascriptv3/example_code/ec2/README.md index 89d2450c401..6139bdefe23 100644 --- a/javascriptv3/example_code/ec2/README.md +++ b/javascriptv3/example_code/ec2/README.md @@ -31,7 +31,7 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas ### Get started -- [Hello Amazon EC2](hello.js#L6) (`DescribeSecurityGroups`) +- [Hello Amazon EC2](hello.js) (`DescribeSecurityGroups`) ### Basics @@ -45,35 +45,35 @@ Code examples that show you how to perform the essential operations within a ser Code excerpts that show you how to call individual service functions. -- [AllocateAddress](actions/allocate-address.js#L6) -- [AssociateAddress](actions/associate-address.js#L6) -- [AuthorizeSecurityGroupIngress](actions/authorize-security-group-ingress.js#L6) -- [CreateKeyPair](actions/create-key-pair.js#L6) +- [AllocateAddress](actions/allocate-address.js) +- [AssociateAddress](actions/associate-address.js#L4) +- [AuthorizeSecurityGroupIngress](actions/authorize-security-group-ingress.js#L4) +- [CreateKeyPair](actions/create-key-pair.js#L4) - [CreateLaunchTemplate](../cross-services/wkflw-resilient-service/steps-deploy.js#L278) -- [CreateSecurityGroup](actions/create-security-group.js#L6) -- [DeleteKeyPair](actions/delete-key-pair.js#L6) +- [CreateSecurityGroup](actions/create-security-group.js#L4) +- [DeleteKeyPair](actions/delete-key-pair.js#L4) - [DeleteLaunchTemplate](../cross-services/wkflw-resilient-service/steps-destroy.js#L266) -- [DeleteSecurityGroup](actions/delete-security-group.js#L6) -- [DescribeAddresses](actions/describe-addresses.js#L6) +- [DeleteSecurityGroup](actions/delete-security-group.js#L4) +- [DescribeAddresses](actions/describe-addresses.js#L4) - [DescribeIamInstanceProfileAssociations](../cross-services/wkflw-resilient-service/steps-demo.js#L241) -- [DescribeImages](actions/describe-images.js#L6) -- [DescribeInstanceTypes](actions/describe-instance-types.js#L6) -- [DescribeInstances](actions/describe-instances.js#L6) -- [DescribeKeyPairs](actions/describe-key-pairs.js#L6) -- [DescribeRegions](actions/describe-regions.js#L6) -- [DescribeSecurityGroups](actions/describe-security-groups.js#L6) +- [DescribeImages](actions/describe-images.js#L4) +- [DescribeInstanceTypes](actions/describe-instance-types.js#L4) +- [DescribeInstances](actions/describe-instances.js#L4) +- [DescribeKeyPairs](actions/describe-key-pairs.js#L4) +- [DescribeRegions](actions/describe-regions.js#L4) +- [DescribeSecurityGroups](actions/describe-security-groups.js#L4) - [DescribeSubnets](../cross-services/wkflw-resilient-service/steps-deploy.js#L372) - [DescribeVpcs](../cross-services/wkflw-resilient-service/steps-deploy.js#L357) -- [DisassociateAddress](actions/disassociate-address.js#L6) -- [MonitorInstances](actions/monitor-instances.js#L6) -- [RebootInstances](actions/reboot-instances.js#L6) -- [ReleaseAddress](actions/release-address.js#L6) +- [DisassociateAddress](actions/disassociate-address.js#L4) +- [MonitorInstances](actions/monitor-instances.js#L4) +- [RebootInstances](actions/reboot-instances.js#L4) +- [ReleaseAddress](actions/release-address.js#L4) - [ReplaceIamInstanceProfileAssociation](../cross-services/wkflw-resilient-service/steps-demo.js#L253) -- [RunInstances](actions/run-instances.js#L6) -- [StartInstances](actions/start-instances.js#L6) -- [StopInstances](actions/stop-instances.js#L6) -- [TerminateInstances](actions/terminate-instances.js#L6) -- [UnmonitorInstances](actions/unmonitor-instances.js#L6) +- [RunInstances](actions/run-instances.js#L4) +- [StartInstances](actions/start-instances.js#L4) +- [StopInstances](actions/stop-instances.js#L4) +- [TerminateInstances](actions/terminate-instances.js#L4) +- [UnmonitorInstances](actions/unmonitor-instances.js#L4) ### Scenarios diff --git a/javascriptv3/example_code/ec2/actions/allocate-address.js b/javascriptv3/example_code/ec2/actions/allocate-address.js index cacb3f61c06..324c6ab6044 100644 --- a/javascriptv3/example_code/ec2/actions/allocate-address.js +++ b/javascriptv3/example_code/ec2/actions/allocate-address.js @@ -1,14 +1,14 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.Addresses.allocateAddressV3] -import { AllocateAddressCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { AllocateAddressCommand, EC2Client } from "@aws-sdk/client-ec2"; +/** + * Allocates an Elastic IP address to your AWS account. + */ export const main = async () => { + const client = new EC2Client({}); const command = new AllocateAddressCommand({}); try { @@ -18,13 +18,17 @@ export const main = async () => { console.log( "You can view your IP addresses in the AWS Management Console for Amazon EC2. Look under Network & Security > Elastic IPs", ); - } catch (err) { - console.error(err); + } catch (caught) { + if (caught instanceof Error && caught.name === "MissingParameter") { + console.warn(`${caught.message}. Did you provide these values?`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.Addresses.allocateAddressV3] - -// Invoke main function if this file was run directly. +import { fileURLToPath } from "url"; +// Call function if run directly. if (process.argv[1] === fileURLToPath(import.meta.url)) { main(); } diff --git a/javascriptv3/example_code/ec2/actions/associate-address.js b/javascriptv3/example_code/ec2/actions/associate-address.js index 60c6c55cd9a..f2a78b47230 100644 --- a/javascriptv3/example_code/ec2/actions/associate-address.js +++ b/javascriptv3/example_code/ec2/actions/associate-address.js @@ -1,22 +1,22 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[javascript.v3.ec2.actions.AssociateAddress] -import { AssociateAddressCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { AssociateAddressCommand, EC2Client } from "@aws-sdk/client-ec2"; -export const main = async () => { - // You need to allocate an Elastic IP address before associating it with an instance. - // You can do that with the AllocateAddressCommand. - const allocationId = "ALLOCATION_ID"; - // You need to create an EC2 instance before an IP address can be associated with it. - // You can do that with the RunInstancesCommand. - const instanceId = "INSTANCE_ID"; +/** + * Associates an Elastic IP address, or carrier IP address (for instances that are in subnets in Wavelength Zones) + * with an instance or a network interface. + * @param {{ instanceId: string, allocationId: string }} options + */ +export const main = async ({ instanceId, allocationId }) => { + const client = new EC2Client({}); const command = new AssociateAddressCommand({ + // You need to allocate an Elastic IP address before associating it with an instance. + // You can do that with the AllocateAddressCommand. AllocationId: allocationId, + // You need to create an EC2 instance before an IP address can be associated with it. + // You can do that with the RunInstancesCommand. InstanceId: instanceId, }); @@ -26,13 +26,34 @@ export const main = async () => { `Address with allocation ID ${allocationId} is now associated with instance ${instanceId}.`, `The association ID is ${AssociationId}.`, ); - } catch (err) { - console.error(err); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidAllocationID.NotFound" + ) { + console.warn( + `${caught.message}. Did you provide the ID of a valid Elastic IP address AllocationId?`, + ); + } else { + throw caught; + } } }; // snippet-end:[javascript.v3.ec2.actions.AssociateAddress] -// Invoke main function if this file was run directly. +// Call function if run directly. +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + allocationId: { + type: "string", + }, + instanceId: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/authorize-security-group-ingress.js b/javascriptv3/example_code/ec2/actions/authorize-security-group-ingress.js index b15a7d64f48..4301799980b 100644 --- a/javascriptv3/example_code/ec2/actions/authorize-security-group-ingress.js +++ b/javascriptv3/example_code/ec2/actions/authorize-security-group-ingress.js @@ -1,29 +1,31 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[javascript.v3.ec2.actions.AuthorizeSecurityGroupIngress] -import { AuthorizeSecurityGroupIngressCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { + AuthorizeSecurityGroupIngressCommand, + EC2Client, +} from "@aws-sdk/client-ec2"; -// Grant permissions for a single IP address to ssh into instances -// within the provided security group. -export const main = async () => { +/** + * Adds the specified inbound (ingress) rules to a security group. + * @param {{ groupId: string, ipAddress: string }} options + */ +export const main = async ({ groupId, ipAddress }) => { + const client = new EC2Client({}); const command = new AuthorizeSecurityGroupIngressCommand({ - // Replace with a security group ID from the AWS console or + // Use a group ID from the AWS console or // the DescribeSecurityGroupsCommand. - GroupId: "SECURITY_GROUP_ID", + GroupId: groupId, IpPermissions: [ { IpProtocol: "tcp", FromPort: 22, ToPort: 22, - // Replace 0.0.0.0 with the IP address to authorize. + // The IP address to authorize. // For more information on this notation, see // https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation - IpRanges: [{ CidrIp: "0.0.0.0/32" }], + IpRanges: [{ CidrIp: `${ipAddress}/32` }], }, ], }); @@ -31,13 +33,30 @@ export const main = async () => { try { const { SecurityGroupRules } = await client.send(command); console.log(JSON.stringify(SecurityGroupRules, null, 2)); - } catch (err) { - console.error(err); + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidGroupId.Malformed") { + console.warn(`${caught.message}. Please provide a valid GroupId.`); + } else { + throw caught; + } } }; // snippet-end:[javascript.v3.ec2.actions.AuthorizeSecurityGroupIngress] -// Invoke main function if this file was run directly. +// Call function if run directly. +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; + if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + groupId: { + type: "string", + }, + ipAddress: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/create-key-pair.js b/javascriptv3/example_code/ec2/actions/create-key-pair.js index 1b2badcc07a..ec09c60251f 100644 --- a/javascriptv3/example_code/ec2/actions/create-key-pair.js +++ b/javascriptv3/example_code/ec2/actions/create-key-pair.js @@ -1,30 +1,47 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.keypairs.createKeyPairV3] -import { CreateKeyPairCommand } from "@aws-sdk/client-ec2"; +import { CreateKeyPairCommand, EC2Client } from "@aws-sdk/client-ec2"; -import { client } from "../libs/client.js"; +/** + * Creates an ED25519 or 2048-bit RSA key pair with the specified name and in the specified PEM or PPK format. + * Amazon EC2 stores the public key and displays the private key for you to save to a file. + * @param {{ keyName: string }} options + */ +export const main = async ({ keyName }) => { + const client = new EC2Client({}); + const command = new CreateKeyPairCommand({ + KeyName: keyName, + }); -export const main = async () => { try { - // Create a key pair in Amazon EC2. - const { KeyMaterial, KeyName } = await client.send( - // A unique name for the key pair. Up to 255 ASCII characters. - new CreateKeyPairCommand({ KeyName: "KEY_PAIR_NAME" }), - ); - // This logs your private key. Be sure to save it. + const { KeyMaterial, KeyName } = await client.send(command); console.log(KeyName); console.log(KeyMaterial); - } catch (err) { - console.error(err); + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidKeyPair.Duplicate") { + console.warn(`${caught.message}. Try another key name.`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.keypairs.createKeyPairV3] -// Invoke main function if this file was run directly. +// Call function if run directly. +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; + if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + keyName: { + type: "string", + description: + "A unique name for the key pair. Up to 255 ASCII characters.", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/create-security-group.js b/javascriptv3/example_code/ec2/actions/create-security-group.js index 6945f92885b..1243120a7d1 100644 --- a/javascriptv3/example_code/ec2/actions/create-security-group.js +++ b/javascriptv3/example_code/ec2/actions/create-security-group.js @@ -1,31 +1,48 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.SecurityGroups.createSecurityGroupV3] -import { CreateSecurityGroupCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { CreateSecurityGroupCommand, EC2Client } from "@aws-sdk/client-ec2"; -export const main = async () => { +/** + * Creates a security group. + * @param {{ groupName: string, description: string }} options + */ +export const main = async ({ groupName, description }) => { + const client = new EC2Client({}); const command = new CreateSecurityGroupCommand({ // Up to 255 characters in length. Cannot start with sg-. - GroupName: "SECURITY_GROUP_NAME", + GroupName: groupName, // Up to 255 characters in length. - Description: "DESCRIPTION", + Description: description, }); try { const { GroupId } = await client.send(command); console.log(GroupId); - } catch (err) { - console.error(err); + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidParameterValue") { + console.warn(`${caught.message}.`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.SecurityGroups.createSecurityGroupV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + groupName: { + type: "string", + }, + description: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/delete-key-pair.js b/javascriptv3/example_code/ec2/actions/delete-key-pair.js index 5cdb11faaf8..08900afe0f7 100644 --- a/javascriptv3/example_code/ec2/actions/delete-key-pair.js +++ b/javascriptv3/example_code/ec2/actions/delete-key-pair.js @@ -1,28 +1,42 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.keypairs.deleteKeyPairV3] -import { DeleteKeyPairCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { DeleteKeyPairCommand, EC2Client } from "@aws-sdk/client-ec2"; -export const main = async () => { +/** + * Deletes the specified key pair, by removing the public key from Amazon EC2. + * @param {{ keyName: string }} options + */ +export const main = async ({ keyName }) => { + const client = new EC2Client({}); const command = new DeleteKeyPairCommand({ - KeyName: "KEY_PAIR_NAME", + KeyName: keyName, }); try { await client.send(command); console.log("Successfully deleted key pair."); - } catch (err) { - console.error(err); + } catch (caught) { + if (caught instanceof Error && caught.name === "MissingParameter") { + console.warn(`${caught.message}. Did you provide the required value?`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.keypairs.deleteKeyPairV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + keyName: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/delete-security-group.js b/javascriptv3/example_code/ec2/actions/delete-security-group.js index 698e6ac8f2b..477e19d9f5b 100644 --- a/javascriptv3/example_code/ec2/actions/delete-security-group.js +++ b/javascriptv3/example_code/ec2/actions/delete-security-group.js @@ -1,28 +1,42 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.SecurityGroups.deleteSecurityGroupV3] -import { DeleteSecurityGroupCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { DeleteSecurityGroupCommand, EC2Client } from "@aws-sdk/client-ec2"; -export const main = async () => { +/** + * Deletes a security group. + * @param {{ groupId: string }} options + */ +export const main = async ({ groupId }) => { + const client = new EC2Client({}); const command = new DeleteSecurityGroupCommand({ - GroupId: "GROUP_ID", + GroupId: groupId, }); try { await client.send(command); console.log("Security group deleted successfully."); - } catch (err) { - console.error(err); + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidGroupId.Malformed") { + console.warn(`${caught.message}. Please provide a valid GroupId.`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.SecurityGroups.deleteSecurityGroupV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + groupId: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/describe-addresses.js b/javascriptv3/example_code/ec2/actions/describe-addresses.js index 8bd03c9f4ef..5443ff804ce 100644 --- a/javascriptv3/example_code/ec2/actions/describe-addresses.js +++ b/javascriptv3/example_code/ec2/actions/describe-addresses.js @@ -1,17 +1,18 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.Addresses.describeAddressesV3] -import { DescribeAddressesCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { DescribeAddressesCommand, EC2Client } from "@aws-sdk/client-ec2"; -export const main = async () => { +/** + * Describes the specified Elastic IP addresses or all of your Elastic IP addresses. + * @param {{ allocationId: string }} options + */ +export const main = async ({ allocationId }) => { + const client = new EC2Client({}); const command = new DescribeAddressesCommand({ // You can omit this property to show all addresses. - AllocationIds: ["ALLOCATION_ID"], + AllocationIds: [allocationId], }); try { @@ -19,13 +20,29 @@ export const main = async () => { const addressList = Addresses.map((address) => ` • ${address.PublicIp}`); console.log("Elastic IP addresses:"); console.log(addressList.join("\n")); - } catch (err) { - console.error(err); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidAllocationID.NotFound" + ) { + console.warn(`${caught.message}. Please provide a valid AllocationId.`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.Addresses.describeAddressesV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + allocationId: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/describe-images.js b/javascriptv3/example_code/ec2/actions/describe-images.js index fbdae97a213..1ba8fc4787c 100644 --- a/javascriptv3/example_code/ec2/actions/describe-images.js +++ b/javascriptv3/example_code/ec2/actions/describe-images.js @@ -1,47 +1,83 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[javascript.v3.ec2.actions.DescribeImages] -import { paginateDescribeImages } from "@aws-sdk/client-ec2"; +import { EC2Client, paginateDescribeImages } from "@aws-sdk/client-ec2"; -import { client } from "../libs/client.js"; +/** + * Describes the specified images (AMIs, AKIs, and ARIs) available to you or all of the images available to you. + * @param {{ architecture: string, pageSize: number }} options + */ +export const main = async ({ architecture, pageSize }) => { + pageSize = parseInt(pageSize); + const client = new EC2Client({}); -// List at least the first i386 image available for EC2 instances. -export const main = async () => { // The paginate function is a wrapper around the base command. const paginator = paginateDescribeImages( // Without limiting the page size, this call can take a long time. pageSize is just sugar for // the MaxResults property in the base command. - { client, pageSize: 25 }, + { client, pageSize }, { // There are almost 70,000 images available. Be specific with your filtering // to increase efficiency. // See https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-ec2/interfaces/describeimagescommandinput.html#filters - Filters: [{ Name: "architecture", Values: ["x86_64"] }], + Filters: [{ Name: "architecture", Values: [architecture] }], }, ); + /** + * @type {import('@aws-sdk/client-ec2').Image[]} + */ + const images = []; + let recordsScanned = 0; + try { - const arm64Images = []; for await (const page of paginator) { + recordsScanned += pageSize; if (page.Images.length) { - arm64Images.push(...page.Images); - // Once we have at least 1 result, we can stop. - if (arm64Images.length >= 1) { - break; - } + images.push(...page.Images); + break; + } else { + console.log( + `No matching image found yet. Searched ${recordsScanned} records.`, + ); } } - console.log(arm64Images); - } catch (err) { - console.error(err); + + if (images.length) { + console.log( + `Found ${images.length} images:\n\n${images.map((image) => image.Name).join("\n")}\n`, + ); + } else { + console.log( + `No matching images found. Searched ${recordsScanned} records.\n`, + ); + } + + return images; + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidParameterValue") { + console.warn(`${caught.message}`); + return []; + } + throw caught; } }; // snippet-end:[javascript.v3.ec2.actions.DescribeImages] // Invoke main function if this file was run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + architecture: { + type: "string", + }, + pageSize: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/describe-instance-types.js b/javascriptv3/example_code/ec2/actions/describe-instance-types.js index 2aff493611e..b7c40b8d069 100644 --- a/javascriptv3/example_code/ec2/actions/describe-instance-types.js +++ b/javascriptv3/example_code/ec2/actions/describe-instance-types.js @@ -1,32 +1,38 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[javascript.v3.ec2.actions.DescribeInstanceTypes] -import { - paginateDescribeInstanceTypes, - DescribeInstanceTypesCommand, -} from "@aws-sdk/client-ec2"; +import { EC2Client, paginateDescribeInstanceTypes } from "@aws-sdk/client-ec2"; -import { client } from "../libs/client.js"; +/** + * Describes the specified instance types. By default, all instance types for the + * current Region are described. Alternatively, you can filter the results. + * @param {{ pageSize: string, supportedArch: string[], freeTier: boolean }} options + */ +export const main = async ({ pageSize, supportedArch, freeTier }) => { + pageSize = parseInt(pageSize); + const client = new EC2Client({}); -// List at least the first arm64 EC2 instance type available. -export const main = async () => { // The paginate function is a wrapper around the underlying command. const paginator = paginateDescribeInstanceTypes( // Without limiting the page size, this call can take a long time. pageSize is just sugar for // the MaxResults property in the underlying command. - { client, pageSize: 25 }, + { client, pageSize }, { Filters: [ - { Name: "processor-info.supported-architecture", Values: ["x86_64"] }, - { Name: "free-tier-eligible", Values: ["true"] }, + { + Name: "processor-info.supported-architecture", + Values: supportedArch, + }, + { Name: "free-tier-eligible", Values: [freeTier ? "true" : "false"] }, ], - } + }, ); try { + /** + * @type {import('@aws-sdk/client-ec2').InstanceTypeInfo[]} + */ const instanceTypes = []; for await (const page of paginator) { @@ -39,14 +45,36 @@ export const main = async () => { } } } - console.log(instanceTypes); - } catch (err) { - console.error(err); + console.log( + `Memory size in MiB for matching instance types:\n\n${instanceTypes.map((it) => `${it.InstanceType}: ${it.MemoryInfo.SizeInMiB} MiB`).join("\n")}`, + ); + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidParameterValue") { + console.warn(`${caught.message}`); + return []; + } + throw caught; } }; // snippet-end:[javascript.v3.ec2.actions.DescribeInstanceTypes] // Invoke main function if this file was run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + pageSize: { + type: "string", + }, + supportedArch: { + type: "string", + multiple: true, + }, + freeTier: { + type: "boolean", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/describe-instances.js b/javascriptv3/example_code/ec2/actions/describe-instances.js index 85d5e22ddc6..aaaffed1fd1 100644 --- a/javascriptv3/example_code/ec2/actions/describe-instances.js +++ b/javascriptv3/example_code/ec2/actions/describe-instances.js @@ -1,45 +1,75 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.Instances.describeInstancesV3] -import { DescribeInstancesCommand } from "@aws-sdk/client-ec2"; +import { EC2Client, paginateDescribeInstances } from "@aws-sdk/client-ec2"; -import { client } from "../libs/client.js"; - -// List all of your EC2 instances running with x86_64 architecture that were -// launched this month. -export const main = async () => { +/** + * List all of your EC2 instances running with the provided architecture that + * were launched in the past month. + * @param {{ pageSize: string, architectures: string[] }} options + */ +export const main = async ({ pageSize, architectures }) => { + pageSize = parseInt(pageSize); + const client = new EC2Client({}); const d = new Date(); const year = d.getFullYear(); const month = `0${d.getMonth() + 1}`.slice(-2); const launchTimePattern = `${year}-${month}-*`; - const command = new DescribeInstancesCommand({ - Filters: [ - { Name: "architecture", Values: ["x86_64"] }, - { Name: "instance-state-name", Values: ["running"] }, - { - Name: "launch-time", - Values: [launchTimePattern], - }, - ], - }); - try { - const { Reservations } = await client.send(command); - const instanceList = Reservations.reduce((prev, current) => { - return prev.concat(current.Instances); - }, []); + const paginator = paginateDescribeInstances( + { + client, + pageSize, + }, + { + Filters: [ + { Name: "architecture", Values: architectures }, + { Name: "instance-state-name", Values: ["running"] }, + { + Name: "launch-time", + Values: [launchTimePattern], + }, + ], + }, + ); - console.log(instanceList); - } catch (err) { - console.error(err); + try { + /** + * @type {import('@aws-sdk/client-ec2').Instance[]} + */ + const instanceList = []; + for await (const page of paginator) { + const { Reservations } = page; + Reservations.forEach((r) => instanceList.push(...r.Instances)); + } + console.log( + `Running instances launched this month:\n\n${instanceList.map((instance) => instance.InstanceId).join("\n")}`, + ); + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidParameterValue") { + console.warn(`${caught.message}.`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.Instances.describeInstancesV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + architectures: { + type: "string", + multiple: true, + }, + pageSize: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/describe-key-pairs.js b/javascriptv3/example_code/ec2/actions/describe-key-pairs.js index 3896544f605..48133a818f3 100644 --- a/javascriptv3/example_code/ec2/actions/describe-key-pairs.js +++ b/javascriptv3/example_code/ec2/actions/describe-key-pairs.js @@ -1,15 +1,16 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.keypairs.describeKeyPairV3] -import { DescribeKeyPairsCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { DescribeKeyPairsCommand, EC2Client } from "@aws-sdk/client-ec2"; -export const main = async () => { - const command = new DescribeKeyPairsCommand({}); +/** + * List all key pairs in the current AWS account. + * @param {{ dryRun: boolean }} + */ +export const main = async ({ dryRun }) => { + const client = new EC2Client({}); + const command = new DescribeKeyPairsCommand({ DryRun: dryRun }); try { const { KeyPairs } = await client.send(command); @@ -18,13 +19,27 @@ export const main = async () => { ).join("\n"); console.log("The following key pairs were found in your account:"); console.log(keyPairList); - } catch (err) { - console.error(err); + } catch (caught) { + if (caught instanceof Error && caught.name === "DryRunOperation") { + console.log(`${caught.message}`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.keypairs.describeKeyPairV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + dryRun: { + type: "boolean", + default: false, + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/describe-regions.js b/javascriptv3/example_code/ec2/actions/describe-regions.js index f4c7b385480..7a1e5c5f785 100644 --- a/javascriptv3/example_code/ec2/actions/describe-regions.js +++ b/javascriptv3/example_code/ec2/actions/describe-regions.js @@ -1,28 +1,31 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.Regions.describeRegionsV3] -import { DescribeRegionsCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { DescribeRegionsCommand, EC2Client } from "@aws-sdk/client-ec2"; -export const main = async () => { +/** + * List all available AWS regions. + * @param {{ regionNames: string[], includeOptInRegions: boolean }} options + */ +export const main = async ({ regionNames, includeOptInRegions }) => { + const client = new EC2Client({}); const command = new DescribeRegionsCommand({ // By default this command will not show regions that require you to opt-in. - // When AllRegions true even the regions that require opt-in will be returned. - AllRegions: true, + // When AllRegions is true, even the regions that require opt-in will be returned. + AllRegions: includeOptInRegions, // You can omit the Filters property if you want to get all regions. - Filters: [ - { - Name: "region-name", - // You can specify multiple values for a filter. - // You can also use '*' as a wildcard. This will return all - // of the regions that start with `us-east-`. - Values: ["ap-southeast-4"], - }, - ], + Filters: regionNames?.length + ? [ + { + Name: "region-name", + // You can specify multiple values for a filter. + // You can also use '*' as a wildcard. This will return all + // of the regions that start with `us-east-`. + Values: regionNames, + }, + ] + : undefined, }); try { @@ -30,13 +33,32 @@ export const main = async () => { const regionsList = Regions.map((reg) => ` • ${reg.RegionName}`); console.log("Found regions:"); console.log(regionsList.join("\n")); - } catch (err) { - console.error(err); + } catch (caught) { + if (caught instanceof Error && caught.name === "DryRunOperation") { + console.log(`${caught.message}`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.Regions.describeRegionsV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; + if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + regionNames: { + type: "string", + multiple: true, + }, + includeOptInRegions: { + type: "boolean", + default: false, + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/describe-security-groups.js b/javascriptv3/example_code/ec2/actions/describe-security-groups.js index ab0a783ff88..0f71233dfb8 100644 --- a/javascriptv3/example_code/ec2/actions/describe-security-groups.js +++ b/javascriptv3/example_code/ec2/actions/describe-security-groups.js @@ -1,29 +1,55 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.SecurityGroups.describeSecurityGroupsV3] -import { DescribeSecurityGroupsCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { DescribeSecurityGroupsCommand, EC2Client } from "@aws-sdk/client-ec2"; -// Log the details of a specific security group. -export const main = async () => { +/** + * Describes the specified security groups or all of your security groups. + * @param {{ groupIds: string[] }} options + */ +export const main = async ({ groupIds = [] }) => { + const client = new EC2Client({}); const command = new DescribeSecurityGroupsCommand({ - GroupIds: ["SECURITY_GROUP_ID"], + GroupIds: groupIds, }); try { const { SecurityGroups } = await client.send(command); - console.log(JSON.stringify(SecurityGroups, null, 2)); - } catch (err) { - console.error(err); + const sgList = SecurityGroups.map( + (sg) => `• ${sg.GroupName} (${sg.GroupId}): ${sg.Description}`, + ).join("\n"); + if (sgList.length) { + console.log(`Security groups:\n${sgList}`); + } else { + console.log("No security groups found."); + } + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidGroupId.Malformed") { + console.warn(`${caught.message}. Please provide a valid GroupId.`); + } else if ( + caught instanceof Error && + caught.name === "InvalidGroup.NotFound" + ) { + console.warn(caught.message); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.SecurityGroups.describeSecurityGroupsV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + groupIds: { + type: "string", + multiple: true, + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/disassociate-address.js b/javascriptv3/example_code/ec2/actions/disassociate-address.js index bba61510c66..bf7b9518f09 100644 --- a/javascriptv3/example_code/ec2/actions/disassociate-address.js +++ b/javascriptv3/example_code/ec2/actions/disassociate-address.js @@ -1,30 +1,46 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[javascript.v3.ec2.actions.DisassociateAddress] -import { DisassociateAddressCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { DisassociateAddressCommand, EC2Client } from "@aws-sdk/client-ec2"; -// Disassociate an Elastic IP address from an instance. -export const main = async () => { +/** + * Disassociate an Elastic IP address from an instance. + * @param {{ associationId: string }} options + */ +export const main = async ({ associationId }) => { + const client = new EC2Client({}); const command = new DisassociateAddressCommand({ // You can also use PublicIp, but that is for EC2 classic which is being retired. - AssociationId: "ASSOCIATION_ID", + AssociationId: associationId, }); try { await client.send(command); console.log("Successfully disassociated address"); - } catch (err) { - console.error(err); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidAssociationID.NotFound" + ) { + console.warn(`${caught.message}.`); + } else { + throw caught; + } } }; // snippet-end:[javascript.v3.ec2.actions.DisassociateAddress] // Invoke main function if this file was run directly. +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + associationId: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/monitor-instances.js b/javascriptv3/example_code/ec2/actions/monitor-instances.js index ed6a58433ff..6f537a0f1a8 100644 --- a/javascriptv3/example_code/ec2/actions/monitor-instances.js +++ b/javascriptv3/example_code/ec2/actions/monitor-instances.js @@ -1,19 +1,19 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.Instances.monitorInstancesV3] -import { MonitorInstancesCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { EC2Client, MonitorInstancesCommand } from "@aws-sdk/client-ec2"; -// Turn on detailed monitoring for the selected instance. -// By default, metrics are sent to Amazon CloudWatch every 5 minutes. -// For a cost you can enable detailed monitoring which sends metrics every minute. -export const main = async () => { +/** + * Turn on detailed monitoring for the selected instance. + * By default, metrics are sent to Amazon CloudWatch every 5 minutes. + * For a cost you can enable detailed monitoring which sends metrics every minute. + * @param {{ instanceIds: string[] }} options + */ +export const main = async ({ instanceIds }) => { + const client = new EC2Client({}); const command = new MonitorInstancesCommand({ - InstanceIds: ["INSTANCE_ID"], + InstanceIds: instanceIds, }); try { @@ -24,13 +24,27 @@ export const main = async () => { ); console.log("Monitoring status:"); console.log(instancesBeingMonitored.join("\n")); - } catch (err) { - console.error(err); + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidParameterValue") { + console.warn(`${caught.message}`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.Instances.monitorInstancesV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + instanceIds: { + type: "string", + multiple: true, + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/reboot-instances.js b/javascriptv3/example_code/ec2/actions/reboot-instances.js index f5c9e100c44..e0b85f482c9 100644 --- a/javascriptv3/example_code/ec2/actions/reboot-instances.js +++ b/javascriptv3/example_code/ec2/actions/reboot-instances.js @@ -1,28 +1,49 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.Instances.rebootInstancesV3] -import { RebootInstancesCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { EC2Client, RebootInstancesCommand } from "@aws-sdk/client-ec2"; -export const main = async () => { +/** + * Requests a reboot of the specified instances. This operation is asynchronous; + * it only queues a request to reboot the specified instances. + * @param {{ instanceIds: string[] }} options + */ +export const main = async ({ instanceIds }) => { + const client = new EC2Client({}); const command = new RebootInstancesCommand({ - InstanceIds: ["INSTANCE_ID"], + InstanceIds: instanceIds, }); try { await client.send(command); console.log("Instance rebooted successfully."); - } catch (err) { - console.error(err); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidInstanceID.NotFound" + ) { + console.warn( + `${caught.message}. Please provide the InstanceId of a valid instance to reboot.`, + ); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.Instances.rebootInstancesV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + instanceIds: { + type: "string", + multiple: true, + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/release-address.js b/javascriptv3/example_code/ec2/actions/release-address.js index c2b98c412da..05787df315e 100644 --- a/javascriptv3/example_code/ec2/actions/release-address.js +++ b/javascriptv3/example_code/ec2/actions/release-address.js @@ -1,29 +1,46 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.Addresses.releaseAddressV3] -import { ReleaseAddressCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { ReleaseAddressCommand, EC2Client } from "@aws-sdk/client-ec2"; -export const main = async () => { +/** + * Release an Elastic IP address. + * @param {{ allocationId: string }} options + */ +export const main = async ({ allocationId }) => { + const client = new EC2Client({}); const command = new ReleaseAddressCommand({ // You can also use PublicIp, but that is for EC2 classic which is being retired. - AllocationId: "ALLOCATION_ID", + AllocationId: allocationId, }); try { await client.send(command); console.log("Successfully released address."); - } catch (err) { - console.error(err); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidAllocationID.NotFound" + ) { + console.warn(`${caught.message}. Please provide a valid AllocationID.`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.Addresses.releaseAddressV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + allocationId: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/run-instances.js b/javascriptv3/example_code/ec2/actions/run-instances.js index cf33138c32d..dab1a245b2b 100644 --- a/javascriptv3/example_code/ec2/actions/run-instances.js +++ b/javascriptv3/example_code/ec2/actions/run-instances.js @@ -1,39 +1,94 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.Instances.create_instancesV3] -import { RunInstancesCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { EC2Client, RunInstancesCommand } from "@aws-sdk/client-ec2"; -// Create a new EC2 instance. -export const main = async () => { +/** + * Create new EC2 instances. + * @param {{ + * keyName: string, + * securityGroupIds: string[], + * imageId: string, + * instanceType: import('@aws-sdk/client-ec2')._InstanceType, + * minCount?: number, + * maxCount?: number }} options + */ +export const main = async ({ + keyName, + securityGroupIds, + imageId, + instanceType, + minCount = "1", + maxCount = "1", +}) => { + const client = new EC2Client({}); + minCount = parseInt(minCount); + maxCount = parseInt(maxCount); const command = new RunInstancesCommand({ // Your key pair name. - KeyName: "KEY_PAIR_NAME", + KeyName: keyName, // Your security group. - SecurityGroupIds: ["SECURITY_GROUP_ID"], - // An x86_64 compatible image. - ImageId: "ami-0001a0d1a04bfcc30", - // An x86_64 compatible free-tier instance type. - InstanceType: "t1.micro", - // Ensure only 1 instance launches. - MinCount: 1, - MaxCount: 1, + SecurityGroupIds: securityGroupIds, + // An Amazon Machine Image (AMI). There are multiple ways to search for AMIs. For more information, see: + // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html + ImageId: imageId, + // An instance type describing the resources provided to your instance. There are multiple + // ways to search for instance types. For more information see: + // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-discovery.html + InstanceType: instanceType, + // Availability Zones have capacity limitations that may impact your ability to launch instances. + // The `RunInstances` operation will only succeed if it can allocate at least the `MinCount` of instances. + // However, EC2 will attempt to launch up to the `MaxCount` of instances, even if the full request cannot be satisfied. + // If you need a specific number of instances, use `MinCount` and `MaxCount` set to the same value. + // If you want to launch up to a certain number of instances, use `MaxCount` and let EC2 provision as many as possible. + // If you require a minimum number of instances, but do not want to exceed a maximum, use both `MinCount` and `MaxCount`. + MinCount: minCount, + MaxCount: maxCount, }); try { - const response = await client.send(command); - console.log(response); - } catch (err) { - console.error(err); + const { Instances } = await client.send(command); + const instanceList = Instances.map( + (instance) => `• ${instance.InstanceId}`, + ).join("\n"); + console.log(`Launched instances:\n${instanceList}`); + } catch (caught) { + if (caught instanceof Error && caught.name === "ResourceCountExceeded") { + console.warn(`${caught.message}`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.Instances.create_instancesV3] // Invoke main function if this file was run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + keyName: { + type: "string", + }, + securityGroupIds: { + type: "string", + multiple: true, + }, + imageId: { + type: "string", + }, + instanceType: { + type: "string", + }, + minCount: { + type: "string", + }, + maxCount: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/start-instances.js b/javascriptv3/example_code/ec2/actions/start-instances.js index f584b2013a3..8ddb91e735e 100644 --- a/javascriptv3/example_code/ec2/actions/start-instances.js +++ b/javascriptv3/example_code/ec2/actions/start-instances.js @@ -1,17 +1,19 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[ec2.JavaScript.Instances.start_stopInstancesV3] -import { StartInstancesCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { EC2Client, StartInstancesCommand } from "@aws-sdk/client-ec2"; +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; -export const main = async () => { +/** + * Starts an Amazon EBS-backed instance that you've previously stopped. + * @param {{ instanceIds }} options + */ +export const main = async ({ instanceIds }) => { + const client = new EC2Client({}); const command = new StartInstancesCommand({ - // Use DescribeInstancesCommand to find InstanceIds - InstanceIds: ["INSTANCE_ID"], + InstanceIds: instanceIds, }); try { @@ -21,13 +23,28 @@ export const main = async () => { ); console.log("Starting instances:"); console.log(instanceIdList.join("\n")); - } catch (err) { - console.error(err); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidInstanceID.NotFound" + ) { + console.warn(`${caught.message}`); + } else { + throw caught; + } } }; // snippet-end:[ec2.JavaScript.Instances.start_stopInstancesV3] // Invoke main function if this file was run directly. if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + instanceIds: { + type: "string", + multiple: true, + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/stop-instances.js b/javascriptv3/example_code/ec2/actions/stop-instances.js index 69013153b2e..ec59a3e0c98 100644 --- a/javascriptv3/example_code/ec2/actions/stop-instances.js +++ b/javascriptv3/example_code/ec2/actions/stop-instances.js @@ -1,17 +1,19 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[javascript.v3.ec2.actions.StopInstances] -import { StopInstancesCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { EC2Client, StopInstancesCommand } from "@aws-sdk/client-ec2"; +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; -export const main = async () => { +/** + * Stop one or more EC2 instances. + * @param {{ instanceIds: string[] }} options + */ +export const main = async ({ instanceIds }) => { + const client = new EC2Client({}); const command = new StopInstancesCommand({ - // Use DescribeInstancesCommand to find InstanceIds - InstanceIds: ["INSTANCE_ID"], + InstanceIds: instanceIds, }); try { @@ -21,13 +23,28 @@ export const main = async () => { ); console.log("Stopping instances:"); console.log(instanceIdList.join("\n")); - } catch (err) { - console.error(err); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidInstanceID.NotFound" + ) { + console.warn(`${caught.message}`); + } else { + throw caught; + } } }; // snippet-end:[javascript.v3.ec2.actions.StopInstances] // Invoke main function if this file was run directly. if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + instanceIds: { + type: "string", + multiple: true, + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/terminate-instances.js b/javascriptv3/example_code/ec2/actions/terminate-instances.js index 0d796109beb..29574c9bc41 100644 --- a/javascriptv3/example_code/ec2/actions/terminate-instances.js +++ b/javascriptv3/example_code/ec2/actions/terminate-instances.js @@ -1,16 +1,19 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[javascript.v2.ec2.actions.TerminateInstances] -import { TerminateInstancesCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { EC2Client, TerminateInstancesCommand } from "@aws-sdk/client-ec2"; +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; -export const main = async () => { +/** + * Terminate one or more EC2 instances. + * @param {{ instanceIds: string[] }} options + */ +export const main = async ({ instanceIds }) => { + const client = new EC2Client({}); const command = new TerminateInstancesCommand({ - InstanceIds: ["INSTANCE_ID"], + InstanceIds: instanceIds, }); try { @@ -20,13 +23,29 @@ export const main = async () => { ); console.log("Terminating instances:"); console.log(instanceList.join("\n")); - } catch (err) { - console.error(err); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidInstanceID.NotFound" + ) { + console.warn(`${caught.message}`); + } else { + throw caught; + } } + ``; }; // snippet-end:[javascript.v2.ec2.actions.TerminateInstances] // Invoke main function if this file was run directly. if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + instanceIds: { + type: "string", + multiple: true, + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/actions/unmonitor-instances.js b/javascriptv3/example_code/ec2/actions/unmonitor-instances.js index ad3f605f435..4be12fedc2a 100644 --- a/javascriptv3/example_code/ec2/actions/unmonitor-instances.js +++ b/javascriptv3/example_code/ec2/actions/unmonitor-instances.js @@ -1,16 +1,19 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - // snippet-start:[javascript.v3.ec2.actions.UnmonitorInstances] -import { UnmonitorInstancesCommand } from "@aws-sdk/client-ec2"; - -import { client } from "../libs/client.js"; +import { EC2Client, UnmonitorInstancesCommand } from "@aws-sdk/client-ec2"; +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; -export const main = async () => { +/** + * Turn off detailed monitoring for the selected instance. + * @param {{ instanceIds: string[] }} options + */ +export const main = async ({ instanceIds }) => { + const client = new EC2Client({}); const command = new UnmonitorInstancesCommand({ - InstanceIds: ["i-09a3dfe7ae00e853f"], + InstanceIds: instanceIds, }); try { @@ -21,13 +24,28 @@ export const main = async () => { ); console.log("Monitoring status:"); console.log(instanceMonitoringsList.join("\n")); - } catch (err) { - console.error(err); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidInstanceID.NotFound" + ) { + console.warn(`${caught.message}`); + } else { + throw caught; + } } }; // snippet-end:[javascript.v3.ec2.actions.UnmonitorInstances] // Invoke main function if this file was run directly. if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const options = { + instanceIds: { + type: "string", + multiple: true, + }, + }; + + const { values } = parseArgs({ options }); + main(values); } diff --git a/javascriptv3/example_code/ec2/hello.js b/javascriptv3/example_code/ec2/hello.js index 56cb6a84cf4..da7b592f133 100644 --- a/javascriptv3/example_code/ec2/hello.js +++ b/javascriptv3/example_code/ec2/hello.js @@ -1,15 +1,11 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { fileURLToPath } from "url"; - -// snippet-start:[javascript.v3.ec2.scenarios.Hello] -import { DescribeSecurityGroupsCommand } from "@aws-sdk/client-ec2"; - -import { client } from "./libs/client.js"; +import { DescribeSecurityGroupsCommand, EC2Client } from "@aws-sdk/client-ec2"; // Call DescribeSecurityGroups and display the result. export const main = async () => { + const client = new EC2Client(); try { const { SecurityGroups } = await client.send( new DescribeSecurityGroupsCommand({}), @@ -27,9 +23,9 @@ export const main = async () => { console.error(err); } }; -// snippet-end:[javascript.v3.ec2.scenarios.Hello] -// Invoke main function if this file was run directly. +// Call function if run directly. +import { fileURLToPath } from "url"; if (process.argv[1] === fileURLToPath(import.meta.url)) { main(); } diff --git a/javascriptv3/example_code/ec2/libs/client.js b/javascriptv3/example_code/ec2/libs/client.js deleted file mode 100644 index 40aba234699..00000000000 --- a/javascriptv3/example_code/ec2/libs/client.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// snippet-start:[ec2.JavaScript.createclientv3] -import { EC2Client } from "@aws-sdk/client-ec2"; -export const REGION = "us-east-1"; -export const client = new EC2Client({ region: REGION }); -// snippet-end:[ec2.JavaScript.createclientv3] diff --git a/javascriptv3/example_code/ec2/package.json b/javascriptv3/example_code/ec2/package.json index e6f0a475ffa..1a4c43b968c 100644 --- a/javascriptv3/example_code/ec2/package.json +++ b/javascriptv3/example_code/ec2/package.json @@ -9,10 +9,10 @@ }, "dependencies": { "@aws-doc-sdk-examples/lib": "^1.0.0", - "@aws-sdk/client-ec2": "^3.266.1", - "@aws-sdk/client-ssm": "^3.271.0" + "@aws-sdk/client-ec2": "^3.624.0", + "@aws-sdk/client-ssm": "^3.624.0" }, "devDependencies": { - "vitest": "^1.6.0" + "vitest": "^2.0.5" } } diff --git a/javascriptv3/example_code/ec2/scenarios/basic.js b/javascriptv3/example_code/ec2/scenarios/basic.js index 26a2dd788cd..564ff0ea864 100644 --- a/javascriptv3/example_code/ec2/scenarios/basic.js +++ b/javascriptv3/example_code/ec2/scenarios/basic.js @@ -1,494 +1,142 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +import { EC2Client } from "@aws-sdk/client-ec2"; -import { fileURLToPath } from "url"; - -// snippet-start:[javascript.v3.ec2.scenarios.basic] -import { mkdtempSync, writeFileSync, rmSync } from "fs"; -import { tmpdir } from "os"; -import { join } from "path"; -import { get } from "http"; - +import { Scenario } from "@aws-doc-sdk-examples/lib/scenario/index.js"; import { - AllocateAddressCommand, - AssociateAddressCommand, - AuthorizeSecurityGroupIngressCommand, - CreateKeyPairCommand, - CreateSecurityGroupCommand, - DeleteKeyPairCommand, - DeleteSecurityGroupCommand, - DescribeInstancesCommand, - DescribeKeyPairsCommand, - DescribeSecurityGroupsCommand, - DisassociateAddressCommand, - EC2Client, - paginateDescribeImages, - paginateDescribeInstanceTypes, - ReleaseAddressCommand, - RunInstancesCommand, - StartInstancesCommand, - StopInstancesCommand, - TerminateInstancesCommand, - waitUntilInstanceStatusOk, - waitUntilInstanceStopped, - waitUntilInstanceTerminated, -} from "@aws-sdk/client-ec2"; -import { paginateGetParametersByPath, SSMClient } from "@aws-sdk/client-ssm"; - -import { wrapText } from "@aws-doc-sdk-examples/lib/utils/util-string.js"; -import { Prompter } from "@aws-doc-sdk-examples/lib/prompter.js"; - -const ec2Client = new EC2Client(); -const ssmClient = new SSMClient(); - -const prompter = new Prompter(); -const confirmMessage = "Continue?"; -const tmpDirectory = mkdtempSync(join(tmpdir(), "ec2-scenario-tmp")); - -const createKeyPair = async (keyPairName) => { - // Create a key pair in Amazon EC2. - const { KeyMaterial, KeyPairId } = await ec2Client.send( - // A unique name for the key pair. Up to 255 ASCII characters. - new CreateKeyPairCommand({ KeyName: keyPairName }), - ); - - // Save the private key in a temporary location. - writeFileSync(`${tmpDirectory}/${keyPairName}.pem`, KeyMaterial, { - mode: 0o400, - }); - - return KeyPairId; -}; - -const describeKeyPair = async (keyPairName) => { - const command = new DescribeKeyPairsCommand({ - KeyNames: [keyPairName], - }); - const { KeyPairs } = await ec2Client.send(command); - return KeyPairs[0]; -}; - -const createSecurityGroup = async (securityGroupName) => { - const command = new CreateSecurityGroupCommand({ - GroupName: securityGroupName, - Description: "A security group for the Amazon EC2 example.", - }); - const { GroupId } = await ec2Client.send(command); - return GroupId; -}; - -const allocateIpAddress = async () => { - const command = new AllocateAddressCommand({}); - const { PublicIp, AllocationId } = await ec2Client.send(command); - return { PublicIp, AllocationId }; -}; - -const getLocalIpAddress = () => { - return new Promise((res, rej) => { - get("http://checkip.amazonaws.com", (response) => { - let data = ""; - response.on("data", (chunk) => (data += chunk)); - response.on("end", () => res(data.trim())); - }).on("error", (err) => { - rej(err); - }); - }); -}; - -const authorizeSecurityGroupIngress = async (securityGroupId) => { - const ipAddress = await getLocalIpAddress(); - const command = new AuthorizeSecurityGroupIngressCommand({ - GroupId: securityGroupId, - IpPermissions: [ - { - IpProtocol: "tcp", - FromPort: 22, - ToPort: 22, - IpRanges: [{ CidrIp: `${ipAddress}/32` }], - }, - ], - }); - - await ec2Client.send(command); - return ipAddress; -}; - -const describeSecurityGroup = async (securityGroupName) => { - const command = new DescribeSecurityGroupsCommand({ - GroupNames: [securityGroupName], - }); - const { SecurityGroups } = await ec2Client.send(command); - - return SecurityGroups[0]; -}; - -const getAmznLinux2AMIs = async () => { - const AMIs = []; - for await (const page of paginateGetParametersByPath( - { - client: ssmClient, - }, - { Path: "/aws/service/ami-amazon-linux-latest" }, - )) { - page.Parameters.forEach((param) => { - if (param.Name.includes("amzn2")) { - AMIs.push(param.Value); - } - }); - } - - const imageDetails = []; - - for await (const page of paginateDescribeImages( - { client: ec2Client }, - { ImageIds: AMIs }, - )) { - imageDetails.push(...(page.Images || [])); - } - - const choices = imageDetails.map((image, index) => ({ - name: `${image.ImageId} - ${image.Description}`, - value: index, - })); - - /** - * @type {number} - */ - const selectedIndex = await prompter.select({ - message: "Select an image.", - choices, - }); - - return imageDetails[selectedIndex]; -}; + greeting, + createKeyPair, + provideKeyPairName, + logKeyPair, + confirmDeleteKeyPair, + maybeDeleteKeyPair, + createSecurityGroup, + logSecurityGroup, + authorizeSecurityGroupIngress, + logSecurityGroupIngress, + provideSecurityGroupName, + getImages, + getCompatibleInstanceTypes, + provideInstanceType, + logRunInstance, + runInstance, + logSSHConnectionInfo, + logIpAddressBehavior, + logStopInstance, + stopInstance, + confirmTerminateInstance, + maybeTerminateInstance, + confirmDeleteSecurityGroup, + maybeDeleteSecurityGroup, + confirm, + exitOnNoConfirm, + provideImage, + logErrors, + describeInstance, + logStartInstance, + startInstance, + logCleanUp, + logIpAllocation, + allocateIp, + associateIp, + logStaticIpProof, + confirmDisassociateAddress, + maybeDisassociateAddress, + maybeReleaseAddress, + deleteTemporaryDirectory, +} from "./steps.js"; + +export const ec2Scenario = new Scenario( + "EC2", + [ + greeting, + confirm, + exitOnNoConfirm, + provideKeyPairName, + createKeyPair, + logKeyPair, + provideSecurityGroupName, + createSecurityGroup, + logSecurityGroup, + authorizeSecurityGroupIngress, + logSecurityGroupIngress, + getImages, + provideImage, + getCompatibleInstanceTypes, + provideInstanceType, + logRunInstance, + confirm, + exitOnNoConfirm, + runInstance, + describeInstance, + logSSHConnectionInfo, + confirm, + exitOnNoConfirm, + logIpAddressBehavior, + confirm, + exitOnNoConfirm, + logStopInstance, + stopInstance, + logStartInstance, + startInstance, + describeInstance, + logSSHConnectionInfo, + confirm, + exitOnNoConfirm, + logIpAllocation, + confirm, + exitOnNoConfirm, + allocateIp, + associateIp, + logSSHConnectionInfo, + confirm, + exitOnNoConfirm, + logStaticIpProof, + confirm, + exitOnNoConfirm, + logStopInstance, + stopInstance, + logStartInstance, + startInstance, + logSSHConnectionInfo, + logCleanUp, + confirm, + exitOnNoConfirm, + confirmDisassociateAddress, + maybeDisassociateAddress, + maybeReleaseAddress, + confirmTerminateInstance, + maybeTerminateInstance, + confirmDeleteSecurityGroup, + maybeDeleteSecurityGroup, + confirmDeleteKeyPair, + maybeDeleteKeyPair, + deleteTemporaryDirectory, + logErrors, + ], + { ec2Client: new EC2Client({}), errors: [] }, +); /** - * @param {import('@aws-sdk/client-ec2').Image} imageDetails + * Run the EC2 introductory scenario. This will make changes + * in your AWS account. + * @param {{ confirmAll: boolean, verbose: boolean }} options */ -const getCompatibleInstanceTypes = async (imageDetails) => { - const paginator = paginateDescribeInstanceTypes( - { client: ec2Client, pageSize: 25 }, - { - Filters: [ - { - Name: "processor-info.supported-architecture", - Values: [imageDetails.Architecture], - }, - { Name: "instance-type", Values: ["*.micro", "*.small"] }, - ], - }, - ); - - const instanceTypes = []; - - for await (const page of paginator) { - if (page.InstanceTypes.length) { - instanceTypes.push(...(page.InstanceTypes || [])); - } - } - - const choices = instanceTypes.map((type, index) => ({ - name: `${type.InstanceType} - Memory:${type.MemoryInfo.SizeInMiB}`, - value: index, - })); - - /** - * @type {number} - */ - const selectedIndex = await prompter.select({ - message: "Select an instance type.", - choices, - }); - return instanceTypes[selectedIndex]; +export const main = async ({ confirmAll, verbose }) => { + await ec2Scenario.run({ confirmAll, verbose }); }; -const runInstance = async ({ - keyPairName, - securityGroupId, - imageId, - instanceType, -}) => { - const command = new RunInstancesCommand({ - KeyName: keyPairName, - SecurityGroupIds: [securityGroupId], - ImageId: imageId, - InstanceType: instanceType, - MinCount: 1, - MaxCount: 1, - }); - - const { Instances } = await ec2Client.send(command); - await waitUntilInstanceStatusOk( - { client: ec2Client }, - { InstanceIds: [Instances[0].InstanceId] }, - ); - return Instances[0].InstanceId; -}; - -const describeInstance = async (instanceId) => { - const command = new DescribeInstancesCommand({ - InstanceIds: [instanceId], - }); - - const { Reservations } = await ec2Client.send(command); - return Reservations[0].Instances[0]; -}; - -const displaySSHConnectionInfo = ({ publicIp, keyPairName }) => { - return `ssh -i ${tmpDirectory}/${keyPairName}.pem ec2-user@${publicIp}`; -}; - -const stopInstance = async (instanceId) => { - const command = new StopInstancesCommand({ InstanceIds: [instanceId] }); - await ec2Client.send(command); - await waitUntilInstanceStopped( - { client: ec2Client }, - { InstanceIds: [instanceId] }, - ); -}; - -const startInstance = async (instanceId) => { - const startCommand = new StartInstancesCommand({ InstanceIds: [instanceId] }); - await ec2Client.send(startCommand); - await waitUntilInstanceStatusOk( - { client: ec2Client }, - { InstanceIds: [instanceId] }, - ); - return await describeInstance(instanceId); -}; - -const associateAddress = async ({ allocationId, instanceId }) => { - const command = new AssociateAddressCommand({ - AllocationId: allocationId, - InstanceId: instanceId, - }); - - const { AssociationId } = await ec2Client.send(command); - return AssociationId; -}; - -const disassociateAddress = async (associationId) => { - const command = new DisassociateAddressCommand({ - AssociationId: associationId, - }); - try { - await ec2Client.send(command); - } catch (err) { - console.warn( - `Failed to disassociated address with association id: ${associationId}`, - err, - ); - } -}; - -const releaseAddress = async (allocationId) => { - const command = new ReleaseAddressCommand({ - AllocationId: allocationId, - }); - - try { - await ec2Client.send(command); - console.log(`Address with allocation ID ${allocationId} released.\n`); - } catch (err) { - console.log( - `Failed to release address with allocation id: ${allocationId}.`, - err, - ); - } -}; - -const restartInstance = async (instanceId) => { - console.log("Stopping instance."); - await stopInstance(instanceId); - console.log("Instance stopped."); - console.log("Starting instance."); - const { PublicIpAddress } = await startInstance(instanceId); - return PublicIpAddress; -}; - -const terminateInstance = async (instanceId) => { - const command = new TerminateInstancesCommand({ - InstanceIds: [instanceId], - }); - - try { - await ec2Client.send(command); - await waitUntilInstanceTerminated( - { client: ec2Client }, - { InstanceIds: [instanceId] }, - ); - console.log(`Instance with ID ${instanceId} terminated.\n`); - } catch (err) { - console.warn(`Failed to terminate instance ${instanceId}.`, err); - } -}; - -const deleteSecurityGroup = async (securityGroupId) => { - const command = new DeleteSecurityGroupCommand({ - GroupId: securityGroupId, - }); - - try { - await ec2Client.send(command); - console.log(`Security group ${securityGroupId} deleted.\n`); - } catch (err) { - console.warn(`Failed to delete security group ${securityGroupId}.`, err); - } -}; - -const deleteKeyPair = async (keyPairName) => { - const command = new DeleteKeyPairCommand({ - KeyName: keyPairName, - }); - - try { - await ec2Client.send(command); - console.log(`Key pair ${keyPairName} deleted.\n`); - } catch (err) { - console.warn(`Failed to delete key pair ${keyPairName}.`, err); - } -}; - -const deleteTemporaryDirectory = () => { - try { - rmSync(tmpDirectory, { recursive: true }); - console.log(`Temporary directory ${tmpDirectory} deleted.\n`); - } catch (err) { - console.warn(`Failed to delete temporary directory ${tmpDirectory}.`, err); - } -}; - -export const main = async () => { - const keyPairName = "ec2-scenario-key-pair"; - const securityGroupName = "ec2-scenario-security-group"; - - let securityGroupId, ipAllocationId, publicIp, instanceId, associationId; - - console.log(wrapText("Welcome to the Amazon EC2 basic usage scenario.")); - - try { - // Prerequisites - console.log( - "Before you launch an instance, you'll need a few things:", - "\n - A Key Pair", - "\n - A Security Group", - "\n - An IP Address", - "\n - An AMI", - "\n - A compatible instance type", - "\n\n I'll go ahead and take care of the first three, but I'll need your help for the rest.", - ); - - await prompter.confirm({ message: confirmMessage }); - - await createKeyPair(keyPairName); - securityGroupId = await createSecurityGroup(securityGroupName); - const { PublicIp, AllocationId } = await allocateIpAddress(); - ipAllocationId = AllocationId; - publicIp = PublicIp; - const ipAddress = await authorizeSecurityGroupIngress(securityGroupId); - - const { KeyName } = await describeKeyPair(keyPairName); - const { GroupName } = await describeSecurityGroup(securityGroupName); - console.log(`✅ created the key pair ${KeyName}.\n`); - console.log( - `✅ created the security group ${GroupName}`, - `and allowed SSH access from ${ipAddress} (your IP).\n`, - ); - console.log(`✅ allocated ${publicIp} to be used for your EC2 instance.\n`); - - await prompter.confirm({ message: confirmMessage }); - - // Creating the instance - console.log(wrapText("Create the instance.")); - console.log( - "You get to choose which image you want. Select an amazon-linux-2 image from the following:", - ); - const imageDetails = await getAmznLinux2AMIs(); - const instanceTypeDetails = await getCompatibleInstanceTypes(imageDetails); - console.log("Creating your instance. This can take a few seconds."); - instanceId = await runInstance({ - keyPairName, - securityGroupId, - imageId: imageDetails.ImageId, - instanceType: instanceTypeDetails.InstanceType, - }); - const instanceDetails = await describeInstance(instanceId); - console.log(`✅ instance ${instanceId}.\n`); - console.log(instanceDetails); - console.log( - `\nYou should now be able to SSH into your instance from another terminal:`, - `\n${displaySSHConnectionInfo({ - publicIp: instanceDetails.PublicIpAddress, - keyPairName, - })}`, - ); - - await prompter.confirm({ message: confirmMessage }); - - // Understanding the IP address. - console.log(wrapText("Understanding the IP address.")); - console.log( - "When you stop and start an instance, the IP address will change. I'll restart your", - "instance for you. Notice how the IP address changes.", - ); - const ipAddressAfterRestart = await restartInstance(instanceId); - console.log( - `\n Instance started. The IP address changed from ${instanceDetails.PublicIpAddress} to ${ipAddressAfterRestart}`, - `\n${displaySSHConnectionInfo({ - publicIp: ipAddressAfterRestart, - keyPairName, - })}`, - ); - await prompter.confirm({ message: confirmMessage }); - console.log( - `If you want to the IP address to be static, you can associate an allocated`, - `IP address to your instance. I allocated ${publicIp} for you earlier, and now I'll associate it to your instance.`, - ); - associationId = await associateAddress({ - allocationId: ipAllocationId, - instanceId, - }); - console.log( - "Done. Now you should be able to SSH using the new IP.\n", - `${displaySSHConnectionInfo({ publicIp, keyPairName })}`, - ); - await prompter.confirm({ message: confirmMessage }); - console.log( - "I'll restart the server again so you can see the IP address remains the same.", - ); - const ipAddressAfterAssociated = await restartInstance(instanceId); - console.log( - `Done. Here's your SSH info. Notice the IP address hasn't changed.`, - `\n${displaySSHConnectionInfo({ - publicIp: ipAddressAfterAssociated, - keyPairName, - })}`, - ); - await prompter.confirm({ message: confirmMessage }); - } catch (err) { - console.error(err); - } finally { - // Clean up. - console.log(wrapText("Clean up.")); - console.log("Now I'll clean up all of the stuff I created."); - await prompter.confirm({ message: confirmMessage }); - console.log("Cleaning up. Some of these steps can take a bit of time."); - await disassociateAddress(associationId); - await terminateInstance(instanceId); - await releaseAddress(ipAllocationId); - await deleteSecurityGroup(securityGroupId); - deleteTemporaryDirectory(); - await deleteKeyPair(keyPairName); - console.log( - "Done cleaning up. Thanks for staying until the end!", - "If you have any feedback please use the feedback button in the docs", - "or create an issue on GitHub.", - ); - } -}; -// snippet-end:[javascript.v3.ec2.scenarios.basic] - -// Invoke main function if this file was run directly. +// Call function if run directly. +import { fileURLToPath } from "node:url"; +import { parseArgs } from "node:util"; if (process.argv[1] === fileURLToPath(import.meta.url)) { - main(); + const { values } = parseArgs({ + options: { + yes: { + type: "boolean", + short: "y", + }, + }, + }); + main({ confirmAll: values.yes }); } diff --git a/javascriptv3/example_code/ec2/scenarios/steps.js b/javascriptv3/example_code/ec2/scenarios/steps.js new file mode 100644 index 00000000000..ea4cb70345b --- /dev/null +++ b/javascriptv3/example_code/ec2/scenarios/steps.js @@ -0,0 +1,815 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { tmpdir } from "node:os"; +import { writeFile, mkdtemp, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { get } from "node:http"; + +import { + AllocateAddressCommand, + AssociateAddressCommand, + AuthorizeSecurityGroupIngressCommand, + CreateKeyPairCommand, + CreateSecurityGroupCommand, + DeleteKeyPairCommand, + DeleteSecurityGroupCommand, + DisassociateAddressCommand, + paginateDescribeImages, + paginateDescribeInstances, + paginateDescribeInstanceTypes, + ReleaseAddressCommand, + RunInstancesCommand, + StartInstancesCommand, + StopInstancesCommand, + TerminateInstancesCommand, + waitUntilInstanceStatusOk, + waitUntilInstanceStopped, + waitUntilInstanceTerminated, +} from "@aws-sdk/client-ec2"; + +import { + ScenarioAction, + ScenarioInput, + ScenarioOutput, +} from "@aws-doc-sdk-examples/lib/scenario/index.js"; + +import { paginateGetParametersByPath, SSMClient } from "@aws-sdk/client-ssm"; + +/** + * @typedef {{ + * ec2Client: import('@aws-sdk/client-ec2').EC2Client, + * errors: Error[], + * keyPairId?: string, + * tmpDirectory?: string, + * securityGroupId?: string, + * ipAddress?: string, + * images?: import('@aws-sdk/client-ec2').Image[], + * image?: import('@aws-sdk/client-ec2').Image, + * instanceTypes?: import('@aws-sdk/client-ec2').InstanceTypeInfo[], + * instanceId?: string, + * instanceIpAddress?: string, + * allocationId?: string, + * allocatedIpAddress?: string, + * associationId?: string, + * }} State + */ + +/** + * A skip function provided to the `skipWhen` of a Step when you want + * to ignore that step if any errors have occurred. + * @param {State} state + */ +const skipWhenErrors = (state) => state.errors.length > 0; + +const MAX_WAITER_TIME_IN_SECONDS = 60 * 8; + +export const confirm = new ScenarioInput("confirmContinue", "Continue?", { + type: "confirm", + skipWhen: skipWhenErrors, +}); + +export const exitOnNoConfirm = new ScenarioAction( + `exitOnConfirmContinueFalse`, + (/** @type { { earlyExit: boolean } & Record} */ state) => { + if (!state[confirm.name]) { + state.earlyExit = true; + } + }, + { + skipWhen: skipWhenErrors, + }, +); + +export const greeting = new ScenarioOutput( + "greeting", + `Welcome to the Amazon EC2 basic usage scenario. +Before you launch an instances, you'll need to provide a few things: + • A key pair - This is for SSH access to your EC2 instance. You only need to provide the name. + • A security group - This is used for configuring access to your instance. Again, only the name is needed. + • An IP address - Your public IP address will be fetched. + • An Amazon Machine Image (AMI) + • A compatible instance type`, + { header: true, preformatted: true, skipWhen: skipWhenErrors }, +); + +export const provideKeyPairName = new ScenarioInput( + "keyPairName", + "Provide a name for a new key pair.", + { type: "input", default: "ec2-example-key-pair", skipWhen: skipWhenErrors }, +); + +export const createKeyPair = new ScenarioAction( + "createKeyPair", + async (/** @type {State} */ state) => { + try { + // Create a key pair in Amazon EC2. + const { KeyMaterial, KeyPairId } = await state.ec2Client.send( + // A unique name for the key pair. Up to 255 ASCII characters. + new CreateKeyPairCommand({ KeyName: state[provideKeyPairName.name] }), + ); + + state.keyPairId = KeyPairId; + + // Save the private key in a temporary location. + state.tmpDirectory = await mkdtemp(join(tmpdir(), "ec2-scenario-tmp")); + await writeFile( + `${state.tmpDirectory}/${state[provideKeyPairName.name]}.pem`, + KeyMaterial, + { + mode: 0o400, + }, + ); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidKeyPair.Duplicate" + ) { + caught.message = `${caught.message}. Try another key name.`; + } + + state.errors.push(caught); + } + }, + { skipWhen: skipWhenErrors }, +); + +export const logKeyPair = new ScenarioOutput( + "logKeyPair", + (/** @type {State} */ state) => + `Created the key pair ${state[provideKeyPairName.name]}.`, + { skipWhen: skipWhenErrors }, +); + +export const confirmDeleteKeyPair = new ScenarioInput( + "confirmDeleteKeyPair", + "Do you want to delete the key pair?", + { + type: "confirm", + // Don't do anything when a key pair was never created. + skipWhen: (/** @type {State} */ state) => !state.keyPairId, + }, +); + +export const maybeDeleteKeyPair = new ScenarioAction( + "deleteKeyPair", + async (/** @type {State} */ state) => { + try { + // Delete a key pair by name from EC2 + await state.ec2Client.send( + new DeleteKeyPairCommand({ KeyName: state[provideKeyPairName.name] }), + ); + } catch (caught) { + if ( + caught instanceof Error && + // Occurs when a required parameter (e.g. KeyName) is undefined. + caught.name === "MissingParameter" + ) { + caught.message = `${caught.message}. Did you provide the required value?`; + } + state.errors.push(caught); + } + }, + { + // Don't do anything when there's no key pair to delete or the user chooses + // to keep it. + skipWhen: (/** @type {State} */ state) => + !state.keyPairId || !state[confirmDeleteKeyPair.name], + }, +); + +export const provideSecurityGroupName = new ScenarioInput( + "securityGroupName", + "Provide a name for a new security group.", + { type: "input", default: "ec2-scenario-sg", skipWhen: skipWhenErrors }, +); + +export const createSecurityGroup = new ScenarioAction( + "createSecurityGroup", + async (/** @type {State} */ state) => { + try { + // Create a new security group that will be used to configure ingress/egress for + // an EC2 instance. + const { GroupId } = await state.ec2Client.send( + new CreateSecurityGroupCommand({ + GroupName: state[provideSecurityGroupName.name], + Description: "A security group for the Amazon EC2 example.", + }), + ); + state.securityGroupId = GroupId; + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidGroup.Duplicate") { + caught.message = `${caught.message}. Please provide a different name for your security group.`; + } + + state.errors.push(caught); + } + }, + { skipWhen: skipWhenErrors }, +); + +export const logSecurityGroup = new ScenarioOutput( + "logSecurityGroup", + (/** @type {State} */ state) => + `Created the security group ${state.securityGroupId}.`, + { skipWhen: skipWhenErrors }, +); + +export const confirmDeleteSecurityGroup = new ScenarioInput( + "confirmDeleteSecurityGroup", + "Do you want to delete the security group?", + { + type: "confirm", + // Don't do anything when a security group was never created. + skipWhen: (/** @type {State} */ state) => !state.securityGroupId, + }, +); + +export const maybeDeleteSecurityGroup = new ScenarioAction( + "deleteSecurityGroup", + async (/** @type {State} */ state) => { + try { + // Delete the security group if the 'skipWhen' condition below is not met. + await state.ec2Client.send( + new DeleteSecurityGroupCommand({ + GroupId: state.securityGroupId, + }), + ); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidGroupId.Malformed" + ) { + caught.message = `${caught.message}. Please provide a valid GroupId.`; + } + state.errors.push(caught); + } + }, + { + // Don't do anything when there's no security group to delete + // or the user chooses to keep it. + skipWhen: (/** @type {State} */ state) => + !state.securityGroupId || !state[confirmDeleteSecurityGroup.name], + }, +); + +export const authorizeSecurityGroupIngress = new ScenarioAction( + "authorizeSecurity", + async (/** @type {State} */ state) => { + try { + // Get the public IP address of the machine running this example. + const ipAddress = await new Promise((res, rej) => { + get("http://checkip.amazonaws.com", (response) => { + let data = ""; + response.on("data", (chunk) => (data += chunk)); + response.on("end", () => res(data.trim())); + }).on("error", (err) => { + rej(err); + }); + }); + state[`ipAddress`] = ipAddress; + // Allow ingress from the IP address above to the security group. + // This will allow you to SSH into the EC2 instance. + const command = new AuthorizeSecurityGroupIngressCommand({ + GroupId: state.securityGroupId, + IpPermissions: [ + { + IpProtocol: "tcp", + FromPort: 22, + ToPort: 22, + IpRanges: [{ CidrIp: `${ipAddress}/32` }], + }, + ], + }); + + await state.ec2Client.send(command); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidGroupId.Malformed" + ) { + caught.message = `${caught.message}. Please provide a valid GroupId.`; + } + + state.errors.push(caught); + } + }, + { skipWhen: skipWhenErrors }, +); + +export const logSecurityGroupIngress = new ScenarioOutput( + "logSecurityGroupIngress", + (/** @type {State} */ state) => + `Allowed SSH access from your public IP: ${state.ipAddress}.`, + { skipWhen: skipWhenErrors }, +); + +export const getImages = new ScenarioAction( + "images", + async (/** @type {State} */ state) => { + const AMIs = []; + // Some AWS services publish information about common artifacts as AWS Systems Manager (SSM) + // public parameters. For example, the Amazon Elastic Compute Cloud (Amazon EC2) + // service publishes information about Amazon Machine Images (AMIs) as public parameters. + + // Create the paginator for getting images. Actions that return multiple pages of + // results have paginators to simplify those calls. + const getParametersByPathPaginator = paginateGetParametersByPath( + { + // Not storing this client in state since it's only used once. + client: new SSMClient({}), + }, + { + // The path to the public list of the latest amazon-linux instances. + Path: "/aws/service/ami-amazon-linux-latest", + }, + ); + + try { + for await (const page of getParametersByPathPaginator) { + page.Parameters.forEach((param) => { + // Filter by Amazon Linux 2 + if (param.Name.includes("amzn2")) { + AMIs.push(param.Value); + } + }); + } + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidFilterValue") { + caught.message = `${caught.message} Please provide a valid filter value for paginateGetParametersByPath.`; + } + state.errors.push(caught); + return; + } + + const imageDetails = []; + const describeImagesPaginator = paginateDescribeImages( + { client: state.ec2Client }, + // The images found from the call to SSM. + { ImageIds: AMIs }, + ); + + try { + // Get more details for the images found above. + for await (const page of describeImagesPaginator) { + imageDetails.push(...(page.Images || [])); + } + + // Store the image details for later use. + state["images"] = imageDetails; + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidAMIID.NotFound") { + caught.message = `${caught.message}. Please provide a valid image id.`; + } + + state.errors.push(caught); + } + }, + { skipWhen: skipWhenErrors }, +); + +export const provideImage = new ScenarioInput( + "image", + "Select one of the following images.", + { + type: "select", + choices: (/** @type { State } */ state) => + state.images.map((image) => ({ + name: `${image.ImageId} - ${image.Description}`, + value: image, + })), + default: (/** @type { State } */ state) => state.images[0], + skipWhen: skipWhenErrors, + }, +); + +export const getCompatibleInstanceTypes = new ScenarioAction( + "getCompatibleInstanceTypes", + async (/** @type {State} */ state) => { + // Get more details about instance types that match the architecture of + // the provided image. + const paginator = paginateDescribeInstanceTypes( + { client: state.ec2Client, pageSize: 25 }, + { + Filters: [ + { + Name: "processor-info.supported-architecture", + // The value selected from provideImage() + Values: [state.image.Architecture], + }, + // Filter for smaller, less expensive, types. + { Name: "instance-type", Values: ["*.micro", "*.small"] }, + ], + }, + ); + + const instanceTypes = []; + + try { + for await (const page of paginator) { + if (page.InstanceTypes.length) { + instanceTypes.push(...(page.InstanceTypes || [])); + } + } + + if (!instanceTypes.length) { + state.errors.push( + "No instance types matched the instance type filters.", + ); + } + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidParameterValue") { + caught.message = `${caught.message}. Please check the provided values and try again.`; + } + + state.errors.push(caught); + } + + state["instanceTypes"] = instanceTypes; + }, + { skipWhen: skipWhenErrors }, +); + +export const provideInstanceType = new ScenarioInput( + "instanceType", + "Select an instance type.", + { + choices: (/** @type {State} */ state) => + state.instanceTypes.map((instanceType) => ({ + name: `${instanceType.InstanceType} - Memory:${instanceType.MemoryInfo.SizeInMiB}`, + value: instanceType.InstanceType, + })), + type: "select", + default: (/** @type {State} */ state) => + state.instanceTypes[0].InstanceType, + skipWhen: skipWhenErrors, + }, +); + +export const runInstance = new ScenarioAction( + "runInstance", + async (/** @type { State } */ state) => { + const { Instances } = await state.ec2Client.send( + new RunInstancesCommand({ + KeyName: state[provideKeyPairName.name], + SecurityGroupIds: [state.securityGroupId], + ImageId: state.image.ImageId, + InstanceType: state[provideInstanceType.name], + // Availability Zones have capacity limitations that may impact your ability to launch instances. + // The `RunInstances` operation will only succeed if it can allocate at least the `MinCount` of instances. + // However, EC2 will attempt to launch up to the `MaxCount` of instances, even if the full request cannot be satisfied. + // If you need a specific number of instances, use `MinCount` and `MaxCount` set to the same value. + // If you want to launch up to a certain number of instances, use `MaxCount` and let EC2 provision as many as possible. + // If you require a minimum number of instances, but do not want to exceed a maximum, use both `MinCount` and `MaxCount`. + MinCount: 1, + MaxCount: 1, + }), + ); + + state.instanceId = Instances[0].InstanceId; + + try { + // Poll `DescribeInstanceStatus` until status is "ok". + await waitUntilInstanceStatusOk( + { + client: state.ec2Client, + maxWaitTime: MAX_WAITER_TIME_IN_SECONDS, + }, + { InstanceIds: [Instances[0].InstanceId] }, + ); + } catch (caught) { + if (caught instanceof Error && caught.name === "TimeoutError") { + caught.message = `${caught.message}. Try increasing the maxWaitTime in the waiter.`; + } + + state.errors.push(caught); + } + }, + { skipWhen: skipWhenErrors }, +); + +export const logRunInstance = new ScenarioOutput( + "logRunInstance", + "The next step is to run your EC2 instance for the first time. This can take a few minutes.", + { header: true, skipWhen: skipWhenErrors }, +); + +export const describeInstance = new ScenarioAction( + "describeInstance", + async (/** @type { State } */ state) => { + /** @type { import("@aws-sdk/client-ec2").Instance[] } */ + const instances = []; + + try { + const paginator = paginateDescribeInstances( + { + client: state.ec2Client, + }, + { + // Only get our created instance. + InstanceIds: [state.instanceId], + }, + ); + + for await (const page of paginator) { + for (const reservation of page.Reservations) { + instances.push(...reservation.Instances); + } + } + if (instances.length !== 1) { + throw new Error(`Instance ${state.instanceId} not found.`); + } + + // The only info we need is the IP address for SSH purposes. + state.instanceIpAddress = instances[0].PublicIpAddress; + } catch (caught) { + if (caught instanceof Error && caught.name === "InvalidParameterValue") { + caught.message = `${caught.message}. Please check provided values and try again.`; + } + + state.errors.push(caught); + } + }, + { skipWhen: skipWhenErrors }, +); + +export const logSSHConnectionInfo = new ScenarioOutput( + "logSSHConnectionInfo", + (/** @type { State } */ state) => + `You can now SSH into your instance using the following command: +ssh -i ${state.tmpDirectory}/${state[provideKeyPairName.name]}.pem ec2-user@${state.instanceIpAddress}`, + { preformatted: true, skipWhen: skipWhenErrors }, +); + +export const logStopInstance = new ScenarioOutput( + "logStopInstance", + "Stopping your EC2 instance.", + { skipWhen: skipWhenErrors }, +); + +export const stopInstance = new ScenarioAction( + "stopInstance", + async (/** @type { State } */ state) => { + try { + await state.ec2Client.send( + new StopInstancesCommand({ + InstanceIds: [state.instanceId], + }), + ); + + await waitUntilInstanceStopped( + { + client: state.ec2Client, + maxWaitTime: MAX_WAITER_TIME_IN_SECONDS, + }, + { InstanceIds: [state.instanceId] }, + ); + } catch (caught) { + if (caught instanceof Error && caught.name === "TimeoutError") { + caught.message = `${caught.message}. Try increasing the maxWaitTime in the waiter.`; + } + + state.errors.push(caught); + } + }, + // Don't try to stop an instance that doesn't exist. + { skipWhen: (/** @type { State } */ state) => !state.instanceId }, +); + +export const logIpAddressBehavior = new ScenarioOutput( + "logIpAddressBehavior", + [ + "When you run an instance, by default it's assigned an IP address.", + "That IP address is not static. It will change every time the instance is restarted.", + "The next step is to stop and restart your instance to demonstrate this behavior.", + ].join(" "), + { header: true, skipWhen: skipWhenErrors }, +); + +export const logStartInstance = new ScenarioOutput( + "logStartInstance", + (/** @type { State } */ state) => `Starting instance ${state.instanceId}`, + { skipWhen: skipWhenErrors }, +); + +export const startInstance = new ScenarioAction( + "startInstance", + async (/** @type { State } */ state) => { + try { + await state.ec2Client.send( + new StartInstancesCommand({ + InstanceIds: [state.instanceId], + }), + ); + + await waitUntilInstanceStatusOk( + { + client: state.ec2Client, + maxWaitTime: MAX_WAITER_TIME_IN_SECONDS, + }, + { InstanceIds: [state.instanceId] }, + ); + } catch (caught) { + if (caught instanceof Error && caught.name === "TimeoutError") { + caught.message = `${caught.message}. Try increasing the maxWaitTime in the waiter.`; + } + + state.errors.push(caught); + } + }, + { skipWhen: skipWhenErrors }, +); + +export const logIpAllocation = new ScenarioOutput( + "logIpAllocation", + [ + "It is possible to have a static IP address.", + "To demonstrate this, an IP will be allocated and associated to your EC2 instance.", + ].join(" "), + { header: true, skipWhen: skipWhenErrors }, +); + +export const allocateIp = new ScenarioAction( + "allocateIp", + async (/** @type { State } */ state) => { + try { + // An Elastic IP address is allocated to your AWS account, and is yours until you release it. + const { AllocationId, PublicIp } = await state.ec2Client.send( + new AllocateAddressCommand({}), + ); + state.allocationId = AllocationId; + state.allocatedIpAddress = PublicIp; + } catch (caught) { + if (caught instanceof Error && caught.name === "MissingParameter") { + caught.message = `${caught.message}. Did you provide these values?`; + } + state.errors.push(caught); + } + }, + { skipWhen: skipWhenErrors }, +); + +export const associateIp = new ScenarioAction( + "associateIp", + async (/** @type { State } */ state) => { + try { + // Associate an allocated IP address to an EC2 instance. An IP address can be allocated + // with the AllocateAddress action. + const { AssociationId } = await state.ec2Client.send( + new AssociateAddressCommand({ + AllocationId: state.allocationId, + InstanceId: state.instanceId, + }), + ); + state.associationId = AssociationId; + // Update the IP address that is being tracked to match + // the one just associated. + state.instanceIpAddress = state.allocatedIpAddress; + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidAllocationID.NotFound" + ) { + caught.message = `${caught.message}. Did you provide the ID of a valid Elastic IP address AllocationId?`; + } + state.errors.push(caught); + } + }, + { skipWhen: skipWhenErrors }, +); + +export const logStaticIpProof = new ScenarioOutput( + "logStaticIpProof", + "The IP address should remain the same even after stopping and starting the instance.", + { header: true, skipWhen: skipWhenErrors }, +); + +export const logCleanUp = new ScenarioOutput( + "logCleanUp", + "That's it! You can choose to clean up the resources now, or clean them up on your own later.", + { header: true, skipWhen: skipWhenErrors }, +); + +export const confirmDisassociateAddress = new ScenarioInput( + "confirmDisassociateAddress", + "Do you want to disassociate and release the static IP address created earlier?", + { + type: "confirm", + skipWhen: (/** @type { State } */ state) => !state.associationId, + }, +); + +export const maybeDisassociateAddress = new ScenarioAction( + "maybeDisassociateAddress", + async (/** @type { State } */ state) => { + try { + await state.ec2Client.send( + new DisassociateAddressCommand({ + AssociationId: state.associationId, + }), + ); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidAssociationID.NotFound" + ) { + caught.message = `${caught.message}. Please provide a valid association ID.`; + } + state.errors.push(caught); + } + }, + { + skipWhen: (/** @type { State } */ state) => + !state[confirmDisassociateAddress.name] || !state.associationId, + }, +); + +export const maybeReleaseAddress = new ScenarioAction( + "maybeReleaseAddress", + async (/** @type { State } */ state) => { + try { + await state.ec2Client.send( + new ReleaseAddressCommand({ + AllocationId: state.allocationId, + }), + ); + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "InvalidAllocationID.NotFound" + ) { + caught.message = `${caught.message}. Please provide a valid AllocationID.`; + } + state.errors.push(caught); + } + }, + { + skipWhen: (/** @type { State } */ state) => + !state[confirmDisassociateAddress.name] || !state.allocationId, + }, +); + +export const confirmTerminateInstance = new ScenarioInput( + "confirmTerminateInstance", + "Do you want to terminate the instance?", + // Don't do anything when an instance was never run. + { + skipWhen: (/** @type { State } */ state) => !state.instanceId, + type: "confirm", + }, +); + +export const maybeTerminateInstance = new ScenarioAction( + "terminateInstance", + async (/** @type { State } */ state) => { + try { + await state.ec2Client.send( + new TerminateInstancesCommand({ + InstanceIds: [state.instanceId], + }), + ); + await waitUntilInstanceTerminated( + { client: state.ec2Client }, + { InstanceIds: [state.instanceId] }, + ); + } catch (caught) { + if (caught instanceof Error && caught.name === "TimeoutError") { + caught.message = `${caught.message}. Try increasing the maxWaitTime in the waiter.`; + } + + state.errors.push(caught); + } + }, + { + // Don't do anything when there's no instance to terminate or the + // use chooses not to terminate. + skipWhen: (/** @type { State } */ state) => + !state.instanceId || !state[confirmTerminateInstance.name], + }, +); + +export const deleteTemporaryDirectory = new ScenarioAction( + "deleteTemporaryDirectory", + async (/** @type { State } */ state) => { + try { + await rm(state.tmpDirectory, { recursive: true }); + } catch (caught) { + state.errors.push(caught); + } + }, +); + +export const logErrors = new ScenarioOutput( + "logErrors", + (/** @type {State}*/ state) => { + const errorList = state.errors + .map((err) => `• ${err.name}: ${err.message}`) + .join("\n"); + return `Scenario errors found:\n${errorList}`; + }, + { + preformatted: true, + header: true, + // Don't log errors when there aren't any! + skipWhen: (/** @type {State} */ state) => state.errors.length === 0, + }, +); diff --git a/javascriptv3/example_code/ec2/tests/allocate-address.unit.test.js b/javascriptv3/example_code/ec2/tests/allocate-address.unit.test.js index 46abd32cf92..a43c6041e9a 100644 --- a/javascriptv3/example_code/ec2/tests/allocate-address.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/allocate-address.unit.test.js @@ -32,14 +32,24 @@ describe("allocate-address", () => { expect(logSpy).toHaveBeenNthCalledWith(2, `ID: bar Public IP: foo`); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to allocate address")); + it("should log MissingParameter errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Missing param"); + error.name = "MissingParameter"; + + send.mockRejectedValueOnce(error); await main(); - expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to allocate address"), + expect(logSpy).toBeCalledWith( + "Missing param. Did you provide these values?", ); }); + + it("should throw unknown errors", async () => { + const error = new Error("Failed to allocate address"); + send.mockRejectedValueOnce(error); + + await expect(main()).rejects.toBe(error); + }); }); diff --git a/javascriptv3/example_code/ec2/tests/associate-address.unit.test.js b/javascriptv3/example_code/ec2/tests/associate-address.unit.test.js index 8b4ab0a71a3..09faf0eb2c6 100644 --- a/javascriptv3/example_code/ec2/tests/associate-address.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/associate-address.unit.test.js @@ -23,7 +23,7 @@ describe("associate-address", () => { send.mockResolvedValueOnce({ AssociationId: "foo" }); - await main(); + await main({ allocationId: "ALLOCATION_ID", instanceId: "INSTANCE_ID" }); expect(logSpy).toHaveBeenCalledWith( "Address with allocation ID ALLOCATION_ID is now associated with instance INSTANCE_ID.", @@ -31,14 +31,23 @@ describe("associate-address", () => { ); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to associate address")); + it("should log InvalidAllocationID.NotFound error", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Invalid id"); + error.name = "InvalidAllocationID.NotFound"; + send.mockRejectedValueOnce(error); - await main(); + await main({}); expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to associate address"), + "Invalid id. Did you provide the ID of a valid Elastic IP address AllocationId?", ); }); + + it("should throw unknown errors", async () => { + const error = new Error(); + send.mockRejectedValueOnce(error); + + await expect(() => main({})).rejects.toBe(error); + }); }); diff --git a/javascriptv3/example_code/ec2/tests/authorize-security-group-ingress.unit.test.js b/javascriptv3/example_code/ec2/tests/authorize-security-group-ingress.unit.test.js index cee5019767f..5b12d8af070 100644 --- a/javascriptv3/example_code/ec2/tests/authorize-security-group-ingress.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/authorize-security-group-ingress.unit.test.js @@ -25,19 +25,31 @@ describe("authorize-security-group-ingress", () => { SecurityGroupRules: rules, }); - await main(); + await main({ groupId: "123", ipAddress: "123" }); expect(logSpy).toHaveBeenCalledWith(JSON.stringify(rules, null, 2)); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to authorize security group")); + it("should log InvalidGroupId.Malformed errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("InvalidGroupId"); + error.name = "InvalidGroupId.Malformed"; - await main(); + send.mockRejectedValueOnce(error); - expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to authorize security group"), + await main({ groupId: "groupId", ipAddress: "ipAddress" }); + + expect(logSpy).toBeCalledWith( + "InvalidGroupId. Please provide a valid GroupId.", + ); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Failed to authorize security group"); + send.mockRejectedValueOnce(error); + + await expect(() => main({ groupId: "123", ipAddress: "123" })).rejects.toBe( + error, ); }); }); diff --git a/javascriptv3/example_code/ec2/tests/basic.integration.test.js b/javascriptv3/example_code/ec2/tests/basic.integration.test.js new file mode 100644 index 00000000000..b8844226d60 --- /dev/null +++ b/javascriptv3/example_code/ec2/tests/basic.integration.test.js @@ -0,0 +1,11 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect } from "vitest"; +import { main } from "../scenarios/basic.js"; + +describe("basic", () => { + it("should run without error", async () => { + await expect(() => main({ confirmAll: true })).rejects.not.toThrowError(); + }); +}); diff --git a/javascriptv3/example_code/ec2/tests/create-key-pair.unit.test.js b/javascriptv3/example_code/ec2/tests/create-key-pair.unit.test.js index 62d10470cc7..ec0ba1f1cf6 100644 --- a/javascriptv3/example_code/ec2/tests/create-key-pair.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/create-key-pair.unit.test.js @@ -24,17 +24,26 @@ describe("create-key-pair", () => { KeyMaterial: "foo", }); - await main(); + await main({ keyName: "test" }); expect(logSpy).toHaveBeenCalledWith("foo"); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to create key pair")); + it("should log InvalidKeyPair.Duplicate errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("InvalidKeyPair"); + error.name = "InvalidKeyPair.Duplicate"; - await main(); + send.mockRejectedValueOnce(error); - expect(logSpy).toHaveBeenCalledWith(new Error("Failed to create key pair")); + await main({ keyName: "keyName" }); + + expect(logSpy).toBeCalledWith("InvalidKeyPair. Try another key name."); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Failed to create key pair"); + send.mockRejectedValueOnce(error); + await expect(() => main({ keyName: "test" })).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/create-security-group.unit.test.js b/javascriptv3/example_code/ec2/tests/create-security-group.unit.test.js index a4001e48dd5..c5d494f285d 100644 --- a/javascriptv3/example_code/ec2/tests/create-security-group.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/create-security-group.unit.test.js @@ -24,19 +24,29 @@ describe("create-security-group", () => { GroupId: "foo", }); - await main(); + await main({ groupName: "name", description: "description" }); expect(logSpy).toHaveBeenCalledWith("foo"); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to create security group")); + it("should log InvalidParameterValue errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("InvalidParameterValue"); + error.name = "InvalidParameterValue"; - await main(); + send.mockRejectedValueOnce(error); - expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to create security group"), - ); + await main({ groupName: "sg-1" }); + + expect(logSpy).toBeCalledWith("InvalidParameterValue."); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Failed to create security group"); + send.mockRejectedValueOnce(error); + + await expect(() => + main({ groupName: "name", description: "description" }), + ).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/delete-key-pair.unit.test.js b/javascriptv3/example_code/ec2/tests/delete-key-pair.unit.test.js index 30fc513a181..1b0e5d8c965 100644 --- a/javascriptv3/example_code/ec2/tests/delete-key-pair.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/delete-key-pair.unit.test.js @@ -20,20 +20,30 @@ const { main } = await import("../actions/delete-key-pair.js"); describe("delete-key-pair", () => { it("should log a success message", async () => { const logSpy = vi.spyOn(console, "log"); - send.mockResolvedValueOnce({}); - await main(); - + await main({ keyName: "name" }); expect(logSpy).toHaveBeenCalledWith("Successfully deleted key pair."); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to delete key pair")); + it("should log MissingParameter errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("MissingParameter"); + error.name = "MissingParameter"; + + send.mockRejectedValueOnce(error); + + await main({ keyName: "test" }); + + expect(logSpy).toBeCalledWith( + "MissingParameter. Did you provide the required value?", + ); + }); - await main(); + it("should throw unknown errors", async () => { + const error = new Error("Failed to delete key pair"); + send.mockRejectedValueOnce(error); - expect(logSpy).toHaveBeenCalledWith(new Error("Failed to delete key pair")); + await expect(() => main({ keyName: "name" })).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/delete-security-group.unit.test.js b/javascriptv3/example_code/ec2/tests/delete-security-group.unit.test.js index 25452a88dd6..f6e9d78832f 100644 --- a/javascriptv3/example_code/ec2/tests/delete-security-group.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/delete-security-group.unit.test.js @@ -23,19 +23,29 @@ describe("delete-security-group", () => { send.mockResolvedValueOnce({}); - await main(); + await main({ groupId: "abc" }); expect(logSpy).toHaveBeenCalledWith("Security group deleted successfully."); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to delete security group")); + it("should log InvalidGroupId.Malformed errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("InvalidGroupId.Malformed"); + error.name = "InvalidGroupId.Malformed"; - await main(); + send.mockRejectedValueOnce(error); - expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to delete security group"), + await main({ groupId: "abc" }); + + expect(logSpy).toBeCalledWith( + "InvalidGroupId.Malformed. Please provide a valid GroupId.", ); }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown"); + send.mockRejectedValueOnce(error); + + await expect(() => main({ groupId: "abc" })).rejects.toBe(error); + }); }); diff --git a/javascriptv3/example_code/ec2/tests/describe-addresses.unit.test.js b/javascriptv3/example_code/ec2/tests/describe-addresses.unit.test.js index c95481f46bc..a9c7062d41d 100644 --- a/javascriptv3/example_code/ec2/tests/describe-addresses.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/describe-addresses.unit.test.js @@ -29,20 +29,29 @@ describe("describe-addresses", () => { ], }); - await main(); + await main({ allocationId: "123" }); expect(logSpy).toHaveBeenNthCalledWith(1, "Elastic IP addresses:"); expect(logSpy).toHaveBeenNthCalledWith(2, " • foo"); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to describe addresses")); + it("should log InvalidAllocationID.NotFound errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("AllocationId not found"); + error.name = "InvalidAllocationID.NotFound"; + send.mockRejectedValueOnce(error); - await main(); + await main({ allocationId: "123" }); expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to describe addresses"), + "AllocationId not found. Please provide a valid AllocationId.", ); }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({ keyName: "name" })).rejects.toBe(error); + }); }); diff --git a/javascriptv3/example_code/ec2/tests/describe-images.unit.test.js b/javascriptv3/example_code/ec2/tests/describe-images.unit.test.js index b8b89a6f901..b4c52a09979 100644 --- a/javascriptv3/example_code/ec2/tests/describe-images.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/describe-images.unit.test.js @@ -24,34 +24,46 @@ describe("describe-images", () => { { ImageId: "12345", Architecture: "arm64", + Name: "Fake image", }, ], }; }); - await main(); + await main({ architecture: "arm64", pageSize: 100 }); - expect(logSpy).toHaveBeenCalledWith([ - { - ImageId: "12345", - Architecture: "arm64", - }, - ]); + expect(logSpy).toHaveBeenCalledWith("Found 1 images:\n\nFake image\n"); }); - it("should log an error if retrieval fails", async () => { - const logSpy = vi.spyOn(console, "log"); - const errorSpy = vi.spyOn(console, "error"); + it("should log InvalidParameter errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Retrieval failed"); + error.name = "InvalidParameterValue"; + paginateDescribeImages.mockReturnValueOnce( // eslint-disable-next-line require-yield (async function* () { - throw new Error("Retrieval failed"); + throw error; })(), ); - await main(); + await main({ architecture: "arm64", pageSize: "100" }); + + expect(logSpy).toHaveBeenCalledWith(error.message); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Retrieval failed"); + + paginateDescribeImages.mockReturnValueOnce( + // eslint-disable-next-line require-yield + (async function* () { + throw error; + })(), + ); - expect(logSpy).not.toHaveBeenCalled(); - expect(errorSpy).toHaveBeenCalledWith(new Error("Retrieval failed")); + await expect(() => + main({ architecture: "arm64", pageSize: "100" }), + ).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/describe-instance-types.unit.test.js b/javascriptv3/example_code/ec2/tests/describe-instance-types.unit.test.js index f22aeacfe0e..218f83b8459 100644 --- a/javascriptv3/example_code/ec2/tests/describe-instance-types.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/describe-instance-types.unit.test.js @@ -23,33 +23,48 @@ describe("describe-instance-types", () => { InstanceTypes: [ { InstanceType: "t2.micro", + MemoryInfo: { SizeInMiB: "1024" }, }, ], }; }); - await main(); + await main({ pageSize: "25", freeTier: true, supportedArch: ["arm64"] }); - expect(logSpy).toHaveBeenCalledWith([ - { - InstanceType: "t2.micro", - }, - ]); + expect(logSpy).toHaveBeenCalledWith( + "Memory size in MiB for matching instance types:\n\nt2.micro: 1024 MiB", + ); }); - it("should log an error if retrieval fails", async () => { - const logSpy = vi.spyOn(console, "log"); - const errorSpy = vi.spyOn(console, "error"); + it("should log InvalidParameter errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Retrieval failed"); + error.name = "InvalidParameterValue"; + paginateDescribeInstanceTypes.mockReturnValueOnce( // eslint-disable-next-line require-yield (async function* () { - throw new Error("Retrieval failed"); + throw error; })(), ); - await main(); + await main({ architecture: "arm64", pageSize: "100" }); + + expect(logSpy).toHaveBeenCalledWith(error.message); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Retrieval failed"); + + paginateDescribeInstanceTypes.mockReturnValueOnce( + // eslint-disable-next-line require-yield + (async function* () { + throw error; + })(), + ); - expect(logSpy).not.toHaveBeenCalled(); - expect(errorSpy).toHaveBeenCalledWith(new Error("Retrieval failed")); + await expect(() => + main({ architecture: "arm64", pageSize: "100" }), + ).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/describe-instances.unit.test.js b/javascriptv3/example_code/ec2/tests/describe-instances.unit.test.js index 893a8d3ac03..d0d9fe1e890 100644 --- a/javascriptv3/example_code/ec2/tests/describe-instances.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/describe-instances.unit.test.js @@ -5,13 +5,13 @@ import { describe, it, expect, vi } from "vitest"; const send = vi.fn(); +const paginateDescribeInstances = vi.fn(); + vi.doMock("@aws-sdk/client-ec2", async () => { const actual = await vi.importActual("@aws-sdk/client-ec2"); return { ...actual, - EC2Client: class { - send = send; - }, + paginateDescribeInstances, }; }); @@ -20,6 +20,19 @@ const { main } = await import("../actions/describe-instances.js"); describe("describe-instances", () => { it("should log found instances", async () => { const logSpy = vi.spyOn(console, "log"); + paginateDescribeInstances.mockImplementationOnce(async function* () { + yield { + Reservations: [ + { + Instances: [ + { + InstanceId: "123", + }, + ], + }, + ], + }; + }); send.mockResolvedValueOnce({ Reservations: [ { @@ -32,19 +45,24 @@ describe("describe-instances", () => { ], }); - await main(); + await main({ architectures: ["x86_64"] }); - expect(logSpy).toHaveBeenCalledWith([{ InstanceId: "123" }]); + expect(logSpy).toHaveBeenCalledWith( + "Running instances launched this month:\n\n123", + ); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to describe instances")); + it("should log InvalidParameterValue errors", async () => { + const error = new Error("Failed to describe instances"); + error.name = "InvalidParameterName"; - await main(); - - expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to describe instances"), + paginateDescribeInstances.mockReturnValueOnce( + // eslint-disable-next-line require-yield + (async function* () { + throw error; + })(), ); + + await expect(() => main({ architectures: ["x86_64"] })).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/describe-key-pairs.unit.test.js b/javascriptv3/example_code/ec2/tests/describe-key-pairs.unit.test.js index 8ce732dc41c..3e69dd98ac0 100644 --- a/javascriptv3/example_code/ec2/tests/describe-key-pairs.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/describe-key-pairs.unit.test.js @@ -29,7 +29,7 @@ describe("describe-key-pairs", () => { ], }); - await main(); + await main({ dryRun: false }); expect(logSpy).nthCalledWith( 1, @@ -38,14 +38,21 @@ describe("describe-key-pairs", () => { expect(logSpy).nthCalledWith(2, " • bar: foo"); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to describe key pairs")); + it("should log DryRunOperation errors", async () => { + const logSpy = vi.spyOn(console, "log"); + const error = new Error("Would have run."); + error.name = "DryRunOperation"; + send.mockRejectedValueOnce(error); - await main(); + await main({ dryRun: true }); - expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to describe key pairs"), - ); + expect(logSpy).toHaveBeenCalledWith("Would have run."); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({ keyName: "name" })).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/describe-regions.unit.test.js b/javascriptv3/example_code/ec2/tests/describe-regions.unit.test.js index adc3e8edbcd..3778cf23f54 100644 --- a/javascriptv3/example_code/ec2/tests/describe-regions.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/describe-regions.unit.test.js @@ -25,18 +25,27 @@ describe("describe-regions", () => { Regions: [{ RegionName: "foo" }], }); - await main(); + await main({}); expect(logSpy).toHaveBeenNthCalledWith(1, "Found regions:"); expect(logSpy).toHaveBeenNthCalledWith(2, " • foo"); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to log regions")); + it("should log DryRunOperation errors", async () => { + const logSpy = vi.spyOn(console, "log"); + const error = new Error("Would have run."); + error.name = "DryRunOperation"; + send.mockRejectedValueOnce(error); + + await main({ dryRun: true }); + + expect(logSpy).toHaveBeenCalledWith("Would have run."); + }); - await main(); + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); - expect(logSpy).toHaveBeenCalledWith(new Error("Failed to log regions")); + await expect(() => main({})).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/describe-security-groups.unit.test.js b/javascriptv3/example_code/ec2/tests/describe-security-groups.unit.test.js index b1df3d88587..bac82972184 100644 --- a/javascriptv3/example_code/ec2/tests/describe-security-groups.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/describe-security-groups.unit.test.js @@ -22,7 +22,9 @@ describe("describe-security-groups", () => { const logSpy = vi.spyOn(console, "log"); const securityGroups = [ { - Foo: "bar", + GroupName: "group", + GroupId: "sg-1", + Description: "My security group", }, ]; @@ -30,21 +32,41 @@ describe("describe-security-groups", () => { SecurityGroups: securityGroups, }); - await main(); + await main({}); expect(logSpy).toHaveBeenCalledWith( - JSON.stringify(securityGroups, null, 2), + `Security groups:\n• group (sg-1): My security group`, ); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to describe security group")); + it("should log InvalidGroupId.Malformed errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Bad group id"); + error.name = "InvalidGroupId.Malformed"; + send.mockRejectedValueOnce(error); - await main(); + await main({}); expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to describe security group"), + "Bad group id. Please provide a valid GroupId.", ); }); + + it("should log InvalidGroup.NotFound errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Missing"); + error.name = "InvalidGroup.NotFound"; + send.mockRejectedValueOnce(error); + + await main({}); + + expect(logSpy).toHaveBeenCalledWith("Missing"); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({})).rejects.toBe(error); + }); }); diff --git a/javascriptv3/example_code/ec2/tests/disassociate-address.unit.test.js b/javascriptv3/example_code/ec2/tests/disassociate-address.unit.test.js index 708959723e2..a8c511dcdd8 100644 --- a/javascriptv3/example_code/ec2/tests/disassociate-address.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/disassociate-address.unit.test.js @@ -23,19 +23,26 @@ describe("disassociate-address", () => { send.mockResolvedValueOnce({}); - await main(); + await main({ associationId: "123" }); expect(logSpy).toHaveBeenCalledWith("Successfully disassociated address"); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to disassociate address")); + it("should log InvalidAssociationID.NotFound errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Failed to disassociate address"); + error.name = "InvalidAssociationID.NotFound"; + send.mockRejectedValueOnce(error); - await main(); + await main({ associationId: "123" }); - expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to disassociate address"), - ); + expect(logSpy).toHaveBeenCalledWith("Failed to disassociate address."); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({})).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/monitor-instances.unit.test.js b/javascriptv3/example_code/ec2/tests/monitor-instances.unit.test.js index 9558662b78a..43daf6f69bf 100644 --- a/javascriptv3/example_code/ec2/tests/monitor-instances.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/monitor-instances.unit.test.js @@ -27,7 +27,7 @@ describe("monitor-instances", () => { ], }); - await main(); + await main({ instanceIds: [] }); expect(logSpy).toHaveBeenNthCalledWith(1, "Monitoring status:"); expect(logSpy).toHaveBeenNthCalledWith( @@ -36,12 +36,21 @@ describe("monitor-instances", () => { ); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed")); + it("should log InvalidParameterValue errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Failed"); + error.name = "InvalidParameterValue"; + send.mockRejectedValueOnce(error); - await main(); + await main({ instanceIds: ["123"] }); - expect(logSpy).toHaveBeenCalledWith(new Error("Failed")); + expect(logSpy).toHaveBeenCalledWith("Failed"); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({})).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/reboot-instances.unit.test.js b/javascriptv3/example_code/ec2/tests/reboot-instances.unit.test.js index 6c0ea05b47f..12a17202697 100644 --- a/javascriptv3/example_code/ec2/tests/reboot-instances.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/reboot-instances.unit.test.js @@ -23,17 +23,28 @@ describe("reboot-instances", () => { send.mockResolvedValueOnce({}); - await main(); + await main({ instanceIds: [] }); expect(logSpy).toHaveBeenCalledWith("Instance rebooted successfully."); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed")); + it("should log InvalidInstanceID.NotFound errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Failed"); + error.name = "InvalidInstanceID.NotFound"; + send.mockRejectedValueOnce(error); - await main(); + await main({ instanceIds: [] }); - expect(logSpy).toHaveBeenCalledWith(new Error("Failed")); + expect(logSpy).toHaveBeenCalledWith( + "Failed. Please provide the InstanceId of a valid instance to reboot.", + ); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({})).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/release-address.unit.test.js b/javascriptv3/example_code/ec2/tests/release-address.unit.test.js index 40c94368c9c..4e22242fdea 100644 --- a/javascriptv3/example_code/ec2/tests/release-address.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/release-address.unit.test.js @@ -23,17 +23,28 @@ describe("release-address", () => { send.mockResolvedValueOnce({}); - await main(); + await main({ allocationId: "123" }); expect(logSpy).toHaveBeenCalledWith("Successfully released address."); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to release address")); + it("should log InvalidAllocationID.NotFound errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Failed to release address"); + error.name = "InvalidAllocationID.NotFound"; + send.mockRejectedValueOnce(error); - await main(); + await main({ allocationId: "123" }); - expect(logSpy).toHaveBeenCalledWith(new Error("Failed to release address")); + expect(logSpy).toHaveBeenCalledWith( + "Failed to release address. Please provide a valid AllocationID.", + ); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({})).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/run-instances.unit.test.js b/javascriptv3/example_code/ec2/tests/run-instances.unit.test.js index 8b3034b2f9c..857594d51fb 100644 --- a/javascriptv3/example_code/ec2/tests/run-instances.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/run-instances.unit.test.js @@ -28,25 +28,38 @@ describe("run-instances", () => { ], }); - await main(); - - expect(logSpy).toHaveBeenCalledWith({ - Instances: [ - { - InstanceId: "i-0e8810a92833675aa", - }, - ], + await main({ + keyName: "key", + securityGroupIds: ["sg-id"], + imageId: "imageid", + instanceType: "a1.2xlarge", }); + + expect(logSpy).toHaveBeenCalledWith( + `Launched instances:\n• i-0e8810a92833675aa`, + ); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to launch instances")); + it("should log ResourceCountExceeded errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Count"); + error.name = "ResourceCountExceeded"; + send.mockRejectedValueOnce(error); - await main(); + await main({ + keyName: "key", + securityGroupIds: ["sg-id"], + imageId: "imageid", + instanceType: "a1.2xlarge", + }); - expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to launch instances"), - ); + expect(logSpy).toHaveBeenCalledWith("Count"); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({})).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/start-instances.unit.test.js b/javascriptv3/example_code/ec2/tests/start-instances.unit.test.js index ee935b16744..77cbfe82a5c 100644 --- a/javascriptv3/example_code/ec2/tests/start-instances.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/start-instances.unit.test.js @@ -22,7 +22,7 @@ describe("start-instances", () => { const logSpy = vi.spyOn(console, "log"); const instances = [ { - InstanceId: "bar", + InstanceId: "i-123", }, ]; @@ -30,18 +30,27 @@ describe("start-instances", () => { StartingInstances: instances, }); - await main(); + await main({ instanceIds: ["i-123"] }); expect(logSpy).toHaveBeenNthCalledWith(1, "Starting instances:"); - expect(logSpy).toHaveBeenNthCalledWith(2, " • bar"); + expect(logSpy).toHaveBeenNthCalledWith(2, " • i-123"); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to start instances")); + it("should log InvalidInstanceID.NotFound errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Failed to start instances"); + error.name = "InvalidInstanceID.NotFound"; + send.mockRejectedValueOnce(error); - await main(); + await main({ instanceIds: ["i-123"] }); - expect(logSpy).toHaveBeenCalledWith(new Error("Failed to start instances")); + expect(logSpy).toHaveBeenCalledWith("Failed to start instances"); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({})).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/stop-instances.unit.test.js b/javascriptv3/example_code/ec2/tests/stop-instances.unit.test.js index 3a694c47e0f..0846d219dd1 100644 --- a/javascriptv3/example_code/ec2/tests/stop-instances.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/stop-instances.unit.test.js @@ -22,7 +22,7 @@ describe("stop-instances", () => { const logSpy = vi.spyOn(console, "log"); const instances = [ { - InstanceId: "bar", + InstanceId: "i-123", }, ]; @@ -30,18 +30,27 @@ describe("stop-instances", () => { StoppingInstances: instances, }); - await main(); + await main({ instanceIds: ["i-123"] }); expect(logSpy).toHaveBeenNthCalledWith(1, "Stopping instances:"); - expect(logSpy).toHaveBeenNthCalledWith(2, " • bar"); + expect(logSpy).toHaveBeenNthCalledWith(2, " • i-123"); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to stop instances")); + it("should log InvalidInstanceID.NotFound errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Failed to start instances"); + error.name = "InvalidInstanceID.NotFound"; + send.mockRejectedValueOnce(error); - await main(); + await main({ instanceIds: ["i-123"] }); - expect(logSpy).toHaveBeenCalledWith(new Error("Failed to stop instances")); + expect(logSpy).toHaveBeenCalledWith("Failed to start instances"); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({})).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/terminate-instances.unit.test.js b/javascriptv3/example_code/ec2/tests/terminate-instances.unit.test.js index 620e017118d..3a9cf25f449 100644 --- a/javascriptv3/example_code/ec2/tests/terminate-instances.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/terminate-instances.unit.test.js @@ -20,28 +20,37 @@ const { main } = await import("../actions/terminate-instances.js"); describe("terminate-instances", () => { it("should log the instances that were terminated", async () => { const logSpy = vi.spyOn(console, "log"); + const instances = [ + { + InstanceId: "i-123", + }, + ]; + send.mockResolvedValueOnce({ - TerminatingInstances: [ - { - InstanceId: "bar", - }, - ], + TerminatingInstances: instances, }); - await main(); + await main({ instanceIds: ["i-123"] }); expect(logSpy).toHaveBeenNthCalledWith(1, "Terminating instances:"); - expect(logSpy).toHaveBeenNthCalledWith(2, " • bar"); + expect(logSpy).toHaveBeenNthCalledWith(2, " • i-123"); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed to terminate instances")); + it("should log InvalidInstanceID.NotFound errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Failed to terminate instances"); + error.name = "InvalidInstanceID.NotFound"; + send.mockRejectedValueOnce(error); + + await main({ instanceIds: ["i-123"] }); + + expect(logSpy).toHaveBeenCalledWith("Failed to terminate instances"); + }); - await main(); + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); - expect(logSpy).toHaveBeenCalledWith( - new Error("Failed to terminate instances"), - ); + await expect(() => main({})).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/ec2/tests/unmonitor-instances.unit.test.js b/javascriptv3/example_code/ec2/tests/unmonitor-instances.unit.test.js index 2e42bcd7997..e386dcecc05 100644 --- a/javascriptv3/example_code/ec2/tests/unmonitor-instances.unit.test.js +++ b/javascriptv3/example_code/ec2/tests/unmonitor-instances.unit.test.js @@ -27,7 +27,7 @@ describe("unmonitor-instances", () => { ], }); - await main(); + await main({ instanceIds: ["i-123"] }); expect(logSpy).toHaveBeenNthCalledWith(1, "Monitoring status:"); expect(logSpy).toHaveBeenNthCalledWith( @@ -36,12 +36,21 @@ describe("unmonitor-instances", () => { ); }); - it("should log the error message", async () => { - const logSpy = vi.spyOn(console, "error"); - send.mockRejectedValueOnce(new Error("Failed")); + it("should log InvalidInstanceID.NotFound errors", async () => { + const logSpy = vi.spyOn(console, "warn"); + const error = new Error("Failed to unmonitor instances"); + error.name = "InvalidInstanceID.NotFound"; + send.mockRejectedValueOnce(error); - await main(); + await main({ instanceIds: ["i-123"] }); - expect(logSpy).toHaveBeenCalledWith(new Error("Failed")); + expect(logSpy).toHaveBeenCalledWith("Failed to unmonitor instances"); + }); + + it("should throw unknown errors", async () => { + const error = new Error("Unknown error"); + send.mockRejectedValueOnce(error); + + await expect(() => main({})).rejects.toBe(error); }); }); diff --git a/javascriptv3/example_code/libs/scenario/scenario.js b/javascriptv3/example_code/libs/scenario/scenario.js index a90867d951d..dba44d545c0 100644 --- a/javascriptv3/example_code/libs/scenario/scenario.js +++ b/javascriptv3/example_code/libs/scenario/scenario.js @@ -66,7 +66,7 @@ export class ScenarioOutput extends Step { /** * @param {string} name * @param {string | (state: Record) => string | false} value - * @param {ScenarioOutputOptions} [scenarioOutputOptions] + * @param {Step['stepOptions']} [scenarioOutputOptions] */ constructor(name, value, scenarioOutputOptions = { slow: true }) { super(name, scenarioOutputOptions); @@ -81,7 +81,9 @@ export class ScenarioOutput extends Step { */ async handle(state, stepHandlerOptions) { if (this.stepOptions.skipWhen(state)) { - console.log(`Skipping step: ${this.name}`); + if (stepHandlerOptions.verbose) { + console.log(`Skipping step: ${this.name}`); + } return; } super.handle(state, stepHandlerOptions); @@ -110,8 +112,8 @@ export class ScenarioOutput extends Step { /** * @typedef {{ * type: "confirm" | "input" | "multi-select" | "select", - * choices: (string | { name: string, value: string })[], - * default: string | string[] | boolean } + * choices: (string | { name: string, value: string })[] | () => (string | { name: string, value: string })[], + * default: string | string[] | boolean | () => string | string[] | boolean } * } ScenarioInputOptions */ @@ -122,7 +124,7 @@ export class ScenarioInput extends Step { /** * @param {string} name * @param {string | (c: Record) => string | false } prompt - * @param {ScenarioInputOptions} [scenarioInputOptions] + * @param {Step['stepOptions']} [scenarioInputOptions] */ constructor(name, prompt, scenarioInputOptions) { super(name, scenarioInputOptions); @@ -136,15 +138,22 @@ export class ScenarioInput extends Step { */ async handle(state, stepHandlerOptions = {}) { if (this.stepOptions.skipWhen(state)) { - console.log(`Skipping step: ${this.name}`); + if (stepHandlerOptions.verbose) { + console.log(`Skipping step: ${this.name}`); + } return; } super.handle(state, stepHandlerOptions); - if (stepHandlerOptions.confirmAll && this.stepOptions.default) { - state[this.name] = this.stepOptions.default; + this.default = + typeof this.stepOptions.default === "function" + ? this.stepOptions.default(state) + : this.stepOptions.default; + + if (stepHandlerOptions.confirmAll && this.default) { + state[this.name] = this.default; return state[this.name]; - } else if (stepHandlerOptions.confirmAll && !this.stepOptions.default) { + } else if (stepHandlerOptions.confirmAll && !this.default) { if (this.stepOptions?.type === "confirm") { state[this.name] = true; return true; @@ -154,20 +163,18 @@ export class ScenarioInput extends Step { ); } - const message = this._getPrompt(state); - switch (this.stepOptions?.type) { case "multi-select": - await this._handleMultiSelect(state, message); + await this._handleMultiSelect(state); break; case "select": - await this._handleSelect(state, message); + await this._handleSelect(state); break; case "input": - await this._handleInput(state, message); + await this._handleInput(state); break; case "confirm": - await this._handleConfirm(state, message); + await this._handleConfirm(state); break; default: throw new Error( @@ -181,47 +188,48 @@ export class ScenarioInput extends Step { /** * @param {Record} state */ - _getPrompt(state) { - const prompt = - typeof this.prompt === "function" ? this.prompt(state) : this.prompt; - const message = - this.stepOptions.type !== "confirm" && this.stepOptions.default - ? `${prompt} (${this.stepOptions.default})` - : prompt; - - if (!message) { - throw new Error(`Error handling ScenarioInput. Missing prompt.`); + _getChoices(state) { + if (this.choices) { + return this.choices; } - return message; - } + const rawChoices = + typeof this.stepOptions.choices === "function" + ? this.stepOptions.choices(state) + : this.stepOptions.choices; - _getChoices() { - if (this.choices) { - return this.choices; + if (!rawChoices) { + throw new Error( + `Error handling ScenarioInput. Could not get choices for ${this.name}.`, + ); } this.choices = - this.stepOptions?.choices && - typeof this.stepOptions?.choices[0] === "string" - ? this.stepOptions?.choices.map((s) => ({ name: s, value: s })) - : this.stepOptions?.choices; + typeof rawChoices[0] === "string" + ? rawChoices.map((s) => ({ name: s, value: s })) + : rawChoices; return this.choices; } /** * @param {Record} state - * @param {string} message */ - async _handleMultiSelect(state, message) { + async _handleMultiSelect(state) { + const message = + typeof this.prompt === "function" ? this.prompt(state) : this.prompt; + + if (!message) { + throw new Error(`Error handling ScenarioInput. Missing prompt.`); + } + const result = await this.prompter.checkbox({ message, - choices: this._getChoices(), + choices: this._getChoices(state), }); - if (!result.length && this.stepOptions.default) { - state[this.name] = this.stepOptions.default; + if (!result.length && this.default) { + state[this.name] = this.default; } else if (!result.length) { throw new Error( `Error handing ScenarioInput. Result of ${this.name} was empty.`, @@ -233,17 +241,23 @@ export class ScenarioInput extends Step { /** * @param {Record} state - * @param {string} message */ - async _handleSelect(state, message) { + async _handleSelect(state) { + const message = + typeof this.prompt === "function" ? this.prompt(state) : this.prompt; + + if (!message) { + throw new Error(`Error handling ScenarioInput. Missing prompt.`); + } + if (this.stepOptions?.type === "select") { const result = await this.prompter.select({ message, - choices: this._getChoices(), + choices: this._getChoices(state), }); - if (!result && this.stepOptions.default) { - state[this.name] = this.stepOptions.default; + if (!result && this.default) { + state[this.name] = this.default; } else if (!result) { throw new Error( `Error handing ScenarioInput. Result of ${this.name} was empty.`, @@ -256,13 +270,20 @@ export class ScenarioInput extends Step { /** * @param {Record} state - * @param {string} message */ - async _handleInput(state, message) { + async _handleInput(state) { + const prompt = + typeof this.prompt === "function" ? this.prompt(state) : this.prompt; + const message = this.default ? `${prompt} (${this.default})` : prompt; + + if (!message) { + throw new Error(`Error handling ScenarioInput. Missing prompt.`); + } + const result = await this.prompter.input({ message }); - if (!result && this.stepOptions.default) { - state[this.name] = this.stepOptions.default; + if (!result && this.default) { + state[this.name] = this.default; } else if (!result) { throw new Error( `Error handing ScenarioInput. Result of ${this.name} was empty.`, @@ -274,9 +295,15 @@ export class ScenarioInput extends Step { /** * @param {Record} state - * @param {string} message */ - async _handleConfirm(state, message) { + async _handleConfirm(state) { + const message = + typeof this.prompt === "function" ? this.prompt(state) : this.prompt; + + if (!message) { + throw new Error(`Error handling ScenarioInput. Missing prompt.`); + } + const result = await this.prompter.confirm({ message, }); @@ -310,7 +337,9 @@ export class ScenarioAction extends Step { */ async handle(state, stepHandlerOptions) { if (this.stepOptions.skipWhen(state)) { - console.log(`Skipping step: ${this.name}`); + if (stepHandlerOptions.verbose) { + console.log(`Skipping step: ${this.name}`); + } return; } const _handle = async () => { From 0708c5359e51be2e5398a4f9ce19f29c8b898f06 Mon Sep 17 00:00:00 2001 From: Steven Meyer <108885656+meyertst-aws@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:19:58 -0400 Subject: [PATCH 49/98] Python:KMS, add strong warning for delete keys (#6781) --- python/example_code/kms/key_management.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/python/example_code/kms/key_management.py b/python/example_code/kms/key_management.py index a9d8f93f195..b3d5165b7a6 100644 --- a/python/example_code/kms/key_management.py +++ b/python/example_code/kms/key_management.py @@ -163,8 +163,18 @@ def delete_keys(self, keys): """ Deletes a list of keys. + Warning: + Deleting a KMS key is a destructive and potentially dangerous operation. When a KMS key is deleted, + all data that was encrypted under the KMS key is unrecoverable. + :param keys: The list of keys to delete. """ + print(""" + Warning: + Deleting a KMS key is a destructive and potentially dangerous operation. When a KMS key is deleted, + all data that was encrypted under the KMS key is unrecoverable. + """) + answer = input("Do you want to delete these keys (y/n)? ") if answer.lower() == "y": window = 7 From a8c248e9216ec0d2a599ce61c67aa1096338e0c8 Mon Sep 17 00:00:00 2001 From: David Souther Date: Tue, 27 Aug 2024 14:32:38 -0400 Subject: [PATCH 50/98] Tools: writeme check for unmanaged folders logic remains wrong. (#6759) --- .tools/readmes/render.py | 9 +-------- .tools/readmes/writeme.py | 0 cpp/example_code/aurora/README.md | 2 +- cpp/example_code/dynamodb/README.md | 2 +- cpp/example_code/lambda/README.md | 2 +- cpp/example_code/rds/README.md | 2 +- cpp/example_code/rekognition/README.md | 2 +- cpp/example_code/s3/README.md | 2 +- cpp/example_code/ses/README.md | 2 +- cpp/example_code/sns/README.md | 2 +- javascriptv3/example_code/dynamodb/README.md | 13 ------------- javascriptv3/example_code/ec2/README.md | 2 +- javascriptv3/example_code/lambda/README.md | 13 ------------- javascriptv3/example_code/ses/README.md | 19 ------------------- javascriptv3/example_code/sfn/README.md | 19 ------------------- php/example_code/dynamodb/README.md | 2 +- php/example_code/lambda/README.md | 2 +- php/example_code/s3/README.md | 2 +- php/example_code/sns/README.md | 2 +- python/example_code/api-gateway/README.md | 8 ++++---- python/example_code/aurora/README.md | 4 ++-- python/example_code/comprehend/README.md | 2 +- python/example_code/emr/README.md | 2 +- python/example_code/lambda/README.md | 12 ++++++------ python/example_code/lookoutvision/README.md | 2 +- python/example_code/polly/README.md | 2 +- python/example_code/rds/README.md | 2 +- python/example_code/rekognition/README.md | 4 ++-- python/example_code/s3/README.md | 13 ++++--------- python/example_code/ses/README.md | 6 +++--- python/example_code/sns/README.md | 2 +- python/example_code/sqs/README.md | 4 ++-- python/example_code/textract/README.md | 4 ++-- 33 files changed, 45 insertions(+), 121 deletions(-) mode change 100644 => 100755 .tools/readmes/writeme.py diff --git a/.tools/readmes/render.py b/.tools/readmes/render.py index c5b742af62e..875517dbe01 100644 --- a/.tools/readmes/render.py +++ b/.tools/readmes/render.py @@ -315,14 +315,7 @@ def render(self) -> RenderStatus: if self.read_current() == self.readme_text: return RenderStatus.UNCHANGED else: - if ( - self.lang_config["service_folder"] - not in self.lang_config.get("service_folder_overrides", {}).values() - and self.readme_filename.exists() - ): - return RenderStatus.UNMANAGED - else: - return RenderStatus.UPDATED + return RenderStatus.UPDATED def write(self): if self.readme_filename.exists(): diff --git a/.tools/readmes/writeme.py b/.tools/readmes/writeme.py old mode 100644 new mode 100755 diff --git a/cpp/example_code/aurora/README.md b/cpp/example_code/aurora/README.md index 05a76476ea8..6d2db9bd804 100644 --- a/cpp/example_code/aurora/README.md +++ b/cpp/example_code/aurora/README.md @@ -74,7 +74,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create an Aurora Serverless work item tracker](cpp/example_code/cross-service/serverless-aurora) +- [Create an Aurora Serverless work item tracker](../../example_code/cross-service/serverless-aurora) diff --git a/cpp/example_code/dynamodb/README.md b/cpp/example_code/dynamodb/README.md index a211d75641c..0061f3c5180 100644 --- a/cpp/example_code/dynamodb/README.md +++ b/cpp/example_code/dynamodb/README.md @@ -73,7 +73,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a serverless application to manage photos](cpp/example_code/cross-service/photo_asset_manager) +- [Create a serverless application to manage photos](../../example_code/cross-service/photo_asset_manager) - [Query a table by using batches of PartiQL statements](dynamodb_utils.cpp) - [Query a table using PartiQL](dynamodb_utils.cpp) diff --git a/cpp/example_code/lambda/README.md b/cpp/example_code/lambda/README.md index 62a2bfa0e6c..dbe70c78f21 100644 --- a/cpp/example_code/lambda/README.md +++ b/cpp/example_code/lambda/README.md @@ -59,7 +59,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a serverless application to manage photos](cpp/example_code/cross-service/photo_asset_manager) +- [Create a serverless application to manage photos](../../example_code/cross-service/photo_asset_manager) - [Get started with functions](get_started_with_functions_scenario.cpp) diff --git a/cpp/example_code/rds/README.md b/cpp/example_code/rds/README.md index 4889d6c2a52..fc6cf93a9d6 100644 --- a/cpp/example_code/rds/README.md +++ b/cpp/example_code/rds/README.md @@ -71,7 +71,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create an Aurora Serverless work item tracker](cpp/example_code/cross-service/serverless-aurora) +- [Create an Aurora Serverless work item tracker](../../example_code/cross-service/serverless-aurora) diff --git a/cpp/example_code/rekognition/README.md b/cpp/example_code/rekognition/README.md index ef400a0642b..0ef346dfb5b 100644 --- a/cpp/example_code/rekognition/README.md +++ b/cpp/example_code/rekognition/README.md @@ -53,7 +53,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a serverless application to manage photos](cpp/example_code/cross-service/photo_asset_manager) +- [Create a serverless application to manage photos](../../example_code/cross-service/photo_asset_manager) diff --git a/cpp/example_code/s3/README.md b/cpp/example_code/s3/README.md index 04c7b90a172..32a888890de 100644 --- a/cpp/example_code/s3/README.md +++ b/cpp/example_code/s3/README.md @@ -84,7 +84,7 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create a presigned URL](presigned_get_object.cpp) -- [Create a serverless application to manage photos](cpp/example_code/cross-service/photo_asset_manager) +- [Create a serverless application to manage photos](../../example_code/cross-service/photo_asset_manager) - [Work with Amazon S3 object integrity](s3_object_integrity_workflow/s3_object_integrity_workflow.cpp) diff --git a/cpp/example_code/ses/README.md b/cpp/example_code/ses/README.md index a995c6a36d4..30427620087 100644 --- a/cpp/example_code/ses/README.md +++ b/cpp/example_code/ses/README.md @@ -63,7 +63,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create an Aurora Serverless work item tracker](cpp/example_code/cross-service/serverless-aurora) +- [Create an Aurora Serverless work item tracker](../../example_code/cross-service/serverless-aurora) diff --git a/cpp/example_code/sns/README.md b/cpp/example_code/sns/README.md index 91fb5efe4ec..2797e87286a 100644 --- a/cpp/example_code/sns/README.md +++ b/cpp/example_code/sns/README.md @@ -62,7 +62,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a serverless application to manage photos](cpp/example_code/cross-service/photo_asset_manager) +- [Create a serverless application to manage photos](../../example_code/cross-service/photo_asset_manager) - [Publish an SMS text message](publish_sms.cpp) - [Publish messages to queues](../cross-service/topics_and_queues/messaging_with_topics_and_queues.cpp) diff --git a/javascriptv3/example_code/dynamodb/README.md b/javascriptv3/example_code/dynamodb/README.md index fb55d2ff3da..78a0ecefbec 100644 --- a/javascriptv3/example_code/dynamodb/README.md +++ b/javascriptv3/example_code/dynamodb/README.md @@ -67,7 +67,6 @@ functions within the same service. - [Query a table by using batches of PartiQL statements](scenarios/partiql-batch.js) - [Query a table using PartiQL](scenarios/partiql-single.js) -- [Use Step Functions to invoke Lambda functions](javascriptv3/example_code/cross-services/lambda-step-functions) @@ -154,18 +153,6 @@ This example shows you how to do the following: -#### Use Step Functions to invoke Lambda functions - -This example shows you how to create an AWS Step Functions state machine that invokes AWS Lambda functions in sequence. - - - - - - - - - ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/javascriptv3/example_code/ec2/README.md b/javascriptv3/example_code/ec2/README.md index 6139bdefe23..6b16493fcb4 100644 --- a/javascriptv3/example_code/ec2/README.md +++ b/javascriptv3/example_code/ec2/README.md @@ -38,7 +38,7 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas Code examples that show you how to perform the essential operations within a service. -- [Learn the basics](scenarios/basic.js) +- [Learn the basics](scenarios/steps.js) ### Single actions diff --git a/javascriptv3/example_code/lambda/README.md b/javascriptv3/example_code/lambda/README.md index f4e51c62df5..04d20ff872b 100644 --- a/javascriptv3/example_code/lambda/README.md +++ b/javascriptv3/example_code/lambda/README.md @@ -52,7 +52,6 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Get started with functions](../iam/actions/attach-role-policy.js) -- [Use Step Functions to invoke Lambda functions](javascriptv3/example_code/cross-services/lambda-step-functions) @@ -106,18 +105,6 @@ This example shows you how to do the following: -#### Use Step Functions to invoke Lambda functions - -This example shows you how to create an AWS Step Functions state machine that invokes AWS Lambda functions in sequence. - - - - - - - - - ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/javascriptv3/example_code/ses/README.md b/javascriptv3/example_code/ses/README.md index 6b9f8ddd084..7935d9d8fc9 100644 --- a/javascriptv3/example_code/ses/README.md +++ b/javascriptv3/example_code/ses/README.md @@ -54,13 +54,6 @@ Code excerpts that show you how to call individual service functions. - [VerifyDomainIdentity](src/ses_verifydomainidentity.js#L15) - [VerifyEmailIdentity](src/ses_verifyemailidentity.js#L16) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Use Step Functions to invoke Lambda functions](javascriptv3/example_code/cross-services/lambda-step-functions) - @@ -89,18 +82,6 @@ node ./scenarios/ -#### Use Step Functions to invoke Lambda functions - -This example shows you how to create an AWS Step Functions state machine that invokes AWS Lambda functions in sequence. - - - - - - - - - ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/javascriptv3/example_code/sfn/README.md b/javascriptv3/example_code/sfn/README.md index 9981756926d..207799fd8e1 100644 --- a/javascriptv3/example_code/sfn/README.md +++ b/javascriptv3/example_code/sfn/README.md @@ -35,13 +35,6 @@ Code excerpts that show you how to call individual service functions. - [StartExecution](actions/start-execution.js) -### Scenarios - -Code examples that show you how to accomplish a specific task by calling multiple -functions within the same service. - -- [Use Step Functions to invoke Lambda functions](javascriptv3/example_code/cross-services/lambda-step-functions) - @@ -70,18 +63,6 @@ node ./scenarios/ -#### Use Step Functions to invoke Lambda functions - -This example shows you how to create an AWS Step Functions state machine that invokes AWS Lambda functions in sequence. - - - - - - - - - ### Tests ⚠ Running tests might result in charges to your AWS account. diff --git a/php/example_code/dynamodb/README.md b/php/example_code/dynamodb/README.md index 3e05b7c3046..d7de8136499 100644 --- a/php/example_code/dynamodb/README.md +++ b/php/example_code/dynamodb/README.md @@ -58,7 +58,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a serverless application to manage photos](php/applications/photo_asset_manager) +- [Create a serverless application to manage photos](../../applications/photo_asset_manager) - [Query a table by using batches of PartiQL statements](DynamoDBService.php) - [Query a table using PartiQL](DynamoDBService.php) diff --git a/php/example_code/lambda/README.md b/php/example_code/lambda/README.md index 25c237c5295..4cca6c72068 100644 --- a/php/example_code/lambda/README.md +++ b/php/example_code/lambda/README.md @@ -46,7 +46,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a serverless application to manage photos](php/applications/photo_asset_manager) +- [Create a serverless application to manage photos](../../applications/photo_asset_manager) - [Get started with functions](GettingStartedWithLambda.php) diff --git a/php/example_code/s3/README.md b/php/example_code/s3/README.md index ea7aa72861d..1ea662257ba 100644 --- a/php/example_code/s3/README.md +++ b/php/example_code/s3/README.md @@ -59,7 +59,7 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create a presigned URL](PresignedURL.php) -- [Create a serverless application to manage photos](php/applications/photo_asset_manager) +- [Create a serverless application to manage photos](../../applications/photo_asset_manager) diff --git a/php/example_code/sns/README.md b/php/example_code/sns/README.md index 7acca6af487..cdfb990af41 100644 --- a/php/example_code/sns/README.md +++ b/php/example_code/sns/README.md @@ -53,7 +53,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a serverless application to manage photos](php/applications/photo_asset_manager) +- [Create a serverless application to manage photos](../../applications/photo_asset_manager) - [Publish an SMS text message](PublishTextSMS.php) diff --git a/python/example_code/api-gateway/README.md b/python/example_code/api-gateway/README.md index 82d287054d8..3f5f826a2b9 100644 --- a/python/example_code/api-gateway/README.md +++ b/python/example_code/api-gateway/README.md @@ -54,11 +54,11 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a REST API to track COVID-19 data](python/cross_service/apigateway_covid-19_tracker) -- [Create a lending library REST API](python/cross_service/aurora_rest_lending_library) -- [Create a websocket chat application](python/cross_service/apigateway_websocket_chat) +- [Create a REST API to track COVID-19 data](../../cross_service/apigateway_covid-19_tracker) +- [Create a lending library REST API](../../cross_service/aurora_rest_lending_library) +- [Create a websocket chat application](../../cross_service/apigateway_websocket_chat) - [Create and deploy a REST API](aws_service/aws_service.py) -- [Use API Gateway to invoke a Lambda function](python/example_code/lambda) +- [Use API Gateway to invoke a Lambda function](../../example_code/lambda) diff --git a/python/example_code/aurora/README.md b/python/example_code/aurora/README.md index 605bccdd60f..17eef681caf 100644 --- a/python/example_code/aurora/README.md +++ b/python/example_code/aurora/README.md @@ -71,8 +71,8 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a lending library REST API](python/cross_service/aurora_rest_lending_library) -- [Create an Aurora Serverless work item tracker](python/cross_service/aurora_item_tracker) +- [Create a lending library REST API](../../cross_service/aurora_rest_lending_library) +- [Create an Aurora Serverless work item tracker](../../cross_service/aurora_item_tracker) diff --git a/python/example_code/comprehend/README.md b/python/example_code/comprehend/README.md index cce0d08c29e..c86b9010921 100644 --- a/python/example_code/comprehend/README.md +++ b/python/example_code/comprehend/README.md @@ -61,7 +61,7 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Detect document elements](comprehend_detect.py) -- [Detect entities in text extracted from an image](python/cross_service/textract_comprehend_notebook) +- [Detect entities in text extracted from an image](../../cross_service/textract_comprehend_notebook) - [Run a topic modeling job on sample data](comprehend_topic_modeler.py) - [Train a custom classifier and classify documents](comprehend_classifier.py) diff --git a/python/example_code/emr/README.md b/python/example_code/emr/README.md index fd53b32da85..8f1bc8de84d 100644 --- a/python/example_code/emr/README.md +++ b/python/example_code/emr/README.md @@ -50,7 +50,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a short-lived Amazon EMR cluster and run a step](python/example_code/emr) +- [Create a short-lived Amazon EMR cluster and run a step](../../example_code/emr) - [Run a shell script to install libraries](install_libraries.py) diff --git a/python/example_code/lambda/README.md b/python/example_code/lambda/README.md index 1e4a34dfd93..151adc17107 100644 --- a/python/example_code/lambda/README.md +++ b/python/example_code/lambda/README.md @@ -56,13 +56,13 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a REST API to track COVID-19 data](python/cross_service/apigateway_covid-19_tracker) -- [Create a lending library REST API](python/cross_service/aurora_rest_lending_library) -- [Create a messenger application](python/cross_service/stepfunctions_messenger) -- [Create a websocket chat application](python/cross_service/apigateway_websocket_chat) +- [Create a REST API to track COVID-19 data](../../cross_service/apigateway_covid-19_tracker) +- [Create a lending library REST API](../../cross_service/aurora_rest_lending_library) +- [Create a messenger application](../../cross_service/stepfunctions_messenger) +- [Create a websocket chat application](../../cross_service/apigateway_websocket_chat) - [Get started with functions](lambda_handler_basic.py) -- [Use API Gateway to invoke a Lambda function](python/example_code/lambda) -- [Use scheduled events to invoke a Lambda function](python/example_code/lambda) +- [Use API Gateway to invoke a Lambda function](../../example_code/lambda) +- [Use scheduled events to invoke a Lambda function](../../example_code/lambda) diff --git a/python/example_code/lookoutvision/README.md b/python/example_code/lookoutvision/README.md index d22efde30e7..ca3a12f583f 100644 --- a/python/example_code/lookoutvision/README.md +++ b/python/example_code/lookoutvision/README.md @@ -63,7 +63,7 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create a manifest file](datasets.py) -- [Create, train, and start a model](python/example_code/lookoutvision) +- [Create, train, and start a model](../../example_code/lookoutvision) - [Export the datasets from a project](export_datasets.py) - [Find a project with a specific tag](find_tag.py) - [List models that are currently hosted](hosting.py) diff --git a/python/example_code/polly/README.md b/python/example_code/polly/README.md index 8706f98ec43..728772836e2 100644 --- a/python/example_code/polly/README.md +++ b/python/example_code/polly/README.md @@ -51,7 +51,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a lip-sync application](python/example_code/polly) +- [Create a lip-sync application](../../example_code/polly) diff --git a/python/example_code/rds/README.md b/python/example_code/rds/README.md index 6e6a148dcee..b45112c70ee 100644 --- a/python/example_code/rds/README.md +++ b/python/example_code/rds/README.md @@ -68,7 +68,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create an Aurora Serverless work item tracker](python/cross_service/aurora_item_tracker) +- [Create an Aurora Serverless work item tracker](../../cross_service/aurora_item_tracker) diff --git a/python/example_code/rekognition/README.md b/python/example_code/rekognition/README.md index dbeb0129c3f..b86d400e3a1 100644 --- a/python/example_code/rekognition/README.md +++ b/python/example_code/rekognition/README.md @@ -63,8 +63,8 @@ functions within the same service. - [Build a collection and find faces in it](rekognition_objects.py) - [Detect and display elements in images](rekognition_image_detection.py) -- [Detect objects in images](python/cross_service/photo_analyzer) -- [Detect people and objects in a video](python/example_code/rekognition) +- [Detect objects in images](../../cross_service/photo_analyzer) +- [Detect people and objects in a video](../../example_code/rekognition) diff --git a/python/example_code/s3/README.md b/python/example_code/s3/README.md index fa876ce1281..a72d852d394 100644 --- a/python/example_code/s3/README.md +++ b/python/example_code/s3/README.md @@ -85,15 +85,10 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Create a presigned URL](s3_basics/presigned_url.py) -<<<<<<< HEAD -- [Get started with buckets and objects](s3_basics/scenario_getting_started.py) -- [Manage versioned objects in batches with a Lambda function](python/example_code/s3/s3_versioning) -======= -- [Create an Amazon Textract explorer application](python/cross_service/textract_explorer) -- [Detect entities in text extracted from an image](python/cross_service/textract_comprehend_notebook) -- [Detect objects in images](python/cross_service/photo_analyzer) -- [Manage versioned objects in batches with a Lambda function](python/code_examples/s3_versioning) ->>>>>>> 80a2ce34d (Run WRITEME for recategorization.) +- [Create an Amazon Textract explorer application](../../cross_service/textract_explorer) +- [Detect entities in text extracted from an image](../../cross_service/textract_comprehend_notebook) +- [Detect objects in images](../../cross_service/photo_analyzer) +- [Manage versioned objects in batches with a Lambda function](../../example_code/s3/s3_versioning) - [Upload or download large files](file_transfer/file_transfer.py) - [Work with versioned objects](s3_versioning/versioning.py) diff --git a/python/example_code/ses/README.md b/python/example_code/ses/README.md index 75a600e024e..8424785731b 100644 --- a/python/example_code/ses/README.md +++ b/python/example_code/ses/README.md @@ -65,9 +65,9 @@ Code examples that show you how to accomplish a specific task by calling multipl functions within the same service. - [Copy email and domain identities across Regions](ses_replicate_identities.py) -- [Create a web application to track DynamoDB data](python/cross_service/dynamodb_item_tracker) -- [Create an Aurora Serverless work item tracker](python/cross_service/aurora_item_tracker) -- [Detect objects in images](python/cross_service/photo_analyzer) +- [Create a web application to track DynamoDB data](../../cross_service/dynamodb_item_tracker) +- [Create an Aurora Serverless work item tracker](../../cross_service/aurora_item_tracker) +- [Detect objects in images](../../cross_service/photo_analyzer) - [Generate credentials to connect to an SMTP endpoint](ses_generate_smtp_credentials.py) - [Verify an email identity and send messages](ses_email.py) diff --git a/python/example_code/sns/README.md b/python/example_code/sns/README.md index 1312f3066e3..69a60fc45e4 100644 --- a/python/example_code/sns/README.md +++ b/python/example_code/sns/README.md @@ -52,7 +52,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create an Amazon Textract explorer application](python/cross_service/textract_explorer) +- [Create an Amazon Textract explorer application](../../cross_service/textract_explorer) - [Create and publish to a FIFO topic](sns_fifo_topic.py) - [Publish an SMS text message](sns_basics.py) diff --git a/python/example_code/sqs/README.md b/python/example_code/sqs/README.md index 87053704b3e..4bfc84d168e 100644 --- a/python/example_code/sqs/README.md +++ b/python/example_code/sqs/README.md @@ -53,8 +53,8 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a messenger application](python/cross_service/stepfunctions_messenger) -- [Create an Amazon Textract explorer application](python/cross_service/textract_explorer) +- [Create a messenger application](../../cross_service/stepfunctions_messenger) +- [Create an Amazon Textract explorer application](../../cross_service/textract_explorer) - [Create and publish to a FIFO topic](../sns/sns_fifo_topic.py) - [Send and receive batches of messages](message_wrapper.py) diff --git a/python/example_code/textract/README.md b/python/example_code/textract/README.md index 65d0d2ad55e..a20fb3fe6c5 100644 --- a/python/example_code/textract/README.md +++ b/python/example_code/textract/README.md @@ -49,8 +49,8 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create an Amazon Textract explorer application](python/cross_service/textract_explorer) -- [Detect entities in text extracted from an image](python/cross_service/textract_comprehend_notebook) +- [Create an Amazon Textract explorer application](../../cross_service/textract_explorer) +- [Detect entities in text extracted from an image](../../cross_service/textract_comprehend_notebook) From 69ed0f083721074b50eeae7651cef0e8832b9be6 Mon Sep 17 00:00:00 2001 From: Scott Macdonald <57190223+scmacdon@users.noreply.github.com> Date: Wed, 28 Aug 2024 09:04:11 -0400 Subject: [PATCH 51/98] Update Java Ec2 examples to use latest Java Standards (#6772) --- .doc_gen/metadata/ec2_metadata.yaml | 19 +- javav2/example_code/ec2/README.md | 40 +- javav2/example_code/ec2/pom.xml | 38 +- .../java/com/example/ec2/AllocateAddress.java | 76 -- .../java/com/example/ec2/CreateInstance.java | 96 --- .../java/com/example/ec2/CreateKeyPair.java | 64 -- .../com/example/ec2/CreateSecurityGroup.java | 111 --- .../java/com/example/ec2/CreateVolume.java | 50 -- .../java/com/example/ec2/DeleteKeyPair.java | 61 -- .../com/example/ec2/DeleteSecurityGroup.java | 61 -- .../java/com/example/ec2/DescribeAccount.java | 58 +- .../com/example/ec2/DescribeAddresses.java | 60 +- .../com/example/ec2/DescribeInstanceTags.java | 66 +- .../com/example/ec2/DescribeInstances.java | 58 -- .../com/example/ec2/DescribeKeyPairs.java | 48 -- .../example/ec2/DescribeRegionsAndZones.java | 98 ++- .../ec2/DescribeReservedInstances.java | 71 +- .../example/ec2/DescribeSecurityGroups.java | 64 -- .../java/com/example/ec2/DescribeVPCs.java | 77 -- .../java/com/example/ec2/EC2Scenario.java | 661 ---------------- .../com/example/ec2/FindRunningInstances.java | 57 +- .../java/com/example/ec2/GetPasswordData.java | 71 +- .../java/com/example/ec2/MonitorInstance.java | 72 +- .../java/com/example/ec2/RebootInstance.java | 54 +- .../java/com/example/ec2/ReleaseAddress.java | 63 -- .../com/example/ec2/StartStopInstance.java | 81 -- .../com/example/ec2/TerminateInstance.java | 67 -- .../com/example/ec2/scenario/EC2Actions.java | 734 ++++++++++++++++++ .../com/example/ec2/scenario/EC2Scenario.java | 601 ++++++++++++++ .../ec2/src/main/resources/log4j2.xml | 15 + .../ec2/src/test/java/EC2Test.java | 493 +++++------- 31 files changed, 2001 insertions(+), 2184 deletions(-) delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/AllocateAddress.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/CreateInstance.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/CreateKeyPair.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/CreateSecurityGroup.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/CreateVolume.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/DeleteKeyPair.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/DeleteSecurityGroup.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeInstances.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeKeyPairs.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeSecurityGroups.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeVPCs.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/EC2Scenario.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/ReleaseAddress.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/StartStopInstance.java delete mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/TerminateInstance.java create mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/scenario/EC2Actions.java create mode 100644 javav2/example_code/ec2/src/main/java/com/example/ec2/scenario/EC2Scenario.java create mode 100644 javav2/example_code/ec2/src/main/resources/log4j2.xml diff --git a/.doc_gen/metadata/ec2_metadata.yaml b/.doc_gen/metadata/ec2_metadata.yaml index 5c4052fe81a..9ba297c7164 100644 --- a/.doc_gen/metadata/ec2_metadata.yaml +++ b/.doc_gen/metadata/ec2_metadata.yaml @@ -118,7 +118,7 @@ ec2_CreateKeyPair: excerpts: - description: snippet_tags: - - ec2.java2.scenario.create_key_pair.main + - ec2.java2.create_key_pair.main Python: versions: - sdk_version: 3 @@ -216,7 +216,7 @@ ec2_DescribeKeyPairs: excerpts: - description: snippet_tags: - - ec2.java.scenario_describe_keys.main + - ec2.java2.describe_key_pairs.main Python: versions: - sdk_version: 3 @@ -302,7 +302,7 @@ ec2_CreateSecurityGroup: excerpts: - description: snippet_tags: - - ec2.java.scenario_inbound_rule.main + - ec2.java2.create_security_group.main Python: versions: - sdk_version: 3 @@ -482,7 +482,7 @@ ec2_StartInstances: excerpts: - description: snippet_tags: - - ec2.java2.scenario.start_instance.main + - ec2.java2.start_instance.main Python: versions: - sdk_version: 3 @@ -580,7 +580,7 @@ ec2_StopInstances: excerpts: - description: snippet_tags: - - ec2.java2.scenario.stop_instance.main + - ec2.java2.stop.instance.main Python: versions: - sdk_version: 3 @@ -677,7 +677,7 @@ ec2_AllocateAddress: excerpts: - description: snippet_tags: - - ec2.java2.scenario.allocate_address.main + - ec2.java2.allocate_address.main Python: versions: - sdk_version: 3 @@ -1030,7 +1030,7 @@ ec2_AuthorizeSecurityGroupIngress: excerpts: - description: snippet_tags: - - ec2.java.scenario_inbound_rule.main + - ec2.java2.create_security_group.main Python: versions: - sdk_version: 3 @@ -2185,9 +2185,12 @@ ec2_Scenario_GetStartedInstances: github: javav2/example_code/ec2 sdkguide: excerpts: - - description: + - description: Run a scenario at a command prompt. snippet_tags: - ec2.java2.scenario.main + - description: Define a class that wraps EC2 actions. + snippet_tags: + - ec2.java2.actions.main Python: versions: - sdk_version: 3 diff --git a/javav2/example_code/ec2/README.md b/javav2/example_code/ec2/README.md index b8d9ee83fe5..7a8cff90e3c 100644 --- a/javav2/example_code/ec2/README.md +++ b/javav2/example_code/ec2/README.md @@ -31,38 +31,38 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav ### Get started -- [Hello Amazon EC2](src/main/java/com/example/ec2/EC2Scenario.java#L556) (`DescribeSecurityGroups`) +- [Hello Amazon EC2](src/main/java/com/example/ec2/scenario/EC2Actions.java#L468) (`DescribeSecurityGroups`) ### Basics Code examples that show you how to perform the essential operations within a service. -- [Learn the basics](src/main/java/com/example/ec2/EC2Scenario.java) +- [Learn the basics](src/main/java/com/example/ec2/scenario/EC2Scenario.java) ### Single actions Code excerpts that show you how to call individual service functions. -- [AllocateAddress](src/main/java/com/example/ec2/EC2Scenario.java#L350) -- [AssociateAddress](src/main/java/com/example/ec2/EC2Scenario.java#L331) -- [AuthorizeSecurityGroupIngress](src/main/java/com/example/ec2/EC2Scenario.java#L577) -- [CreateKeyPair](src/main/java/com/example/ec2/EC2Scenario.java#L640) -- [CreateSecurityGroup](src/main/java/com/example/ec2/EC2Scenario.java#L577) -- [DeleteKeyPair](src/main/java/com/example/ec2/EC2Scenario.java#L281) -- [DeleteSecurityGroup](src/main/java/com/example/ec2/EC2Scenario.java#L233) -- [DescribeInstanceTypes](src/main/java/com/example/ec2/EC2Scenario.java#L471) -- [DescribeInstances](src/main/java/com/example/ec2/DescribeInstances.java#L6) -- [DescribeKeyPairs](src/main/java/com/example/ec2/EC2Scenario.java#L623) -- [DescribeSecurityGroups](src/main/java/com/example/ec2/EC2Scenario.java#L556) -- [DisassociateAddress](src/main/java/com/example/ec2/EC2Scenario.java#L314) -- [GetPasswordData](src/main/java/com/example/ec2/GetPasswordData.java#L7) -- [ReleaseAddress](src/main/java/com/example/ec2/EC2Scenario.java#L298) -- [RunInstances](src/main/java/com/example/ec2/CreateInstance.java#L6) -- [StartInstances](src/main/java/com/example/ec2/EC2Scenario.java#L368) -- [StopInstances](src/main/java/com/example/ec2/EC2Scenario.java#L391) -- [TerminateInstances](src/main/java/com/example/ec2/EC2Scenario.java#L250) +- [AllocateAddress](src/main/java/com/example/ec2/scenario/EC2Actions.java#L265) +- [AssociateAddress](src/main/java/com/example/ec2/scenario/EC2Actions.java#L235) +- [AuthorizeSecurityGroupIngress](src/main/java/com/example/ec2/scenario/EC2Actions.java#L505) +- [CreateKeyPair](src/main/java/com/example/ec2/scenario/EC2Actions.java#L585) +- [CreateSecurityGroup](src/main/java/com/example/ec2/scenario/EC2Actions.java#L505) +- [DeleteKeyPair](src/main/java/com/example/ec2/scenario/EC2Actions.java#L106) +- [DeleteSecurityGroup](src/main/java/com/example/ec2/scenario/EC2Actions.java#L132) +- [DescribeInstanceTypes](src/main/java/com/example/ec2/scenario/EC2Actions.java#L356) +- [DescribeInstances](src/main/java/com/example/ec2/scenario/EC2Actions.java#L402) +- [DescribeKeyPairs](src/main/java/com/example/ec2/scenario/EC2Actions.java#L566) +- [DescribeSecurityGroups](src/main/java/com/example/ec2/scenario/EC2Actions.java#L468) +- [DisassociateAddress](src/main/java/com/example/ec2/scenario/EC2Actions.java#L207) +- [GetPasswordData](src/main/java/com/example/ec2/GetPasswordData.java#L6) +- [ReleaseAddress](src/main/java/com/example/ec2/scenario/EC2Actions.java#L184) +- [RunInstances](src/main/java/com/example/ec2/scenario/EC2Actions.java#L319) +- [StartInstances](src/main/java/com/example/ec2/scenario/EC2Actions.java#L696) +- [StopInstances](src/main/java/com/example/ec2/scenario/EC2Actions.java#L653) +- [TerminateInstances](src/main/java/com/example/ec2/scenario/EC2Actions.java#L155) ### Scenarios diff --git a/javav2/example_code/ec2/pom.xml b/javav2/example_code/ec2/pom.xml index 0e194d42a02..c1a9a88dc16 100644 --- a/javav2/example_code/ec2/pom.xml +++ b/javav2/example_code/ec2/pom.xml @@ -38,7 +38,14 @@ software.amazon.awssdk bom - 2.21.20 + 2.27.7 + pom + import + + + org.apache.logging.log4j + log4j-bom + 2.23.1 pom import @@ -52,11 +59,40 @@ test + org.apache.logging.log4j + log4j-core + + + software.amazon.awssdk + sso + + + software.amazon.awssdk + ssooidc + + + org.slf4j + slf4j-api + 2.0.13 + + + org.apache.logging.log4j + log4j-slf4j2-impl + + + org.apache.logging.log4j + log4j-1.2-api + + org.junit.jupiter junit-jupiter-engine 5.9.2 test + + software.amazon.awssdk + netty-nio-client + org.junit.platform junit-platform-commons diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/AllocateAddress.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/AllocateAddress.java deleted file mode 100644 index b6cc9dcd1cc..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/AllocateAddress.java +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.allocate_address.main] -// snippet-start:[ec2.java2.allocate_address.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.AllocateAddressRequest; -import software.amazon.awssdk.services.ec2.model.DomainType; -import software.amazon.awssdk.services.ec2.model.AllocateAddressResponse; -import software.amazon.awssdk.services.ec2.model.AssociateAddressRequest; -import software.amazon.awssdk.services.ec2.model.AssociateAddressResponse; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -// snippet-end:[ec2.java2.allocate_address.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class AllocateAddress { - public static void main(String[] args) { - - final String usage = """ - - Usage: - - - Where: - instanceId - An instance id value that you can obtain from the AWS Console.\s - """; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String instanceId = args[0]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - System.out.println(getAllocateAddress(ec2, instanceId)); - ec2.close(); - } - - public static String getAllocateAddress(Ec2Client ec2, String instanceId) { - try { - AllocateAddressRequest allocateRequest = AllocateAddressRequest.builder() - .domain(DomainType.VPC) - .build(); - - AllocateAddressResponse allocateResponse = ec2.allocateAddress(allocateRequest); - String allocationId = allocateResponse.allocationId(); - AssociateAddressRequest associateRequest = AssociateAddressRequest.builder() - .instanceId(instanceId) - .allocationId(allocationId) - .build(); - - AssociateAddressResponse associateResponse = ec2.associateAddress(associateRequest); - return associateResponse.associationId(); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - return ""; - } -} -// snippet-end:[ec2.java2.allocate_address.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateInstance.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateInstance.java deleted file mode 100644 index bde272e6c28..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateInstance.java +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.create_instance.main] -// snippet-start:[ec2.java2.create_instance.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.InstanceType; -import software.amazon.awssdk.services.ec2.model.RunInstancesRequest; -import software.amazon.awssdk.services.ec2.model.RunInstancesResponse; -import software.amazon.awssdk.services.ec2.model.Tag; -import software.amazon.awssdk.services.ec2.model.CreateTagsRequest; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -// snippet-end:[ec2.java2.create_instance.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - * - * This code example requires an AMI value. You can learn more about this value - * by reading this documentation topic: - * - * https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/AMIs.html - */ -public class CreateInstance { - public static void main(String[] args) { - final String usage = """ - - Usage: - - - Where: - name - An instance name value that you can obtain from the AWS Console (for example, ami-xxxxxx5c8b987b1a0).\s - amiId - An Amazon Machine Image (AMI) value that you can obtain from the AWS Console (for example, i-xxxxxx2734106d0ab).\s - """; - - if (args.length != 2) { - System.out.println(usage); - System.exit(1); - } - - String name = args[0]; - String amiId = args[1]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - String instanceId = createEC2Instance(ec2, name, amiId); - System.out.println("The Amazon EC2 Instance ID is " + instanceId); - ec2.close(); - } - - public static String createEC2Instance(Ec2Client ec2, String name, String amiId) { - RunInstancesRequest runRequest = RunInstancesRequest.builder() - .imageId(amiId) - .instanceType(InstanceType.T1_MICRO) - .maxCount(1) - .minCount(1) - .build(); - - // Use a waiter to wait until the instance is running. - System.out.println("Going to start an EC2 instance using a waiter"); - RunInstancesResponse response = ec2.runInstances(runRequest); - String instanceIdVal = response.instances().get(0).instanceId(); - ec2.waiter().waitUntilInstanceRunning(r -> r.instanceIds(instanceIdVal)); - Tag tag = Tag.builder() - .key("Name") - .value(name) - .build(); - - CreateTagsRequest tagRequest = CreateTagsRequest.builder() - .resources(instanceIdVal) - .tags(tag) - .build(); - - try { - ec2.createTags(tagRequest); - System.out.printf("Successfully started EC2 Instance %s based on AMI %s", instanceIdVal, amiId); - return instanceIdVal; - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - - return ""; - } -} -// snippet-end:[ec2.java2.create_instance.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateKeyPair.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateKeyPair.java deleted file mode 100644 index 326e916d62f..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateKeyPair.java +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.create_key_pair.main] -// snippet-start:[ec2.java2.create_key_pair.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.CreateKeyPairRequest; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -// snippet-end:[ec2.java2.create_key_pair.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class CreateKeyPair { - - public static void main(String[] args) { - final String usage = """ - - Usage: - \s - - Where: - keyName - A key pair name (for example, TestKeyPair).\s - """; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String keyName = args[0]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - createEC2KeyPair(ec2, keyName); - ec2.close(); - } - - public static void createEC2KeyPair(Ec2Client ec2, String keyName) { - try { - CreateKeyPairRequest request = CreateKeyPairRequest.builder() - .keyName(keyName) - .build(); - - ec2.createKeyPair(request); - System.out.printf("Successfully created key pair named %s", keyName); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} -// snippet-end:[ec2.java2.create_key_pair.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateSecurityGroup.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateSecurityGroup.java deleted file mode 100644 index d4b6d11995a..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateSecurityGroup.java +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.create_security_group.main] -// snippet-start:[ec2.java2.create_security_group.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupRequest; -import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressRequest; -import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressResponse; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -import software.amazon.awssdk.services.ec2.model.IpPermission; -import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupResponse; -import software.amazon.awssdk.services.ec2.model.IpRange; -// snippet-end:[ec2.java2.create_security_group.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class CreateSecurityGroup { - public static void main(String[] args) { - final String usage = """ - - Usage: - \s - - Where: - groupName - A group name (for example, TestKeyPair).\s - groupDesc - A group description (for example, TestKeyPair).\s - vpcId - A VPC ID that you can obtain from the AWS Management Console (for example, vpc-xxxxxf2f).\s - - """; - - if (args.length != 3) { - System.out.println(usage); - System.exit(1); - } - - String groupName = args[0]; - String groupDesc = args[1]; - String vpcId = args[2]; - - // snippet-start:[ec2.java2.create_security_group.client] - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - // snippet-end:[ec2.java2.create_security_group.client] - - String id = createEC2SecurityGroup(ec2, groupName, groupDesc, vpcId); - System.out.printf("Successfully created Security Group with this ID %s", id); - ec2.close(); - } - - public static String createEC2SecurityGroup(Ec2Client ec2, String groupName, String groupDesc, String vpcId) { - try { - // snippet-start:[ec2.java2.create_security_group.create] - CreateSecurityGroupRequest createRequest = CreateSecurityGroupRequest.builder() - .groupName(groupName) - .description(groupDesc) - .vpcId(vpcId) - .build(); - - CreateSecurityGroupResponse resp = ec2.createSecurityGroup(createRequest); - // snippet-end:[ec2.java2.create_security_group.create] - - // snippet-start:[ec2.java2.create_security_group.config] - IpRange ipRange = IpRange.builder() - .cidrIp("0.0.0.0/0").build(); - - IpPermission ipPerm = IpPermission.builder() - .ipProtocol("tcp") - .toPort(80) - .fromPort(80) - .ipRanges(ipRange) - .build(); - - IpPermission ipPerm2 = IpPermission.builder() - .ipProtocol("tcp") - .toPort(22) - .fromPort(22) - .ipRanges(ipRange) - .build(); - - AuthorizeSecurityGroupIngressRequest authRequest = AuthorizeSecurityGroupIngressRequest - .builder() - .groupName(groupName) - .ipPermissions(ipPerm, ipPerm2) - .build(); - - AuthorizeSecurityGroupIngressResponse authResponse = ec2 - .authorizeSecurityGroupIngress(authRequest); - System.out.printf("Successfully added ingress policy to Security Group %s", groupName); - return resp.groupId(); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - return ""; - } -} -// snippet-end:[ec2.java2.create_security_group.config] -// snippet-end:[ec2.java2.create_security_group.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateVolume.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateVolume.java deleted file mode 100644 index f71f5af06b2..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/CreateVolume.java +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.CreateVolumeRequest; -import software.amazon.awssdk.services.ec2.model.CreateVolumeResponse; -import software.amazon.awssdk.services.ec2.model.VolumeType; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - * - * This code example requires an AMI value. You can learn more about this value - * by reading this documentation topic: - * - * https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/AMIs.html - */ -public class CreateVolume { - public static void main(String[] args) { - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - try { - CreateVolumeRequest request = CreateVolumeRequest.builder() - .availabilityZone("us-east-1e") - .size(384) - .volumeType(VolumeType.GP3) - .build(); - - CreateVolumeResponse response = ec2.createVolume(request); - System.out.println("The ARN is " + response.outpostArn()); - ec2.close(); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} \ No newline at end of file diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DeleteKeyPair.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DeleteKeyPair.java deleted file mode 100644 index 193d8e727f0..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DeleteKeyPair.java +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.delete_key_pair.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.DeleteKeyPairRequest; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -// snippet-end:[ec2.java2.delete_key_pair.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class DeleteKeyPair { - - public static void main(String[] args) { - final String usage = """ - - Usage: - \s - - Where: - keyPair - A key pair name (for example, TestKeyPair)."""; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String keyPair = args[0]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - deleteKeys(ec2, keyPair); - ec2.close(); - } - - public static void deleteKeys(Ec2Client ec2, String keyPair) { - try { - DeleteKeyPairRequest request = DeleteKeyPairRequest.builder() - .keyName(keyPair) - .build(); - - ec2.deleteKeyPair(request); - System.out.printf("Successfully deleted key pair named %s", keyPair); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} \ No newline at end of file diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DeleteSecurityGroup.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DeleteSecurityGroup.java deleted file mode 100644 index b82e3c1316b..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DeleteSecurityGroup.java +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.delete_security_group.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.DeleteSecurityGroupRequest; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -// snippet-end:[ec2.java2.delete_security_group.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class DeleteSecurityGroup { - public static void main(String[] args) { - final String usage = """ - - Usage: - \s - - Where: - groupId - A security group id that you can obtain from the AWS Console (for example, sg-xxxxxx1c0b65785c3)."""; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String groupId = args[0]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - deleteEC2SecGroup(ec2, groupId); - ec2.close(); - } - - public static void deleteEC2SecGroup(Ec2Client ec2, String groupId) { - try { - DeleteSecurityGroupRequest request = DeleteSecurityGroupRequest.builder() - .groupId(groupId) - .build(); - - ec2.deleteSecurityGroup(request); - System.out.printf("Successfully deleted Security Group with id %s", groupId); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} - diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeAccount.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeAccount.java index fc37fd304cf..9abb978b14e 100644 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeAccount.java +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeAccount.java @@ -6,9 +6,9 @@ // snippet-start:[ec2.java2.describe_account.main] // snippet-start:[ec2.java2.describe_account.import] import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; import software.amazon.awssdk.services.ec2.model.DescribeAccountAttributesResponse; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; +import java.util.concurrent.CompletableFuture; // snippet-end:[ec2.java2.describe_account.import] /** @@ -21,29 +21,43 @@ */ public class DescribeAccount { public static void main(String[] args) { - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); + Ec2AsyncClient ec2AsyncClient = Ec2AsyncClient.builder() + .region(Region.US_EAST_1) + .build(); - describeEC2Account(ec2); - System.out.print("Done"); - ec2.close(); - } - - public static void describeEC2Account(Ec2Client ec2) { try { - DescribeAccountAttributesResponse accountResults = ec2.describeAccountAttributes(); - accountResults.accountAttributes().forEach(attribute -> { - System.out.print("\n The name of the attribute is " + attribute.attributeName()); - attribute.attributeValues().forEach( - myValue -> System.out.print("\n The value of the attribute is " + myValue.attributeValue())); - }); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); + CompletableFuture future = describeEC2AccountAsync(ec2AsyncClient); + future.join(); + System.out.println("EC2 Account attributes described successfully."); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); } } + + /** + * Describes the EC2 account attributes asynchronously. + * + * @param ec2AsyncClient the EC2 asynchronous client to use for the operation + * @return a {@link CompletableFuture} containing the {@link DescribeAccountAttributesResponse} with the account attributes + */ + public static CompletableFuture describeEC2AccountAsync(Ec2AsyncClient ec2AsyncClient) { + CompletableFuture response = ec2AsyncClient.describeAccountAttributes(); + return response.whenComplete((accountResults, ex) -> { + if (ex != null) { + // Handle the exception by throwing a RuntimeException. + throw new RuntimeException("Failed to describe EC2 account attributes.", ex); + } else if (accountResults == null || accountResults.accountAttributes().isEmpty()) { + // Throw an exception if the response is null or no account attributes are found. + throw new RuntimeException("No account attributes found."); + } else { + // Process the response if no exception occurred. + accountResults.accountAttributes().forEach(attribute -> { + System.out.println("\nThe name of the attribute is " + attribute.attributeName()); + attribute.attributeValues().forEach( + myValue -> System.out.println("The value of the attribute is " + myValue.attributeValue())); + }); + } + }); + } } // snippet-end:[ec2.java2.describe_account.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeAddresses.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeAddresses.java index 0faca7a9ce0..8755eee42e3 100644 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeAddresses.java +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeAddresses.java @@ -6,10 +6,9 @@ // snippet-start:[ec2.java2.describe_addresses.main] // snippet-start:[ec2.java2.describe_addresses.import] import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.Address; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; import software.amazon.awssdk.services.ec2.model.DescribeAddressesResponse; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; +import java.util.concurrent.CompletableFuture; // snippet-end:[ec2.java2.describe_addresses.import] /** @@ -22,33 +21,52 @@ */ public class DescribeAddresses { public static void main(String[] args) { - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); + Ec2AsyncClient ec2AsyncClient = Ec2AsyncClient.builder() + .region(Region.US_EAST_1) + .build(); - describeEC2Address(ec2); - ec2.close(); + try { + CompletableFuture future = describeEC2AddressAsync(ec2AsyncClient); + future.join(); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + } } - public static void describeEC2Address(Ec2Client ec2) { - try { - DescribeAddressesResponse response = ec2.describeAddresses(); - for (Address address : response.addresses()) { - System.out.printf( + /** + * Asynchronously describes the Elastic Compute Cloud (EC2) addresses associated with the provided + * {@code Ec2AsyncClient}. + * + * @param ec2AsyncClient the EC2 asynchronous client to use for the request + * @return a {@link CompletableFuture} containing the {@link DescribeAddressesResponse} with the + * details of the described addresses + */ + public static CompletableFuture describeEC2AddressAsync(Ec2AsyncClient ec2AsyncClient) { + CompletableFuture response = ec2AsyncClient.describeAddresses(); + // Handle the response or exception. + response.whenComplete((addressesResponse, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to describe EC2 addresses.", ex); + } else if (addressesResponse == null || addressesResponse.addresses().isEmpty()) { + // Throw an exception if the response is null or the result is empty (no addresses found). + throw new RuntimeException("No EC2 addresses found."); + } else { + // Process the response if no exception occurred and the result is not empty. + addressesResponse.addresses().forEach(address -> { + System.out.printf( "Found address with public IP %s, " + - "domain %s, " + - "allocation id %s " + - "and NIC id %s", + "domain %s, " + + "allocation id %s, " + + "and NIC id %s%n", address.publicIp(), address.domain(), address.allocationId(), address.networkInterfaceId()); + }); } - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } + }); + + return response; } } // snippet-end:[ec2.java2.describe_addresses.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeInstanceTags.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeInstanceTags.java index 64457646ec7..a92e4b4dbe7 100644 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeInstanceTags.java +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeInstanceTags.java @@ -6,12 +6,11 @@ // snippet-start:[ec2.java2.describe_tags.main] // snippet-start:[ec2.java2.describe_tags.import] import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; import software.amazon.awssdk.services.ec2.model.Filter; import software.amazon.awssdk.services.ec2.model.DescribeTagsResponse; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; import software.amazon.awssdk.services.ec2.model.DescribeTagsRequest; -import software.amazon.awssdk.services.ec2.paginators.DescribeTagsIterable; +import java.util.concurrent.CompletableFuture; // snippet-end:[ec2.java2.describe_tags.import] /** @@ -35,36 +34,53 @@ public static void main(String[] args) { if (args.length != 1) { System.out.println(usage); - System.exit(1); + return; } String resourceId = args[0]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); + Ec2AsyncClient ec2AsyncClient = Ec2AsyncClient.builder() + .region(Region.US_EAST_1) + .build(); - describeEC2Tags(ec2, resourceId); - ec2.close(); + try { + CompletableFuture future = describeEC2TagsAsync(ec2AsyncClient, resourceId); + future.join(); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + } } - public static void describeEC2Tags(Ec2Client ec2, String resourceId) { - try { - Filter filter = Filter.builder() - .name("resource-id") - .values(resourceId) - .build(); + /** + * Asynchronously describes the tags associated with the specified Amazon EC2 resource. + * + * @param ec2AsyncClient the Amazon EC2 asynchronous client + * @param resourceId the ID of the Amazon EC2 resource + * @return a {@link CompletableFuture} that completes when the tags have been described, or with an exception if the operation fails + */ + public static CompletableFuture describeEC2TagsAsync(Ec2AsyncClient ec2AsyncClient, String resourceId) { + Filter filter = Filter.builder() + .name("resource-id") + .values(resourceId) + .build(); - DescribeTagsIterable response = ec2.describeTagsPaginator(DescribeTagsRequest.builder().filters(filter).build()); - response.stream() - .flatMap(r -> r.tags().stream()) - .forEach(tag -> System.out - .println("Tag key is: " + tag.key() + " Tag value is: " + tag.value())); + CompletableFuture response = ec2AsyncClient.describeTags( + DescribeTagsRequest.builder().filters(filter).build()); + response.whenComplete((tagsResponse, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to describe EC2 tags.", ex); + } else if (tagsResponse == null || tagsResponse.tags().isEmpty()) { + throw new RuntimeException("No EC2 tags found for the resource."); + } else { + tagsResponse.tags().forEach(tag -> { + System.out.printf( + "Tag key is: %s, Tag value is: %s%n", + tag.key(), + tag.value()); + }); + } + }); - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } + return response; } } // snippet-end:[ec2.java2.describe_tags.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeInstances.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeInstances.java deleted file mode 100644 index 3d527e1dbff..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeInstances.java +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.describe_instances.main] -// snippet-start:[ec2.java2.describe_instances.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -import software.amazon.awssdk.services.ec2.paginators.DescribeInstancesIterable; -// snippet-end:[ec2.java2.describe_instances.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class DescribeInstances { - public static void main(String[] args) { - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - describeEC2Instances(ec2); - ec2.close(); - } - - public static void describeEC2Instances(Ec2Client ec2) { - try { - DescribeInstancesRequest request = DescribeInstancesRequest.builder() - .maxResults(10) - .build(); - - DescribeInstancesIterable instancesIterable = ec2.describeInstancesPaginator(request); - instancesIterable.stream() - .flatMap(r -> r.reservations().stream()) - .flatMap(reservation -> reservation.instances().stream()) - .forEach(instance -> { - System.out.println("Instance Id is " + instance.instanceId()); - System.out.println("Image id is " + instance.imageId()); - System.out.println("Instance type is " + instance.instanceType()); - System.out.println("Instance state name is " + instance.state().name()); - System.out.println("Monitoring information is " + instance.monitoring().state()); - }); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorCode()); - System.exit(1); - } - } -} -// snippet-end:[ec2.java2.describe_instances.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeKeyPairs.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeKeyPairs.java deleted file mode 100644 index e1e46eb20c7..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeKeyPairs.java +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.describe_key_pairs.main] -// snippet-start:[ec2.java2.describe_key_pairs.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.DescribeKeyPairsResponse; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -// snippet-end:[ec2.java2.describe_key_pairs.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class DescribeKeyPairs { - public static void main(String[] args) { - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - describeEC2Keys(ec2); - ec2.close(); - } - - public static void describeEC2Keys(Ec2Client ec2) { - try { - DescribeKeyPairsResponse response = ec2.describeKeyPairs(); - response.keyPairs().forEach(keyPair -> System.out.printf( - "Found key pair with name %s " + - "and fingerprint %s", - keyPair.keyName(), - keyPair.keyFingerprint())); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} -// snippet-end:[ec2.java2.describe_key_pairs.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeRegionsAndZones.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeRegionsAndZones.java index 67bea7ddcfd..1058b6babd4 100644 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeRegionsAndZones.java +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeRegionsAndZones.java @@ -5,13 +5,14 @@ // snippet-start:[ec2.java2.describe_region_and_zones.complete] // snippet-start:[ec2.java2.describe_region_and_zones.main] +// snippet-start:[ec2.java2.describe_region_and_zones.region] // snippet-start:[ec2.java2.describe_region_and_zones.import] -import software.amazon.awssdk.services.ec2.Ec2Client; +// snippet-start:[ec2.java2.describe_region_and_zones.avail_zone] +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; import software.amazon.awssdk.services.ec2.model.DescribeRegionsResponse; import software.amazon.awssdk.services.ec2.model.DescribeAvailabilityZonesResponse; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; - - +import java.util.concurrent.CompletableFuture; // snippet-end:[ec2.java2.describe_region_and_zones.import] /** @@ -25,47 +26,70 @@ public class DescribeRegionsAndZones { public static void main(String[] args) { // snippet-start:[ec2.java2.describe_region_and_zones.client] - software.amazon.awssdk.regions.Region region = software.amazon.awssdk.regions.Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) + Ec2AsyncClient ec2AsyncClient = Ec2AsyncClient.builder() + .region(Region.US_EAST_1) .build(); // snippet-end:[ec2.java2.describe_region_and_zones.client] - describeEC2RegionsAndZones(ec2); - ec2.close(); + try { + CompletableFuture future = describeEC2RegionsAndZonesAsync(ec2AsyncClient); + future.join(); // Wait for both async operations to complete. + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + } } - public static void describeEC2RegionsAndZones(Ec2Client ec2) { - // snippet-start:[ec2.java2.describe_region_and_zones.region] - try { - DescribeRegionsResponse regionsResponse = ec2.describeRegions(); - regionsResponse.regions().forEach(region -> { - System.out.printf( - "Found Region %s with endpoint %s%n", - region.regionName(), - region.endpoint()); - System.out.println(); - }); - // snippet-end:[ec2.java2.describe_region_and_zones.region] + /** + * Asynchronously describes the EC2 regions and availability zones. + * + * @param ec2AsyncClient the EC2 async client used to make the API calls + * @return a {@link CompletableFuture} that completes when both the region and availability zone descriptions are complete + */ + public static CompletableFuture describeEC2RegionsAndZonesAsync(Ec2AsyncClient ec2AsyncClient) { + // Initiate the asynchronous request to describe regions + CompletableFuture regionsResponse = ec2AsyncClient.describeRegions(); - // snippet-start:[ec2.java2.describe_region_and_zones.avail_zone] - DescribeAvailabilityZonesResponse zonesResponse = ec2.describeAvailabilityZones(); - zonesResponse.availabilityZones().forEach(zone -> { - System.out.printf( - "Found Availability Zone %s with status %s in region %s%n", - zone.zoneName(), - zone.state(), - zone.regionName() - ); - System.out.println(); - }); - // snippet-end:[ec2.java2.describe_region_and_zones.avail_zone] + // Handle the response or exception for regions + CompletableFuture regionsFuture = regionsResponse.whenComplete((regionsResp, ex) -> { + if (ex != null) { + // Handle the exception by throwing a RuntimeException + throw new RuntimeException("Failed to describe EC2 regions.", ex); + } else if (regionsResp == null || regionsResp.regions().isEmpty()) { + // Throw an exception if the response is null or the result is empty + throw new RuntimeException("No EC2 regions found."); + } else { + // Process the response if no exception occurred and the result is not empty + regionsResp.regions().forEach(region -> { + System.out.printf( + "Found Region %s with endpoint %s%n", + region.regionName(), + region.endpoint()); + }); + } + }); - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } + CompletableFuture zonesResponse = ec2AsyncClient.describeAvailabilityZones(); + CompletableFuture zonesFuture = zonesResponse.whenComplete((zonesResp, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to describe EC2 availability zones.", ex); + } else if (zonesResp == null || zonesResp.availabilityZones().isEmpty()) { + throw new RuntimeException("No EC2 availability zones found."); + } else { + zonesResp.availabilityZones().forEach(zone -> { + System.out.printf( + "Found Availability Zone %s with status %s in region %s%n", + zone.zoneName(), + zone.state(), + zone.regionName() + ); + }); + } + }); + + return CompletableFuture.allOf(regionsFuture, zonesFuture); } } // snippet-end:[ec2.java2.describe_region_and_zones.main] +// snippet-end:[ec2.java2.describe_region_and_zones.region] +// snippet-end:[ec2.java2.describe_region_and_zones.avail_zone] // snippet-end:[ec2.java2.describe_region_and_zones.complete] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeReservedInstances.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeReservedInstances.java index 42c5ed0b406..cf3766778b7 100644 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeReservedInstances.java +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeReservedInstances.java @@ -6,11 +6,9 @@ // snippet-start:[ec2.java2.describe_reserved_instances.main] // snippet-start:[ec2.java2.describe_reserved_instances.import] import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.DescribeReservedInstancesRequest; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; import software.amazon.awssdk.services.ec2.model.DescribeReservedInstancesResponse; -import software.amazon.awssdk.services.ec2.model.ReservedInstances; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; +import java.util.concurrent.CompletableFuture; // snippet-end:[ec2.java2.describe_reserved_instances.import] /** @@ -23,35 +21,50 @@ */ public class DescribeReservedInstances { public static void main(String[] args) { - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); + Ec2AsyncClient ec2AsyncClient = Ec2AsyncClient.builder() + .region(Region.US_EAST_1) + .build(); - describeReservedEC2Instances(ec2); - ec2.close(); + try { + CompletableFuture future = describeReservedEC2InstancesAsync(ec2AsyncClient); + future.join(); // Wait for the async operation to complete. + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + } } - public static void describeReservedEC2Instances(Ec2Client ec2) { - try { - DescribeReservedInstancesResponse response = ec2.describeReservedInstances(); - response.reservedInstances().forEach(instance -> { - System.out.printf( - "Found a Reserved Instance with id %s, " + - "in AZ %s, " + - "type %s, " + - "state %s " + - "and monitoring state %s%n", - instance.reservedInstancesId(), - instance.availabilityZone(), - instance.instanceType(), - instance.state().name()); - }); + /** + * Describes the Reserved EC2 Instances asynchronously using the given {@link Ec2AsyncClient}. + *

+ * This method uses the {@link Ec2AsyncClient#describeReservedInstances()} method to fetch the + * details of the Reserved EC2 Instances and prints the information about each instance to the console. + * + * @param ec2AsyncClient the {@link Ec2AsyncClient} instance to be used for the asynchronous operation + * @return a {@link CompletableFuture} that completes when the asynchronous operation is finished + */ + public static CompletableFuture describeReservedEC2InstancesAsync(Ec2AsyncClient ec2AsyncClient) { + CompletableFuture response = ec2AsyncClient.describeReservedInstances(); + response.whenComplete((reservedInstancesResponse, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to describe EC2 reserved instances.", ex); + } else if (reservedInstancesResponse == null || reservedInstancesResponse.reservedInstances().isEmpty()) { + throw new RuntimeException("No EC2 reserved instances found."); + } else { + reservedInstancesResponse.reservedInstances().forEach(instance -> { + System.out.printf( + "Found a Reserved Instance with id %s, " + + "in AZ %s, " + + "type %s, " + + "state %s%n", + instance.reservedInstancesId(), + instance.availabilityZone(), + instance.instanceType(), + instance.state().name()); + }); + } + }); - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } + return response.thenApply(resp -> null); } } // snippet-end:[ec2.java2.describe_reserved_instances.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeSecurityGroups.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeSecurityGroups.java deleted file mode 100644 index 98a14b5dd84..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeSecurityGroups.java +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.describe_security_groups.main] -// snippet-start:[ec2.java2.describe_security_groups.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsRequest; -import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsResponse; -import software.amazon.awssdk.services.ec2.model.SecurityGroup; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -import software.amazon.awssdk.services.ec2.paginators.DescribeSecurityGroupsIterable; -// snippet-end:[ec2.java2.describe_security_groups.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class DescribeSecurityGroups { - public static void main(String[] args) { - final String usage = "To run this example, supply a group id\n" + - "Ex: DescribeSecurityGroups \n"; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String groupId = args[0]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - describeEC2SecurityGroups(ec2, groupId); - ec2.close(); - } - - public static void describeEC2SecurityGroups(Ec2Client ec2, String groupId) { - try { - DescribeSecurityGroupsRequest request = DescribeSecurityGroupsRequest.builder() - .groupIds(groupId) - .build(); - - // Use a paginator. - DescribeSecurityGroupsIterable listGroups = ec2.describeSecurityGroupsPaginator(request); - listGroups.stream() - .flatMap(r -> r.securityGroups().stream()) - .forEach(group -> System.out - .println(" Group id: " +group.groupId() + " group name = " + group.groupName())); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} -// snippet-end:[ec2.java2.describe_security_groups.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeVPCs.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeVPCs.java deleted file mode 100644 index 730f27ff26c..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/DescribeVPCs.java +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.describe_vpc.main] -// snippet-start:[ec2.java2.describe_vpc.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.DescribeVpcsRequest; -import software.amazon.awssdk.services.ec2.model.DescribeVpcsResponse; -import software.amazon.awssdk.services.ec2.model.Vpc; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -import software.amazon.awssdk.services.ec2.paginators.DescribeVpcsIterable; -// snippet-end:[ec2.java2.describe_vpc.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class DescribeVPCs { - public static void main(String[] args) { - final String usage = """ - - Usage: - - - Where: - vpcId - A VPC ID that you can obtain from the AWS Management Console (for example, vpc-xxxxxf2f).\s - """; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String vpcId = args[0]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - describeEC2Vpcs(ec2, vpcId); - ec2.close(); - } - - public static void describeEC2Vpcs(Ec2Client ec2, String vpcId) { - try { - DescribeVpcsRequest request = DescribeVpcsRequest.builder() - .vpcIds(vpcId) - .build(); - - DescribeVpcsIterable vpcsIterable = ec2.describeVpcsPaginator(request); - vpcsIterable.stream() - .flatMap(r -> r.vpcs().stream()) - .forEach(vpc -> System.out - .printf( - "Found VPC with id %s, " + - "vpc state %s " + - "and tenancy %s%n", - vpc.vpcId(), - vpc.stateAsString(), - vpc.instanceTenancyAsString() - ) - ); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} -// snippet-end:[ec2.java2.describe_vpc.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/EC2Scenario.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/EC2Scenario.java deleted file mode 100644 index 409ae077720..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/EC2Scenario.java +++ /dev/null @@ -1,661 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -import software.amazon.awssdk.core.waiters.WaiterResponse; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.AllocateAddressRequest; -import software.amazon.awssdk.services.ec2.model.AllocateAddressResponse; -import software.amazon.awssdk.services.ec2.model.AssociateAddressRequest; -import software.amazon.awssdk.services.ec2.model.AssociateAddressResponse; -import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressRequest; -import software.amazon.awssdk.services.ec2.model.CreateKeyPairRequest; -import software.amazon.awssdk.services.ec2.model.CreateKeyPairResponse; -import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupRequest; -import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupResponse; -import software.amazon.awssdk.services.ec2.model.DeleteKeyPairRequest; -import software.amazon.awssdk.services.ec2.model.DeleteSecurityGroupRequest; -import software.amazon.awssdk.services.ec2.model.DescribeImagesRequest; -import software.amazon.awssdk.services.ec2.model.DescribeImagesResponse; -import software.amazon.awssdk.services.ec2.model.DescribeInstanceTypesRequest; -import software.amazon.awssdk.services.ec2.model.DescribeInstanceTypesResponse; -import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest; -import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse; -import software.amazon.awssdk.services.ec2.model.DescribeKeyPairsResponse; -import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsRequest; -import software.amazon.awssdk.services.ec2.model.DisassociateAddressRequest; -import software.amazon.awssdk.services.ec2.model.DomainType; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -import software.amazon.awssdk.services.ec2.model.InstanceTypeInfo; -import software.amazon.awssdk.services.ec2.model.IpPermission; -import software.amazon.awssdk.services.ec2.model.IpRange; -import software.amazon.awssdk.services.ec2.model.ReleaseAddressRequest; -import software.amazon.awssdk.services.ec2.model.RunInstancesRequest; -import software.amazon.awssdk.services.ec2.model.RunInstancesResponse; -import software.amazon.awssdk.services.ec2.model.StartInstancesRequest; -import software.amazon.awssdk.services.ec2.model.StopInstancesRequest; -import software.amazon.awssdk.services.ec2.model.TerminateInstancesRequest; -import software.amazon.awssdk.services.ec2.paginators.DescribeSecurityGroupsIterable; -import software.amazon.awssdk.services.ec2.waiters.Ec2Waiter; -import software.amazon.awssdk.services.ssm.SsmClient; -import software.amazon.awssdk.services.ssm.model.GetParametersByPathRequest; -import software.amazon.awssdk.services.ssm.model.Parameter; -import software.amazon.awssdk.services.ssm.model.SsmException; -import software.amazon.awssdk.services.ssm.paginators.GetParametersByPathIterable; -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; -import java.util.List; - -// snippet-start:[ec2.java2.scenario.main] -/** - * Before running this Java (v2) code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - * - * This Java example performs the following tasks: - * - * 1. Creates an RSA key pair and saves the private key data as a .pem file. - * 2. Lists key pairs. - * 3. Creates a security group for the default VPC. - * 4. Displays security group information. - * 5. Gets a list of Amazon Linux 2 AMIs and selects one. - * 6. Gets more information about the image. - * 7. Gets a list of instance types that are compatible with the selected AMI’s - * architecture. - * 8. Creates an instance with the key pair, security group, AMI, and an - * instance type. - * 9. Displays information about the instance. - * 10. Stops the instance and waits for it to stop. - * 11. Starts the instance and waits for it to start. - * 12. Allocates an Elastic IP address and associates it with the instance. - * 13. Displays SSH connection info for the instance. - * 14. Disassociates and deletes the Elastic IP address. - * 15. Terminates the instance and waits for it to terminate. - * 16. Deletes the security group. - * 17. Deletes the key pair. - */ -public class EC2Scenario { - public static final String DASHES = new String(new char[80]).replace("\0", "-"); - - public static void main(String[] args) throws InterruptedException { - - final String usage = """ - - Usage: - - - Where: - keyName - A key pair name (for example, TestKeyPair).\s - fileName - A file name where the key information is written to.\s - groupName - The name of the security group.\s - groupDesc - The description of the security group.\s - vpcId - A VPC Id value. You can get this value from the AWS Management Console.\s - myIpAddress - The IP address of your development machine.\s - - """; - - if (args.length != 6) { - System.out.println(usage); - System.exit(1); - } - - String keyName = args[0]; - String fileName = args[1]; - String groupName = args[2]; - String groupDesc = args[3]; - String vpcId = args[4]; - String myIpAddress = args[5]; - - Region region = Region.US_WEST_2; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - SsmClient ssmClient = SsmClient.builder() - .region(region) - .build(); - - System.out.println(DASHES); - System.out.println("Welcome to the Amazon EC2 example scenario."); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("1. Create an RSA key pair and save the private key material as a .pem file."); - createKeyPair(ec2, keyName, fileName); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("2. List key pairs."); - describeKeys(ec2); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("3. Create a security group."); - String groupId = createSecurityGroup(ec2, groupName, groupDesc, vpcId, myIpAddress); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("4. Display security group info for the newly created security group."); - describeSecurityGroups(ec2, groupId); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("5. Get a list of Amazon Linux 2 AMIs and selects one with amzn2 in the name."); - String instanceId = getParaValues(ssmClient); - System.out.println("The instance Id is " + instanceId); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("6. Get more information about an amzn2 image."); - String amiValue = describeImage(ec2, instanceId); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("7. Get a list of instance types."); - String instanceType = getInstanceTypes(ec2); - System.out.println("The instance type is " + instanceType); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("8. Create an instance."); - String newInstanceId = runInstance(ec2, instanceType, keyName, groupName, amiValue); - System.out.println("The instance Id is " + newInstanceId); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("9. Display information about the running instance. "); - String ipAddress = describeEC2Instances(ec2, newInstanceId); - System.out.println("You can SSH to the instance using this command:"); - System.out.println("ssh -i " + fileName + "ec2-user@" + ipAddress); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("10. Stop the instance and use a waiter."); - stopInstance(ec2, newInstanceId); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("11. Start the instance and use a waiter."); - startInstance(ec2, newInstanceId); - ipAddress = describeEC2Instances(ec2, newInstanceId); - System.out.println("You can SSH to the instance using this command:"); - System.out.println("ssh -i " + fileName + "ec2-user@" + ipAddress); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("12. Allocate an Elastic IP address and associate it with the instance."); - String allocationId = allocateAddress(ec2); - System.out.println("The allocation Id value is " + allocationId); - String associationId = associateAddress(ec2, newInstanceId, allocationId); - System.out.println("The associate Id value is " + associationId); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("13. Describe the instance again."); - ipAddress = describeEC2Instances(ec2, newInstanceId); - System.out.println("You can SSH to the instance using this command:"); - System.out.println("ssh -i " + fileName + "ec2-user@" + ipAddress); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("14. Disassociate and release the Elastic IP address."); - disassociateAddress(ec2, associationId); - releaseEC2Address(ec2, allocationId); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("15. Terminate the instance and use a waiter."); - terminateEC2(ec2, newInstanceId); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("16. Delete the security group."); - deleteEC2SecGroup(ec2, groupId); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("17. Delete the key."); - deleteKeys(ec2, keyName); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("You successfully completed the Amazon EC2 scenario."); - System.out.println(DASHES); - ec2.close(); - } - - // snippet-start:[ec2.java2.delete_security_group.main] - public static void deleteEC2SecGroup(Ec2Client ec2, String groupId) { - try { - DeleteSecurityGroupRequest request = DeleteSecurityGroupRequest.builder() - .groupId(groupId) - .build(); - - ec2.deleteSecurityGroup(request); - System.out.println("Successfully deleted security group with Id " + groupId); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } - // snippet-end:[ec2.java2.delete_security_group.main] - - // snippet-start:[ec2.java2.terminate_instance] - public static void terminateEC2(Ec2Client ec2, String instanceId) { - try { - Ec2Waiter ec2Waiter = Ec2Waiter.builder() - .overrideConfiguration(b -> b.maxAttempts(100)) - .client(ec2) - .build(); - - TerminateInstancesRequest ti = TerminateInstancesRequest.builder() - .instanceIds(instanceId) - .build(); - - System.out.println("Use an Ec2Waiter to wait for the instance to terminate. This will take a few minutes."); - ec2.terminateInstances(ti); - DescribeInstancesRequest instanceRequest = DescribeInstancesRequest.builder() - .instanceIds(instanceId) - .build(); - - WaiterResponse waiterResponse = ec2Waiter - .waitUntilInstanceTerminated(instanceRequest); - waiterResponse.matched().response().ifPresent(System.out::println); - System.out.println("Successfully started instance " + instanceId); - System.out.println(instanceId + " is terminated!"); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } - // snippet-end:[ec2.java2.terminate_instance] - - // snippet-start:[ec2.java2.delete_key_pair.main] - public static void deleteKeys(Ec2Client ec2, String keyPair) { - try { - DeleteKeyPairRequest request = DeleteKeyPairRequest.builder() - .keyName(keyPair) - .build(); - - ec2.deleteKeyPair(request); - System.out.println("Successfully deleted key pair named " + keyPair); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } - // snippet-end:[ec2.java2.delete_key_pair.main] - - // snippet-start:[ec2.java2.release_instance.main] - public static void releaseEC2Address(Ec2Client ec2, String allocId) { - try { - ReleaseAddressRequest request = ReleaseAddressRequest.builder() - .allocationId(allocId) - .build(); - - ec2.releaseAddress(request); - System.out.println("Successfully released Elastic IP address " + allocId); - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } - // snippet-end:[ec2.java2.release_instance.main] - - // snippet-start:[ec2.java2.scenario.disassociate_address.main] - public static void disassociateAddress(Ec2Client ec2, String associationId) { - try { - DisassociateAddressRequest addressRequest = DisassociateAddressRequest.builder() - .associationId(associationId) - .build(); - - ec2.disassociateAddress(addressRequest); - System.out.println("You successfully disassociated the address!"); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } - // snippet-end:[ec2.java2.scenario.disassociate_address.main] - - // snippet-start:[ec2.java2.associate_address.main] - public static String associateAddress(Ec2Client ec2, String instanceId, String allocationId) { - try { - AssociateAddressRequest associateRequest = AssociateAddressRequest.builder() - .instanceId(instanceId) - .allocationId(allocationId) - .build(); - - AssociateAddressResponse associateResponse = ec2.associateAddress(associateRequest); - return associateResponse.associationId(); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - return ""; - } - // snippet-end:[ec2.java2.associate_address.main] - - // snippet-start:[ec2.java2.scenario.allocate_address.main] - public static String allocateAddress(Ec2Client ec2) { - try { - AllocateAddressRequest allocateRequest = AllocateAddressRequest.builder() - .domain(DomainType.VPC) - .build(); - - AllocateAddressResponse allocateResponse = ec2.allocateAddress(allocateRequest); - return allocateResponse.allocationId(); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - return ""; - } - // snippet-end:[ec2.java2.scenario.allocate_address.main] - - // snippet-start:[ec2.java2.scenario.start_instance.main] - public static void startInstance(Ec2Client ec2, String instanceId) { - Ec2Waiter ec2Waiter = Ec2Waiter.builder() - .overrideConfiguration(b -> b.maxAttempts(100)) - .client(ec2) - .build(); - - StartInstancesRequest request = StartInstancesRequest.builder() - .instanceIds(instanceId) - .build(); - - System.out.println("Use an Ec2Waiter to wait for the instance to run. This will take a few minutes."); - ec2.startInstances(request); - DescribeInstancesRequest instanceRequest = DescribeInstancesRequest.builder() - .instanceIds(instanceId) - .build(); - - WaiterResponse waiterResponse = ec2Waiter.waitUntilInstanceRunning(instanceRequest); - waiterResponse.matched().response().ifPresent(System.out::println); - System.out.println("Successfully started instance " + instanceId); - } - // snippet-end:[ec2.java2.scenario.start_instance.main] - - // snippet-start:[ec2.java2.scenario.stop_instance.main] - public static void stopInstance(Ec2Client ec2, String instanceId) { - Ec2Waiter ec2Waiter = Ec2Waiter.builder() - .overrideConfiguration(b -> b.maxAttempts(100)) - .client(ec2) - .build(); - StopInstancesRequest request = StopInstancesRequest.builder() - .instanceIds(instanceId) - .build(); - - System.out.println("Use an Ec2Waiter to wait for the instance to stop. This will take a few minutes."); - ec2.stopInstances(request); - DescribeInstancesRequest instanceRequest = DescribeInstancesRequest.builder() - .instanceIds(instanceId) - .build(); - - WaiterResponse waiterResponse = ec2Waiter.waitUntilInstanceStopped(instanceRequest); - waiterResponse.matched().response().ifPresent(System.out::println); - System.out.println("Successfully stopped instance " + instanceId); - } - // snippet-end:[ec2.java2.scenario.stop_instance.main] - - // snippet-start:[ec2.java2.scenario.describe_instance.main] - public static String describeEC2Instances(Ec2Client ec2, String newInstanceId) { - try { - String pubAddress = ""; - boolean isRunning = false; - DescribeInstancesRequest request = DescribeInstancesRequest.builder() - .instanceIds(newInstanceId) - .build(); - - while (!isRunning) { - DescribeInstancesResponse response = ec2.describeInstances(request); - String state = response.reservations().get(0).instances().get(0).state().name().name(); - if (state.compareTo("RUNNING") == 0) { - System.out.println("Image id is " + response.reservations().get(0).instances().get(0).imageId()); - System.out.println( - "Instance type is " + response.reservations().get(0).instances().get(0).instanceType()); - System.out.println( - "Instance state is " + response.reservations().get(0).instances().get(0).state().name()); - pubAddress = response.reservations().get(0).instances().get(0).publicIpAddress(); - System.out.println("Instance address is " + pubAddress); - isRunning = true; - } - } - return pubAddress; - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - return ""; - } - // snippet-end:[ec2.java2.scenario.describe_instance.main] - - public static String runInstance(Ec2Client ec2, String instanceType, String keyName, String groupName, - String amiId) { - try { - RunInstancesRequest runRequest = RunInstancesRequest.builder() - .instanceType(instanceType) - .keyName(keyName) - .securityGroups(groupName) - .maxCount(1) - .minCount(1) - .imageId(amiId) - .build(); - - System.out.println("Going to start an EC2 instance using a waiter"); - RunInstancesResponse response = ec2.runInstances(runRequest); - String instanceIdVal = response.instances().get(0).instanceId(); - ec2.waiter().waitUntilInstanceRunning(r -> r.instanceIds(instanceIdVal)); - System.out.println("Successfully started EC2 instance " + instanceIdVal + " based on AMI " + amiId); - return instanceIdVal; - - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - return ""; - } - - // snippet-start:[ec2.java2.scenario.describe_instance.type.main] - // Get a list of instance types. - public static String getInstanceTypes(Ec2Client ec2) { - String instanceType; - try { - DescribeInstanceTypesRequest typesRequest = DescribeInstanceTypesRequest.builder() - .maxResults(10) - .build(); - - DescribeInstanceTypesResponse response = ec2.describeInstanceTypes(typesRequest); - List instanceTypes = response.instanceTypes(); - for (InstanceTypeInfo type : instanceTypes) { - System.out.println("The memory information of this type is " + type.memoryInfo().sizeInMiB()); - System.out.println("Network information is " + type.networkInfo().toString()); - System.out.println("Instance type is " + type.instanceType().toString()); - instanceType = type.instanceType().toString(); - if (instanceType.compareTo("t2.2xlarge") == 0){ - return instanceType; - } - } - - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - return ""; - } - // snippet-end:[ec2.java2.scenario.describe_instance.type.main] - - // Display the Description field that corresponds to the instance Id value. - public static String describeImage(Ec2Client ec2, String instanceId) { - try { - DescribeImagesRequest imagesRequest = DescribeImagesRequest.builder() - .imageIds(instanceId) - .build(); - - DescribeImagesResponse response = ec2.describeImages(imagesRequest); - System.out.println("The description of the first image is " + response.images().get(0).description()); - System.out.println("The name of the first image is " + response.images().get(0).name()); - - // Return the image Id value. - return response.images().get(0).imageId(); - - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - return ""; - } - - // Get the Id value of an instance with amzn2 in the name. - public static String getParaValues(SsmClient ssmClient) { - try { - GetParametersByPathRequest parameterRequest = GetParametersByPathRequest.builder() - .path("/aws/service/ami-amazon-linux-latest") - .build(); - - GetParametersByPathIterable responses = ssmClient.getParametersByPathPaginator(parameterRequest); - for (software.amazon.awssdk.services.ssm.model.GetParametersByPathResponse response : responses) { - System.out.println("Test " + response.nextToken()); - List parameterList = response.parameters(); - for (Parameter para : parameterList) { - System.out.println("The name of the para is: " + para.name()); - System.out.println("The type of the para is: " + para.type()); - if (filterName(para.name())) { - return para.value(); - } - } - } - - } catch (SsmException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - return ""; - } - - // Return true if the name has amzn2 in it. For example: - // /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-arm64-gp2 - private static boolean filterName(String name) { - String[] parts = name.split("/"); - String myValue = parts[4]; - return myValue.contains("amzn2"); - } - - // snippet-start:[ec2.java2.scenario.describe_securitygroup.main] - public static void describeSecurityGroups(Ec2Client ec2, String groupId) { - try { - DescribeSecurityGroupsRequest request = DescribeSecurityGroupsRequest.builder() - .groupIds(groupId) - .build(); - - // Use a paginator. - DescribeSecurityGroupsIterable listGroups = ec2.describeSecurityGroupsPaginator(request); - listGroups.stream() - .flatMap(r -> r.securityGroups().stream()) - .forEach(group -> System.out - .println(" Group id: " +group.groupId() + " group name = " + group.groupName())); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } - // snippet-end:[ec2.java2.scenario.describe_securitygroup.main] - - // snippet-start:[ec2.java.scenario_inbound_rule.main] - public static String createSecurityGroup(Ec2Client ec2, String groupName, String groupDesc, String vpcId, - String myIpAddress) { - try { - CreateSecurityGroupRequest createRequest = CreateSecurityGroupRequest.builder() - .groupName(groupName) - .description(groupDesc) - .vpcId(vpcId) - .build(); - - CreateSecurityGroupResponse resp = ec2.createSecurityGroup(createRequest); - IpRange ipRange = IpRange.builder() - .cidrIp(myIpAddress + "/0") - .build(); - - IpPermission ipPerm = IpPermission.builder() - .ipProtocol("tcp") - .toPort(80) - .fromPort(80) - .ipRanges(ipRange) - .build(); - - IpPermission ipPerm2 = IpPermission.builder() - .ipProtocol("tcp") - .toPort(22) - .fromPort(22) - .ipRanges(ipRange) - .build(); - - AuthorizeSecurityGroupIngressRequest authRequest = AuthorizeSecurityGroupIngressRequest.builder() - .groupName(groupName) - .ipPermissions(ipPerm, ipPerm2) - .build(); - - ec2.authorizeSecurityGroupIngress(authRequest); - System.out.println("Successfully added ingress policy to security group " + groupName); - return resp.groupId(); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - return ""; - } - // snippet-end:[ec2.java.scenario_inbound_rule.main] - - // snippet-start:[ec2.java.scenario_describe_keys.main] - public static void describeKeys(Ec2Client ec2) { - try { - DescribeKeyPairsResponse response = ec2.describeKeyPairs(); - response.keyPairs().forEach(keyPair -> System.out.printf( - "Found key pair with name %s " + - "and fingerprint %s", - keyPair.keyName(), - keyPair.keyFingerprint())); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } - // snippet-end:[ec2.java.scenario_describe_keys.main] - - // snippet-start:[ec2.java2.scenario.create_key_pair.main] - public static void createKeyPair(Ec2Client ec2, String keyName, String fileName) { - try { - CreateKeyPairRequest request = CreateKeyPairRequest.builder() - .keyName(keyName) - .build(); - - CreateKeyPairResponse response = ec2.createKeyPair(request); - String content = response.keyMaterial(); - BufferedWriter writer = new BufferedWriter(new FileWriter(fileName)); - writer.write(content); - writer.close(); - System.out.println("Successfully created key pair named " + keyName); - - } catch (Ec2Exception | IOException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[ec2.java2.scenario.create_key_pair.main] -} -// snippet-end:[ec2.java2.scenario.main] \ No newline at end of file diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/FindRunningInstances.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/FindRunningInstances.java index 09c977ed155..be0dbe24a60 100644 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/FindRunningInstances.java +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/FindRunningInstances.java @@ -6,9 +6,10 @@ // snippet-start:[ec2.java2.running_instances.main] // snippet-start:[ec2.java2.running_instances.import] import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; +import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse; +import java.util.concurrent.CompletableFuture; // snippet-end:[ec2.java2.running_instances.import] /** @@ -21,32 +22,42 @@ */ public class FindRunningInstances { public static void main(String[] args) { - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) + Ec2AsyncClient ec2AsyncClient = Ec2AsyncClient.builder() + .region(Region.US_EAST_1) .build(); - - findRunningEC2InstancesUsingPaginator(ec2); - ec2.close(); + try { + CompletableFuture future = findRunningEC2InstancesUsingPaginatorAsync(ec2AsyncClient); + future.join(); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + } } - public static void findRunningEC2InstancesUsingPaginator(Ec2Client ec2) { - try { - // Create a DescribeInstancesRequest to filter running instances. - DescribeInstancesRequest describeInstancesRequest = DescribeInstancesRequest.builder() - .filters(f -> f.name("instance-state-name").values("running")) - .build(); + /** + * Finds all running EC2 instances asynchronously. + * + * @param ec2AsyncClient the EC2 asynchronous client to use for the operation + * @return a {@link CompletableFuture} that completes when the asynchronous operation is finished + */ + public static CompletableFuture findRunningEC2InstancesUsingPaginatorAsync(Ec2AsyncClient ec2AsyncClient) { + DescribeInstancesRequest describeInstancesRequest = DescribeInstancesRequest.builder() + .filters(f -> f.name("instance-state-name").values("running")) + .build(); - // Use the describeInstancesPaginator to paginate through the results. - ec2.describeInstancesPaginator(describeInstancesRequest).stream() - .flatMap(response -> response.reservations().stream()) - .flatMap(reservation -> reservation.instances().stream()) - .forEach(instance -> System.out.println("Instance ID: " + instance.instanceId() + ", State: " + instance.state().name())); + CompletableFuture response = ec2AsyncClient.describeInstances(describeInstancesRequest); + response.whenComplete((instancesResponse, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to describe running EC2 instances.", ex); + } else if (instancesResponse == null || instancesResponse.reservations().isEmpty()) { + throw new RuntimeException("No running EC2 instances found."); + } else { + instancesResponse.reservations().stream() + .flatMap(reservation -> reservation.instances().stream()) + .forEach(instance -> System.out.println("Instance ID: " + instance.instanceId() + ", State: " + instance.state().name())); + } + }); - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } + return response.thenApply(resp -> null); } } // snippet-end:[ec2.java2.running_instances.main] \ No newline at end of file diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/GetPasswordData.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/GetPasswordData.java index 4b9f6405c20..96b99cebc7d 100644 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/GetPasswordData.java +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/GetPasswordData.java @@ -1,18 +1,13 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 - package com.example.ec2; // snippet-start:[ec2.java2.get_password.main] -import software.amazon.awssdk.core.exception.SdkClientException; -import software.amazon.awssdk.core.exception.SdkServiceException; import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -import software.amazon.awssdk.services.ec2.model.GetPasswordDataRequest; -import software.amazon.awssdk.services.ec2.model.GetPasswordDataResponse; -import software.amazon.awssdk.services.secretsmanager.model.ResourceNotFoundException; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; +import software.amazon.awssdk.services.ec2.model.*; +import java.util.concurrent.CompletableFuture; /** * Before running this Java V2 code example, set up your development @@ -31,51 +26,53 @@ public static void main(String[] args) { Where: - instanceId - An instance id from which the password is obtained.\s + instanceId - An instance id value that you can obtain from the AWS Management Console.\s """; if (args.length != 1) { System.out.println(usage); - return; + System.exit(1); } - - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) + String instanceId = args[0]; + Ec2AsyncClient ec2AsyncClient = Ec2AsyncClient.builder() + .region(Region.US_EAST_1) .build(); - String instanceId = args[0]; - getPasswordData(ec2,instanceId); + try { + CompletableFuture future = getPasswordDataAsync(ec2AsyncClient, instanceId); + future.join(); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + } } /** - * Retrieves and prints the encrypted administrator password data for a specified EC2 instance. + * Fetches the password data for the specified EC2 instance asynchronously. * - *

The password data is encrypted using the key pair that was specified when the instance was launched. - * To decrypt the password data, you can use the private key of the key pair.

- * - * @param ec2 The {@link Ec2Client} to use for making the request. - * @param instanceId The ID of the instance for which to get the encrypted password data. + * @param ec2AsyncClient the EC2 asynchronous client to use for the request + * @param instanceId instanceId the ID of the EC2 instance for which you want to fetch the password data + * @return a {@link CompletableFuture} that completes when the password data has been fetched + * @throws RuntimeException if there was a failure in fetching the password data */ - public static void getPasswordData(Ec2Client ec2,String instanceId) { + public static CompletableFuture getPasswordDataAsync(Ec2AsyncClient ec2AsyncClient, String instanceId) { GetPasswordDataRequest getPasswordDataRequest = GetPasswordDataRequest.builder() .instanceId(instanceId) .build(); - try { - GetPasswordDataResponse getPasswordDataResponse = ec2.getPasswordData(getPasswordDataRequest); - String encryptedPasswordData = getPasswordDataResponse.passwordData(); - System.out.println("Encrypted Password Data: " + encryptedPasswordData); - } catch (Ec2Exception e) { - String errorCode = e.awsErrorDetails().errorCode(); - if (errorCode.matches("InvalidInstanceID.NotFound")) { - System.err.println("Instance ID not found, unable to retrieve password data."); - } else { - System.err.println("There was a problem retrieving password data. Details:"); - e.printStackTrace(); - } - } + CompletableFuture response = ec2AsyncClient.getPasswordData(getPasswordDataRequest); + response.whenComplete((getPasswordDataResponse, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to get password data for instance: " + instanceId, ex); + } else if (getPasswordDataResponse == null || getPasswordDataResponse.passwordData().isEmpty()) { + throw new RuntimeException("No password data found for instance: " + instanceId); + } else { + String encryptedPasswordData = getPasswordDataResponse.passwordData(); + System.out.println("Encrypted Password Data: " + encryptedPasswordData); + } + }); + + return response.thenApply(resp -> null); } - } +} // snippet-end:[ec2.java2.get_password.main] \ No newline at end of file diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/MonitorInstance.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/MonitorInstance.java index fe3859e0674..b85e4ac5912 100644 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/MonitorInstance.java +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/MonitorInstance.java @@ -3,12 +3,16 @@ package com.example.ec2; -// snippet-start:[ec2.java2.monitor_instance.main] // snippet-start:[ec2.java2.monitor_instance.import] import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; import software.amazon.awssdk.services.ec2.Ec2Client; import software.amazon.awssdk.services.ec2.model.MonitorInstancesRequest; +import software.amazon.awssdk.services.ec2.model.MonitorInstancesResponse; import software.amazon.awssdk.services.ec2.model.UnmonitorInstancesRequest; +import software.amazon.awssdk.services.ec2.model.UnmonitorInstancesResponse; + +import java.util.concurrent.CompletableFuture; // snippet-end:[ec2.java2.monitor_instance.import] /** @@ -39,36 +43,70 @@ public static void main(String[] args) { String instanceId = args[0]; boolean monitor = Boolean.parseBoolean(args[1]); Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); + Ec2AsyncClient ec2AsyncClient = Ec2AsyncClient.builder() + .region(region) + .build(); + CompletableFuture future; if (monitor) { - monitorInstance(ec2, instanceId); + future = monitorInstanceAsync(ec2AsyncClient, instanceId); } else { - unmonitorInstance(ec2, instanceId); + future = unmonitorInstanceAsync(ec2AsyncClient, instanceId); } - ec2.close(); + + future.join(); // Wait for the async operation to complete. } - public static void monitorInstance(Ec2Client ec2, String instanceId) { + // snippet-start:[ec2.java2.monitor_instance.main] + /** + * Monitors an EC2 instance asynchronously. + * + * @param ec2AsyncClient the EC2 asynchronous client used to perform the operation + * @param instanceId the ID of the EC2 instance to be monitored + * @return a {@link CompletableFuture} representing the asynchronous operation of enabling monitoring for the specified instance + */ + public static CompletableFuture monitorInstanceAsync(Ec2AsyncClient ec2AsyncClient, String instanceId) { MonitorInstancesRequest request = MonitorInstancesRequest.builder() - .instanceIds(instanceId) - .build(); + .instanceIds(instanceId) + .build(); - ec2.monitorInstances(request); - System.out.printf("Successfully enabled monitoring for instance %s", instanceId); + CompletableFuture response = ec2AsyncClient.monitorInstances(request); + response.whenComplete((result, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to enable monitoring for instance: " + instanceId, ex); + } else if (result == null || result.instanceMonitorings().isEmpty()) { + throw new RuntimeException("No monitoring information returned for instance: " + instanceId); + } else { + System.out.printf("Successfully enabled monitoring for instance %s%n", instanceId); + } + }); + + return response.thenApply(result -> null); } // snippet-end:[ec2.java2.monitor_instance.main] // snippet-start:[ec2.java2.monitor_instance.stop] - public static void unmonitorInstance(Ec2Client ec2, String instanceId) { + public static CompletableFuture unmonitorInstanceAsync(Ec2AsyncClient ec2AsyncClient, String instanceId) { + // Create the UnmonitorInstancesRequest with the specified instance ID. UnmonitorInstancesRequest request = UnmonitorInstancesRequest.builder() - .instanceIds(instanceId) - .build(); + .instanceIds(instanceId) + .build(); + + CompletableFuture response = ec2AsyncClient.unmonitorInstances(request); + response.whenComplete((result, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to disable monitoring for instance: " + instanceId, ex); + } else if (result == null || result.instanceMonitorings().isEmpty()) { + // Throw an exception if the response is null or monitoring was not disabled. + throw new RuntimeException("No monitoring information returned for instance: " + instanceId); + } else { + // Process the response if no exception occurred and monitoring information is available. + System.out.printf("Successfully disabled monitoring for instance %s%n", instanceId); + } + }); - ec2.unmonitorInstances(request); - System.out.printf("Successfully disabled monitoring for instance %s", instanceId); + // Return CompletableFuture to signify the async operation's completion. + return response.thenApply(result -> null); } // snippet-end:[ec2.java2.monitor_instance.stop] } diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/RebootInstance.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/RebootInstance.java index dda36f7d2c4..01147f464f2 100644 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/RebootInstance.java +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/RebootInstance.java @@ -6,9 +6,10 @@ // snippet-start:[ec2.java2.reboot_instance.main] // snippet-start:[ec2.java2.reboot_instance.import] import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; +import software.amazon.awssdk.services.ec2.model.RebootInstancesResponse; import software.amazon.awssdk.services.ec2.model.RebootInstancesRequest; +import java.util.concurrent.CompletableFuture; // snippet-end:[ec2.java2.reboot_instance.import] /** @@ -36,28 +37,41 @@ public static void main(String[] args) { } String instanceId = args[0]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); + Ec2AsyncClient ec2AsyncClient = Ec2AsyncClient.builder() + .region(Region.US_EAST_1) + .build(); - rebootEC2Instance(ec2, instanceId); - ec2.close(); - } - - public static void rebootEC2Instance(Ec2Client ec2, String instanceId) { try { - RebootInstancesRequest request = RebootInstancesRequest.builder() - .instanceIds(instanceId) - .build(); + CompletableFuture future = rebootEC2InstanceAsync(ec2AsyncClient, instanceId); + future.join(); + System.out.println("Instance rebooted successfully."); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + } + } - ec2.rebootInstances(request); - System.out.printf("Successfully rebooted instance %s", instanceId); + /** + * Reboots an Amazon EC2 instance asynchronously. + * + * @param ec2AsyncClient the EC2 async client to use for the operation + * @param instanceId the ID of the EC2 instance to reboot + * @return a {@link CompletableFuture} that completes when the reboot operation is finished + */ + public static CompletableFuture rebootEC2InstanceAsync(Ec2AsyncClient ec2AsyncClient, String instanceId) { + RebootInstancesRequest request = RebootInstancesRequest.builder() + .instanceIds(instanceId) + .build(); - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } + CompletableFuture response = ec2AsyncClient.rebootInstances(request); + return response.whenComplete((result, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to reboot instance: " + instanceId, ex); + } else if (result == null) { + throw new RuntimeException("No response received for rebooting instance: " + instanceId); + } else { + System.out.printf("Successfully rebooted instance %s%n", instanceId); + } + }).thenApply(result -> null); } } // snippet-end:[ec2.java2.reboot_instance.main] diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/ReleaseAddress.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/ReleaseAddress.java deleted file mode 100644 index b4af5d94c6e..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/ReleaseAddress.java +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.release_instance.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -import software.amazon.awssdk.services.ec2.model.ReleaseAddressRequest; -// snippet-end:[ec2.java2.release_instance.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class ReleaseAddress { - public static void main(String[] args) { - final String usage = """ - - Usage: - - - Where: - allocId - An allocation ID value that you can obtain from the AWS Console.\s - - """; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String allocId = args[0]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - releaseEC2Address(ec2, allocId); - ec2.close(); - } - - public static void releaseEC2Address(Ec2Client ec2, String allocId) { - try { - ReleaseAddressRequest request = ReleaseAddressRequest.builder() - .allocationId(allocId) - .build(); - - ec2.releaseAddress(request); - System.out.printf("Successfully released elastic IP address %s", allocId); - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} - diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/StartStopInstance.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/StartStopInstance.java deleted file mode 100644 index 2fa06f09bd1..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/StartStopInstance.java +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.start_stop_instance.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.StartInstancesRequest; -import software.amazon.awssdk.services.ec2.model.StopInstancesRequest; -// snippet-end:[ec2.java2.start_stop_instance.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class StartStopInstance { - public static void main(String[] args) { - final String usage = """ - - Usage: - - - Where: - instanceId - an instance id value that you can obtain from the AWS Console.\s - - """; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String instanceId = args[0]; - boolean start; - - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - if (args[1].equals("start")) { - start = true; - } else { - start = false; - } - - if (start) { - startInstance(ec2, instanceId); - } else { - stopInstance(ec2, instanceId); - } - ec2.close(); - } - - // snippet-start:[ec2.java2.start_stop_instance.start] - public static void startInstance(Ec2Client ec2, String instanceId) { - StartInstancesRequest request = StartInstancesRequest.builder() - .instanceIds(instanceId) - .build(); - - ec2.startInstances(request); - System.out.printf("Successfully started instance %s", instanceId); - } - // snippet-end:[ec2.java2.start_stop_instance.start] - - // snippet-start:[ec2.java2.start_stop_instance.stop] - public static void stopInstance(Ec2Client ec2, String instanceId) { - StopInstancesRequest request = StopInstancesRequest.builder() - .instanceIds(instanceId) - .build(); - - ec2.stopInstances(request); - System.out.printf("Successfully stopped instance %s", instanceId); - } - // snippet-end:[ec2.java2.start_stop_instance.stop] -} diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/TerminateInstance.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/TerminateInstance.java deleted file mode 100644 index e6cec702815..00000000000 --- a/javav2/example_code/ec2/src/main/java/com/example/ec2/TerminateInstance.java +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.ec2; - -// snippet-start:[ec2.java2.terminate_instance.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.ec2.Ec2Client; -import software.amazon.awssdk.services.ec2.model.TerminateInstancesRequest; -import software.amazon.awssdk.services.ec2.model.TerminateInstancesResponse; -import software.amazon.awssdk.services.ec2.model.InstanceStateChange; -import software.amazon.awssdk.services.ec2.model.Ec2Exception; -import java.util.List; -// snippet-end:[ec2.java2.terminate_instance.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class TerminateInstance { - public static void main(String[] args) { - final String usage = """ - - Usage: - - - Where: - instanceId - An instance id value that you can obtain from the AWS Console.\s - """; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String instanceId = args[0]; - Region region = Region.US_EAST_1; - Ec2Client ec2 = Ec2Client.builder() - .region(region) - .build(); - - terminateEC2(ec2, instanceId); - ec2.close(); - } - - public static void terminateEC2(Ec2Client ec2, String instanceID) { - try { - TerminateInstancesRequest ti = TerminateInstancesRequest.builder() - .instanceIds(instanceID) - .build(); - - TerminateInstancesResponse response = ec2.terminateInstances(ti); - List list = response.terminatingInstances(); - for (InstanceStateChange sc : list) { - System.out.println("The ID of the terminated instance is " + sc.instanceId()); - } - - } catch (Ec2Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/scenario/EC2Actions.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/scenario/EC2Actions.java new file mode 100644 index 00000000000..8c66d6f9854 --- /dev/null +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/scenario/EC2Actions.java @@ -0,0 +1,734 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.ec2.scenario; + +// snippet-start:[ec2.java2.actions.main] +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.ec2.Ec2AsyncClient; +import software.amazon.awssdk.services.ec2.model.AllocateAddressRequest; +import software.amazon.awssdk.services.ec2.model.AllocateAddressResponse; +import software.amazon.awssdk.services.ec2.model.AssociateAddressRequest; +import software.amazon.awssdk.services.ec2.model.AssociateAddressResponse; +import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressRequest; +import software.amazon.awssdk.services.ec2.model.CreateKeyPairRequest; +import software.amazon.awssdk.services.ec2.model.CreateKeyPairResponse; +import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupRequest; +import software.amazon.awssdk.services.ec2.model.DeleteKeyPairRequest; +import software.amazon.awssdk.services.ec2.model.DeleteKeyPairResponse; +import software.amazon.awssdk.services.ec2.model.DeleteSecurityGroupRequest; +import software.amazon.awssdk.services.ec2.model.DeleteSecurityGroupResponse; +import software.amazon.awssdk.services.ec2.model.DescribeImagesRequest; +import software.amazon.awssdk.services.ec2.model.DescribeInstanceTypesRequest; +import software.amazon.awssdk.services.ec2.model.DescribeInstanceTypesResponse; +import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest; +import software.amazon.awssdk.services.ec2.model.DescribeKeyPairsResponse; +import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsRequest; +import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsResponse; +import software.amazon.awssdk.services.ec2.model.DescribeVpcsRequest; +import software.amazon.awssdk.services.ec2.model.DisassociateAddressRequest; +import software.amazon.awssdk.services.ec2.model.DisassociateAddressResponse; +import software.amazon.awssdk.services.ec2.model.DomainType; +import software.amazon.awssdk.services.ec2.model.Ec2Exception; +import software.amazon.awssdk.services.ec2.model.Filter; +import software.amazon.awssdk.services.ec2.model.InstanceTypeInfo; +import software.amazon.awssdk.services.ec2.model.IpPermission; +import software.amazon.awssdk.services.ec2.model.IpRange; +import software.amazon.awssdk.services.ec2.model.ReleaseAddressRequest; +import software.amazon.awssdk.services.ec2.model.ReleaseAddressResponse; +import software.amazon.awssdk.services.ec2.model.RunInstancesRequest; +import software.amazon.awssdk.services.ec2.model.RunInstancesResponse; +import software.amazon.awssdk.services.ec2.model.StopInstancesRequest; +import software.amazon.awssdk.services.ec2.model.StartInstancesRequest; +import software.amazon.awssdk.services.ec2.model.TerminateInstancesRequest; +import software.amazon.awssdk.services.ec2.model.Vpc; +import software.amazon.awssdk.services.ec2.paginators.DescribeImagesPublisher; +import software.amazon.awssdk.services.ec2.paginators.DescribeInstancesPublisher; +import software.amazon.awssdk.services.ec2.paginators.DescribeSecurityGroupsPublisher; +import software.amazon.awssdk.services.ec2.paginators.DescribeVpcsPublisher; +import software.amazon.awssdk.services.ec2.waiters.Ec2AsyncWaiter; +import software.amazon.awssdk.services.ssm.SsmAsyncClient; +import software.amazon.awssdk.services.ssm.model.GetParametersByPathRequest; +import software.amazon.awssdk.services.ssm.model.GetParametersByPathResponse; +import software.amazon.awssdk.services.ec2.model.TerminateInstancesResponse; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.time.Duration; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.concurrent.atomic.AtomicReference; + +public class EC2Actions { + private static final Logger logger = LoggerFactory.getLogger(EC2Actions.class); + private static Ec2AsyncClient ec2AsyncClient; + + /** + * Retrieves an asynchronous Amazon Elastic Container Registry (ECR) client. + * + * @return the configured ECR asynchronous client. + */ + private static Ec2AsyncClient getAsyncClient() { + if (ec2AsyncClient == null) { + /* + The `NettyNioAsyncHttpClient` class is part of the AWS SDK for Java, version 2, + and it is designed to provide a high-performance, asynchronous HTTP client for interacting with AWS services. + It uses the Netty framework to handle the underlying network communication and the Java NIO API to + provide a non-blocking, event-driven approach to HTTP requests and responses. + */ + SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() + .maxConcurrency(50) // Adjust as needed. + .connectionTimeout(Duration.ofSeconds(60)) // Set the connection timeout. + .readTimeout(Duration.ofSeconds(60)) // Set the read timeout. + .writeTimeout(Duration.ofSeconds(60)) // Set the write timeout. + .build(); + + ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() + .apiCallTimeout(Duration.ofMinutes(2)) // Set the overall API call timeout. + .apiCallAttemptTimeout(Duration.ofSeconds(90)) // Set the individual call attempt timeout. + .build(); + + ec2AsyncClient = Ec2AsyncClient.builder() + .region(Region.US_EAST_1) + .httpClient(httpClient) + .overrideConfiguration(overrideConfig) + .build(); + } + return ec2AsyncClient; + } + + // snippet-start:[ec2.java2.delete_key_pair.main] + /** + * Deletes a key pair asynchronously. + * + * @param keyPair the name of the key pair to delete + * @return a {@link CompletableFuture} that represents the result of the asynchronous operation. + * The {@link CompletableFuture} will complete with a {@link DeleteKeyPairResponse} object + * that provides the result of the key pair deletion operation. + */ + public CompletableFuture deleteKeysAsync(String keyPair) { + DeleteKeyPairRequest request = DeleteKeyPairRequest.builder() + .keyName(keyPair) + .build(); + + // Initiate the asynchronous request to delete the key pair. + CompletableFuture response = getAsyncClient().deleteKeyPair(request); + return response.whenComplete((resp, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to delete key pair: " + keyPair, ex); + } else if (resp == null) { + throw new RuntimeException("No response received for deleting key pair: " + keyPair); + } + }); + } + // snippet-end:[ec2.java2.delete_key_pair.main] + + // snippet-start:[ec2.java2.delete_security_group.main] + /** + * Deletes an EC2 security group asynchronously. + * + * @param groupId the ID of the security group to delete + * @return a CompletableFuture that completes when the security group is deleted + */ + public CompletableFuture deleteEC2SecGroupAsync(String groupId) { + DeleteSecurityGroupRequest request = DeleteSecurityGroupRequest.builder() + .groupId(groupId) + .build(); + + CompletableFuture response = getAsyncClient().deleteSecurityGroup(request); + return response.whenComplete((resp, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to delete security group with Id " + groupId, ex); + } else if (resp == null) { + throw new RuntimeException("No response received for deleting security group with Id " + groupId); + } + }).thenApply(resp -> null); + } + // snippet-end:[ec2.java2.delete_security_group.main] + + // snippet-start:[ec2.java2.terminate_instance] + /** + * Terminates an EC2 instance asynchronously and waits for it to reach the terminated state. + * + * @param instanceId the ID of the EC2 instance to terminate + * @return a {@link CompletableFuture} that completes when the instance has been terminated + * @throws RuntimeException if there is no response from the AWS SDK or if there is a failure during the termination process + */ + public CompletableFuture terminateEC2Async(String instanceId) { + TerminateInstancesRequest terminateRequest = TerminateInstancesRequest.builder() + .instanceIds(instanceId) + .build(); + + CompletableFuture responseFuture = getAsyncClient().terminateInstances(terminateRequest); + return responseFuture.thenCompose(terminateResponse -> { + if (terminateResponse == null) { + throw new RuntimeException("No response received for terminating instance " + instanceId); + } + System.out.println("Going to terminate an EC2 instance and use a waiter to wait for it to be in terminated state"); + return getAsyncClient().waiter() + .waitUntilInstanceTerminated(r -> r.instanceIds(instanceId)) + .thenApply(waiterResponse -> null); + }).exceptionally(throwable -> { + // Handle any exceptions that occurred during the async call + throw new RuntimeException("Failed to terminate EC2 instance: " + throwable.getMessage(), throwable); + }); + } + // snippet-end:[ec2.java2.terminate_instance] + + // snippet-start:[ec2.java2.release_instance.main] + /** + * Releases an Elastic IP address asynchronously. + * + * @param allocId the allocation ID of the Elastic IP address to be released + * @return a {@link CompletableFuture} representing the asynchronous operation of releasing the Elastic IP address + */ + public CompletableFuture releaseEC2AddressAsync(String allocId) { + ReleaseAddressRequest request = ReleaseAddressRequest.builder() + .allocationId(allocId) + .build(); + + CompletableFuture response = getAsyncClient().releaseAddress(request); + response.whenComplete((resp, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to release Elastic IP address", ex); + } + }); + + return response; + } + // snippet-end:[ec2.java2.release_instance.main] + + // snippet-start:[ec2.java2.scenario.disassociate_address.main] + /** + * Disassociates an Elastic IP address from an instance asynchronously. + * + * @param associationId The ID of the association you want to disassociate. + * @return a {@link CompletableFuture} representing the asynchronous operation of disassociating the address. The + * {@link CompletableFuture} will complete with a {@link DisassociateAddressResponse} when the operation is + * finished. + * @throws RuntimeException if the disassociation of the address fails. + */ + public CompletableFuture disassociateAddressAsync(String associationId) { + Ec2AsyncClient ec2 = getAsyncClient(); + DisassociateAddressRequest addressRequest = DisassociateAddressRequest.builder() + .associationId(associationId) + .build(); + + // Disassociate the address asynchronously. + CompletableFuture response = ec2.disassociateAddress(addressRequest); + response.whenComplete((resp, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to disassociate address", ex); + } + }); + + return response; + } + // snippet-end:[ec2.java2.scenario.disassociate_address.main] + + // snippet-start:[ec2.java2.associate_address.main] + /** + * Associates an Elastic IP address with an EC2 instance asynchronously. + * + * @param instanceId the ID of the EC2 instance to associate the Elastic IP address with + * @param allocationId the allocation ID of the Elastic IP address to associate + * @return a {@link CompletableFuture} that completes with the association ID when the operation is successful, + * or throws a {@link RuntimeException} if the operation fails + */ + public CompletableFuture associateAddressAsync(String instanceId, String allocationId) { + AssociateAddressRequest associateRequest = AssociateAddressRequest.builder() + .instanceId(instanceId) + .allocationId(allocationId) + .build(); + + CompletableFuture responseFuture = getAsyncClient().associateAddress(associateRequest); + return responseFuture.thenApply(response -> { + if (response.associationId() != null) { + return response.associationId(); + } else { + throw new RuntimeException("Association ID is null after associating address."); + } + }).whenComplete((result, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to associate address", ex); + } + }); + } + // snippet-end:[ec2.java2.associate_address.main] + + // snippet-start:[ec2.java2.allocate_address.main] + /** + * Allocates an Elastic IP address asynchronously in the VPC domain. + * + * @return a {@link CompletableFuture} containing the allocation ID of the allocated Elastic IP address + */ + public CompletableFuture allocateAddressAsync() { + AllocateAddressRequest allocateRequest = AllocateAddressRequest.builder() + .domain(DomainType.VPC) + .build(); + + CompletableFuture responseFuture = getAsyncClient().allocateAddress(allocateRequest); + return responseFuture.thenApply(AllocateAddressResponse::allocationId).whenComplete((result, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to allocate address", ex); + } + }); + } + // snippet-end:[ec2.java2.allocate_address.main] + + // snippet-start:[ec2.java2.scenario.describe_instance.main] + /** + * Asynchronously describes the state of an EC2 instance. + * The paginator helps you iterate over multiple pages of results. + * + * @param newInstanceId the ID of the EC2 instance to describe + * @return a {@link CompletableFuture} that, when completed, contains a string describing the state of the EC2 instance + */ + public CompletableFuture describeEC2InstancesAsync(String newInstanceId) { + DescribeInstancesRequest request = DescribeInstancesRequest.builder() + .instanceIds(newInstanceId) + .build(); + + DescribeInstancesPublisher paginator = getAsyncClient().describeInstancesPaginator(request); + AtomicReference publicIpAddressRef = new AtomicReference<>(); + return paginator.subscribe(response -> { + response.reservations().stream() + .flatMap(reservation -> reservation.instances().stream()) + .filter(instance -> instance.instanceId().equals(newInstanceId)) + .findFirst() + .ifPresent(instance -> publicIpAddressRef.set(instance.publicIpAddress())); + }).thenApply(v -> { + String publicIpAddress = publicIpAddressRef.get(); + if (publicIpAddress == null) { + throw new RuntimeException("Instance with ID " + newInstanceId + " not found."); + } + return publicIpAddress; + }).exceptionally(ex -> { + logger.info("Failed to describe instances: " + ex.getMessage()); + throw new RuntimeException("Failed to describe instances", ex); + }); + } + // snippet-end:[ec2.java2.scenario.describe_instance.main] + + // snippet-start:[ec2.java2.create_instance.main] + /** + * Runs an EC2 instance asynchronously. + * + * @param instanceType The instance type to use for the EC2 instance. + * @param keyName The name of the key pair to associate with the EC2 instance. + * @param groupName The name of the security group to associate with the EC2 instance. + * @param amiId The ID of the Amazon Machine Image (AMI) to use for the EC2 instance. + * @return A {@link CompletableFuture} that completes with the ID of the started EC2 instance. + * @throws RuntimeException If there is an error running the EC2 instance. + */ + public CompletableFuture runInstanceAsync(String instanceType, String keyName, String groupName, String amiId) { + RunInstancesRequest runRequest = RunInstancesRequest.builder() + .instanceType(instanceType) + .keyName(keyName) + .securityGroups(groupName) + .maxCount(1) + .minCount(1) + .imageId(amiId) + .build(); + + CompletableFuture responseFuture = getAsyncClient().runInstances(runRequest); + return responseFuture.thenCompose(response -> { + String instanceIdVal = response.instances().get(0).instanceId(); + System.out.println("Going to start an EC2 instance and use a waiter to wait for it to be in running state"); + return getAsyncClient().waiter() + .waitUntilInstanceExists(r -> r.instanceIds(instanceIdVal)) + .thenCompose(waitResponse -> getAsyncClient().waiter() + .waitUntilInstanceRunning(r -> r.instanceIds(instanceIdVal)) + .thenApply(runningResponse -> instanceIdVal)); + }).exceptionally(throwable -> { + // Handle any exceptions that occurred during the async call + throw new RuntimeException("Failed to run EC2 instance: " + throwable.getMessage(), throwable); + }); + } + // snippet-end:[ec2.java2.create_instance.main] + + // snippet-start:[ec2.java2.scenario.describe_instance.type.main] + /** + * Asynchronously retrieves the instance types available in the current AWS region. + *

+ * This method uses the AWS SDK's asynchronous API to fetch the available instance types + * and then processes the response. It logs the memory information, network information, + * and instance type for each instance type returned. Additionally, it returns a + * {@link CompletableFuture} that resolves to the instance type string for the "t2.2xlarge" + * instance type, if it is found in the response. If the "t2.2xlarge" instance type is not + * found, an empty string is returned. + *

+ * + * @return a {@link CompletableFuture} that resolves to the instance type string for the + * "t2.2xlarge" instance type, or an empty string if the instance type is not found + */ + public CompletableFuture getInstanceTypesAsync() { + DescribeInstanceTypesRequest typesRequest = DescribeInstanceTypesRequest.builder() + .maxResults(10) + .build(); + + CompletableFuture response = getAsyncClient().describeInstanceTypes(typesRequest); + response.whenComplete((resp, ex) -> { + if (resp != null) { + List instanceTypes = resp.instanceTypes(); + for (InstanceTypeInfo type : instanceTypes) { + logger.info("The memory information of this type is " + type.memoryInfo().sizeInMiB()); + logger.info("Network information is " + type.networkInfo().toString()); + logger.info("Instance type is " + type.instanceType().toString()); + } + } else { + throw (RuntimeException) ex; + } + }); + + return response.thenApply(resp -> { + for (InstanceTypeInfo type : resp.instanceTypes()) { + String instanceType = type.instanceType().toString(); + if (instanceType.equals("t2.2xlarge")) { + return instanceType; + } + } + return ""; + }); + } + // snippet-end:[ec2.java2.scenario.describe_instance.type.main] + + // snippet-start:[ec2.java2.describe_instances.main] + /** + * Asynchronously describes an AWS EC2 image with the specified image ID. + * + * @param imageId the ID of the image to be described + * @return a {@link CompletableFuture} that, when completed, contains the ID of the described image + * @throws RuntimeException if no images are found with the provided image ID, or if an error occurs during the AWS API call + */ + public CompletableFuture describeImageAsync(String imageId) { + DescribeImagesRequest imagesRequest = DescribeImagesRequest.builder() + .imageIds(imageId) + .build(); + + AtomicReference imageIdRef = new AtomicReference<>(); + DescribeImagesPublisher paginator = getAsyncClient().describeImagesPaginator(imagesRequest); + return paginator.subscribe(response -> { + response.images().stream() + .filter(image -> image.imageId().equals(imageId)) + .findFirst() + .ifPresent(image -> { + logger.info("The description of the image is " + image.description()); + logger.info("The name of the image is " + image.name()); + imageIdRef.set(image.imageId()); + }); + }).thenApply(v -> { + String id = imageIdRef.get(); + if (id == null) { + throw new RuntimeException("No images found with the provided image ID."); + } + return id; + }).exceptionally(ex -> { + logger.info("Failed to describe image: " + ex.getMessage()); + throw new RuntimeException("Failed to describe image", ex); + }); + } + // snippet-end:[ec2.java2.describe_instances.main] + + /** + * Retrieves the parameter values asynchronously using the AWS Systems Manager (SSM) API. + * + * @return a {@link CompletableFuture} that holds the response from the SSM API call to get parameters by path + */ + public CompletableFuture getParaValuesAsync() { + SsmAsyncClient ssmClient = SsmAsyncClient.builder() + .region(Region.US_EAST_1) + .build(); + + GetParametersByPathRequest parameterRequest = GetParametersByPathRequest.builder() + .path("/aws/service/ami-amazon-linux-latest") + .build(); + + // Create a CompletableFuture to hold the final result. + CompletableFuture responseFuture = new CompletableFuture<>(); + ssmClient.getParametersByPath(parameterRequest) + .whenComplete((response, exception) -> { + if (exception != null) { + responseFuture.completeExceptionally(new RuntimeException("Failed to get parameters by path", exception)); + } else { + responseFuture.complete(response); + } + }); + + return responseFuture; + } + // snippet-start:[ec2.java2.describe_security_groups.main] + + // snippet-start:[ec2.java2.scenario.describe_securitygroup.main] + + /** + * Asynchronously describes the security groups for the specified group ID. + * + * @param groupName the name of the security group to describe + * @return a {@link CompletableFuture} that represents the asynchronous operation + * of describing the security groups. The future will complete with a + * {@link DescribeSecurityGroupsResponse} object that contains the + * security group information. + */ + public CompletableFuture describeSecurityGroupArnByNameAsync(String groupName) { + DescribeSecurityGroupsRequest request = DescribeSecurityGroupsRequest.builder() + .groupNames(groupName) + .build(); + + DescribeSecurityGroupsPublisher paginator = getAsyncClient().describeSecurityGroupsPaginator(request); + AtomicReference groupIdRef = new AtomicReference<>(); + return paginator.subscribe(response -> { + response.securityGroups().stream() + .filter(securityGroup -> securityGroup.groupName().equals(groupName)) + .findFirst() + .ifPresent(securityGroup -> groupIdRef.set(securityGroup.groupId())); + }).thenApply(v -> { + String groupId = groupIdRef.get(); + if (groupId == null) { + throw new RuntimeException("No security group found with the name: " + groupName); + } + return groupId; + }).exceptionally(ex -> { + logger.info("Failed to describe security group: " + ex.getMessage()); + throw new RuntimeException("Failed to describe security group", ex); + }); + } + // snippet-end:[ec2.java2.scenario.describe_securitygroup.main] + // snippet-end:[ec2.java2.describe_security_groups.main] + + // snippet-start:[ec2.java2.create_security_group.main] + /** + * Creates a new security group asynchronously with the specified group name, description, and VPC ID. It also + * authorizes inbound traffic on ports 80 and 22 from the specified IP address. + * + * @param groupName the name of the security group to create + * @param groupDesc the description of the security group + * @param vpcId the ID of the VPC in which to create the security group + * @param myIpAddress the IP address from which to allow inbound traffic (e.g., "192.168.1.1/0" to allow traffic from + * any IP address in the 192.168.1.0/24 subnet) + * @return a CompletableFuture that, when completed, returns the ID of the created security group + * @throws RuntimeException if there was a failure creating the security group or authorizing the inbound traffic + */ + public CompletableFuture createSecurityGroupAsync(String groupName, String groupDesc, String vpcId, String myIpAddress) { + CreateSecurityGroupRequest createRequest = CreateSecurityGroupRequest.builder() + .groupName(groupName) + .description(groupDesc) + .vpcId(vpcId) + .build(); + + return getAsyncClient().createSecurityGroup(createRequest) + .thenCompose(createResponse -> { + String groupId = createResponse.groupId(); + IpRange ipRange = IpRange.builder() + .cidrIp(myIpAddress + "/32") + .build(); + + IpPermission ipPerm = IpPermission.builder() + .ipProtocol("tcp") + .toPort(80) + .fromPort(80) + .ipRanges(ipRange) + .build(); + + IpPermission ipPerm2 = IpPermission.builder() + .ipProtocol("tcp") + .toPort(22) + .fromPort(22) + .ipRanges(ipRange) + .build(); + + AuthorizeSecurityGroupIngressRequest authRequest = AuthorizeSecurityGroupIngressRequest.builder() + .groupName(groupName) + .ipPermissions(ipPerm, ipPerm2) + .build(); + + return getAsyncClient().authorizeSecurityGroupIngress(authRequest) + .thenApply(authResponse -> groupId); + }) + .whenComplete((result, exception) -> { + if (exception != null) { + if (exception instanceof CompletionException && exception.getCause() instanceof Ec2Exception) { + throw (Ec2Exception) exception.getCause(); + } else { + throw new RuntimeException("Failed to create security group: " + exception.getMessage(), exception); + } + } + }); + } + // snippet-end:[ec2.java2.create_security_group.main] + + // snippet-start:[ec2.java2.describe_key_pairs.main] + /** + * Asynchronously describes the key pairs associated with the current AWS account. + * + * @return a {@link CompletableFuture} containing the {@link DescribeKeyPairsResponse} object, which provides + * information about the key pairs. + */ + public CompletableFuture describeKeysAsync() { + CompletableFuture responseFuture = getAsyncClient().describeKeyPairs(); + responseFuture.whenComplete((response, exception) -> { + if (exception != null) { + throw new RuntimeException("Failed to describe key pairs: " + exception.getMessage(), exception); + } + }); + + return responseFuture; + } + // snippet-end:[ec2.java2.describe_key_pairs.main] + + // snippet-start:[ec2.java2.create_key_pair.main] + /** + * Creates a new key pair asynchronously. + * + * @param keyName the name of the key pair to create + * @param fileName the name of the file to write the key material to + * @return a {@link CompletableFuture} that represents the asynchronous operation + * of creating the key pair and writing the key material to a file + */ + public CompletableFuture createKeyPairAsync(String keyName, String fileName) { + CreateKeyPairRequest request = CreateKeyPairRequest.builder() + .keyName(keyName) + .build(); + + CompletableFuture responseFuture = getAsyncClient().createKeyPair(request); + responseFuture.whenComplete((response, exception) -> { + if (response != null) { + try { + BufferedWriter writer = new BufferedWriter(new FileWriter(fileName)); + writer.write(response.keyMaterial()); + writer.close(); + } catch (IOException e) { + throw new RuntimeException("Failed to write key material to file: " + e.getMessage(), e); + } + } else { + throw new RuntimeException("Failed to create key pair: " + exception.getMessage(), exception); + } + }); + + return responseFuture; + } + // snippet-end:[ec2.java2.create_key_pair.main] + + // snippet-start:[ec2.java2.describe_vpc.main] + /** + * Describes the first default VPC asynchronously and using a paginator. + * + * @return a {@link CompletableFuture} that, when completed, contains the first default VPC found.\ + */ + public CompletableFuture describeFirstEC2VpcAsync() { + Filter myFilter = Filter.builder() + .name("is-default") + .values("true") + .build(); + + DescribeVpcsRequest request = DescribeVpcsRequest.builder() + .filters(myFilter) + .build(); + + DescribeVpcsPublisher paginator = getAsyncClient().describeVpcsPaginator(request); + AtomicReference vpcRef = new AtomicReference<>(); + return paginator.subscribe(response -> { + response.vpcs().stream() + .findFirst() + .ifPresent(vpcRef::set); + }).thenApply(v -> { + Vpc vpc = vpcRef.get(); + if (vpc == null) { + throw new RuntimeException("Default VPC not found"); + } + return vpc; + }).exceptionally(ex -> { + logger.info("Failed to describe VPCs: " + ex.getMessage()); + throw new RuntimeException("Failed to describe VPCs", ex); + }); + } + // snippet-end:[ec2.java2.describe_vpc.main] + + // snippet-start:[ec2.java2.stop.instance.main] + /** + * Stops the EC2 instance with the specified ID asynchronously and waits for the instance to stop. + * + * @param instanceId the ID of the EC2 instance to stop + * @return a {@link CompletableFuture} that completes when the instance has been stopped, or exceptionally if an error occurs + */ + public CompletableFuture stopInstanceAsync(String instanceId) { + StopInstancesRequest stopRequest = StopInstancesRequest.builder() + .instanceIds(instanceId) + .build(); + + DescribeInstancesRequest describeRequest = DescribeInstancesRequest.builder() + .instanceIds(instanceId) + .build(); + + Ec2AsyncWaiter ec2Waiter = Ec2AsyncWaiter.builder() + .client(getAsyncClient()) + .build(); + + CompletableFuture resultFuture = new CompletableFuture<>(); + logger.info("Stopping instance " + instanceId + " and waiting for it to stop."); + getAsyncClient().stopInstances(stopRequest) + .thenCompose(response -> { + if (response.stoppingInstances().isEmpty()) { + return CompletableFuture.failedFuture(new RuntimeException("No instances were stopped. Please check the instance ID: " + instanceId)); + } + return ec2Waiter.waitUntilInstanceStopped(describeRequest); + }) + .thenAccept(waiterResponse -> { + logger.info("Successfully stopped instance " + instanceId); + resultFuture.complete(null); + }) + .exceptionally(throwable -> { + logger.error("Failed to stop instance " + instanceId + ": " + throwable.getMessage(), throwable); + resultFuture.completeExceptionally(new RuntimeException("Failed to stop instance: " + throwable.getMessage(), throwable)); + return null; + }); + + return resultFuture; + } + // snippet-end:[ec2.java2.stop.instance.main] + + // snippet-start:[ec2.java2.start_instance.main] + /** + * Starts an Amazon EC2 instance asynchronously and waits until it is in the "running" state. + * + * @param instanceId the ID of the instance to start + * @return a {@link CompletableFuture} that completes when the instance has been started and is in the "running" state, or exceptionally if an error occurs + */ + public CompletableFuture startInstanceAsync(String instanceId) { + StartInstancesRequest startRequest = StartInstancesRequest.builder() + .instanceIds(instanceId) + .build(); + + Ec2AsyncWaiter ec2Waiter = Ec2AsyncWaiter.builder() + .client(getAsyncClient()) + .build(); + + DescribeInstancesRequest describeRequest = DescribeInstancesRequest.builder() + .instanceIds(instanceId) + .build(); + + logger.info("Starting instance " + instanceId + " and waiting for it to run."); + CompletableFuture resultFuture = new CompletableFuture<>(); + return getAsyncClient().startInstances(startRequest) + .thenCompose(response -> + ec2Waiter.waitUntilInstanceRunning(describeRequest) + ) + .thenAccept(waiterResponse -> { + logger.info("Successfully started instance " + instanceId); + resultFuture.complete(null); + }) + .exceptionally(throwable -> { + resultFuture.completeExceptionally(new RuntimeException("Failed to start instance: " + throwable.getMessage(), throwable)); + return null; + }); + } + // snippet-end:[ec2.java2.start_instance.main] + +} +// snippet-end:[ec2.java2.actions.main] \ No newline at end of file diff --git a/javav2/example_code/ec2/src/main/java/com/example/ec2/scenario/EC2Scenario.java b/javav2/example_code/ec2/src/main/java/com/example/ec2/scenario/EC2Scenario.java new file mode 100644 index 00000000000..8aa8b10a3e6 --- /dev/null +++ b/javav2/example_code/ec2/src/main/java/com/example/ec2/scenario/EC2Scenario.java @@ -0,0 +1,601 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.ec2.scenario; + +// snippet-start:[ec2.java2.scenario.main] +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.services.ec2.model.CreateKeyPairResponse; +import software.amazon.awssdk.services.ec2.model.DeleteKeyPairResponse; +import software.amazon.awssdk.services.ec2.model.DescribeKeyPairsResponse; +import software.amazon.awssdk.services.ec2.model.DisassociateAddressResponse; +import software.amazon.awssdk.services.ec2.model.Ec2Exception; +import software.amazon.awssdk.services.ec2.model.ReleaseAddressResponse; +import software.amazon.awssdk.services.ssm.model.GetParametersByPathResponse; +import software.amazon.awssdk.services.ssm.model.Parameter; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.List; +import java.util.Scanner; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; + +/** + * Before running this Java (v2) code example, set up your development + * environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html + * + * This Java example performs the following tasks: + * + * 1. Creates an RSA key pair and saves the private key data as a .pem file. + * 2. Lists key pairs. + * 3. Creates a security group for the default VPC. + * 4. Displays security group information. + * 5. Gets a list of Amazon Linux 2 AMIs and selects one. + * 6. Gets additional information about the image. + * 7. Gets a list of instance types that are compatible with the selected AMI’s + * architecture. + * 8. Creates an instance with the key pair, security group, AMI, and an + * instance type. + * 9. Displays information about the instance. + * 10. Stops the instance and waits for it to stop. + * 11. Starts the instance and waits for it to start. + * 12. Allocates an Elastic IP address and associates it with the instance. + * 13. Displays SSH connection info for the instance. + * 14. Disassociates and deletes the Elastic IP address. + * 15. Terminates the instance and waits for it to terminate. + * 16. Deletes the security group. + * 17. Deletes the key pair. + */ +public class EC2Scenario { + + public static final String DASHES = new String(new char[80]).replace("\0", "-"); + private static final Logger logger = LoggerFactory.getLogger(EC2Scenario.class); + public static void main(String[] args) throws InterruptedException, UnknownHostException { + + logger.info(""" + Usage: + + + Where: + keyName - A key pair name (for example, TestKeyPair).\s + fileName - A file name where the key information is written to.\s + groupName - The name of the security group.\s + groupDesc - The description of the security group.\s + """); + + Scanner scanner = new Scanner(System.in); + EC2Actions ec2Actions = new EC2Actions(); + + String keyName = "TestKeyPair7" ; + String fileName = "ec2Key.pem"; + String groupName = "TestSecGroup7" ; + String groupDesc = "Test Group" ; + String vpcId = ec2Actions.describeFirstEC2VpcAsync().join().vpcId(); + InetAddress localAddress = InetAddress.getLocalHost(); + String myIpAddress = localAddress.getHostAddress(); + + logger.info(""" + Amazon Elastic Compute Cloud (EC2) is a web service that provides secure, resizable compute + capacity in the cloud. It allows developers and organizations to easily launch and manage + virtual server instances, known as EC2 instances, to run their applications. + + EC2 provides a wide range of instance types, each with different compute, memory, + and storage capabilities, to meet the diverse needs of various workloads. Developers + can choose the appropriate instance type based on their application's requirements, + such as high-performance computing, memory-intensive tasks, or GPU-accelerated workloads. + + The `Ec2AsyncClient` interface in the AWS SDK for Java 2.x provides a set of methods to + programmatically interact with the Amazon EC2 service. This allows developers to + automate the provisioning, management, and monitoring of EC2 instances as part of their + application deployment pipelines. With EC2, teams can focus on building and deploying + their applications without having to worry about the underlying infrastructure + required to host and manage physical servers. + + This scenario walks you through how to perform key operations for this service. + Let's get started... + """); + + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("1. Create an RSA key pair and save the private key material as a .pem file."); + logger.info(""" + An RSA key pair for Amazon EC2 is a security mechanism used to authenticate and secure + access to your EC2 instances. It consists of a public key and a private key, + which are generated as a pair. + """); + waitForInputToContinue(scanner); + try { + CompletableFuture future = ec2Actions.createKeyPairAsync(keyName, fileName); + CreateKeyPairResponse response = future.join(); + logger.info("Key Pair successfully created. Key Fingerprint: " + response.keyFingerprint()); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + if (ec2Ex.getMessage().contains("already exists")) { + // Key pair already exists. + logger.info("The key pair '" + keyName + "' already exists. Moving on..."); + } else { + logger.info("EC2 error occurred: Error message: {}, Error code {}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } + } else { + logger.info("An unexpected error occurred: " + (rt.getMessage())); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("2. List key pairs."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = ec2Actions.describeKeysAsync(); + DescribeKeyPairsResponse keyPairsResponse = future.join(); + keyPairsResponse.keyPairs().forEach(keyPair -> logger.info( + "Found key pair with name {} and fingerprint {}", + keyPair.keyName(), + keyPair.keyFingerprint())); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + logger.info("EC2 error occurred: Error message: {}, Error code {}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", (cause != null ? cause.getMessage() : rt.getMessage())); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("3. Create a security group."); + logger.info(""" + An AWS EC2 Security Group is a virtual firewall that controls the + inbound and outbound traffic to an EC2 instance. It acts as a first line + of defense for your EC2 instances, allowing you to specify the rules that + govern the network traffic entering and leaving your instances. + """); + waitForInputToContinue(scanner); + String groupId = ""; + try { + CompletableFuture future = ec2Actions.createSecurityGroupAsync(groupName, groupDesc, vpcId, myIpAddress); + future.join(); + logger.info("Created security group") ; + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + if (ec2Ex.awsErrorDetails().errorMessage().contains("already exists")) { + logger.info("The Security Group already exists. Moving on..."); + } else { + logger.error("An unexpected error occurred: {}", ec2Ex.awsErrorDetails().errorMessage()); + return; + } + } else { + logger.error("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("4. Display security group information for the new security group."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = ec2Actions.describeSecurityGroupArnByNameAsync(groupName); + groupId = future.join(); + logger.info("The security group Id is "+groupId); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + String errorCode = ec2Ex.awsErrorDetails().errorCode(); + if ("InvalidGroup.NotFound".equals(errorCode)) { + logger.info("Security group '{}' does not exist. Error Code: {}", groupName, errorCode); + } else { + logger.info("EC2 error occurred: Message {}, Error Code: {}", ec2Ex.getMessage(), errorCode); + } + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("5. Get a list of Amazon Linux 2 AMIs and select one with amzn2 in the name."); + logger.info(""" + An Amazon EC2 AMI (Amazon Machine Image) is a pre-configured virtual machine image that + serves as a template for launching EC2 instances. It contains all the necessary software and + configurations required to run an application or operating system on an EC2 instance. + """); + waitForInputToContinue(scanner); + String instanceAMI=""; + try { + CompletableFuture future = ec2Actions.getParaValuesAsync(); + GetParametersByPathResponse pathResponse = future.join(); + List parameterList = pathResponse.parameters(); + for (Parameter para : parameterList) { + if (filterName(para.name())) { + instanceAMI = para.value(); + break; + } + } + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + logger.info("The AMI value with amzn2 is: {}", instanceAMI); + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("6. Get the (Amazon Machine Image) AMI value from the amzn2 image."); + logger.info(""" + An AMI value represents a specific version of a virtual machine (VM) or server image. + It uniquely identifies a particular version of an EC2 instance, including its operating system, + pre-installed software, and any custom configurations. This allows you to consistently deploy the same + VM image across your infrastructure. + + """); + waitForInputToContinue(scanner); + String amiValue; + try { + CompletableFuture future = ec2Actions.describeImageAsync(instanceAMI); + amiValue = future.join(); + + } catch (CompletionException ce) { + Throwable cause = ce.getCause(); + if (cause instanceof Ec2Exception) { + Ec2Exception ec2Ex = (Ec2Exception) cause; + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("7. Retrieves an instance type available in the current AWS region."); + waitForInputToContinue(scanner); + String instanceType; + try { + CompletableFuture future = ec2Actions.getInstanceTypesAsync(); + instanceType = future.join(); + if (!instanceType.isEmpty()) { + logger.info("Found instance type: " + instanceType); + } else { + logger.info("Desired instance type not found."); + } + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("8. Create an Amazon EC2 instance using the key pair, the instance type, the security group, and the EC2 AMI value."); + logger.info("Once the EC2 instance is created, it is placed into a running state."); + waitForInputToContinue(scanner); + String newInstanceId; + try { + CompletableFuture future = ec2Actions.runInstanceAsync(instanceType, keyName, groupName, amiValue); + newInstanceId = future.join(); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception) { + Ec2Exception ec2Ex = (Ec2Exception) cause; + switch (ec2Ex.awsErrorDetails().errorCode()) { + case "InvalidParameterValue": + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + break; + case "InsufficientInstanceCapacity": + // Handle insufficient instance capacity. + logger.info("Insufficient instance capacity: {}, {}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + break; + case "InvalidGroup.NotFound": + // Handle security group not found. + logger.info("Security group not found: {},{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + break; + default: + logger.info("EC2 error occurred: {} (Code: {}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + break; + } + return; + } else { + logger.info("An unexpected error occurred: {}", (cause != null ? cause.getMessage() : rt.getMessage())); + return; + } + } + logger.info("The instance Id is " + newInstanceId); + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("9. Display information about the running instance. "); + + waitForInputToContinue(scanner); + String publicIp; + try { + CompletableFuture future = ec2Actions.describeEC2InstancesAsync(newInstanceId); + publicIp = future.join(); + logger.info("EC2 instance public IP {}", publicIp); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + + } + logger.info("You can SSH to the instance using this command:"); + logger.info("ssh -i " + fileName + " ec2-user@" + publicIp); + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("10. Stop the instance using a waiter (this may take a few mins)."); + // Remove the 2nd one + waitForInputToContinue(scanner); + try { + CompletableFuture future = ec2Actions.stopInstanceAsync(newInstanceId); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("11. Start the instance using a waiter (this may take a few mins)."); + try { + CompletableFuture future = ec2Actions.startInstanceAsync(newInstanceId); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + // Handle EC2 exceptions. + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("12. Allocate an Elastic IP address and associate it with the instance."); + logger.info(""" + An Elastic IP address is a static public IP address that you can associate with your EC2 instance. + This allows you to have a fixed, predictable IP address that remains the same even if your instance + is stopped, terminated, or replaced. + This is particularly useful for applications or services that need to be accessed consistently from a + known IP address. + + An EC2 Allocation ID (also known as a Reserved Instance Allocation ID) is a unique identifier associated with a Reserved Instance (RI) that you have purchased in AWS. + + When you purchase a Reserved Instance, AWS assigns a unique Allocation ID to it. + This Allocation ID is used to track and identify the specific RI you have purchased, + and it is important for managing and monitoring your Reserved Instances. + + """); + + waitForInputToContinue(scanner); + String allocationId; + try { + CompletableFuture future = ec2Actions.allocateAddressAsync(); + allocationId = future.join(); + logger.info("Successfully allocated address with ID: " +allocationId); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + logger.info("The allocation Id value is " + allocationId); + waitForInputToContinue(scanner); + String associationId; + try { + CompletableFuture future = ec2Actions.associateAddressAsync(newInstanceId, allocationId); + associationId = future.join(); + logger.info("Successfully associated address with ID: " +associationId); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("13. Describe the instance again. Note that the public IP address has changed"); + waitForInputToContinue(scanner); + try { + CompletableFuture future = ec2Actions.describeEC2InstancesAsync(newInstanceId); + publicIp = future.join(); + logger.info("EC2 instance public IP: " + publicIp); + logger.info("You can SSH to the instance using this command:"); + logger.info("ssh -i " + fileName + " ec2-user@" + publicIp); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("14. Disassociate and release the Elastic IP address."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = ec2Actions.disassociateAddressAsync(associationId); + future.join(); + logger.info("Address successfully disassociated."); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + // Handle EC2 exceptions. + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + waitForInputToContinue(scanner); + try { + CompletableFuture future = ec2Actions.releaseEC2AddressAsync(allocationId); + future.join(); // Wait for the operation to complete + logger.info("Elastic IP address successfully released."); + } catch (RuntimeException rte) { + logger.info("An unexpected error occurred: {}", rte.getMessage()); + return; + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("15. Terminate the instance and use a waiter (this may take a few mins)."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = ec2Actions.terminateEC2Async(newInstanceId); + future.join(); + logger.info("EC2 instance successfully terminated."); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + // Handle EC2 exceptions. + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + logger.info(DASHES); + + logger.info(DASHES); + logger.info("16. Delete the security group."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = ec2Actions.deleteEC2SecGroupAsync(groupId); + future.join(); + logger.info("Security group successfully deleted."); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("17. Delete the key."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = ec2Actions.deleteKeysAsync(keyName); + future.join(); + logger.info("Successfully deleted key pair named " + keyName); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof Ec2Exception ec2Ex) { + logger.info("EC2 error occurred: Message {}, Error Code:{}", ec2Ex.getMessage(), ec2Ex.awsErrorDetails().errorCode()); + return; + } else { + logger.info("An unexpected error occurred: {}", cause.getMessage()); + return; + } + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("You successfully completed the Amazon EC2 scenario."); + logger.info(DASHES); + } + public static boolean filterName(String name) { + String[] parts = name.split("/"); + String myValue = parts[4]; + return myValue.contains("amzn2"); + } + + private static void waitForInputToContinue(Scanner scanner) { + while (true) { + logger.info(""); + logger.info("Enter 'c' followed by to continue:"); + String input = scanner.nextLine(); + + if (input.trim().equalsIgnoreCase("c")) { + logger.info("Continuing with the program..."); + logger.info(""); + break; + } else { + // Handle invalid input. + logger.info("Invalid input. Please try again."); + } + } + } +} +// snippet-end:[ec2.java2.scenario.main] \ No newline at end of file diff --git a/javav2/example_code/ec2/src/main/resources/log4j2.xml b/javav2/example_code/ec2/src/main/resources/log4j2.xml new file mode 100644 index 00000000000..4d900326937 --- /dev/null +++ b/javav2/example_code/ec2/src/main/resources/log4j2.xml @@ -0,0 +1,15 @@ + + + + + + %msg%n + + + + + + + + + \ No newline at end of file diff --git a/javav2/example_code/ec2/src/test/java/EC2Test.java b/javav2/example_code/ec2/src/test/java/EC2Test.java index f282b898902..1ee45add804 100644 --- a/javav2/example_code/ec2/src/test/java/EC2Test.java +++ b/javav2/example_code/ec2/src/test/java/EC2Test.java @@ -1,21 +1,23 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import com.example.ec2.*; +import com.example.ec2.scenario.EC2Actions; +import com.example.ec2.scenario.EC2Scenario; import com.google.gson.Gson; import org.junit.jupiter.api.*; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertFalse; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; -import software.amazon.awssdk.services.ec2.Ec2Client; -import java.io.*; -import java.util.concurrent.TimeUnit; - +import java.util.List; +import java.util.concurrent.CompletableFuture; import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.ec2.model.CreateKeyPairResponse; +import software.amazon.awssdk.services.ec2.model.DeleteKeyPairResponse; +import software.amazon.awssdk.services.ec2.model.DescribeKeyPairsResponse; +import software.amazon.awssdk.services.ec2.model.KeyPairInfo; import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; -import software.amazon.awssdk.services.ssm.SsmClient; +import software.amazon.awssdk.services.ssm.model.GetParametersByPathResponse; +import software.amazon.awssdk.services.ssm.model.Parameter; /** * To run these integration tests, you must set the required values @@ -25,330 +27,265 @@ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class EC2Test { - private static Ec2Client ec2; - - private static Ec2Client ec2East; - private static SsmClient ssmClient; - - // Define the data members required for the tests. - private static String instanceId = ""; // gets set in test 2. - private static String ami = ""; - private static String instanceName = ""; private static String keyName = ""; private static String groupName = ""; private static String groupDesc = ""; private static String groupId = ""; - private static String vpcId = ""; private static String keyNameSc = ""; private static String fileNameSc = ""; - private static String groupDescSc = ""; - private static String groupNameSc = ""; private static String vpcIdSc = ""; private static String myIpAddressSc = ""; - private static String winServer = ""; - - @BeforeAll - public static void setUp() throws IOException { - Region region = Region.US_WEST_2; - ec2 = Ec2Client.builder() - .region(region) - .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) - .build(); + private static String newInstanceId = ""; - Region regionEast = Region.US_EAST_1; - ec2East = Ec2Client.builder() - .region(regionEast) - .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) - .build(); + private static EC2Actions ec2Actions; - ssmClient = SsmClient.builder() - .region(region) - .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) - .build(); + @BeforeAll + public static void setUp() { + ec2Actions = new EC2Actions(); // Get the values to run these tests from AWS Secrets Manager. Gson gson = new Gson(); String json = getSecretValues(); SecretValues values = gson.fromJson(json, SecretValues.class); - ami = values.getAmi(); - instanceName = values.getInstanceName(); - keyName = values.getKeyNameSc(); - groupName = values.getGroupName(); + keyName = values.getKeyNameSc(); + groupName = values.getGroupName() + java.util.UUID.randomUUID(); groupDesc = values.getGroupDesc(); - vpcId = values.getVpcId(); keyNameSc = values.getKeyNameSc() + java.util.UUID.randomUUID(); fileNameSc = values.getFileNameSc(); - groupDescSc = values.getGroupDescSc(); - groupNameSc = values.getGroupDescSc() + java.util.UUID.randomUUID(); vpcIdSc = values.getVpcIdSc(); myIpAddressSc = values.getMyIpAddressSc(); - winServer = values.getWinServer(); - - // Uncomment this code block if you prefer using a config.properties file to - // retrieve AWS values required for these tests. - /* - * try (InputStream input = - * EC2Test.class.getClassLoader().getResourceAsStream("config.properties")) { - * Properties prop = new Properties(); - * if (input == null) { - * System.out.println("Sorry, unable to find config.properties"); - * return; - * } - * prop.load(input); - * ami = prop.getProperty("ami"); - * instanceName = prop.getProperty("instanceName"); - * keyName = prop.getProperty("keyPair")+ java.util.UUID.randomUUID(); - * groupName= prop.getProperty("groupName")+ java.util.UUID.randomUUID();; - * groupDesc= prop.getProperty("groupDesc"); - * vpcId= prop.getProperty("vpcId"); - * keyNameSc= prop.getProperty("keyNameSc")+ java.util.UUID.randomUUID(); - * fileNameSc= prop.getProperty("fileNameSc"); - * groupDescSc= prop.getProperty("groupDescSc"); - * groupNameSc= prop.getProperty("groupNameSc")+ java.util.UUID.randomUUID();; - * vpcIdSc= prop.getProperty("vpcIdSc"); - * myIpAddressSc= prop.getProperty("myIpAddressSc"); - * - * } catch (IOException ex) { - * ex.printStackTrace(); - * } - */ } @Test @Tag("IntegrationTest") @Order(1) - public void CreateInstance() { - instanceId = CreateInstance.createEC2Instance(ec2, instanceName, ami); - assertFalse(instanceId.isEmpty()); - System.out.println("\n Test 1 passed"); + public void createKeyPair() { + try { + CompletableFuture future = ec2Actions.createKeyPairAsync(keyNameSc, fileNameSc); + CreateKeyPairResponse response = future.join(); + + // Assert that the response is not null. + Assertions.assertNotNull(response, "The response should not be null"); + + // Assert specific properties of the response + Assertions.assertNotNull(response.keyFingerprint(), "The key fingerprint should not be null"); + Assertions.assertFalse(response.keyFingerprint().isEmpty(), "The key fingerprint should not be empty"); + System.out.println("Key Pair successfully created. Key Fingerprint: " + response.keyFingerprint()); + + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception: " + rte.getMessage()); + } + + System.out.println("Test 1 passed"); } + @Test @Tag("IntegrationTest") @Order(2) - public void CreateKeyPair() { - assertDoesNotThrow(() -> CreateKeyPair.createEC2KeyPair(ec2, keyName)); + public void createInstance() { + try { + CompletableFuture future = ec2Actions.createSecurityGroupAsync(groupName, groupDesc, vpcIdSc, myIpAddressSc); + groupId = future.join(); + + // Assert that the security group ID is not null or empty + Assertions.assertNotNull(groupId, "The security group ID should not be null"); + Assertions.assertFalse(groupId.isEmpty(), "The security group ID should not be empty"); + + System.out.println("Created security group with ID: " + groupId); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception while creating security group: " + rte.getMessage()); + } + + String instanceId =""; + try { + CompletableFuture future = ec2Actions.getParaValuesAsync(); + GetParametersByPathResponse pathResponse = future.join(); + + // Assert that the pathResponse is not null. + Assertions.assertNotNull(pathResponse, "The response from getParaValuesAsync should not be null"); + + List parameterList = pathResponse.parameters(); + Assertions.assertFalse(parameterList.isEmpty(), "Parameter list should not be empty"); + for (Parameter para : parameterList) { + if (EC2Scenario.filterName(para.name())) { + instanceId = para.value(); + break; + } + } + + // Assert that instanceId is found and not empty + Assertions.assertNotNull(instanceId, "The instance ID should not be null"); + Assertions.assertFalse(instanceId.isEmpty(), "The instance ID should not be empty"); + + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception while retrieving parameters: " + rte.getMessage()); + } + + + String amiValue=""; + try { + CompletableFuture futureImage = ec2Actions.describeImageAsync(instanceId); + amiValue = futureImage.join(); + + // Assert that the AMI value is not null or empty + Assertions.assertNotNull(amiValue, "The AMI value should not be null"); + Assertions.assertFalse(amiValue.isEmpty(), "The AMI value should not be empty"); + + System.out.println("Image ID: " + amiValue); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception while describing image: " + rte.getMessage()); + } + + String instanceType=""; + try { + CompletableFuture futureInstanceType = ec2Actions.getInstanceTypesAsync(); + instanceType = futureInstanceType.join(); + + // Assert that the instance type is not null or empty + Assertions.assertNotNull(instanceType, "The instance type should not be null"); + Assertions.assertFalse(instanceType.isEmpty(), "The instance type should not be empty"); + + System.out.println("Found instance type: " + instanceType); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception while getting instance type: " + rte.getMessage()); + } + + try { + CompletableFuture future = ec2Actions.runInstanceAsync(instanceType, keyName, groupName, amiValue); + newInstanceId = future.join(); // Get the instance ID. + + // Assert that the new instance ID is not null or empty + Assertions.assertNotNull(newInstanceId, "The new instance ID should not be null"); + Assertions.assertFalse(newInstanceId.isEmpty(), "The new instance ID should not be empty"); + + System.out.println("EC2 instance ID: " + newInstanceId); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception while running instance: " + rte.getMessage()); + } + System.out.println("\n Test 2 passed"); } + @Test @Tag("IntegrationTest") @Order(3) - public void DescribeKeyPair() { - assertDoesNotThrow(() -> DescribeKeyPairs.describeEC2Keys(ec2)); - System.out.println("Test 3 passed"); - } + public void describeKeyPair() { + try { + CompletableFuture future = ec2Actions.describeKeysAsync(); + DescribeKeyPairsResponse response = future.join(); - @Test - @Tag("IntegrationTest") - @Order(4) - public void DeleteKeyPair() { - assertDoesNotThrow(() -> DeleteKeyPair.deleteKeys(ec2, keyName)); - System.out.println("\n Test 4 passed"); - } + // Assert that the response is not null + Assertions.assertNotNull(response, "The response from describeKeysAsync should not be null"); - @Test - @Tag("IntegrationTest") - @Order(5) - public void CreateSecurityGroup() { - groupId = CreateSecurityGroup.createEC2SecurityGroup(ec2, groupName, groupDesc, vpcId); - assertFalse(groupId.isEmpty()); - System.out.println("\n Test 5 passed"); - } + // Assert that the key pairs list is not null or empty + List keyPairs = response.keyPairs(); + Assertions.assertNotNull(keyPairs, "The key pairs list should not be null"); + Assertions.assertFalse(keyPairs.isEmpty(), "The key pairs list should not be empty"); - @Test - @Tag("IntegrationTest") - @Order(6) - public void DescribeSecurityGroup() { - assertDoesNotThrow(() -> DescribeSecurityGroups.describeEC2SecurityGroups(ec2, groupId)); - System.out.println("\n Test 6 passed"); - } + // Optionally, you can print out the details of each key pair + keyPairs.forEach(keyPair -> + System.out.println("Key Pair Name: " + keyPair.keyName() + ", Key Fingerprint: " + keyPair.keyFingerprint()) + ); - @Test - @Tag("IntegrationTest") - @Order(7) - public void DeleteSecurityGroup() { - assertDoesNotThrow(() -> DeleteSecurityGroup.deleteEC2SecGroup(ec2, groupId)); - System.out.println("\n Test 7 passed"); - } + System.out.println("Successfully described key pairs."); - @Test - @Tag("IntegrationTest") - @Order(8) - public void DescribeAccount() { - assertDoesNotThrow(() -> DescribeAccount.describeEC2Account(ec2)); - System.out.println("\n Test 8 passed"); - } + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception while describing key pairs: " + rte.getMessage()); + } - @Test - @Tag("IntegrationTest") - @Order(9) - public void DescribeInstances() { - assertDoesNotThrow(() -> DescribeInstances.describeEC2Instances(ec2)); - System.out.println("\n Test 9 passed"); + System.out.println("Test 3 passed"); } @Test @Tag("IntegrationTest") - @Order(10) - public void DescribeRegionsAndZones() { - assertDoesNotThrow(() -> DescribeRegionsAndZones.describeEC2RegionsAndZones(ec2)); - System.out.println("\n Test 10 passed"); - } + @Order(4) + public void deleteKeyPair() { + try { + CompletableFuture future = ec2Actions.deleteKeysAsync(keyNameSc); + DeleteKeyPairResponse response = future.join(); + + // Assert that the response is not null. + Assertions.assertNotNull(response, "The response from deleteKeysAsync should not be null"); + System.out.println("Key pair deletion completed."); + + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception while deleting key pair: " + rte.getMessage()); + } - @Test - @Tag("IntegrationTest") - @Order(11) - public void DescribeVPCs() { - assertDoesNotThrow(() -> DescribeVPCs.describeEC2Vpcs(ec2, vpcId)); - System.out.println("\n Test 11 passed"); + System.out.println("\n Test 4 passed"); } @Test @Tag("IntegrationTest") - @Order(12) - public void FindRunningInstances() { - assertDoesNotThrow(() -> FindRunningInstances.findRunningEC2InstancesUsingPaginator(ec2)); - System.out.println("\n Test 12 passed"); - } + @Order(5) + public void describeSecurityGroup() { + try { + CompletableFuture future = ec2Actions.describeSecurityGroupArnByNameAsync(groupName); + groupId = future.join(); + // Assert that the response is not null + Assertions.assertNotNull(groupId, "The response from describeSecurityGroupsAsync should not be null"); - @Test - @Tag("IntegrationTest") - @Order(13) - public void DescribeAddressed() { - assertDoesNotThrow(() -> DescribeAddresses.describeEC2Address(ec2)); - System.out.println("\n Test 13 passed"); - } - @Test - @Tag("IntegrationTest") - @Order(14) - public void TerminateInstance() { - assertDoesNotThrow(() -> TerminateInstance.terminateEC2(ec2, instanceId)); - System.out.println("\n Test 14 passed"); + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception while describing security groups: " + rte.getMessage()); + } + + System.out.println("\n Test 5 passed"); } + @Test @Tag("IntegrationTest") - @Order(15) - public void testGetPassword() { - GetPasswordData.getPasswordData(ec2East, winServer); - System.out.println(EC2Scenario.DASHES); + @Order(6) + public void describeInstances() { + try { + CompletableFuture future = ec2Actions.describeEC2InstancesAsync(newInstanceId); + String publicIp = future.join(); + + // Assert that the public IP is not null or empty. + Assertions.assertNotNull(publicIp, "The public IP should not be null"); + Assertions.assertFalse(publicIp.isEmpty(), "The public IP should not be empty"); + System.out.println("EC2 instance public IP: " + publicIp); + + } catch (RuntimeException rte) { + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception while describing EC2 instances: " + rte.getMessage()); + } + System.out.println("\n Test 6 passed"); } @Test @Tag("IntegrationTest") - @Order(16) - public void TestEC2Scenario() { - System.out.println(EC2Scenario.DASHES); - System.out.println("1. Create an RSA key pair and save the private key material as a .pem file."); - EC2Scenario.createKeyPair(ec2, keyNameSc, fileNameSc); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("2. List key pairs."); - EC2Scenario.describeKeys(ec2); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("3. Create a security group."); - String groupId = EC2Scenario.createSecurityGroup(ec2, groupNameSc, groupDescSc, vpcIdSc, myIpAddressSc); - assertFalse(groupId.isEmpty()); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("4. Display security group info for the newly created security group."); - EC2Scenario.describeSecurityGroups(ec2, groupId); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("5. Get a list of Amazon Linux 2 AMIs and select one with amzn2 in the name."); - String instanceId = EC2Scenario.getParaValues(ssmClient); - assertFalse(instanceId.isEmpty()); - System.out.println("The instance Id is " + instanceId); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("6. Get more information about an amzn2 image."); - String amiValue = EC2Scenario.describeImage(ec2, instanceId); - assertFalse(amiValue.isEmpty()); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("7. Get a list of instance types."); - String instanceType = EC2Scenario.getInstanceTypes(ec2); - System.out.println("The instance type is " + instanceType); - System.out.println("*** The instance type is " + instanceType); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("8. Create an instance."); - String newInstanceId = EC2Scenario.runInstance(ec2, instanceType, keyNameSc, groupNameSc, amiValue); - System.out.println("The instance Id is " + newInstanceId); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("9. Display information about the running instance. "); - String ipAddress = EC2Scenario.describeEC2Instances(ec2, newInstanceId); - assertFalse(ipAddress.isEmpty()); - System.out.println("You can SSH to the instance using this command:"); - System.out.println("ssh -i " + fileNameSc + "ec2-user@" + ipAddress); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("10. Stop the instance."); - EC2Scenario.stopInstance(ec2, newInstanceId); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("11. Start the instance."); - EC2Scenario.startInstance(ec2, newInstanceId); - ipAddress = EC2Scenario.describeEC2Instances(ec2, newInstanceId); - assertFalse(ipAddress.isEmpty()); - System.out.println("You can SSH to the instance using this command:"); - System.out.println("ssh -i " + fileNameSc + "ec2-user@" + ipAddress); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("12. Allocate an Elastic IP address and associate it with the instance."); - String allocationId = EC2Scenario.allocateAddress(ec2); - assertFalse(allocationId.isEmpty()); - System.out.println("The allocation Id value is " + allocationId); - String associationId = EC2Scenario.associateAddress(ec2, newInstanceId, allocationId); - System.out.println("The association Id value is " + associationId); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("13. Describe the instance again."); - ipAddress = EC2Scenario.describeEC2Instances(ec2, newInstanceId); - assertFalse(ipAddress.isEmpty()); - System.out.println("You can SSH to the instance using this command:"); - System.out.println("ssh -i " + fileNameSc + "ec2-user@" + ipAddress); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("14. Disassociate and release the Elastic IP address."); - EC2Scenario.disassociateAddress(ec2, associationId); - EC2Scenario.releaseEC2Address(ec2, allocationId); - System.out.println(EC2Scenario.DASHES); - - - System.out.println(EC2Scenario.DASHES); - System.out.println("15. Terminate the instance."); - EC2Scenario.terminateEC2(ec2, newInstanceId); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("16. Delete the security group."); - EC2Scenario.deleteEC2SecGroup(ec2, groupId); - System.out.println(EC2Scenario.DASHES); - - System.out.println(EC2Scenario.DASHES); - System.out.println("17. Delete the keys."); - EC2Scenario.deleteKeys(ec2, keyNameSc); - System.out.println(EC2Scenario.DASHES); - System.out.println("\n Test 16 passed"); + @Order(8) + public void terminateInstance() { + try { + System.out.println("Instance ID is: " + newInstanceId); + CompletableFuture future = ec2Actions.terminateEC2Async(newInstanceId); + future.join(); // Wait for the operation to complete + + // Since the operation returns void, reaching this point indicates success. + System.out.println("EC2 instance successfully terminated."); + + } catch (RuntimeException rte) { + // Handle any runtime exceptions and fail the test if one occurs + System.err.println("An exception occurred: " + (rte.getCause() != null ? rte.getCause().getMessage() : rte.getMessage())); + Assertions.fail("Test failed due to an unexpected exception while terminating the EC2 instance: " + rte.getMessage()); + } + + // Confirm that the test passed + System.out.println("\n Test 8 passed"); } private static String getSecretValues() { @@ -390,8 +327,6 @@ class SecretValues { private String myIpAddressSc; - private String winServer; - public String getAmi() { return ami; } @@ -412,10 +347,6 @@ public String getGroupDesc() { return groupDesc; } - public String getVpcId() { - return vpcId; - } - public String getKeyNameSc() { return keyNameSc; } @@ -424,14 +355,6 @@ public String getFileNameSc() { return fileNameSc; } - public String getGroupNameSc() { - return groupNameSc; - } - - public String getGroupDescSc() { - return groupDescSc; - } - public String getVpcIdSc() { return vpcIdSc; } @@ -439,7 +362,5 @@ public String getVpcIdSc() { public String getMyIpAddressSc() { return myIpAddressSc; } - - public String getWinServer(){return winServer;} } } From 8715c95968fe148a225c2c321096841521a805cc Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Wed, 28 Aug 2024 14:08:16 -0400 Subject: [PATCH 52/98] JavaScript (v3): Readme - Update jinja template with run options instructions. (#6782) --- .tools/readmes/includes/run_instructions.jinja2 | 11 +++++++++++ javascriptv3/example_code/auto-scaling/README.md | 11 +++++++++++ .../example_code/bedrock-agent-runtime/README.md | 11 +++++++++++ javascriptv3/example_code/bedrock-agent/README.md | 11 +++++++++++ javascriptv3/example_code/bedrock-runtime/README.md | 11 +++++++++++ javascriptv3/example_code/bedrock/README.md | 11 +++++++++++ javascriptv3/example_code/cloudwatch-events/README.md | 11 +++++++++++ javascriptv3/example_code/cloudwatch-logs/README.md | 11 +++++++++++ javascriptv3/example_code/cloudwatch/README.md | 11 +++++++++++ javascriptv3/example_code/codebuild/README.md | 11 +++++++++++ .../example_code/cognito-identity-provider/README.md | 11 +++++++++++ javascriptv3/example_code/dynamodb/README.md | 11 +++++++++++ javascriptv3/example_code/ec2/README.md | 11 +++++++++++ .../example_code/elastic-load-balancing-v2/README.md | 11 +++++++++++ javascriptv3/example_code/eventbridge/README.md | 11 +++++++++++ javascriptv3/example_code/glacier/README.md | 11 +++++++++++ javascriptv3/example_code/glue/README.md | 11 +++++++++++ javascriptv3/example_code/iam/README.md | 11 +++++++++++ javascriptv3/example_code/lambda/README.md | 11 +++++++++++ javascriptv3/example_code/medical-imaging/README.md | 11 +++++++++++ javascriptv3/example_code/personalize/README.md | 11 +++++++++++ javascriptv3/example_code/pinpoint/README.md | 11 +++++++++++ javascriptv3/example_code/redshift/README.md | 11 +++++++++++ javascriptv3/example_code/s3/README.md | 11 +++++++++++ javascriptv3/example_code/sagemaker/README.md | 11 +++++++++++ javascriptv3/example_code/secrets-manager/README.md | 11 +++++++++++ javascriptv3/example_code/ses/README.md | 11 +++++++++++ javascriptv3/example_code/sfn/README.md | 11 +++++++++++ javascriptv3/example_code/sns/README.md | 11 +++++++++++ javascriptv3/example_code/sqs/README.md | 11 +++++++++++ javascriptv3/example_code/sts/README.md | 11 +++++++++++ javascriptv3/example_code/support/README.md | 11 +++++++++++ javascriptv3/example_code/transcribe/README.md | 11 +++++++++++ 33 files changed, 363 insertions(+) diff --git a/.tools/readmes/includes/run_instructions.jinja2 b/.tools/readmes/includes/run_instructions.jinja2 index 4d5e05b2ea2..f364e2a0c55 100644 --- a/.tools/readmes/includes/run_instructions.jinja2 +++ b/.tools/readmes/includes/run_instructions.jinja2 @@ -11,10 +11,21 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` + +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. {% endif %} {% if lang_config['name'] == '.NET' and lang_config['sdk_ver'] == 3 %} For general instructions to run the examples, see the diff --git a/javascriptv3/example_code/auto-scaling/README.md b/javascriptv3/example_code/auto-scaling/README.md index 7f21ad8e236..a3259800e48 100644 --- a/javascriptv3/example_code/auto-scaling/README.md +++ b/javascriptv3/example_code/auto-scaling/README.md @@ -60,11 +60,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/bedrock-agent-runtime/README.md b/javascriptv3/example_code/bedrock-agent-runtime/README.md index 4292dc635ab..cac0effa84e 100644 --- a/javascriptv3/example_code/bedrock-agent-runtime/README.md +++ b/javascriptv3/example_code/bedrock-agent-runtime/README.md @@ -56,11 +56,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/bedrock-agent/README.md b/javascriptv3/example_code/bedrock-agent/README.md index a7ad8c00637..69393ddba82 100644 --- a/javascriptv3/example_code/bedrock-agent/README.md +++ b/javascriptv3/example_code/bedrock-agent/README.md @@ -65,11 +65,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/bedrock-runtime/README.md b/javascriptv3/example_code/bedrock-runtime/README.md index 42b3a2f88f5..6e78a957523 100644 --- a/javascriptv3/example_code/bedrock-runtime/README.md +++ b/javascriptv3/example_code/bedrock-runtime/README.md @@ -101,11 +101,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/bedrock/README.md b/javascriptv3/example_code/bedrock/README.md index 53a4cd09773..67eaa07312b 100644 --- a/javascriptv3/example_code/bedrock/README.md +++ b/javascriptv3/example_code/bedrock/README.md @@ -62,11 +62,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/cloudwatch-events/README.md b/javascriptv3/example_code/cloudwatch-events/README.md index e4db9582109..e3e500d35a0 100644 --- a/javascriptv3/example_code/cloudwatch-events/README.md +++ b/javascriptv3/example_code/cloudwatch-events/README.md @@ -55,11 +55,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/cloudwatch-logs/README.md b/javascriptv3/example_code/cloudwatch-logs/README.md index 53bc0e6c4de..a27f825ad78 100644 --- a/javascriptv3/example_code/cloudwatch-logs/README.md +++ b/javascriptv3/example_code/cloudwatch-logs/README.md @@ -67,11 +67,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/cloudwatch/README.md b/javascriptv3/example_code/cloudwatch/README.md index 265fbf19fc8..5a3f60b2d5d 100644 --- a/javascriptv3/example_code/cloudwatch/README.md +++ b/javascriptv3/example_code/cloudwatch/README.md @@ -59,11 +59,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/codebuild/README.md b/javascriptv3/example_code/codebuild/README.md index bbcb908d21c..fcff8bb7fe6 100644 --- a/javascriptv3/example_code/codebuild/README.md +++ b/javascriptv3/example_code/codebuild/README.md @@ -53,11 +53,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/cognito-identity-provider/README.md b/javascriptv3/example_code/cognito-identity-provider/README.md index 66ce95e2569..b286b11b86d 100644 --- a/javascriptv3/example_code/cognito-identity-provider/README.md +++ b/javascriptv3/example_code/cognito-identity-provider/README.md @@ -76,11 +76,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/dynamodb/README.md b/javascriptv3/example_code/dynamodb/README.md index 78a0ecefbec..a5ec710ad19 100644 --- a/javascriptv3/example_code/dynamodb/README.md +++ b/javascriptv3/example_code/dynamodb/README.md @@ -86,11 +86,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/ec2/README.md b/javascriptv3/example_code/ec2/README.md index 6b16493fcb4..02a0c6ba6fe 100644 --- a/javascriptv3/example_code/ec2/README.md +++ b/javascriptv3/example_code/ec2/README.md @@ -100,11 +100,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/elastic-load-balancing-v2/README.md b/javascriptv3/example_code/elastic-load-balancing-v2/README.md index 8ebc8227190..2685fb27a18 100644 --- a/javascriptv3/example_code/elastic-load-balancing-v2/README.md +++ b/javascriptv3/example_code/elastic-load-balancing-v2/README.md @@ -72,11 +72,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/eventbridge/README.md b/javascriptv3/example_code/eventbridge/README.md index 810cf344155..52282d50d4a 100644 --- a/javascriptv3/example_code/eventbridge/README.md +++ b/javascriptv3/example_code/eventbridge/README.md @@ -55,11 +55,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/glacier/README.md b/javascriptv3/example_code/glacier/README.md index 62588709db7..e9bf82357d0 100644 --- a/javascriptv3/example_code/glacier/README.md +++ b/javascriptv3/example_code/glacier/README.md @@ -54,11 +54,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/glue/README.md b/javascriptv3/example_code/glue/README.md index 7400eab40c9..3e657a283fa 100644 --- a/javascriptv3/example_code/glue/README.md +++ b/javascriptv3/example_code/glue/README.md @@ -80,11 +80,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/iam/README.md b/javascriptv3/example_code/iam/README.md index c26002ea9aa..46600afe6db 100644 --- a/javascriptv3/example_code/iam/README.md +++ b/javascriptv3/example_code/iam/README.md @@ -108,11 +108,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/lambda/README.md b/javascriptv3/example_code/lambda/README.md index 04d20ff872b..91eb996a8c9 100644 --- a/javascriptv3/example_code/lambda/README.md +++ b/javascriptv3/example_code/lambda/README.md @@ -71,11 +71,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/medical-imaging/README.md b/javascriptv3/example_code/medical-imaging/README.md index e1434baa85e..39d1eb304f4 100644 --- a/javascriptv3/example_code/medical-imaging/README.md +++ b/javascriptv3/example_code/medical-imaging/README.md @@ -84,11 +84,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/personalize/README.md b/javascriptv3/example_code/personalize/README.md index 052a780a866..109259e1e1f 100644 --- a/javascriptv3/example_code/personalize/README.md +++ b/javascriptv3/example_code/personalize/README.md @@ -65,11 +65,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/pinpoint/README.md b/javascriptv3/example_code/pinpoint/README.md index 954e82b3555..3fe5a3356bb 100644 --- a/javascriptv3/example_code/pinpoint/README.md +++ b/javascriptv3/example_code/pinpoint/README.md @@ -53,11 +53,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/redshift/README.md b/javascriptv3/example_code/redshift/README.md index ff55e4c15e2..0b122caa144 100644 --- a/javascriptv3/example_code/redshift/README.md +++ b/javascriptv3/example_code/redshift/README.md @@ -56,11 +56,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/s3/README.md b/javascriptv3/example_code/s3/README.md index 453a5c17b07..d1cd36780f4 100644 --- a/javascriptv3/example_code/s3/README.md +++ b/javascriptv3/example_code/s3/README.md @@ -99,11 +99,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + Some scenarios are web applications that must be bundled. These scenarios are in the `scenarios/web` folder. diff --git a/javascriptv3/example_code/sagemaker/README.md b/javascriptv3/example_code/sagemaker/README.md index 486339cf188..0e9fe35f408 100644 --- a/javascriptv3/example_code/sagemaker/README.md +++ b/javascriptv3/example_code/sagemaker/README.md @@ -68,11 +68,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/secrets-manager/README.md b/javascriptv3/example_code/secrets-manager/README.md index d71b202ec68..348b763d03f 100644 --- a/javascriptv3/example_code/secrets-manager/README.md +++ b/javascriptv3/example_code/secrets-manager/README.md @@ -53,11 +53,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/ses/README.md b/javascriptv3/example_code/ses/README.md index 7935d9d8fc9..c4e0708ac71 100644 --- a/javascriptv3/example_code/ses/README.md +++ b/javascriptv3/example_code/ses/README.md @@ -72,11 +72,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/sfn/README.md b/javascriptv3/example_code/sfn/README.md index 207799fd8e1..13b53bd5084 100644 --- a/javascriptv3/example_code/sfn/README.md +++ b/javascriptv3/example_code/sfn/README.md @@ -53,11 +53,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/sns/README.md b/javascriptv3/example_code/sns/README.md index 07c46047f53..db8c8955821 100644 --- a/javascriptv3/example_code/sns/README.md +++ b/javascriptv3/example_code/sns/README.md @@ -77,11 +77,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/sqs/README.md b/javascriptv3/example_code/sqs/README.md index 71b37ebc6e4..86274a509dd 100644 --- a/javascriptv3/example_code/sqs/README.md +++ b/javascriptv3/example_code/sqs/README.md @@ -75,11 +75,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/sts/README.md b/javascriptv3/example_code/sts/README.md index aaf8c708adc..596053c0539 100644 --- a/javascriptv3/example_code/sts/README.md +++ b/javascriptv3/example_code/sts/README.md @@ -53,11 +53,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/support/README.md b/javascriptv3/example_code/support/README.md index 0d28c0efbad..fafc35ca856 100644 --- a/javascriptv3/example_code/support/README.md +++ b/javascriptv3/example_code/support/README.md @@ -72,11 +72,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + diff --git a/javascriptv3/example_code/transcribe/README.md b/javascriptv3/example_code/transcribe/README.md index e1846fa46ce..b9e5f83fb88 100644 --- a/javascriptv3/example_code/transcribe/README.md +++ b/javascriptv3/example_code/transcribe/README.md @@ -58,11 +58,22 @@ node ./actions/ ``` **Run a scenario** + Most scenarios can be run with the following command: ```bash node ./scenarios/ ``` +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + From 420df9a2b8174b7482bbf2cbc100a051decb5e7d Mon Sep 17 00:00:00 2001 From: David Souther Date: Wed, 28 Aug 2024 14:12:28 -0400 Subject: [PATCH 53/98] -tools release 2024-08-28-A (#6786) * Test -tools release 2024-08-28-A --- .github/workflows/validate-doc-metadata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index a90e3d3af70..732f42bca21 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@release/2024-08-26-B + uses: awsdocs/aws-doc-sdk-examples-tools@2024-08-28-A with: doc_gen_only: "False" strict_titles: "True" From 90743c43582d84c6acf565f7de3d53a636b71ce1 Mon Sep 17 00:00:00 2001 From: Joy Niu <70342924+niujoy@users.noreply.github.com> Date: Thu, 29 Aug 2024 08:43:34 -0700 Subject: [PATCH 54/98] python: Add ' us-gov-east-1' to SMTP_REGIONS in ses_generate_smtp_credentials.py (#6783) Add ' us-gov-east-1' to SMTP_REGIONS Co-authored-by: Joy Niu --- python/example_code/ses/ses_generate_smtp_credentials.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/example_code/ses/ses_generate_smtp_credentials.py b/python/example_code/ses/ses_generate_smtp_credentials.py index b3acb6fb08f..c913177ae7b 100644 --- a/python/example_code/ses/ses_generate_smtp_credentials.py +++ b/python/example_code/ses/ses_generate_smtp_credentials.py @@ -34,6 +34,7 @@ "eu-north-1", # Europe (Stockholm) "sa-east-1", # South America (Sao Paulo) "us-gov-west-1", # AWS GovCloud (US) + "us-gov-east-1", # AWS GovCloud (US) ] # These values are required to calculate the signature. Do not change them. From ad7cb9b6d9a60a786e43e79cc3dc95d1e696d952 Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Fri, 30 Aug 2024 09:44:30 -0400 Subject: [PATCH 55/98] JavaScript (v3): Integration test fixes (#6793) --- javascriptv3/.gitignore | 3 +- .../example_code/auto-scaling/README.md | 2 +- .../wkflw-resilient-service/constants.js | 3 ++ .../wkflw-resilient-service/steps-deploy.js | 2 ++ .../wkflw-resilient-service/steps-destroy.js | 36 +++++++++++++++++++ javascriptv3/example_code/ec2/README.md | 8 ++--- .../elastic-load-balancing-v2/README.md | 10 +++--- javascriptv3/example_code/iam/README.md | 2 +- 8 files changed, 54 insertions(+), 12 deletions(-) diff --git a/javascriptv3/.gitignore b/javascriptv3/.gitignore index 8ec467f5932..18a26eadff0 100644 --- a/javascriptv3/.gitignore +++ b/javascriptv3/.gitignore @@ -3,4 +3,5 @@ node_modules/ *.pem package-lock.json test_results/ -test-results.xml \ No newline at end of file +test-results.xml +state.json \ No newline at end of file diff --git a/javascriptv3/example_code/auto-scaling/README.md b/javascriptv3/example_code/auto-scaling/README.md index a3259800e48..bb7efbd1236 100644 --- a/javascriptv3/example_code/auto-scaling/README.md +++ b/javascriptv3/example_code/auto-scaling/README.md @@ -33,7 +33,7 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas Code excerpts that show you how to call individual service functions. -- [AttachLoadBalancerTargetGroups](../cross-services/wkflw-resilient-service/steps-deploy.js#L492) +- [AttachLoadBalancerTargetGroups](../cross-services/wkflw-resilient-service/steps-deploy.js#L493) ### Scenarios diff --git a/javascriptv3/example_code/cross-services/wkflw-resilient-service/constants.js b/javascriptv3/example_code/cross-services/wkflw-resilient-service/constants.js index d7b1004738b..1663350fece 100644 --- a/javascriptv3/example_code/cross-services/wkflw-resilient-service/constants.js +++ b/javascriptv3/example_code/cross-services/wkflw-resilient-service/constants.js @@ -172,6 +172,9 @@ Some of the resources create by this demo are: "Detached SSM only role ${ROLE_NAME} from profile ${PROFILE_NAME}.", detachSsmOnlyRoleFromProfileError: "Error detaching SSM only role ${ROLE_NAME} from profile ${PROFILE_NAME}.", + revokeSecurityGroupIngressError: + "Error revoking security group ingress for ${IP}.", + revokedSecurityGroupIngress: "Revoked security group ingress for ${IP}", }; export const PREFIX = "resilient-wkflw-"; diff --git a/javascriptv3/example_code/cross-services/wkflw-resilient-service/steps-deploy.js b/javascriptv3/example_code/cross-services/wkflw-resilient-service/steps-deploy.js index 3419751e008..bce679267cd 100644 --- a/javascriptv3/example_code/cross-services/wkflw-resilient-service/steps-deploy.js +++ b/javascriptv3/example_code/cross-services/wkflw-resilient-service/steps-deploy.js @@ -48,6 +48,7 @@ import { ScenarioInput, ScenarioAction, } from "@aws-doc-sdk-examples/lib/scenario/index.js"; +import { saveState } from "@aws-doc-sdk-examples/lib/scenario/steps-common.js"; import { retry } from "@aws-doc-sdk-examples/lib/utils/util-timers.js"; import { MESSAGES, NAMES, RESOURCES_PATH, ROOT } from "./constants.js"; @@ -622,4 +623,5 @@ export const deploySteps = [ ); } }), + saveState, ]; diff --git a/javascriptv3/example_code/cross-services/wkflw-resilient-service/steps-destroy.js b/javascriptv3/example_code/cross-services/wkflw-resilient-service/steps-destroy.js index 533f0ee1f57..0281a24bdf1 100644 --- a/javascriptv3/example_code/cross-services/wkflw-resilient-service/steps-destroy.js +++ b/javascriptv3/example_code/cross-services/wkflw-resilient-service/steps-destroy.js @@ -7,6 +7,7 @@ import { EC2Client, DeleteKeyPairCommand, DeleteLaunchTemplateCommand, + RevokeSecurityGroupIngressCommand, } from "@aws-sdk/client-ec2"; import { IAMClient, @@ -36,6 +37,7 @@ import { ScenarioInput, ScenarioAction, } from "@aws-doc-sdk-examples/lib/scenario/index.js"; +import { loadState } from "@aws-doc-sdk-examples/lib/scenario/steps-common.js"; import { retry } from "@aws-doc-sdk-examples/lib/utils/util-timers.js"; import { MESSAGES, NAMES } from "./constants.js"; @@ -45,6 +47,7 @@ import { findLoadBalancer } from "./shared.js"; * @type {import('@aws-doc-sdk-examples/lib/scenario.js').Step[]} */ export const destroySteps = [ + loadState, new ScenarioInput("destroy", MESSAGES.destroy, { type: "confirm" }), new ScenarioAction( "abort", @@ -514,6 +517,39 @@ export const destroySteps = [ ); } }), + new ScenarioAction( + "revokeSecurityGroupIngress", + async ( + /** @type {{ myIp: string, defaultSecurityGroup: { GroupId: string } }} */ state, + ) => { + const ec2Client = new EC2Client({}); + + try { + await ec2Client.send( + new RevokeSecurityGroupIngressCommand({ + GroupId: state.defaultSecurityGroup.GroupId, + CidrIp: `${state.myIp}/32`, + FromPort: 80, + ToPort: 80, + IpProtocol: "tcp", + }), + ); + } catch (e) { + state.revokeSecurityGroupIngressError = e; + } + }, + ), + new ScenarioOutput("revokeSecurityGroupIngressResult", (state) => { + if (state.revokeSecurityGroupIngressError) { + console.error(state.revokeSecurityGroupIngressError); + return MESSAGES.revokeSecurityGroupIngressError.replace( + "${IP}", + state.myIp, + ); + } else { + return MESSAGES.revokedSecurityGroupIngress.replace("${IP}", state.myIp); + } + }), ]; /** diff --git a/javascriptv3/example_code/ec2/README.md b/javascriptv3/example_code/ec2/README.md index 02a0c6ba6fe..25f7b65610d 100644 --- a/javascriptv3/example_code/ec2/README.md +++ b/javascriptv3/example_code/ec2/README.md @@ -49,10 +49,10 @@ Code excerpts that show you how to call individual service functions. - [AssociateAddress](actions/associate-address.js#L4) - [AuthorizeSecurityGroupIngress](actions/authorize-security-group-ingress.js#L4) - [CreateKeyPair](actions/create-key-pair.js#L4) -- [CreateLaunchTemplate](../cross-services/wkflw-resilient-service/steps-deploy.js#L278) +- [CreateLaunchTemplate](../cross-services/wkflw-resilient-service/steps-deploy.js#L279) - [CreateSecurityGroup](actions/create-security-group.js#L4) - [DeleteKeyPair](actions/delete-key-pair.js#L4) -- [DeleteLaunchTemplate](../cross-services/wkflw-resilient-service/steps-destroy.js#L266) +- [DeleteLaunchTemplate](../cross-services/wkflw-resilient-service/steps-destroy.js#L269) - [DeleteSecurityGroup](actions/delete-security-group.js#L4) - [DescribeAddresses](actions/describe-addresses.js#L4) - [DescribeIamInstanceProfileAssociations](../cross-services/wkflw-resilient-service/steps-demo.js#L241) @@ -62,8 +62,8 @@ Code excerpts that show you how to call individual service functions. - [DescribeKeyPairs](actions/describe-key-pairs.js#L4) - [DescribeRegions](actions/describe-regions.js#L4) - [DescribeSecurityGroups](actions/describe-security-groups.js#L4) -- [DescribeSubnets](../cross-services/wkflw-resilient-service/steps-deploy.js#L372) -- [DescribeVpcs](../cross-services/wkflw-resilient-service/steps-deploy.js#L357) +- [DescribeSubnets](../cross-services/wkflw-resilient-service/steps-deploy.js#L373) +- [DescribeVpcs](../cross-services/wkflw-resilient-service/steps-deploy.js#L358) - [DisassociateAddress](actions/disassociate-address.js#L4) - [MonitorInstances](actions/monitor-instances.js#L4) - [RebootInstances](actions/reboot-instances.js#L4) diff --git a/javascriptv3/example_code/elastic-load-balancing-v2/README.md b/javascriptv3/example_code/elastic-load-balancing-v2/README.md index 2685fb27a18..c25594d3cc9 100644 --- a/javascriptv3/example_code/elastic-load-balancing-v2/README.md +++ b/javascriptv3/example_code/elastic-load-balancing-v2/README.md @@ -38,11 +38,11 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas Code excerpts that show you how to call individual service functions. -- [CreateListener](../cross-services/wkflw-resilient-service/steps-deploy.js#L463) -- [CreateLoadBalancer](../cross-services/wkflw-resilient-service/steps-deploy.js#L435) -- [CreateTargetGroup](../cross-services/wkflw-resilient-service/steps-deploy.js#L402) -- [DeleteLoadBalancer](../cross-services/wkflw-resilient-service/steps-destroy.js#L293) -- [DeleteTargetGroup](../cross-services/wkflw-resilient-service/steps-destroy.js#L327) +- [CreateListener](../cross-services/wkflw-resilient-service/steps-deploy.js#L464) +- [CreateLoadBalancer](../cross-services/wkflw-resilient-service/steps-deploy.js#L436) +- [CreateTargetGroup](../cross-services/wkflw-resilient-service/steps-deploy.js#L403) +- [DeleteLoadBalancer](../cross-services/wkflw-resilient-service/steps-destroy.js#L296) +- [DeleteTargetGroup](../cross-services/wkflw-resilient-service/steps-destroy.js#L330) - [DescribeLoadBalancers](hello.js) - [DescribeTargetGroups](../cross-services/wkflw-resilient-service/steps-demo.js#L77) - [DescribeTargetHealth](../cross-services/wkflw-resilient-service/steps-demo.js#L86) diff --git a/javascriptv3/example_code/iam/README.md b/javascriptv3/example_code/iam/README.md index 46600afe6db..46b23f53ebc 100644 --- a/javascriptv3/example_code/iam/README.md +++ b/javascriptv3/example_code/iam/README.md @@ -51,7 +51,7 @@ Code excerpts that show you how to call individual service functions. - [DeleteAccessKey](actions/delete-access-key.js#L6) - [DeleteAccountAlias](actions/delete-account-alias.js#L6) - [DeleteGroup](actions/delete-group.js#L6) -- [DeleteInstanceProfile](../cross-services/wkflw-resilient-service/steps-destroy.js#L213) +- [DeleteInstanceProfile](../cross-services/wkflw-resilient-service/steps-destroy.js#L216) - [DeletePolicy](actions/delete-policy.js#L6) - [DeleteRole](actions/delete-role.js#L6) - [DeleteRolePolicy](actions/delete-role-policy.js#L6) From 819991f439fc5c3f691ca1ec8b417a32b5d9b6ac Mon Sep 17 00:00:00 2001 From: Laren-AWS <57545972+Laren-AWS@users.noreply.github.com> Date: Fri, 30 Aug 2024 08:10:24 -0700 Subject: [PATCH 56/98] SOS: Remove sdks and services.yaml because all tools now use the versions in -tools (#6795) Remove sdks and services.yaml because all tools now use the versions in -tools. --- .doc_gen/metadata/sdks.yaml | 380 ---- .doc_gen/metadata/services.yaml | 3316 ------------------------------- 2 files changed, 3696 deletions(-) delete mode 100644 .doc_gen/metadata/sdks.yaml delete mode 100644 .doc_gen/metadata/services.yaml diff --git a/.doc_gen/metadata/sdks.yaml b/.doc_gen/metadata/sdks.yaml deleted file mode 100644 index b9fa685c376..00000000000 --- a/.doc_gen/metadata/sdks.yaml +++ /dev/null @@ -1,380 +0,0 @@ -# zexi 0.4.0 -SAP ABAP: - property: sap-abap - sdk: - 1: - long: "&ABAPlong;" - short: "&ABAP;" - expanded: - long: "AWS SDK for SAP ABAP" - short: "SDK for SAP ABAP" - guide: "sdk-for-sapabap/latest/developer-guide/home.html" - api_ref: - uid: "SdkForABAP" - name: "&guide-abap-api;" - link_template: "sdk-for-sap-abap/v1/api/latest/index.html" - guide: "&guide-abap-dev;" -C++: - property: cpp - sdk: - 1: - long: "&CPPlong;" - short: "&CPP;" - expanded: - long: "AWS SDK for C++" - short: "SDK for C++" - guide: "sdk-for-cpp/v1/developer-guide/welcome.html" - api_ref: - uid: "SdkForCpp" - name: "&guide-cpp-api;" - guide: "&guide-cpp-dev;" -Go: - property: go - sdk: - 1: - long: "&Golong; V1" - short: "&Go; V1" - expanded: - long: "AWS SDK for Go V1" - short: "SDK for Go V1" - guide: "sdk-for-go/v1/developer-guide/welcome.html" - api_ref: - uid: "SdkForGoV1" - name: "&guide-go-api;" - 2: - long: "&Golong; V2" - short: "&Go; V2" - expanded: - long: "AWS SDK for Go V2" - short: "SDK for Go V2" - guide: "https://aws.github.io/aws-sdk-go-v2/docs/" - api_ref: - uid: "SdkForGoV2" - name: "&guide-go-api;" - link_template: "https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/{{.MappedService}}#Client.{{.Action}}" - service_map: - acm-pca: acmpca - alexa-for-business: alexaforbusiness - api-gateway: apigateway - application-autoscaling: applicationautoscaling - app-mesh: appmesh - application-auto-scaling: applicationautoscaling - application-discovery-service: applicationdiscoveryservice - auto-scaling: autoscaling - auto-scaling-plans: autoscalingplans - bedrock-runtime: bedrockruntime - bedrock-agent: bedrockagent - bedrock-agent-runtime: bedrockagentruntime - cloudsearch-domain: cloudsearchdomain - cloudwatch-events: cloudwatchevents - cloudwatch-logs: cloudwatchlogs - codeguru-reviewer: codegurureviewer - codestar-connections: codestarconnections - codestar-notifications: codestarnotifications - cognito-identity: cognitoidentity - cognito-identity-provider: cognitoidentityprovider - cognito-sync: cognitosync - config-service: configservice - cost-and-usage-report-service: costandusagereportservice - cost-explorer: costexplorer - data-pipeline: datapipeline - database-migration-service: databasemigrationservice - device-farm: devicefarm - direct-connect: directconnect - directory-service: directoryservice - dynamodb-streams: dynamodbstreams - ec2-instance-connect: ec2instanceconnect - ecr-public: ecrpublic - elastic-beanstalk: elasticbeanstalk - elastic-load-balancing: elasticloadbalancing - elastic-load-balancing-v2: elasticloadbalancingv2 - elastic-transcoder: elastictranscoder - elasticsearch-service: elasticsearchservice - emr-containers: emrcontainers - global-accelerator: globalaccelerator - iot-1click-devices-service: iot1clickdevicesservice - iot-1click-projects: iot1clickprojects - iot-data-plane: iotdataplane - iot-events: iotevents - iot-events-data: ioteventsdata - iot-jobs-data-plane: iotjobsdataplane - iot-wireless: iotwireless - ivs-realtime: ivsrealtime - kinesis-analytics-v2: kinesisanalyticsv2 - license-manager: licensemanager - marketplace-agreement: marketplaceagreement - marketplace-catalog: marketplacecatalog - mediapackage-vod: mediapackagevod - mediastore-data: mediastoredata - medical-imaging: medicalimaging - migration-hub: migrationhub - payment-cryptography: paymentcryptography - payment-cryptography-data: paymentcryptographydata - personalize-runtime: personalizeruntime - personalize-events: personalizeevents - pinpoint-email: pinpointemail - pinpoint-sms-voice: pinpointsmsvoice - rds-data: rdsdata - resource-explorer-2: resourceexplorer2 - resource-groups: resourcegroups - resource-groups-tagging-api: resourcegroupstaggingapi - route-53: route53 - route-53-domains: route53domains - route53-recovery-cluster: route53recoverycluster - s3-control: s3control - secrets-manager: secretsmanager - service-catalog: servicecatalog - service-catalog-appregistry: servicecatalogappregistry - service-quotas: servicequotas - ssm-contacts: ssmcontacts - ssm-incidents: ssmincidents - storage-gateway: storagegateway - transcribe-medical: transcribemedical - vpc-lattice: vpclattice - waf-regional: wafregional - guide: "&guide-go-dev;" -Java: - property: java - sdk: - 1: - long: "&Javalong; 1.x" - short: "&Java; 1.x" - expanded: - long: "AWS SDK for Java 1.x" - short: "SDK for Java 1.x" - guide: "sdk-for-java/v1/developer-guide/welcome.html" - 2: - long: "&JavaV2long;" - short: "&JavaV2;" - expanded: - long: "AWS SDK for Java 2.x" - short: "SDK for Java 2.x" - guide: "sdk-for-java/latest/developer-guide/home.html" - bookmark: readme - api_ref: - uid: "SdkForJavaV2" - name: "&guide-javaV2-api;" - guide: "&guide-javaV2-dev;" -JavaScript: - property: javascript - sdk: - 2: - long: "&JSBlong; (v2)" - short: "&JSB; (v2)" - expanded: - long: "AWS SDK for JavaScript (v2)" - short: "SDK for JavaScript (v2)" - guide: "sdk-for-javascript/v2/developer-guide/welcome.html" - api_ref: - uid: "AWSJavaScriptSDK" - name: "&guide-jsb-api;" - 3: - long: "&JSBlong; (v3)" - short: "&JSB; (v3)" - expanded: - long: "AWS SDK for JavaScript (v3)" - short: "SDK for JavaScript (v3)" - guide: "sdk-for-javascript/v3/developer-guide/welcome.html" - api_ref: - uid: "AWSJavaScriptSDKV3" - name: "&guide-jsb-api;" - link_template: "AWSJavaScriptSDK/v3/latest/client/{{.Service}}/command/{{.Action}}Command" - guide: "&guide-jsb-dev;" -Kotlin: - property: kotlin - sdk: - 1: - long: "&Kotlinlong;" - short: "&Kotlin;" - expanded: - long: "AWS SDK for Kotlin" - short: "SDK for Kotlin" - guide: "sdk-for-kotlin/latest/developer-guide/home.html" - api_ref: - uid: "SdkForKotlinV1" - name: "&guide-kotlin-api;" - link_template: "https://sdk.amazonaws.com/kotlin/api/latest/index.html" - guide: "&guide-kotlin-dev;" -.NET: - property: csharp - sdk: - 3: - long: "&NETlong;" - short: "&NET;" - expanded: - long: "AWS SDK for .NET" - short: "SDK for .NET" - guide: "sdk-for-net/v3/developer-guide/welcome.html" - api_ref: - uid: "DotNetSDKV3" - name: "&guide-net-api;" - guide: "&guide-net-dev;" -PHP: - property: php - sdk: - 3: - long: "&PHPlong;" - short: "&PHP;" - expanded: - long: "AWS SDK for PHP" - short: "SDK for PHP" - guide: "sdk-for-php/v3/developer-guide/welcome.html" - api_ref: - uid: "SdkForPHPV3" - name: "&guide-php-api;" - guide: "&guide-php-dev;" -PowerShell: - property: powershell - sdk: - 4: - long: "&TWPALLlong;" - short: "&TWPALL;" - expanded: - long: "AWS Tools for PowerShell" - short: "Tools for PowerShell" - guide: "powershell/latest/userguide/pstools-welcome.html" - api_ref: - uid: "ToolsForPowerShell4" - name: "&guide-twp-ref;" - link_template: "https://docs.aws.amazon.com/powershell/latest/reference" - guide: "&guide-twp-ug;" -Python: - property: python - sdk: - 3: - long: "&Python3long;" - short: "&Python3;" - expanded: - long: "AWS SDK for Python (Boto3)" - short: "SDK for Python" - guide: "https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html" - api_ref: - uid: "boto3" - name: "&guide-python3-api;" - guide: "&guide-python3-gsg;" -Ruby: - property: ruby - sdk: - 3: - long: "&Rubylong;" - short: "&Ruby;" - expanded: - long: "AWS SDK for Ruby" - short: "SDK for Ruby" - guide: "sdk-for-ruby/v3/developer-guide/welcome.html" - api_ref: - uid: "SdkForRubyV3" - name: "&guide-ruby-api;" - guide: "&guide-ruby-dev;" -Rust: - property: rust - sdk: - 1: - long: "&Rustlong;" - short: "&Rust;" - expanded: - long: "AWS SDK for Rust" - short: "SDK for Rust" - guide: "sdk-for-rust/latest/dg/welcome.html" - api_ref: - uid: "SdkForRustV1" - name: "&guide-rust-api;" - # https://docs.rs/aws-sdk-apigateway/latest/aws_sdk_apigateway/client/struct.Client.html#method.get_rest_apis - link_template: "https://docs.rs/aws-sdk-{{.ServiceCollapsed}}/latest/aws_sdk_{{.ServiceCollapsed}}/client/struct.Client.html#method.{{.ActionSnake}}" - guide: "&guide-rust-dev;" -Swift: - property: swift - sdk: - 1: - long: "&Swiftlong;" - short: "&Swift;" - caveat: "This is prerelease documentation for an SDK in preview release. It is subject to change." - expanded: - long: "AWS SDK for Swift" - short: "SDK for Swift" - guide: "sdk-for-swift/latest/developer-guide/home.html" - api_ref: - uid: "SdkForSwift" - name: "&guide-swift-api;" - link_template: "https://awslabs.github.io/aws-sdk-swift/reference/0.x" - guide: "&guide-swift-dev;" -CLI: - property: cli - syntax: cli - sdk: - 2: - long: "&CLIlong;" - short: "&CLI;" - expanded: - long: "AWS Command Line Interface" - short: "AWS CLI" - guide: "cli/latest/userguide/cli-chap-welcome.html" - title_override: - title: "&CLI; command examples" - title_abbrev: "Command examples" - api_ref: - uid: "aws-cli" - name: "&guide-cli-ref;" - link_template: "https://awscli.amazonaws.com/v2/documentation/api/latest/reference/{{.MappedService}}/{{.ActionKebab}}.html" - service_map: - api-gateway: apigateway - application-auto-scaling: application-autoscaling - app-mesh: appmesh - auto-scaling: autoscaling - auto-scaling-plans: autoscaling-plans - cost-explorer: ce - cloudsearch-domain: cloudsearchdomain - cognito-identity-provider: cognito-idp - config-service: configservice - cost-and-usage-report-service: cur - data-pipeline: datapipeline - codedeploy: deploy - device-farm: devicefarm - direct-connect: directconnect - application-discovery-service: discovery - database-migration-service: dms - directory-service: ds - dynamodb-streams: dynamodbstreams - elastic-beanstalk: elasticbeanstalk - elastic-transcoder: elastictranscoder - elastic-load-balancing: elb - elastic-load-balancing-v2: elbv2 - elasticsearch-service: es - eventbridge: events - global-accelerator: globalaccelerator - iot-data-plane: iot-data - iot-jobs-data-plane: iot-jobs-data - iot-1click-devices-service: iot1click-devices - iot-1click-projects: iot1click-projects - iot-events: iotevents - iot-events-data: iotevents-data - iot-wireless: iotwireless - cloudwatch-logs: logs - resource-groups-tagging-api: resourcegroupstaggingapi - route-53: route53 - route-53-domains: route53domains - s3: s3api - s3-control: s3control - secrets-manager: secretsmanager - serverlessapplicationrepository: serverlessrepo - service-catalog: servicecatalog - service-catalog-appregistry: servicecatalog-appregistry - storage-gateway: storagegateway - guide: "&guide-cli-ug;" -Bash: - property: bash - sdk: - 2: - long: "&Bashlong;" - short: "&Bash;" - expanded: - long: "AWS Command Line Interface with Bash script" - short: "AWS CLI with Bash script" - guide: "cli/latest/userguide/cli-chap-welcome.html" - title_override: - title: "&Bash; code examples" - title_abbrev: "Bash script examples" - api_ref: - uid: "aws-cli" - name: "&guide-cli-ref;" - guide: "&guide-cli-ug;" diff --git a/.doc_gen/metadata/services.yaml b/.doc_gen/metadata/services.yaml deleted file mode 100644 index 7b6854b0690..00000000000 --- a/.doc_gen/metadata/services.yaml +++ /dev/null @@ -1,3316 +0,0 @@ -accessanalyzer: - long: '&iam-citadel-long;' - short: '&iam-citadel;' - sort: IAM Access Analyzer - expanded: - long: AWS Identity and Access Management Access Analyzer - short: IAM Access Analyzer - blurb: helps you identify the resources in your organization and accounts, such as Amazon S3 buckets or IAM roles, shared with an external entity. - guide: - subtitle: User Guide - url: IAM/latest/UserGuide/what-is-access-analyzer.html - api_ref: access-analyzer/latest/APIReference/Welcome.html - tags: - product_categories: {'Security, Identity, & Compliance'} - version: accessanalyzer-2019-11-01 -acm: - long: '&ACMlong; (&ACM;)' - short: '&ACM;' - sort: ACM - expanded: - long: AWS Certificate Manager (ACM) - short: ACM - blurb: helps you to provision, manage, and renew publicly trusted TLS certificates on AWS based websites. - guide: - subtitle: User Guide - url: acm/latest/userguide/acm-overview.html - api_ref: acm/latest/APIReference/Welcome.html - tags: - product_categories: {'Security, Identity, & Compliance'} - version: acm-2015-12-08 -acm-pca: - api_ref: privateca/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Private Certificate Authority - short: AWS Private CA - guide: - subtitle: User Guide - url: privateca/latest/userguide/PcaWelcome.html - long: '&PCAlong;' - short: '&PCA;' - sort: Private CA - tags: - product_categories: {} - version: '2017-08-22' -alexa-for-business: - api_ref: alexa-for-business/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Alexa For Business - short: Alexa for Business - guide: - subtitle: Developer Guide - url: alexa-for-business/latest/dev/what-is.html - long: '&ABUSlong;' - short: '&ABUS;' - sort: Alexa for Business - tags: - product_categories: {} - version: '2017-11-09' -api-gateway: - long: '&ABPlong;' - short: '&ABP;' - sort: API Gateway - expanded: - long: Amazon API Gateway - short: API Gateway - blurb: enables you to create and deploy your own REST and WebSocket APIs at any scale. - guide: - subtitle: Developer Guide - url: apigateway/latest/developerguide/welcome.html - api_ref: apigateway/latest/api/API_Operations.html - tags: - product_categories: {'Networking & Content Delivery'} - version: apigateway-2015-07-09 -apigatewaymanagementapi: - long: '&ABPMAlong;' - short: '&ABPMA;' - sort: API Gateway Management - expanded: - long: Amazon API Gateway Management API - short: API Gateway Management API - blurb: allows you to directly manage runtime aspects of your deployed APIs. - guide: - subtitle: Developer Guide - url: apigateway/latest/developerguide/welcome.html - api_ref: apigateway/latest/api/API_Operations.html - tags: - product_categories: {'Networking & Content Delivery'} - version: apigatewaymanagementapi-2018-11-29 -apigatewayv2: - api_ref: apigateway/latest/developerguide/welcome.html - blurb: '' - expanded: - long: Amazon API Gateway HTTP and WebSocket API - short: API Gateway HTTP and WebSocket API - guide: - subtitle: Developer Guide - url: apigatewayv2/latest/api-reference/apis-apiid-models-modelid.html - long: '&ABPV2long;' - short: '&ABPV2;' - sort: API Gateway HTTP and WebSocket API - tags: - product_categories: {'Networking & Content Delivery'} - version: '2018-11-29' -application-auto-scaling: - long: '&APP-ASlong;' - short: '&APP-AS;' - sort: Application Auto Scaling - expanded: - long: AWS Application Auto Scaling - short: Application Auto Scaling - blurb: configures auto scaling for resources beyond just EC2, either with scaling policies or with scheduled scaling. - guide: - subtitle: User Guide - url: autoscaling/application/userguide/what-is-application-auto-scaling.html - api_ref: autoscaling/application/APIReference/Welcome.html - tags: - product_categories: {'Management & Governance'} - version: application-autoscaling-2016-02-06 -app-mesh: - api_ref: app-mesh/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS App Mesh - short: App Mesh - guide: - subtitle: User Guide - url: app-mesh/latest/userguide/what-is-app-mesh.html - long: '&MESHlong;' - short: '&MESH;' - sort: App Mesh - tags: - product_categories: {} - version: '2019-01-25' -appconfig: - api_ref: appconfig/2019-10-09/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS AppConfig - short: AWS AppConfig - guide: - subtitle: User Guide - url: appconfig/latest/userguide/what-is-appconfig.html - long: '&APPClong;' - short: '&APPC;' - sort: AppConfig - tags: - product_categories: {} - version: '2019-10-09' -application-discovery-service: - api_ref: application-discovery/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Application Discovery Service - short: Application Discovery Service - guide: - subtitle: User Guide - url: application-discovery/latest/userguide/what-is-appdiscovery.html - long: '&APP-DSlong;' - short: '&APP-DS;' - sort: Application Discovery Service - tags: - product_categories: {} - version: '2015-11-01' -apprunner: - api_ref: apprunner/latest/api/Welcome.html - blurb: '' - expanded: - long: AWS App Runner - short: App Runner - guide: - subtitle: Developer Guide - url: apprunner/latest/dg/what-is-apprunner.html - long: '&ARlong;' - short: '&AR;' - sort: App Runner - tags: - product_categories: {} - version: '2020-05-15' -appstream: - long: '&AAS2long;' - short: '&AAS2;' - sort: AppStream - expanded: - long: Amazon AppStream - short: Amazon AppStream - blurb: provides secure, reliable, and scalable access to applications and non-persistent desktops from any location. - guide: - subtitle: Developer Guide - url: appstream2/latest/developerguide/what-is-appstream.html - api_ref: appstream2/latest/APIReference/Welcome.html - tags: - product_categories: {'End User Computing'} - version: appstream-2016-12-01 -athena: - api_ref: athena/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Athena - short: Athena - guide: - subtitle: User Guide - url: athena/latest/ug/what-is.html - long: '&ATElong;' - short: '&ATE;' - sort: Athena - tags: - product_categories: {} - version: '2017-05-18' -auditmanager: - long: '&AMlong;' - short: '&AM;' - sort: Audit Manager - expanded: - long: AWS Audit Manager - short: Audit Manager - blurb: helps you continuously audit your AWS usage to simplify how you manage risk and compliance with regulations and industry standards. - guide: - subtitle: User Guide - url: audit-manager/latest/userguide/what-is.html - api_ref: audit-manager/latest/APIReference/Welcome.html - tags: - product_categories: {'Security, Identity, & Compliance'} - version: auditmanager-2017-07-25 -aurora: - long: '&AURlong;' - short: '&AUR;' - sort: Aurora - expanded: - long: Amazon Aurora - short: Aurora - blurb: is a fully managed relational database engine that's built for the cloud and compatible with MySQL and PostgreSQL. Amazon Aurora is part of Amazon Relational Database Service (Amazon RDS). - guide: - subtitle: User Guide - url: AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html - tags: - product_categories: {'Databases'} - api_client: rds - version: rds-2014-10-31 - api_ref: AmazonRDS/latest/APIReference/Welcome.html -auto-scaling: - long: '&ASlong;' - short: '&AS;' - sort: Auto Scaling - expanded: - long: Amazon EC2 Auto Scaling - short: Auto Scaling - blurb: automatically scales EC2 instances, either with scaling - policies or with scheduled scaling. - guide: - subtitle: User Guide - url: autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html - tags: - product_categories: {'Management & Governance'} - version: autoscaling-2011-01-01 - api_ref: autoscaling/ec2/APIReference/Welcome.html -auto-scaling-plans: - api_ref: autoscaling/plans/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Auto Scaling Plans - short: Auto Scaling Plans - guide: - subtitle: User Guide - url: autoscaling/plans/userguide/what-is-a-scaling-plan.html - long: '&AWS-ASPlanslong;' - short: '&AWS-ASPlans;' - sort: Auto Scaling Plans - tags: - product_categories: {} - version: '2018-01-06' -backup: - api_ref: aws-backup/latest/devguide/api-reference.html - blurb: '' - expanded: - long: AWS Backup - short: AWS Backup - guide: - subtitle: Developer Guide - url: aws-backup/latest/devguide/whatisbackup.html - long: '&BKPlong;' - short: '&BKP;' - sort: Backup - tags: - product_categories: {} - version: '2018-11-15' -batch: - long: '&BATCHlong;' - short: '&BATCH;' - sort: Batch - expanded: - long: AWS Batch - short: AWS Batch - blurb: enables you to run batch computing workloads on the AWS Cloud. - guide: - subtitle: User Guide - url: batch/latest/userguide/what-is-batch.html - api_ref: batch/latest/APIReference/Welcome.html - tags: - product_categories: {'Compute'} - version: batch-2016-08-10 -bedrock: - bundle: bedrock - long: '&BRlong;' - short: '&BR;' - sort: Bedrock1 - expanded: - long: Amazon Bedrock - short: Amazon Bedrock - blurb: enables you to build and scale generative AI applications with foundation models. - guide: - subtitle: User Guide - url: bedrock/latest/userguide/what-is-bedrock.html - api_ref: bedrock/latest/APIReference/welcome.html - tags: - product_categories: {'Machine Learning & AI', 'Generative AI'} - version: bedrock-2023-04-20 -bedrock-runtime: - bundle: bedrock - long: '&BRRUNlong;' - short: '&BRRUN;' - sort: Bedrock2 - expanded: - long: Amazon Bedrock Runtime - short: Amazon Bedrock Runtime - blurb: is a fully managed service that makes it easy to use foundation models from third-party providers and Amazon. - guide: - subtitle: User Guide - url: bedrock/latest/userguide/what-is-bedrock.html - api_ref: bedrock/latest/APIReference/welcome.html - tags: - product_categories: {'Machine Learning & AI', 'Generative AI'} - version: bedrock-runtime-2023-09-30 -bedrock-agent: - bundle: bedrock - long: '&BRAlong;' - short: '&BRA;' - sort: Bedrock3 - expanded: - long: Agents for Amazon Bedrock - short: Agents for Amazon Bedrock - blurb: offer you the ability to build and configure autonomous agents in your application. - guide: - subtitle: User Guide - url: bedrock/latest/userguide/agents.html - api_ref: bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock.html - tags: - product_categories: {'Machine Learning & AI', 'Generative AI'} - version: bedrock-agent-2023-12-12 -bedrock-agent-runtime: - bundle: bedrock - long: '&BRARUNlong;' - short: '&BRARUN;' - sort: Bedrock4 - expanded: - long: Agents for Amazon Bedrock Runtime - short: Agents for Amazon Bedrock Runtime - blurb: offers you the ability to run autonomous agents in your application. - guide: - subtitle: User Guide - url: bedrock/latest/userguide/agents.html - api_ref: bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock_Runtime.html - tags: - product_categories: {'Machine Learning & AI', 'Generative AI'} - version: bedrock-agent-runtime-2023-12-12 -budgets: - api_ref: aws-cost-management/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Budgets - short: AWS Budgets - guide: - subtitle: Developer Guide - url: cost-management/latest/userguide/budgets-managing-costs.html - long: '&Budgetslong;' - short: '&Budgetslong;' - sort: Budgets - tags: - product_categories: {} - version: '2016-10-20' -chime: - api_ref: chime/latest/APIReference/welcome.html - blurb: '' - expanded: - long: Amazon Chime - short: Amazon Chime - guide: - subtitle: User Guide - url: chime/latest/ug/what-is-chime.html - long: '&CHMlong;' - short: '&CHM;' - sort: Chime - tags: - product_categories: {} - version: '2018-05-01' -cloud9: - api_ref: cloud9/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Cloud9 - short: AWS Cloud9 - guide: - subtitle: User Guide - url: cloud9/latest/user-guide/welcome.html - long: '&AC9long;' - short: '&AC9;' - sort: Cloud9 - tags: - product_categories: {} - version: '2017-09-23' -cloudcontrol: - api_ref: cloudcontrolapi/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Cloud Control API - short: Cloud Control API - guide: - subtitle: Developer Guide - url: cloudcontrolapi/latest/userguide/what-is-cloudcontrolapi.html - long: '&CCAPIlong;' - short: '&CCAPI;' - sort: Cloud Control API - tags: - product_categories: {} - version: '2021-09-30' -cloudformation: - long: '&CFNlong;' - short: '&CFN;' - sort: CloudFormation - expanded: - long: AWS CloudFormation - short: CloudFormation - blurb: enables you to create and provision AWS infrastructure deployments predictably and repeatedly. - guide: - subtitle: User Guide - url: AWSCloudFormation/latest/UserGuide/Welcome.html - api_ref: AWSCloudFormation/latest/APIReference/Welcome.html - tags: - product_categories: {'Management & Governance'} - version: cloudformation-2010-05-15 -cloudfront: - long: '&CFlong;' - short: '&CF;' - sort: CloudFront - expanded: - long: Amazon CloudFront - short: CloudFront - blurb: speeds up distribution of your static and dynamic web content, such as .html, .css, .php, image, and media files. - guide: - subtitle: Developer Guide - url: AmazonCloudFront/latest/DeveloperGuide/Introduction.html - api_ref: cloudfront/latest/APIReference/Welcome.html - tags: - product_categories: {'Networking & Content Delivery'} - version: cloudfront-2020-05-31 -cloudsearch-domain: - api_ref: cloudsearch/latest/developerguide/search-api.html - blurb: '' - expanded: - long: Amazon CloudSearch - short: Amazon CloudSearch - guide: - subtitle: Developer Guide - url: cloudsearch/latest/developerguide/search-api.html - long: '&CSlong;' - short: '&CS;' - sort: Cloudsearch - tags: - product_categories: {} - version: '2013-01-01' -cloudtrail: - api_ref: awscloudtrail/latest/APIReference/Welcome.html - blurb: helps you monitor your AWS deployments in the cloud by getting a history of AWS API calls for your account. - expanded: - long: AWS CloudTrail - short: CloudTrail - guide: - subtitle: Developer Guide - url: awscloudtrail/latest/userguide/cloudtrail-user-guide.html - long: '&CTlong;' - short: '&CT;' - sort: CloudTrail - tags: - product_categories: {} - version: '2013-11-01' -cloudwatch: - long: '&CWlong;' - short: '&CW;' - sort: CloudWatch - expanded: - long: Amazon CloudWatch - short: CloudWatch - blurb: provides a reliable, scalable, and flexible monitoring solution that you can start using within minutes. - guide: - subtitle: User Guide - url: AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html - api_ref: AmazonCloudWatch/latest/APIReference/Welcome.html - tags: - product_categories: {'Management & Governance'} - version: monitoring-2010-08-01 -cloudwatch-events: - long: '&CWElong;' - short: '&CWE;' - sort: CloudWatch Events - expanded: - long: Amazon CloudWatch Events - short: CloudWatch Events - blurb: send system events from AWS resources to AWS Lambda functions, Amazon Simple Notification Service topics, streams in Amazon Kinesis, and other target types. - guide: - subtitle: User Guide - url: AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html - api_ref: eventbridge/latest/APIReference/Welcome.html - tags: - product_categories: {'Management & Governance'} - version: monitoring-2010-08-01 -cloudwatch-logs: - long: '&CWLlong;' - short: '&CWL;' - sort: CloudWatch Logs - expanded: - long: Amazon CloudWatch Logs - short: CloudWatch Logs - blurb: monitor, store, and access your log files from Amazon Elastic Compute Cloud instances, AWS CloudTrail, or other sources. - guide: - subtitle: User Guide - url: AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html - api_ref: AmazonCloudWatchLogs/latest/APIReference/Welcome.html - tags: - product_categories: {'Management & Governance'} - version: logs-2014-03-28 -codeartifact: - api_ref: codeartifact/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: CodeArtifact - short: CodeArtifact - guide: - subtitle: User Guide - url: codeartifact/latest/ug/welcome.html - long: '&ACAlong;' - short: '&ACA;' - sort: CodeArtifact - tags: - product_categories: {} - version: '2018-09-22' -codebuild: - long: '&ACBlong;' - short: '&ACB;' - sort: CodeBuild - expanded: - long: AWS CodeBuild - short: CodeBuild - blurb: compiles your source code, runs unit tests, and produces artifacts that are ready to deploy. - guide: - subtitle: User Guide - url: codebuild/latest/userguide/welcome.html - api_ref: codebuild/latest/APIReference/Welcome.html - tags: - product_categories: {'Developer Tools'} - version: codebuild-2016-10-06 -codecommit: - api_ref: codecommit/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS CodeCommit - short: CodeCommit - guide: - subtitle: User Guide - url: codecommit/latest/userguide/welcome.html - long: '&ACClong;' - short: '&ACC;' - sort: CodeCommit - tags: - product_categories: {} - version: '2015-04-13' -codedeploy: - api_ref: codedeploy/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS CodeDeploy - short: CodeDeploy - guide: - subtitle: Developer Guide - url: codedeploy/latest/userguide/welcome.html - long: '&ACDlong;' - short: '&ACD;' - sort: CodeDeploy - tags: - product_categories: {} - version: '2014-10-06' -codeguru-reviewer: - api_ref: codeguru/latest/reviewer-api/Welcome.html - blurb: '' - expanded: - long: Amazon CodeGuru Reviewer - short: CodeGuru Reviewer - guide: - subtitle: User Guide - url: codeguru/latest/reviewer-ug/welcome.html - long: '&ACRElong;' - short: '&ACRE;' - sort: CodeGuru Reviewer - tags: - product_categories: {} - version: '2019-09-19' -codepipeline: - api_ref: codepipeline/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS CodePipeline - short: CodePipeline - guide: - subtitle: User Guide - url: codepipeline/latest/userguide/welcome.html - long: '&ACPlong;' - short: '&ACP;' - sort: CodePipeline - tags: - product_categories: {} - version: '2015-07-09' -codestar: - api_ref: codestar/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS CodeStar - short: AWS CodeStar - guide: - subtitle: User Guide - url: codestar/latest/userguide/welcome.html - long: '&ACSlong;' - short: '&ACS;' - sort: CodeStar - tags: - product_categories: {} - version: '2017-04-19' -codestar-connections: - api_ref: codestar-connections/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS CodeStar Connections - short: AWS CodeStar Connections - guide: - subtitle: Developer Guide - url: dtconsole/latest/userguide/welcome-connections.html - long: '&CSClong;' - short: '&CSC;' - sort: CodeStart Connections - tags: - product_categories: {} - version: '2019-12-01' -codestar-notifications: - api_ref: codestar-notifications/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS CodeStar Notifications - short: AWS CodeStar Notifications - guide: - subtitle: Developer Guide - url: dtconsole/latest/userguide/welcome.html - long: '&CSNlong;' - short: '&CSN;' - sort: CodeStar Notifications - tags: - product_categories: {} - version: '2019-10-15' -cognito: - long: '&COGlong;' - short: '&COG;' - sort: Cognito - expanded: - long: Amazon Cognito - short: Amazon Cognito - blurb: handles user authentication and authorization for your web and mobile apps. - guide: - subtitle: Landing Page - url: cognito/ - api_ref: cognito/ - tags: - product_categories: {'Security, Identity, & Compliance'} - version: cognito-idp-2016-04-18 -cognito-identity: - bundle: cognito - long: '&COGID;' - short: '&COGID;' - sort: Cognito Identity - expanded: - long: Amazon Cognito Identity - short: Amazon Cognito Identity - blurb: enables you to create unique identities for your users and federate them with identity providers. - guide: - subtitle: Developer Guide - url: cognito/latest/developerguide/cognito-identity.html - api_ref: cognitoidentity/latest/APIReference/Welcome.html - tags: - product_categories: {'Security, Identity, & Compliance'} - version: cognito-identity-2014-06-30 -cognito-identity-provider: - bundle: cognito - long: '&COGIDP;' - short: '&COGIDP;' - sort: Cognito Identity Provider - expanded: - long: Amazon Cognito Identity Provider - short: Amazon Cognito Identity Provider - blurb: handles user authentication and authorization for your web and mobile apps. - guide: - subtitle: Developer Guide - url: cognito/latest/developerguide/cognito-user-identity-pools.html - tags: - product_categories: {'Security, Identity, & Compliance'} - version: cognito-idp-2016-04-18 - api_ref: cognito-user-identity-pools/latest/APIReference/Welcome.html -cognito-sync: - bundle: cognito - long: '&COGSYNClong;' - short: '&COGSYNC;' - sort: Cognito Sync - expanded: - long: Amazon Cognito Sync - short: Amazon Cognito Sync - blurb: makes it possible to sync application-related user data across devices. - guide: - subtitle: Developer Guide - url: cognito/latest/developerguide/cognito-sync.html - api_ref: cognitosync/latest/APIReference/Welcome.html - tags: - product_categories: {'Security, Identity, & Compliance'} - version: cognito-sync-2014-06-30 -comprehend: - long: '&CMPlong;' - short: '&CMP;' - sort: Comprehend - expanded: - long: Amazon Comprehend - short: Amazon Comprehend - blurb: uses natural language processing (NLP) to extract insights about the content of documents without the need of any special preprocessing. - guide: - subtitle: Developer Guide - url: comprehend/latest/dg/what-is.html - api_ref: comprehend/latest/APIReference/welcome.html - tags: - product_categories: {'Machine Learning & AI'} - version: comprehend-2017-11-27 -comprehendmedical: - api_ref: comprehend-medical/latest/api/Welcome.html - blurb: '' - expanded: - long: AWS Comprehend Medical - short: AWS Comprehend Medical - guide: - subtitle: Developer Guide - url: comprehend-medical/latest/dev/comprehendmedical-welcome.html - long: '&CMPMlong;' - short: '&CMPM;' - sort: Comprehend Medical - tags: - product_categories: {} - version: '2018-10-30' -config-service: - long: '&CClong;' - short: '&CC;' - sort: Config - expanded: - long: AWS Config - short: AWS Config - blurb: provides a detailed view of the resources associated with your AWS account, including how they are configured, - how they are related to one another, and how the configurations and their relationships have changed over time. - guide: - subtitle: Developer Guide - url: config/latest/developerguide/WhatIsConfig.html - api_ref: config/latest/APIReference/Welcome.html - tags: - product_categories: {'Management & Governance'} - version: config-2014-11-12 -connect: - api_ref: connect/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Connect - short: Amazon Connect - guide: - subtitle: Administrator Guide - url: connect/latest/adminguide/what-is-amazon-connect.html - long: '&CONlong;' - short: '&CON;' - sort: Connect - tags: - product_categories: {} - version: '2017-08-08' -cost-and-usage-report-service: - api_ref: aws-cost-management/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Cost and Usage Report - short: AWS Cost and Usage Report - guide: - subtitle: User Guide - url: cur/latest/userguide/what-is-cur.html - long: '&CURlong;' - short: '&CURlong;' - sort: Cost and Usage Report - tags: - product_categories: {} - version: '2017-01-06' -cost-explorer: - api_ref: aws-cost-management/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Cost Explorer Service - short: Cost Explorer Service - guide: - subtitle: User Guide - url: cost-management/latest/userguide/what-is-costmanagement.html - long: '&AWSCostExplorerServicelong;' - short: '&AWSCostExplorerService;' - sort: Cost Explorer Service - tags: - product_categories: {} - version: '2017-10-25' -data-pipeline: - api_ref: datapipeline/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Data Pipeline - short: AWS Data Pipeline - guide: - subtitle: Developer Guide - url: datapipeline/latest/DeveloperGuide/what-is-datapipeline.html - long: '&AWSDPlong;' - short: '&AWSDP;' - sort: Data Pipeline - tags: - product_categories: {} - version: '2012-10-29' -database-migration-service: - api_ref: dms/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Database Migration Service - short: AWS DMS - guide: - subtitle: Developer Guide - url: dms/latest/userguide/Welcome.html - long: '&DMSlong;' - short: '&DMS;' - sort: DMS - tags: - product_categories: {} - version: '2016-01-01' -datasync: - api_ref: datasync/latest/userguide/API_Reference.html - blurb: is an online data movement and discovery service that simplifies data migration and helps you quickly, easily, and securely transfer your file or object data to, from, and between AWS storage services. - expanded: - long: AWS DataSync - short: DataSync - guide: - subtitle: User Guide - url: datasync/latest/userguide/what-is-datasync.html - long: '&DSYlong;' - short: '&DSY;' - sort: DataSync - tags: - product_categories: {} - version: '2018-11-09' -dax: - api_ref: amazondynamodb/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: DynamoDB Accelerator - short: DAX - guide: - subtitle: Developer Guide - url: amazondynamodb/latest/developerguide/DAX.html - long: '&DAXlong;' - short: '&DAX;' - sort: DAX - tags: - product_categories: {} - version: '2017-04-19' -detective: - api_ref: detective/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Detective - short: Detective - guide: - subtitle: User Guide - url: detective/latest/userguide/detective-investigation-about.html - long: '&DETlong;' - short: '&DET;' - sort: Detective - tags: - product_categories: {} - version: '2018-10-26' -device-farm: - long: '&ATPlong;' - short: '&ATP;' - sort: Device Farm - expanded: - long: AWS Device Farm - short: Device Farm - blurb: is an app testing service that enables you to test your iOS, Android and Fire OS apps on real, physical phones and tablets that are hosted by AWS. - guide: - subtitle: Developer Guide - url: devicefarm/latest/developerguide/welcome.html - api_ref: devicefarm/latest/APIReference/Welcome.html - tags: - product_categories: {'Front-End Web & Mobile'} - version: devicefarm-2015-06-23 -direct-connect: - api_ref: directconnect/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Direct Connect - short: AWS Direct Connect - guide: - subtitle: User Guide - url: directconnect/latest/UserGuide/Welcome.html - long: '&AWS-DC-long;' - short: '&AWS-DC;' - sort: Direct Connect - tags: - product_categories: {} - version: '2012-10-25' -directory-service: - api_ref: directoryservice/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Directory Service - short: AWS Directory Service - guide: - subtitle: Administration Guide - url: directoryservice/latest/admin-guide/what_is.html - long: '&ADSlong;' - short: '&ADS;' - sort: Directory Service - tags: - product_categories: {} - version: '2015-04-16' -dlm: - api_ref: dlm/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Data Lifecycle Manager - short: Amazon Data Lifecycle Manager - guide: - subtitle: Developer Guide - url: AWSEC2/latest/UserGuide/snapshot-lifecycle.html - long: '&DLMlong;' - short: '&DLM;' - sort: Data Lifecycle Manager - tags: - product_categories: {} - version: '2018-01-12' -docdb: - api_ref: documentdb/latest/developerguide/api-reference.html - blurb: '' - expanded: - long: Amazon DocumentDB (with MongoDB compatibility) - short: Amazon DocumentDB - guide: - subtitle: Developer Guide - url: documentdb/latest/developerguide/what-is.html - long: '&DocDBlong;' - short: '&DocDB;' - sort: DocumentDB - tags: - product_categories: {} - version: '2014-10-31' -dynamodb: - long: '&DDBlong;' - short: '&DDB;' - sort: DynamoDB - expanded: - long: Amazon DynamoDB - short: DynamoDB - blurb: is a fully managed NoSQL database service that provides fast and predictable performance with seamless scalability. - guide: - subtitle: Developer Guide - url: amazondynamodb/latest/developerguide/Introduction.html - api_ref: amazondynamodb/latest/APIReference/Welcome.html - tags: - product_categories: {'Databases'} - version: dynamodb-2012-08-10 -dynamodb-streams: - api_ref: dynamodb-streams/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon DynamoDB Streams - short: DynamoDB Streams - guide: - subtitle: Developer Guide - url: amazondynamodb/latest/APIReference/Welcome.html - long: '&DSlong;' - short: '&DS;' - sort: DynamoDB Streams - tags: - product_categories: {} - version: '2012-08-10' -ebs: - long: '&EBSlong; (&EBS;)' - short: '&EBS;' - sort: EBS - expanded: - long: Amazon Elastic Block Store (Amazon EBS) - short: Amazon EBS - blurb: is a web service that provides block level storage volumes for use with Amazon Elastic Compute Cloud instances. - guide: - subtitle: User Guide - url: AWSEC2/latest/UserGuide/AmazonEBS.html - api_ref: AWSEC2/latest/APIReference/OperationList-query-ebs.html - tags: - product_categories: {'Storage'} - version: ebs-2019-11-02 -ec2: - long: '&EC2long; (&EC2;)' - short: '&EC2;' - sort: EC2 - expanded: - long: Amazon Elastic Compute Cloud (Amazon EC2) - short: Amazon EC2 - blurb: is a web service that provides resizable computing capacity—literally, servers in Amazon's data centers—that - you use to build and host your software systems. - guide: - subtitle: User Guide - url: AWSEC2/latest/UserGuide/concepts.html - api_ref: AWSEC2/latest/APIReference/Welcome.html - tags: - product_categories: {'Compute'} - version: ec2-2016-11-15 -ec2-instance-connect: - api_ref: ec2-instance-connect/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon EC2 Instance Connect - short: Amazon EC2 Instance Connect - guide: - subtitle: Developer Guide - url: AWSEC2/latest/UserGuide/connect-linux-inst-eic.html - long: '&EC2InstConnlong;' - short: '&EC2InstConn;' - sort: EC2 Instance Connect - tags: - product_categories: {} - version: '2018-04-02' -ecr: - long: '&ECRlong; (&ECR;)' - short: '&ECR;' - sort: ECR - expanded: - long: Amazon Elastic Container Registry (Amazon ECR) - short: Amazon ECR - blurb: is a fully managed Docker container registry that makes it easy for developers to store, manage, and deploy Docker container images. - guide: - subtitle: User Guide - url: AmazonECR/latest/userguide/what-is-ecr.html - api_ref: AmazonECR/latest/APIReference/Welcome.html - tags: - product_categories: {'Containers'} - version: ecr-2015-09-21 -ecr-public: - api_ref: AmazonECRPublic/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Elastic Container Registry Public - short: Amazon ECR Public - guide: - subtitle: Developer Guide - url: AmazonECR/latest/public/what-is-ecr.html - long: '&ECRPubliclong;' - short: '&ECRPublic;' - sort: ECR Public - tags: - product_categories: {} - version: '2020-10-30' -ecs: - long: '&ECSlong; (&ECS;)' - short: '&ECS;' - sort: ECS - expanded: - long: Amazon Elastic Container Service (Amazon ECS) - short: Amazon ECS - blurb: is a highly scalable, fast, container management service that makes it easy to run, stop, and manage Docker containers on a cluster of Amazon EC2 instances. - guide: - subtitle: Developer Guide - url: AmazonECS/latest/developerguide/Welcome.html - api_ref: AmazonECS/latest/APIReference/Welcome.html - tags: - product_categories: {'Containers'} - version: ecs-2014-11-13 -efs: - api_ref: efs/latest/ug/api-reference.html - blurb: '' - expanded: - long: Amazon Elastic File System - short: Amazon EFS - guide: - subtitle: Developer Guide - url: efs/latest/ug/whatisefs.html - long: '&EFSlong;' - short: '&EFS;' - sort: EFS - tags: - product_categories: {} - version: '2015-02-01' -eks: - long: '&EKSlong; (&EKS;)' - short: '&EKS;' - sort: EKS - expanded: - long: Amazon Elastic Kubernetes Service (Amazon EKS) - short: Amazon EKS - blurb: is a managed service that makes it easy for you to run Kubernetes on AWS without needing to install and operate your own Kubernetes clusters. - guide: - subtitle: User Guide - url: eks/latest/userguide/what-is-eks.html - api_ref: eks/latest/APIReference/Welcome.html - tags: - product_categories: {'Containers'} - version: eks-2017-11-01 -elastic-beanstalk: - api_ref: elasticbeanstalk/latest/api/Welcome.html - blurb: '' - expanded: - long: AWS Elastic Beanstalk - short: Elastic Beanstalk - guide: - subtitle: Developer Guide - url: elasticbeanstalk/latest/dg/Welcome.html - long: '&AEBlong;' - short: '&AEB;' - sort: Elastic Beanstalk - tags: - product_categories: {} - version: '2010-12-01' -elastic-load-balancing: - api_ref: elasticloadbalancing/2012-06-01/APIReference/Welcome.html - blurb: automatically distributes your incoming traffic across multiple targets, such as EC2 instances, containers, and IP addresses, in one or more Availability Zones. - expanded: - long: Elastic Load Balancing - Version 1 - short: Elastic Load Balancing - Version 1 - guide: - subtitle: User Guide - url: elasticloadbalancing/latest/classic/introduction.html - long: '&ELBv1long;' - short: '&ELBv1;' - sort: Elastic Load Balancing - Version 1 - tags: - product_categories: {'Networking & Content Delivery'} - version: 'elasticloadbalancing-2012-06-01' -elastic-load-balancing-v2: - long: '&ELBv2long;' - short: '&ELBv2;' - sort: Elastic Load Balancing - Version 2 - expanded: - long: Elastic Load Balancing - Version 2 - short: Elastic Load Balancing - Version 2 - blurb: automatically distributes your incoming traffic across multiple targets, such as EC2 instances, containers, and IP addresses, in one or more Availability Zones. - guide: - subtitle: User Guide - url: elasticloadbalancing/latest/userguide/what-is-load-balancing.html - api_ref: elasticloadbalancing/latest/APIReference/Welcome.html - tags: - product_categories: {'Networking & Content Delivery'} - version: elasticloadbalancingv2-2015-12-01 -elastic-transcoder: - api_ref: elastictranscoder/latest/developerguide/api-reference.html - blurb: '' - expanded: - long: Amazon Elastic Transcoder - short: Elastic Transcoder - guide: - subtitle: Developer Guide - url: elastictranscoder/latest/developerguide/introduction.html - long: '&ETlong;' - short: '&ET;' - sort: Elastic Transcoder - tags: - product_categories: {} - version: '2012-09-25' -elasticache: - api_ref: AmazonElastiCache/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon ElastiCache - short: ElastiCache - guide: - subtitle: User Guide - url: AmazonElastiCache/latest/red-ug/WhatIs.html - long: '&ELClong;' - short: '&ELC;' - sort: ElastiCache - tags: - product_categories: {} - version: '2015-02-02' -elasticsearch-service: - api_ref: opensearch-service/latest/APIReference/API_Operations_Amazon_OpenSearch_Service.html - blurb: '' - expanded: - long: Amazon OpenSearch Service - short: OpenSearch Service - guide: - subtitle: Developer Guide - url: opensearch-service/latest/developerguide/what-is.html - long: '&ESlong;' - short: '&ES;' - sort: OpenSearch Service - tags: - product_categories: {} - version: '2015-01-01' -emr: - long: '&EMRlong;' - short: '&EMR;' - sort: EMR - expanded: - long: Amazon EMR - short: Amazon EMR - blurb: is a web service that makes it easy to process vast amounts of data efficiently using Apache Hadoop and services offered by Amazon Web Services. - guide: - subtitle: Management Guide - url: emr/latest/ManagementGuide/emr-what-is-emr.html - api_ref: emr/latest/APIReference/Welcome.html - tags: - product_categories: {'Analytics'} - version: elasticmapreduce-2009-03-31 -emr-containers: - api_ref: emr-on-eks/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon EMR on EKS - short: Amazon EMR on EKS - guide: - subtitle: Developer Guide - url: emr/latest/EMR-on-EKS-DevelopmentGuide/emr-eks.html - long: '&EMR-EKS;' - short: '&EMR-EKS;' - sort: EMR on EKS - tags: - product_categories: {} - version: '2020-10-01' -eventbridge: - long: '&EVlong;' - short: '&EV;' - sort: EventBridge - expanded: - long: Amazon EventBridge - short: EventBridge - blurb: is a serverless event bus service that makes it easy to connect your applications with data from a variety of sources. - guide: - subtitle: User Guide - url: eventbridge/latest/userguide/eb-what-is.html - api_ref: eventbridge/latest/APIReference/Welcome.html - tags: - product_categories: {'Application Integration'} - version: eventbridge-2015-10-07 -firehose: - long: "&FHlong;" - short: "&FH;" - sort: Data Firehose - api_ref: firehose/latest/APIReference/Welcome.html - expanded: - long: Amazon Data Firehose - short: Data Firehose - blurb: "is a fully managed service for delivering real-time streaming data to &AWS; destinations and third-party HTTP endpoints." - guide: - subtitle: User Guide - url: firehose/latest/dev/what-is-this-service.html - version: "firehose-2015-08-04" - tags: - product_categories: {'Analytics'} -forecast: - long: '&FORlong;' - short: '&FOR;' - sort: Forecast - expanded: - long: Amazon Forecast Service - short: Forecast - blurb: a fully managed service that uses statistical and machine learning algorithms to deliver highly accurate time-series forecasts. - guide: - subtitle: User Guide - url: forecast/latest/dg/getting-started.html - api_ref: forecast/latest/dg/api-reference.html - tags: - product_categories: {'Machine Learning & AI'} - version: forecast-2018-06-26 -fis: - api_ref: fis/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Fault Injection Simulator - short: AWS FIS - guide: - subtitle: User Guide - url: fis/latest/userguide/what-is.html - long: '&FISlong;' - short: '&FIS;' - sort: FIS - tags: - product_categories: {} - version: '2020-12-01' -fms: - api_ref: fms/2018-01-01/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Firewall Manager - short: Firewall Manager - guide: - subtitle: Developer Guide - url: waf/latest/developerguide/fms-chapter.html - long: '&FMSlong;' - short: '&FMS;' - sort: Firewall Manager - tags: - product_categories: {} - version: '2018-01-01' -fsx: - api_ref: fsx/latest/APIReference/welcome.html - blurb: '' - expanded: - long: Amazon FSx - short: Amazon FSx - guide: - subtitle: Developer Guide - url: fsx/latest/WindowsGuide/what-is.html - long: '&FSXlong;' - short: '&FSX;' - sort: FSx - tags: - product_categories: {'Storage'} - version: 'fsx-2018-03-01' -gamelift: - api_ref: gamelift/latest/apireference/Welcome.html - blurb: '' - expanded: - long: Amazon GameLift - short: Amazon GameLift - guide: - subtitle: Developer Guide - url: gamelift/latest/developerguide/gamelift-intro.html - long: '&AGSlong;' - short: '&AGS;' - sort: GameLift - tags: - product_categories: {} - version: '2015-10-01' -glacier: - long: '&GLlong;' - short: '&GLshort;' - sort: S3 Glacier - expanded: - long: Amazon S3 Glacier - short: S3 Glacier - blurb: provides durable and extremely low-cost storage for infrequently used data with security features for data archiving and backup. - guide: - subtitle: Developer Guide - url: amazonglacier/latest/dev/introduction.html - api_ref: amazonglacier/latest/dev/amazon-glacier-api.html - tags: - product_categories: {'Storage'} - version: glacier-2012-06-01 -global-accelerator: - api_ref: global-accelerator/latest/api/Welcome.html - blurb: '' - expanded: - long: AWS Global Accelerator - short: Global Accelerator - guide: - subtitle: Developer Guide - url: global-accelerator/latest/dg/what-is-global-accelerator.html - long: '&GAXlong;' - short: '&GAX;' - sort: Global Accelerator - tags: - product_categories: {} - version: '2018-08-08' -glue: - long: '&GLUlong;' - short: '&GLU;' - sort: Glue - chapter_override: - title: '&GLU; API code examples using &AWS; SDKs' - title_abbrev: '&GLU; API code examples' - expanded: - long: AWS Glue - short: AWS Glue - blurb: is a scalable, serverless data integration service that makes it easy to discover, prepare, and combine data for analytics, machine learning, and application development. - guide: - subtitle: Developer Guide - url: glue/latest/dg/what-is-glue.html - api_ref: glue/latest/dg/aws-glue-api.html - tags: - product_categories: {'Analytics'} - version: glue-2017-03-31 -grafana: - api_ref: grafana/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Managed Grafana - short: Amazon Managed Grafana - guide: - subtitle: Developer Guide - url: grafana/latest/userguide/what-is-Amazon-Managed-Service-Grafana.html - long: '&GRAlong;' - short: '&GRA;' - sort: Managed Grafana - tags: - product_categories: {} - version: '2020-08-18' -greengrass: - api_ref: greengrass/v1/apireference/api-doc.html - blurb: '' - expanded: - long: AWS IoT Greengrass - short: AWS IoT Greengrass - guide: - subtitle: Developer Guide - url: greengrass/v1/developerguide/what-is-gg.html - long: '&GGlong;' - short: '&GG;' - sort: IoT Greengrass - tags: - product_categories: {} - version: '2017-06-07' -greengrassv2: - api_ref: greengrass/v2/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS IoT Greengrass V2 - short: AWS IoT Greengrass V2 - guide: - subtitle: Developer Guide - url: greengrass/v2/developerguide/what-is-iot-greengrass.html - long: '&GG2long;' - short: '&GG2;' - sort: IoT Greengrass V2 - tags: - product_categories: {} - version: '2020-11-30' -guardduty: - api_ref: guardduty/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon GuardDuty - short: GuardDuty - guide: - subtitle: Developer Guide - url: guardduty/latest/ug/what-is-guardduty.html - long: '&GDUlong;' - short: '&GDU;' - sort: GuardDuty - tags: - product_categories: {} - version: '2017-11-28' -health: - api_ref: health/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Health - short: AWS Health - guide: - subtitle: Developer Guide - url: health/latest/ug/what-is-aws-health.html - long: '&awshealthlong;' - short: '&awshealth;' - sort: Health - tags: - product_categories: {} - version: '2016-08-04' -healthlake: - api_ref: healthlake/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS HealthLake - short: HealthLake - guide: - subtitle: Developer Guide - url: healthlake/latest/devguide/what-is-amazon-health-lake.html - long: '&AHLlong;' - short: '&AHL;' - sort: HealthLake - tags: - product_categories: {} - version: '2017-07-01' -iam: - bundle: iam - long: '&IAMlong; (&IAM;)' - short: '&IAM;' - sort: IAM - expanded: - long: AWS Identity and Access Management (IAM) - short: IAM - blurb: is a web service for securely controlling access to AWS services. With IAM, you can centrally manage permissions in your AWS account. - guide: - subtitle: User Guide - url: IAM/latest/UserGuide/introduction.html - api_ref: IAM/latest/APIReference/welcome.html - tags: - product_categories: {'Security, Identity, & Compliance'} - version: iam-2010-05-08 -imagebuilder: - api_ref: imagebuilder/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: EC2 Image Builder - short: Image Builder - guide: - subtitle: Developer Guide - url: imagebuilder/latest/userguide/what-is-image-builder.html - long: '&IBlong;' - short: '&IB;' - sort: Image Builder - tags: - product_categories: {} - version: '2019-12-02' -inspector: - api_ref: inspector/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Inspector - short: Amazon Inspector - guide: - subtitle: User Guide - url: inspector/latest/user/what-is-inspector.html - long: '&INSlong;' - short: '&INS;' - sort: Inspector - tags: - product_categories: {} - version: '2016-02-16' -iot: - long: '&IoTlong;' - short: '&IoT;' - sort: IoT - expanded: - long: AWS IoT - short: AWS IoT - blurb: provides secure, bi-directional communication for Internet-connected devices (such as sensors, actuators, - embedded devices, wireless devices, and smart appliances) to connect to the AWS Cloud over MQTT, HTTPS, and LoRaWAN. - guide: - subtitle: Developer Guide - url: iot/latest/developerguide/what-is-aws-iot.html - api_ref: iot/latest/apireference/Welcome.html - tags: - product_categories: {'IoT'} - version: iot-2015-05-28 -iot-1click-devices-service: - api_ref: iot-1click-devices-service/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS IoT 1-Click Devices - short: AWS IoT 1-Click Devices - guide: - subtitle: Developer Guide - url: iot-1-click/1.0/devices-apireference/what-is-iot.html - long: '&ITOCDevlong;' - short: '&ITOCDev;' - sort: IoT 1-Click Devices - tags: - product_categories: {} - version: '2018-05-14' -iot-1click-projects: - api_ref: iot-1-click/latest/projects-apireference/Welcome.html - blurb: '' - expanded: - long: AWS IoT 1-Click Projects - short: AWS IoT 1-Click Projects - guide: - subtitle: Developer Guide - url: iot-1-click/latest/developerguide/what-is-1click.html - long: '&ITOCProjlong;' - short: '&ITOCProj;' - sort: IoT 1-Click Projects - tags: - product_categories: {} - version: '2018-05-14' -iot-data-plane: - api_ref: iot/latest/apireference/Welcome.html - blurb: '' - expanded: - long: AWS IoT data - short: AWS IoT data - guide: - subtitle: Developer Guide - url: iot/latest/developerguide/what-is-aws-iot.html - long: '&IoTDatalong;' - short: '&IoTData;' - sort: IoT data - tags: - product_categories: {} - version: '2015-05-28' -iot-events: - api_ref: iotevents/latest/apireference/Welcome.html - blurb: '' - expanded: - long: AWS IoT Events - short: AWS IoT Events - guide: - subtitle: Developer Guide - url: iotevents/latest/developerguide/what-is-iotevents.html - long: '&ITElong;' - short: '&ITE;' - sort: IoT Events - tags: - product_categories: {} - version: '2018-07-27' -iot-events-data: - api_ref: iotevents/latest/apireference/Welcome.html - blurb: '' - expanded: - long: AWS IoT Events-Data - short: AWS IoT Events-Data - guide: - subtitle: Developer Guide - url: iot-events-data/latest/dev/what-is.html - long: '&ITEDlong;' - short: '&ITED;' - sort: IoT Events-Data - tags: - product_categories: {} - version: '2018-10-23' -iot-jobs-data-plane: - api_ref: iot/latest/apireference/Welcome.html - blurb: '' - expanded: - long: AWS IoT Jobs SDK release - short: AWS IoT Jobs SDK release - guide: - subtitle: Developer Guide - url: iot/latest/developerguide/what-is-aws-iot.html - long: '&IoTJobsSDKreleaselong;' - short: '&IoTJobsSDKrelease;' - sort: IoT Jobs SDK release - tags: - product_categories: {} - version: '2017-09-29' -iot-wireless: - api_ref: iot-wireless/2020-11-22/apireference/Welcome.html - blurb: '' - expanded: - long: AWS IoT Wireless - short: AWS IoT Wireless - guide: - subtitle: Developer Guide - url: iot/latest/developerguide/what-is-aws-iot.html - long: '&iot-wireless-api-long;' - short: '&iot-wireless-api;' - sort: IoT Wireless - tags: - product_categories: {} - version: '2020-11-22' -iotanalytics: - api_ref: iotanalytics/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS IoT Analytics - short: AWS IoT Analytics - guide: - subtitle: Developer Guide - url: iotanalytics/latest/userguide/welcome.html - long: '&ITAlong;' - short: '&ITA;' - sort: IoT Analytics - tags: - product_categories: {} - version: '2017-11-27' -iotdeviceadvisor: - api_ref: iot/latest/apireference/Welcome.html - blurb: '' - expanded: - long: AWS IoT Core Device Advisor - short: Device Advisor - guide: - subtitle: Developer Guide - url: iot/latest/developerguide/what-is-aws-iot.html - long: '&IoTDAlong;' - short: '&IoTDA;' - sort: IoT Core Device Advisor - tags: - product_categories: {} - version: '2020-09-18' -iotsitewise: - api_ref: iot-sitewise/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS IoT SiteWise - short: AWS IoT SiteWise - guide: - subtitle: Developer Guide - url: iot-sitewise/latest/userguide/what-is-sitewise.html - long: '&ITSWlong;' - short: '&ITSW;' - sort: IoT SiteWise - tags: - product_categories: {} - version: '2019-12-02' -iotthingsgraph: - api_ref: iot-twinmaker/latest/apireference/Welcome.html - blurb: '' - expanded: - long: AWS IoT Things Graph - short: AWS IoT Things Graph - guide: - subtitle: User Guide - url: iot-twinmaker/latest/guide/what-is-twinmaker.html - long: '&ITTGlong;' - short: '&ITTG;' - sort: IoT Things Graph - tags: - product_categories: {} - version: '2018-09-06' -ivs: - api_ref: ivs/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Interactive Video Service - short: Amazon IVS - guide: - subtitle: User Guide - url: ivs/latest/LowLatencyUserGuide/what-is.html - long: '&IVSlong;' - short: '&IVS;' - sort: IVS - tags: - product_categories: {} - version: '2020-07-14' -ivs-realtime: - api_ref: ivs/latest/RealTimeAPIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Interactive Video Service Real-Time Streaming - short: Amazon IVS Real-Time Streaming - guide: - subtitle: Developer Guide - url: ivs/latest/RealTimeUserGuide/what-is.html - long: '&IVSReallong;' - short: '&IVSReal;' - sort: IVS Real-Time Streaming - tags: - product_categories: {} - version: '2020-07-14' -ivschat: - api_ref: ivs/latest/ChatAPIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Interactive Video Service Chat - short: Amazon IVS Chat - guide: - subtitle: Developer Guide - url: ivs/latest/ChatAPIReference/Welcome.html - long: '&IVSChatlong;' - short: '&IVSChat;' - sort: IVS Chat - tags: - product_categories: {} - version: '2020-07-14' -kafka: - api_ref: MSK/2.0/APIReference/welcome.html - blurb: '' - expanded: - long: Amazon Managed Streaming for Apache Kafka - short: Amazon MSK - guide: - subtitle: Developer Guide - url: msk/latest/developerguide/what-is-msk.html - long: '&MSKlong;' - short: '&MSK;' - sort: MSK - tags: - product_categories: {} - version: '2018-11-14' -keyspaces: - long: '&KEYlong;' - short: '&KEY;' - sort: Keyspaces - expanded: - long: Amazon Keyspaces (for Apache Cassandra) - short: Amazon Keyspaces - blurb: is a scalable, highly available, and managed Apache Cassandra-compatible database service. - guide: - subtitle: Developer Guide - url: keyspaces/latest/devguide/what-is-keyspaces.html - api_ref: keyspaces/latest/APIReference/Welcome.html - tags: - product_categories: {'Databases'} - version: keyspaces-2022-02-10 -kendra: - long: '&KENlong;' - short: '&KEN;' - sort: Kendra - expanded: - long: Amazon Kendra - short: Amazon Kendra - blurb: is a search service, powered by machine learning, that helps users to search unstructured text using natural language. - guide: - subtitle: Developer Guide - url: kendra/latest/dg/what-is-kendra.html - api_ref: kendra/latest/APIReference/welcome.html - tags: - product_categories: {'Machine Learning & AI'} - version: kendra-2019-02-03 -kinesis: - long: '&AKlong;' - short: '&AK;' - sort: Kinesis - expanded: - long: Amazon Kinesis - short: Kinesis - blurb: makes it easy to collect, process, and analyze video and data streams in real time. - guide: - subtitle: Developer Guide - url: streams/latest/dev/introduction.html - api_ref: kinesis/latest/APIReference/Welcome.html - tags: - product_categories: {'Analytics'} - version: kinesis-2013-12-02 -kinesis-analytics-v2: - long: '&AKAlong;' - short: '&AKA;' - sort: Managed Service for Apache Flink - expanded: - long: Amazon Managed Service for Apache Flink - short: Managed Service for Apache Flink - blurb: processes and analyzes streaming data using SQL or Java. - guide: - subtitle: Developer Guide - url: managed-flink/latest/java/what-is.html - api_ref: managed-flink/latest/apiv2/Welcome.html - tags: - product_categories: {'Analytics'} - version: kinesisanalyticsv2-2018-05-23 -kms: - long: '&KMSlong; (&KMS;)' - short: '&KMS;' - sort: KMS - expanded: - long: AWS Key Management Service (AWS KMS) - short: AWS KMS - blurb: is an encryption and key management service scaled for the cloud. - guide: - subtitle: Developer Guide - url: kms/latest/developerguide/overview.html - api_ref: kms/latest/APIReference/Welcome.html - tags: - product_categories: {'Security, Identity, & Compliance'} - version: kms-2014-11-01 -lakeformation: - api_ref: lake-formation/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Lake Formation - short: Lake Formation - guide: - subtitle: Developer Guide - url: lake-formation/latest/dg/what-is-lake-formation.html - long: '&LFlong;' - short: '&LF;' - sort: Lake Formation - tags: - product_categories: {} - version: '2017-03-31' -lambda: - long: '&LAMlong;' - short: '&LAM;' - sort: Lambda - expanded: - long: AWS Lambda - short: Lambda - blurb: allows you to run code without provisioning or managing servers. - guide: - subtitle: Developer Guide - url: lambda/latest/dg/welcome.html - api_ref: lambda/latest/dg/API_Reference.html - tags: - product_categories: {'Compute'} - version: lambda-2015-03-31 -lex: - long: '&LEX2long;' - short: '&LEX2;' - sort: Lex - expanded: - long: Amazon Lex - short: Amazon Lex - blurb: is an AWS service for building conversational interfaces into applications using voice and text. - guide: - subtitle: Developer Guide - url: lexv2/latest/dg/what-is.html - api_ref: lexv2/latest/APIReference/welcome.html - tags: - product_categories: {'Machine Learning & AI'} - version: runtime.lex.v2-2020-08-07 -license-manager: - api_ref: license-manager/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS License Manager - short: License Manager - guide: - subtitle: User Guide - url: license-manager/latest/userguide/license-manager.html - long: '&LIClong;' - short: '&LIC;' - sort: License Manager - tags: - product_categories: {} - version: '2018-08-01' -lightsail: - api_ref: lightsail/2016-11-28/api-reference/Welcome.html - blurb: '' - expanded: - long: Amazon Lightsail - short: Lightsail - guide: - subtitle: Developer Guide - url: lightsail - long: '&lightsaillong;' - short: '&lightsail;' - sort: Lightsail - tags: - product_categories: {} - version: '2016-11-28' -lookoutvision: - long: '&LYRAlong;' - short: '&LYRA;' - sort: Lookout for Vision - expanded: - long: Amazon Lookout for Vision - short: Lookout for Vision - blurb: enables you to find visual defects in industrial products, accurately and at scale. - guide: - subtitle: Developer Guide - url: lookout-for-vision/latest/developer-guide/what-is.html - api_ref: lookout-for-vision/latest/APIReference/Welcome.html - tags: - product_categories: {'Machine Learning & AI'} - version: lookoutvision-2020-11-20 -machine-learning: - api_ref: machine-learning/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Machine Learning - short: Amazon ML - guide: - subtitle: Developer Guide - url: machine-learning/latest/dg/what-is-amazon-machine-learning.html - long: '&MLlong;' - short: '&ML;' - sort: Machine Learning - tags: - product_categories: {'Machine Learning & AI'} - version: 'machinelearning-2014-12-12' -macie2: - api_ref: macie/latest/APIReference/welcome.html - blurb: '' - expanded: - long: Amazon Macie - short: Macie - guide: - subtitle: User Guide - url: macie/latest/user/what-is-macie.html - long: '&MCElong;' - short: '&MCE;' - sort: Macie - tags: - product_categories: {} - version: '2020-01-01' -marketplace-agreement: - api_ref: marketplace-agreements/latest/api-reference/welcome.html - blurb: provides an API interface that helps AWS Marketplace sellers manage their agreements, including listing, filtering, and viewing details about their agreements. - expanded: - long: AWS Marketplace Agreement Service - short: AWS Marketplace Agreement Service - guide: - subtitle: Seller Guide - url: marketplace/latest/userguide/what-is-marketplace.html - long: '&MKTAgreementlong;' - short: '&MKTAgreement;' - sort: Marketplace Agreement Service - tags: - product_categories: {'Marketplace'} - version: marketplace-agreement-2020-03-01 -marketplace-catalog: - api_ref: marketplace-catalog/latest/api-reference/welcome.html - blurb: provides an API interface for approved providers to programmatically manage their products. - expanded: - long: AWS Marketplace Catalog API - short: AWS Marketplace Catalog API - guide: - subtitle: Seller Guide - url: marketplace/latest/userguide/what-is-marketplace.html - long: '&MKTCAPIlong;' - short: '&MKTCAPI;' - sort: Marketplace Catalog API - tags: - product_categories: {'Marketplace'} - version: marketplace-catalog-2018-09-17 -mediaconnect: - api_ref: mediaconnect/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Elemental MediaConnect - short: MediaConnect - guide: - subtitle: Developer Guide - url: mediaconnect/latest/dev/what-is.html - long: '&EMXlong;' - short: '&EMX;' - sort: MediaConnect - tags: - product_categories: {} - version: '2018-11-14' -mediaconvert: - long: '&EMClong;' - short: '&EMC;' - sort: MediaConvert - expanded: - long: AWS Elemental MediaConvert - short: MediaConvert - blurb: is a service that formats and compresses offline video content for delivery to televisions or connected devices. - guide: - subtitle: User Guide - url: mediaconvert/latest/ug/what-is.html - api_ref: mediaconvert/latest/apireference/custom-endpoints.html - tags: - product_categories: {'Media Services'} - version: mediaconvert-2017-08-29 -medialive: - long: '&EMLlong;' - short: '&EML;' - sort: MediaLive - expanded: - long: AWS Elemental MediaLive - short: MediaLive - blurb: is a video service that allows easy and reliable creation of live outputs for broadcast and streaming delivery. - guide: - subtitle: User Guide - url: medialive/latest/ug/what-is.html - api_ref: medialive/latest/apireference/what-is.html - tags: - product_categories: {'Media Services'} - version: medialive-2017-10-14 -mediapackage: - long: '&EMPlong;' - short: '&EMP;' - sort: MediaPackage - expanded: - long: AWS Elemental MediaPackage - short: MediaPackage - blurb: is a just-in-time video packaging and origination service that delivers highly secure, scalable, and reliable video streams to a wide variety of playback devices. - guide: - subtitle: User Guide - url: mediapackage/latest/ug/what-is.html - api_ref: mediapackage/latest/apireference/what-is.html - tags: - product_categories: {'Media Services'} - version: mediapackage-2017-10-12 -mediapackage-vod: - api_ref: mediapackage-vod/latest/apireference/what-is-mp-vod.html - blurb: '' - expanded: - long: AWS Elemental MediaPackage Video on Demand - short: MediaPackage VOD - guide: - subtitle: User Guide - url: mediapackage/latest/ug/what-is.html - long: '&EMPVODlong;' - short: '&EMPVOD;' - sort: MediaPackage VOD - tags: - product_categories: {} - version: '2018-11-07' -mediastore: - api_ref: mediastore/latest/apireference/Welcome.html - blurb: '' - expanded: - long: AWS Elemental MediaStore - short: MediaStore - guide: - subtitle: User Guide - url: mediastore/latest/ug/what-is.html - long: '&EMSlong;' - short: '&EMS;' - sort: Elemental MediaStore - tags: - product_categories: {} - version: '2017-09-01' -mediastore-data: - api_ref: mediastore/latest/apireference/Welcome.html - blurb: '' - expanded: - long: AWS Elemental MediaStore Data Plane - short: MediaStore Data Plane - guide: - subtitle: User Guide - url: mediastore/latest/ug/what-is.html - long: '&EMSDPlong;' - short: '&EMSDP;' - sort: MediaStore Data Plane - tags: - product_categories: {} - version: '2017-09-01' -mediatailor: - api_ref: mediatailor/latest/apireference/Welcome.html - blurb: '' - expanded: - long: AWS Elemental MediaTailor - short: MediaTailor - guide: - subtitle: User Guide - url: mediatailor/latest/ug/what-is.html - long: '&EMTlong;' - short: '&EMT;' - sort: MediaTailor - tags: - product_categories: {} - version: '2018-04-23' -medical-imaging: - long: '&AHIlong;' - short: '&AHI;' - sort: HealthImaging - expanded: - long: AWS HealthImaging - short: HealthImaging - blurb: is a HIPAA-eligible service that helps health care providers and their medical imaging ISV partners store, transform, and apply machine learning to medical images. - guide: - subtitle: Developer Guide - url: healthimaging/latest/devguide/what-is.html - api_ref: healthimaging/latest/APIReference/Welcome.html - tags: - product_categories: {'Machine Learning & AI'} - version: medical-imaging-2023-07-19 -migration-hub: - long: '&MHBlong;' - short: '&MHB;' - sort: MigrationHub - expanded: - long: AWS Migration Hub - short: Migration Hub - blurb: is a single place to discover your existing servers, plan migrations, and track the status of each application migration. - guide: - subtitle: User Guide - url: migrationhub/latest/ug/getting-started.html - api_ref: migrationhub/latest/ug/api-reference.html - tags: - product_categories: {'Migration'} - version: migration-hub-2017-05-31 -memorydb: - api_ref: memorydb/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon MemoryDB for Redis - short: MemoryDB - guide: - subtitle: Developer Guide - url: memorydb/latest/devguide/what-is-memorydb-for-redis.html - long: '&MDBlong;' - short: '&MDB;' - sort: MemoryDB - tags: - product_categories: {} - version: '2021-01-01' -networkmanager: - api_ref: networkmanager/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Network Manager - short: Network Manager - guide: - subtitle: User Guide - url: network-manager/latest/tgwnm/what-are-global-networks.html - long: '&NMlong;' - short: '&NM;' - sort: Network Manager - tags: - product_categories: {} - version: '2019-07-05' -networkmonitor: - api_ref: networkmonitor/latest/APIReference/Welcome.html - blurb: is an AWS active network monitoring service that identifies if a network issues exists within the AWS network or your own company network. - expanded: - long: Amazon CloudWatch Network Monitoring - short: CloudWatch Network Monitoring - guide: - subtitle: User Guide - url: AmazonCloudWatch/latest/monitoring/CloudWatch-Network-Monitoring-Sections.html - long: '&cloudwatch-netmon-long;' - short: '&cloudwatch-netmon;' - sort: CloudWatch Network Monitoring - tags: - product_categories: {'Management & Governance'} - version: networkmonitor-2023-08-01 -nimble: - api_ref: nimble-studio/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Nimble Studio - short: Nimble Studio - guide: - subtitle: Administrative Guide - url: nimble-studio/latest/userguide/what-is-nimble-studio.html - long: '&ANSlong;' - short: '&ANS;' - sort: Nimble Studio - tags: - product_categories: {} - version: '2020-08-01' -omics: - api_ref: omics/latest/api/Welcome.html - blurb: '' - expanded: - long: AWS HealthOmics - short: HealthOmics - guide: - subtitle: Developer Guide - url: omics/latest/dev/what-is-service.html - long: '&OMlong;' - short: '&OM;' - sort: HealthOmics - tags: - product_categories: {} - version: '2022-11-28' -opensearch: - long: '&ESlong;' - short: '&ES;' - sort: "ES" - expanded: - long: Amazon OpenSearch Service - short: OpenSearch - blurb: is a distributed, community-driven, Apache 2.0-licensed, 100% open-source search and analytics suite used for a broad set of use cases like real-time application monitoring, log analytics, and website search. - guide: - subtitle: User Guide - url: opensearch-service/latest/developerguide/gsg.html - api_ref: opensearch-service/latest/APIReference/Welcome.html - tags: - product_categories: {'Analytics'} - version: es-2021-01-01 -opsworks: - api_ref: opsworks/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS OpsWorks - short: AWS OpsWorks - guide: - subtitle: User Guide - url: opsworks/latest/userguide/welcome.html - long: '&OPSlong;' - short: '&OPS;' - sort: OpsWorks - tags: - product_categories: {} - version: '2013-02-18' -opsworkscm: - api_ref: opsworks-cm/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS OpsWorks CM - short: AWS OpsWorks CM - guide: - subtitle: User Guide - url: opsworks/latest/userguide/welcome.html - long: '&OPSCMlong;' - short: '&OPSCM;' - sort: OpsWorks CM - tags: - product_categories: {} - version: '2016-11-01' -organizations: - long: '&AOlong;' - short: '&AO;' - sort: Organizations - expanded: - long: AWS Organizations - short: Organizations - blurb: consolidates multiple AWS accounts into an organization that you create and centrally manage. - guide: - subtitle: User Guide - url: organizations/latest/userguide/orgs_introduction.html - api_ref: organizations/latest/userguide/orgs_introduction.html - tags: - product_categories: {'Management & Governance'} - version: organizations-2016-11-28 -outposts: - api_ref: outposts/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Outposts - short: Outposts - guide: - subtitle: Developer Guide - url: outposts/latest/userguide/what-is-outposts.html - long: '&OUTlong;' - short: '&OUT;' - sort: Outposts - tags: - product_categories: {} - version: '2019-12-03' -payment-cryptography: - api_ref: payment-cryptography/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Payment Cryptography - short: AWS Payment Cryptography - guide: - subtitle: User Guide - url: payment-cryptography/latest/userguide/what-is.html - long: '&PAYCRlong;' - short: '&PAYCR;' - sort: Payment Cryptography - tags: - product_categories: {} - version: '2021-09-14' -payment-cryptography-data: - api_ref: payment-cryptography/latest/DataAPIReference/Welcome.html - blurb: '' - expanded: - long: AWS Payment Cryptography Data Plane - short: AWS Payment Cryptography Data Plane - guide: - subtitle: User Guide - url: payment-cryptography/latest/userguide/what-is.html - long: '&PAYCRDatalong;' - short: '&PAYCRData;' - sort: Payment Cryptography Data Plane - tags: - product_categories: {} - version: '2022-02-03' -personalize: - bundle: personalize - long: "&PERSlong;" - short: "&PERS;" - sort: Personalize - expanded: - long: Amazon Personalize - short: Amazon Personalize - blurb: enables real-time personalization and recommendations, based on the same technology used at Amazon.com. - guide: - subtitle: Developer Guide - url: personalize/latest/dg/what-is-personalize.html - api_ref: personalize/latest/dg/API_Reference.html - tags: - product_categories: {'Machine Learning & AI'} - version: personalize-2018-05-22 -personalize-runtime: - bundle: personalize - long: "&PERSRlong;" - short: "&PERSR;" - sort: Personalize Runtime - expanded: - long: Amazon Personalize Runtime - short: Amazon Personalize Runtime - blurb: enables real-time personalization and recommendations, based on the same technology used at Amazon.com. - guide: - subtitle: Developer Guide - url: personalize/latest/dg/what-is-personalize.html - api_ref: personalize/latest/dg/API_Operations_Amazon_Personalize_Runtime.html - tags: - product_categories: {'Machine Learning & AI'} - version: personalize-runtime-2018-05-22 -personalize-events: - bundle: personalize - long: "&PERSElong;" - short: "&PERSE;" - sort: Personalize Events - expanded: - long: Amazon Personalize Events - short: Amazon Personalize Events - blurb: enables real-time personalization and recommendations, based on the same technology used at Amazon.com. - guide: - subtitle: Developer Guide - url: personalize/latest/dg/what-is-personalize.html - api_ref: personalize/latest/dg/API_Operations_Amazon_Personalize_Events.html - tags: - product_categories: {'Machine Learning & AI'} - version: personalize-events-2018-03-22 -pi: - api_ref: performance-insights/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Relational Database Service Performance Insights - short: Amazon RDS Performance Insights - guide: - subtitle: User Guide - url: AmazonRDS/latest/UserGuide/Welcome.html - long: '&RDSPerflong;' - short: '&RDSPerf;' - sort: RDS Performance Insights - tags: - product_categories: {} - version: '2018-02-27' -pinpoint: - bundle: pinpoint - long: '&PINlong;' - short: '&PIN;' - sort: Pinpoint - expanded: - long: Amazon Pinpoint - short: Amazon Pinpoint - blurb: helps you engage your customers by sending them email, SMS and voice messages, and push notifications. - guide: - subtitle: Developer Guide - url: pinpoint/latest/developerguide/welcome.html - api_ref: pinpoint/latest/apireference/welcome.html - tags: - product_categories: {'Business Applications'} - version: pinpoint-2016-12-01 -pinpoint-email: - long: '&PIN-Email-API;' - short: '&PIN-Email-API;' - sort: Pinpoint Email - expanded: - long: Amazon Pinpoint Email - short: Amazon Pinpoint Email - blurb: helps you engage your customers by sending them email, SMS and voice messages, and push notifications. - guide: - subtitle: Developer Guide - url: pinpoint/latest/developerguide/welcome.html - api_ref: pinpoint/latest/apireference/welcome.html - tags: - product_categories: {'Business Applications'} - version: pinpoint-email-2018-07-26 -pinpoint-sms-voice: - bundle: pinpoint - long: '&PIN-SMS-Voice-API;' - short: '&PIN-SMS-Voice-API;' - sort: Pinpoint SMS and Voice - expanded: - long: Amazon Pinpoint SMS and Voice - short: Amazon Pinpoint SMS and Voice - blurb: helps you engage your customers by sending them email, SMS and voice messages, and push notifications. - guide: - subtitle: Developer Guide - url: pinpoint/latest/developerguide/welcome.html - api_ref: pinpoint-sms-voice/latest/APIReference/welcome.html - tags: - product_categories: {'Business Applications'} - version: pinpoint-sms-voice-2018-09-05 -polly: - long: '&POLlong;' - short: '&POL;' - sort: Polly - expanded: - long: Amazon Polly - short: Amazon Polly - blurb: is a Text-to-Speech (TTS) cloud service that converts text into lifelike speech. - guide: - subtitle: Developer Guide - url: polly/latest/dg/what-is.html - api_ref: polly/latest/dg/API_Reference.html - tags: - product_categories: {'Machine Learning & AI'} - version: polly-2016-06-10 -pricing: - api_ref: aws-cost-management/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Price List - short: AWS Price List - guide: - subtitle: User Guide - url: awsaccountbilling/latest/aboutv2/price-changes.html - long: '&PLlong;' - short: '&PLlong;' - sort: Price List - tags: - product_categories: {} - version: '2017-10-15' -proton: - api_ref: proton/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Proton - short: AWS Proton - guide: - subtitle: User Guide - url: proton/latest/userguide/Welcome.html - long: '&ARWlong;' - short: '&ARW;' - sort: Proton - tags: - product_categories: {} - version: '2020-07-20' -qldb: - long: '&QLDBlong; (&QLDB;)' - short: '&QLDB;' - sort: QLDB - expanded: - long: Amazon Quantum Ledger Database (Amazon QLDB) - short: Amazon QLDB - blurb: is a fully managed ledger database that provides a transparent, immutable, and cryptographically verifiable transaction log owned by a central trusted authority. - guide: - subtitle: Developer Guide - url: qldb/latest/developerguide/what-is.html - api_ref: qldb/latest/developerguide/api-reference.html - tags: - product_categories: {'Databases'} - version: qldb-2019-01-02 -ram: - api_ref: ram/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Resource Access Manager - short: AWS RAM - guide: - subtitle: User Guide - url: ram/latest/userguide/what-is.html - long: '&RAMlong;' - short: '&RAM;' - sort: Resource Access Manager - tags: - product_categories: {} - version: '2018-01-04' -rds: - long: '&RDSlong; (&RDS;)' - short: '&RDS;' - sort: RDS - expanded: - long: Amazon Relational Database Service (Amazon RDS) - short: Amazon RDS - blurb: is a web service that makes it easier to set up, operate, and scale a relational database in the cloud. - guide: - subtitle: User Guide - url: AmazonRDS/latest/UserGuide/Welcome.html - api_ref: AmazonRDS/latest/APIReference/Welcome.html - tags: - product_categories: {'Databases'} - version: rds-2014-10-31 -rds-data: - long: '&RDSDataServicelong;' - short: '&RDSDataService;' - sort: RDS Data Service - expanded: - long: Amazon Relational Database Service Data Service - short: Amazon RDS Data Service - blurb: provides an HTTP endpoint to run SQL statements on an Amazon Aurora Serverless v1 DB cluster. - guide: - subtitle: User Guide - url: AmazonRDS/latest/UserGuide/Welcome.html - api_ref: rdsdataservice/latest/APIReference/Welcome.html - tags: - product_categories: {'Databases'} - version: rds-data-2018-08-01 -redshift: - long: '&RSlong;' - short: '&RS;' - sort: Redshift - expanded: - long: Amazon Redshift - short: Amazon Redshift - blurb: is a fast, fully managed, petabyte-scale data warehouse service that makes it simple and cost-effective to - efficiently analyze all your data using your existing business intelligence tools. - guide: - subtitle: Management Guide - url: redshift/latest/mgmt/welcome.html - api_ref: redshift/latest/APIReference/Welcome.html - tags: - product_categories: {'Databases'} - version: redshift-2012-12-01 -rekognition: - caveat: The code examples in this chapter are intended to supplement the code examples - found throughout the rest of this guide. - long: '&REKlong;' - short: '&REK;' - sort: Rekognition - expanded: - long: Amazon Rekognition - short: Amazon Rekognition - blurb: makes it easy to add image and video analysis to your applications. - guide: - subtitle: Developer Guide - url: rekognition/latest/dg/what-is.html - api_ref: rekognition/latest/APIReference/Welcome.html - tags: - product_categories: {'Machine Learning & AI'} - version: rekognition-2016-06-27 -resource-explorer-2: - api_ref: resource-explorer/latest/apireference/Welcome.html - blurb: '' - expanded: - long: AWS Resource Explorer - short: Resource Explorer - guide: - subtitle: User Guide - url: resource-explorer/latest/userguide/welcome.html - long: '&AREXlong;' - short: '&AREX;' - sort: Resource Explorer - tags: - product_categories: {} - version: '2022-07-28' -resource-groups: - api_ref: ARG/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Resource Groups - short: Resource Groups - guide: - subtitle: User Guide - url: ARG/latest/userguide/resource-groups.html - long: '&ARGlong;' - short: '&ARG;' - sort: Resource Groups - tags: - product_categories: {} - version: '2017-11-27' -resource-groups-tagging-api: - api_ref: resourcegroupstagging/latest/APIReference/overview.html - blurb: '' - expanded: - long: AWS Resource Groups Tagging API - short: Resource Groups Tagging API - guide: - subtitle: User Guide - url: tag-editor/latest/userguide/tagging.html - long: '&ARGTAPIlong;' - short: '&ARGTAPI;' - sort: Resource Groups Tagging API - tags: - product_categories: {} - version: '2017-01-26' -robomaker: - api_ref: robomaker/latest/dg/API_Reference.html - blurb: '' - expanded: - long: AWS RoboMaker - short: AWS RoboMaker - guide: - subtitle: Developer Guide - url: robomaker/latest/dg/chapter-welcome.html - long: '&RBMlong;' - short: '&RBM;' - sort: RoboMaker - tags: - product_categories: {} - version: '2018-06-29' -route-53: - bundle: route-53 - long: '&R53long;' - short: '&R53;' - sort: Route 53 - expanded: - long: Amazon Route 53 - short: Route 53 - blurb: is a highly available and scalable Domain Name System (DNS) web service. - guide: - subtitle: Developer Guide - url: Route53/latest/DeveloperGuide/Welcome.html - api_ref: Route53/latest/APIReference/Welcome.html - tags: - product_categories: {'Networking & Content Delivery'} - version: route53-2013-04-01 -route-53-domains: - bundle: route-53 - long: '&R53DRlong;' - short: '&R53DR;' - sort: Route 53 Domain Registration - expanded: - long: Amazon Route 53 Domain Registration - short: Route 53 Domain Registration - blurb: is a highly available and scalable Domain Name System (DNS) web service. - api_ref: Route53/latest/APIReference/API_Operations_Amazon_Route_53_Domains.html - guide: - subtitle: Developer Guide - url: Route53/latest/DeveloperGuide/Welcome.html - tags: - product_categories: {'Networking & Content Delivery'} - version: route53domains-2014-05-15 -route53-recovery-cluster: - long: '&R53ARClong;' - short: '&R53ARC;' - sort: Application Recovery Controller - expanded: - long: Amazon Route 53 Application Recovery Controller - short: Route 53 ARC - blurb: gives you insights about whether your applications and resources are ready for recovery, and helps you move traffic across AWS Regions or away from Availability Zones for application disaster recovery. - guide: - subtitle: Developer Guide - url: r53recovery/latest/dg/what-is-route53-recovery.html - api_ref: routing-control/latest/APIReference/Welcome.html - tags: - product_categories: {'Networking & Content Delivery'} - version: route53-recovery-cluster-2019-12-02 -route53resolver: - api_ref: Route53/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon Route 53 Resolver - short: Route 53 Resolver - guide: - subtitle: Developer Guide - url: Route53/latest/DeveloperGuide/Welcome.html - long: '&R53Rlong;' - short: '&R53R;' - sort: Route 53 Resolver - tags: - product_categories: {} - version: '2018-04-01' -s3: - long: '&S3long; (&S3;)' - short: '&S3;' - sort: S3 - expanded: - long: Amazon Simple Storage Service (Amazon S3) - short: Amazon S3 - blurb: is storage for the internet. You can use Amazon S3 to store and retrieve any amount of data at any time, from anywhere on the web. - guide: - subtitle: User Guide - url: AmazonS3/latest/userguide/Welcome.html - api_ref: AmazonS3/latest/API/Welcome.html - tags: - product_categories: {'Storage'} - version: s3-2006-03-01 -s3-control: - api_ref: AmazonS3/latest/API/Welcome.html - blurb: '' - expanded: - long: Amazon S3 Control - short: Amazon S3 Control - guide: - subtitle: User Guide - url: AmazonS3/latest/userguide/Welcome.html - long: '&S3Controllong;' - short: '&S3Control;' - sort: S3 Control - tags: - product_categories: {} - version: '2018-08-20' -sagemaker: - long: '&SMlong;' - short: '&SM;' - sort: SageMaker - expanded: - long: Amazon SageMaker - short: SageMaker - blurb: is a fully managed machine learning service. - guide: - subtitle: Developer Guide - url: sagemaker/latest/dg/whatis.html - api_ref: sagemaker/latest/APIReference/Welcome.html - tags: - product_categories: {'Machine Learning & AI'} - version: sagemaker-2017-07-24 -scheduler: - long: '&EVSlong;' - short: '&EVS;' - sort: EventBridge Scheduler - expanded: - long: Amazon EventBridge Scheduler - short: EventBridge Scheduler - blurb: allows you to create, run, and manage tasks on a schedule from one central, managed service. - guide: - subtitle: User Guide - url: scheduler/latest/userguide/intro.html - api_ref: scheduler/latest/apireference/Welcome.html - tags: - product_categories: {'Management & Governance'} - version: '2021-06-30' -secrets-manager: - long: '&ASMlong;' - short: '&ASM;' - sort: Secrets Manager - expanded: - long: AWS Secrets Manager - short: Secrets Manager - blurb: helps you to securely encrypt, store, and retrieve credentials for your databases and other services. - guide: - subtitle: User Guide - url: secretsmanager/latest/userguide/intro.html - api_ref: secretsmanager/latest/apireference/Welcome.html - tags: - product_categories: {'Security, Identity, & Compliance'} - version: secretsmanager-2017-10-17 -securityhub: - api_ref: securityhub/1.0/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Security Hub - short: Security Hub - guide: - subtitle: Developer Guide - url: securityhub/latest/userguide/what-is-securityhub.html - long: '&ASHlong;' - short: '&ASH;' - sort: Security Hub - tags: - product_categories: {} - version: '2018-10-26' -serverlessapplicationrepository: - api_ref: serverlessrepo/latest/devguide/operations.html - blurb: '' - expanded: - long: AWS Serverless Application Repository - short: AWS Serverless Application Repository - guide: - subtitle: Developer Guide - url: serverlessrepo/latest/devguide/what-is-serverlessrepo.html - long: '&SARlong;' - short: '&SAR;' - sort: Serverless Application Repository - tags: - product_categories: {} - version: '2017-09-08' -service-catalog: - api_ref: servicecatalog/latest/dg/API_Reference.html - blurb: '' - expanded: - long: AWS Service Catalog - short: Service Catalog - guide: - subtitle: Developer Guide - url: servicecatalog/latest/dg/what-is-service-catalog.html - long: '&SClong;' - short: '&SC;' - sort: Service Catalog - tags: - product_categories: {} - version: '2015-12-10' -service-catalog-appregistry: - api_ref: servicecatalog/latest/dg/API_Reference.html - blurb: '' - expanded: - long: AWS Service Catalog AppRegistry - short: AppRegistry - guide: - subtitle: Administrator Guide - url: servicecatalog/latest/arguide/intro-app-registry.html - long: '&SCARlong;' - short: '&SCAR;' - sort: AppRegistry - tags: - product_categories: {} - version: '2020-06-24' -service-quotas: - api_ref: servicequotas/2019-06-24/apireference/Welcome.html - blurb: '' - expanded: - long: Service Quotas - short: Service Quotas - guide: - subtitle: Developer Guide - url: servicequotas/latest/userguide/intro.html - long: '&SQlong;' - short: '&SQ;' - sort: Service Quotas - tags: - product_categories: {} - version: '2019-06-24' -servicediscovery: - api_ref: cloud-map/latest/api/Welcome.html - blurb: '' - expanded: - long: AWS Cloud Map - short: AWS Cloud Map - guide: - subtitle: Developer Guide - url: cloud-map/latest/dg/what-is-cloud-map.html - long: '&CMAPlong;' - short: '&CMAP;' - sort: Cloud Map - tags: - product_categories: {} - version: '2017-03-14' -ses: - bundle: ses - long: '&SESlong; (&SES;)' - short: '&SES;' - sort: SES - expanded: - long: Amazon Simple Email Service (Amazon SES) - short: Amazon SES - blurb: is a reliable, scalable, and cost-effective email service. - guide: - subtitle: Developer Guide - url: ses/latest/dg/Welcome.html - api_ref: ses/latest/APIReference/Welcome.html - tags: - product_categories: {'Business Applications'} - version: email-2010-12-01 -sesv2: - bundle: ses - long: '&SESv2long;' - short: '&SESv2;' - sort: SES v2 API - expanded: - long: Amazon Simple Email Service v2 API - short: Amazon SES v2 API - blurb: is a reliable, scalable, and cost-effective email service. - guide: - subtitle: Developer Guide - url: ses/latest/dg/Welcome.html - api_ref: ses/latest/APIReference-V2/Welcome.html - tags: - product_categories: {'Business Applications'} - version: sesv2-2019-09-27 -sfn: - long: '&SFNlong;' - short: '&SFN;' - sort: Step Functions - expanded: - long: AWS Step Functions - short: Step Functions - blurb: makes it easy to coordinate the components of distributed applications as a series of steps in a visual workflow. - guide: - subtitle: Developer Guide - url: step-functions/latest/dg/welcome.html - api_ref: step-functions/latest/apireference/Welcome.html - tags: - product_categories: {'Application Integration'} - version: states-2016-11-23 -shield: - api_ref: waf/latest/DDOSAPIReference/Welcome.html - blurb: '' - expanded: - long: AWS Shield - short: Shield - guide: - subtitle: Developer Guide - url: waf/latest/developerguide/shield-chapter.html - long: '&SHDlong;' - short: '&SHD;' - sort: Shield - tags: - product_categories: {} - version: '2016-06-02' -signer: - api_ref: signer/latest/api/Welcome.html - blurb: '' - expanded: - long: AWS Signer - short: Signer - guide: - subtitle: Developer Guide - url: signer/latest/developerguide/Welcome.html - long: '&Signerlong;' - short: '&Signer;' - sort: Signer - tags: - product_categories: {} - version: '2017-08-25' -snowball: - long: '&Frozenlong;' - short: '&Frozen;' - sort: Snowball - expanded: - long: AWS Snowball - short: Snowball - blurb: uses physical storage devices to transfer large amounts of data between Amazon Simple Storage Service (Amazon S3) - and your onsite data storage location at faster-than-internet speeds. - guide: - subtitle: User Guide - url: snowball/latest/ug/whatissnowball.html - api_ref: snowball/latest/api-reference/API_Operations_Amazon_Import_Export_Snowball.html - tags: - product_categories: {'Storage'} - version: snowball-2016-06-30 -sns: - long: '&SNSlong; (&SNS;)' - short: '&SNS;' - sort: SNS - expanded: - long: Amazon Simple Notification Service (Amazon SNS) - short: Amazon SNS - blurb: is a web service that enables applications, end-users, and devices to instantly send and receive notifications from the cloud. - guide: - subtitle: Developer Guide - url: sns/latest/dg/welcome.html - api_ref: sns/latest/api/welcome.html - tags: - product_categories: {'Application Integration'} - version: sns-2010-03-31 -sqs: - long: '&SQSlong; (&SQS;)' - short: '&SQS;' - sort: SQS - expanded: - long: Amazon Simple Queue Service (Amazon SQS) - short: Amazon SQS - blurb: is a fully managed message queuing service that makes it easy to decouple and scale microservices, distributed systems, and serverless applications. - guide: - subtitle: Developer Guide - url: AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html - api_ref: AWSSimpleQueueService/latest/APIReference/Welcome.html - tags: - product_categories: {'Application Integration'} - version: sqs-2012-11-05 -ssm: - long: '&SYSlong;' - short: '&SYS;' - sort: Systems Manager - expanded: - long: AWS Systems Manager - short: Systems Manager - blurb: organizes, monitors, and automates management tasks on your AWS resources. - guide: - subtitle: User Guide - url: systems-manager/latest/userguide/what-is-systems-manager.html - api_ref: systems-manager/latest/APIReference/Welcome.html - tags: - product_categories: {'Management & Governance'} - version: ssm-2014-11-06 -ssm-contacts: - api_ref: incident-manager/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Systems Manager Incident Manager Contacts - short: Incident Manager Contacts - guide: - subtitle: Developer Guide - url: incident-manager/latest/userguide/what-is-incident-manager.html - long: '&commander-contacts-long;' - short: '&commander-contacts;' - sort: Incident Manager Contacts - tags: - product_categories: {} - version: '2021-05-03' -ssm-incidents: - api_ref: incident-manager/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Systems Manager Incident Manager - short: Incident Manager - guide: - subtitle: Developer Guide - url: incident-manager/latest/userguide/what-is-incident-manager.html - long: '&commander-long;' - short: '&commander;' - sort: Incident Manager - tags: - product_categories: {} - version: '2018-05-10' -storage-gateway: - api_ref: storagegateway/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: AWS Storage Gateway - short: Storage Gateway - guide: - subtitle: User Guide - url: storagegateway - long: '&AWSSGlong;' - short: '&AWSSG;' - sort: Storage Gateway - tags: - product_categories: {} - version: '2013-06-30' -sts: - bundle: iam - long: '&STSlong; (&STS;)' - short: '&STS;' - sort: STS - expanded: - long: AWS Security Token Service (AWS STS) - short: AWS STS - blurb: creates and provides trusted users with temporary security credentials that can control access to your AWS resources. - guide: - subtitle: User Guide - url: IAM/latest/UserGuide/id_credentials_temp.html - api_ref: STS/latest/APIReference/welcome.html - tags: - product_categories: {'Security, Identity, & Compliance'} - version: sts-2011-06-15 -support: - long: '&SUPlong;' - short: '&SUP;' - sort: Support - expanded: - long: AWS Support - short: Support - blurb: provides support for users of Amazon Web Services. - guide: - subtitle: User Guide - url: awssupport/latest/user/getting-started.html - api_ref: awssupport/latest/APIReference/welcome.html - tags: - product_categories: {'Contact Center'} - version: support-2013-04-15 -swf: - api_ref: amazonswf/latest/apireference/Welcome.html - blurb: '' - expanded: - long: Amazon Simple Workflow Service - short: Amazon SWF - guide: - subtitle: Developer Guide - url: amazonswf/latest/developerguide/swf-welcome.html - long: '&SWFlong;' - short: '&SWF;' - sort: SWF - tags: - product_categories: {} - version: '2012-01-25' -textract: - long: '&TEXTRACTlong;' - short: '&TEXTRACT;' - sort: Textract - expanded: - long: Amazon Textract - short: Amazon Textract - blurb: enables you to add document text detection and analysis to your applications. - guide: - subtitle: Developer Guide - url: textract/latest/dg/what-is.html - api_ref: textract/latest/dg/API_Reference.html - tags: - product_categories: {'Machine Learning & AI'} - version: textract-2018-06-27 -transcribe: - long: '&TSClong;' - short: '&TSC;' - sort: Transcribe - expanded: - long: Amazon Transcribe - short: Amazon Transcribe - blurb: provides transcription services for your audio files and audio streams. - guide: - subtitle: Developer Guide - url: transcribe/latest/dg/what-is.html - api_ref: transcribe/latest/APIReference/Welcome.html - tags: - product_categories: {'Machine Learning & AI'} - version: transcribe-2017-10-26 -transcribe-medical: - long: '&TSCMlong;' - short: '&TSCM;' - sort: Transcribe Medical - expanded: - long: Amazon Transcribe Medical - short: Amazon Transcribe Medical - blurb: is an automatic speech recognition (ASR) service designed for medical professionals who want to transcribe - medical-related speech, such as physician-dictated notes, drug safety monitoring, telemedicine appointments, or physician-patient conversations. - guide: - subtitle: Developer Guide - url: transcribe/latest/dg/transcribe-medical.html - api_ref: transcribe/latest/APIReference/Welcome.html - tags: - product_categories: {'Machine Learning & AI'} - version: transcribe-2017-10-26 -translate: - long: '&TSLlong;' - short: '&TSL;' - sort: Translate - expanded: - long: Amazon Translate - short: Amazon Translate - blurb: is a neural machine translation service for translating text to and from English across a breadth of supported languages. - guide: - subtitle: Developer Guide - url: translate/latest/dg/what-is.html - api_ref: translate/latest/APIReference/welcome.html - tags: - product_categories: {'Machine Learning & AI'} - version: translate-2017-07-01 -trustedadvisor: - long: '&AWS-TA-long;' - short: '&AWS-TA;' - sort: Trusted Advisor - expanded: - long: AWS Trusted Advisor - short: Trusted Advisor - blurb: inspects your AWS environment and recommends ways to save money, close security gaps, and improve system availability and performance. - guide: - subtitle: User Guide - url: awssupport/latest/user/trusted-advisor.html - api_ref: trustedadvisor/latest/APIReference/Welcome.html - tags: - product_categories: {'Management & Governance'} - version: trustedadvisor-2022-09-15 -verifiedpermissions: - api_ref: verifiedpermissions/latest/apireference/Welcome.html - blurb: '' - expanded: - long: Amazon Verified Permissions - short: Verified Permissions - guide: - subtitle: Developer Guide - url: verifiedpermissions/latest/userguide/what-is-avp.html - long: '&AVPlong;' - short: '&AVP;' - sort: Verified Permissions - tags: - product_categories: {} - version: '2021-12-01' -vpc-lattice: - api_ref: vpc-lattice/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon VPC Lattice - short: VPC Lattice - guide: - subtitle: Developer Guide - url: vpc-lattice/latest/ug/what-is-vpc-lattice.html - long: '&VPCLATlong;' - short: '&VPCLAT;' - sort: VPC Lattice - tags: - product_categories: {} - version: '2022-11-30' -waf: - api_ref: waf/latest/APIReference/API_Operations_AWS_WAF.html - blurb: is a web application firewall that lets you monitor and manage web requests that are forwarded to protected AWS resources. - expanded: - long: AWS WAF Classic - short: AWS WAF Classic - guide: - subtitle: Developer Guide - url: waf/latest/developerguide/waf-chapter.html - long: '&WAFclassic;' - short: '&WAFclassic;' - sort: WAF Classic - tags: - product_categories: {'Security, Identity, & Compliance'} - version: 'waf-2015-08-24' -waf-regional: - api_ref: waf/latest/APIReference/API_Operations_AWS_WAF_Regional.html - blurb: is a web application firewall that lets you monitor and manage web requests that are forwarded to protected AWS resources. - expanded: - long: AWS WAF Classic Regional - short: AWS WAF Classic Regional - guide: - subtitle: Developer Guide - url: waf/latest/developerguide/waf-chapter.html - long: '&WAFClassicRegional;' - short: '&WAFClassicRegional;' - sort: WAF Classic Regional - tags: - product_categories: {'Security, Identity, & Compliance'} - version: 'waf-regional-2016-11-28' -wafv2: - api_ref: waf/latest/APIReference/API_Operations_AWS_WAFV2.html - blurb: is a web application firewall that lets you monitor and manage web requests that are forwarded to protected AWS resources. - expanded: - long: AWS WAFV2 - short: AWS WAFV2 - guide: - subtitle: Developer Guide - url: waf/latest/developerguide/waf-chapter.html - long: '&WAFv2long;' - short: '&WAFv2;' - sort: WAFV2 - tags: - product_categories: {'Security, Identity, & Compliance'} - version: 'wafv2-2019-07-29' -workdocs: - api_ref: workdocs/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon WorkDocs - short: Amazon WorkDocs - guide: - subtitle: Developer Guide - url: workdocs/latest/developerguide/what_is.html - long: '&WDlong;' - short: '&WD;' - sort: WorkDocs - tags: - product_categories: {} - version: '2016-05-01' -workmail: - api_ref: workmail/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon WorkMail - short: Amazon WorkMail - guide: - subtitle: User Guide - url: workmail/latest/userguide/what_is.html - long: '&WMlong;' - short: '&WM;' - sort: WorkMail - tags: - product_categories: {} - version: '2017-10-01' -workmailmessageflow: - api_ref: workmail/latest/APIReference/Welcome.html - blurb: '' - expanded: - long: Amazon WorkMail Message Flow - short: Amazon WorkMail Message Flow - guide: - subtitle: Developer Guide - url: workmail/latest/userguide/what_is.html - long: '&WMFlowlong;' - short: '&WMFlow;' - sort: WorkMail Message Flow - tags: - product_categories: {} - version: '2019-05-01' -workspaces: - api_ref: workspaces/latest/api/welcome.html - blurb: '' - expanded: - long: Amazon WorkSpaces - short: WorkSpaces - guide: - subtitle: Developer Guide - url: workspaces/latest/userguide/workspaces-user-getting-started.html - long: '&WSPlong;' - short: '&WSP;' - sort: WorkSpaces - tags: - product_categories: {} - version: '2015-04-08' -xray: - api_ref: xray/latest/api/Welcome.html - blurb: '' - expanded: - long: AWS X-Ray - short: X-Ray - guide: - subtitle: Developer Guide - url: xray/latest/devguide/aws-xray.html - long: '&xraylong;' - short: '&xray;' - sort: XRay - tags: - product_categories: {} - version: '2016-04-12' From 048540a2f60bde51e433d52692f93d22ca39498a Mon Sep 17 00:00:00 2001 From: Laren-AWS <57545972+Laren-AWS@users.noreply.github.com> Date: Fri, 30 Aug 2024 09:41:50 -0700 Subject: [PATCH 57/98] Update tools release to 2024-08-29-A (#6796) --- .github/workflows/validate-doc-metadata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index 732f42bca21..9d887d40a72 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@2024-08-28-A + uses: awsdocs/aws-doc-sdk-examples-tools@2024-08-29-A with: doc_gen_only: "False" strict_titles: "True" From 2e003fa6ef0c2a4806c703afea7239a5cc50aab7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 11:45:10 -0500 Subject: [PATCH 58/98] Bump webpack from 5.76.1 to 5.94.0 in /resources/clients/react/item-tracker (#6798) Bump webpack in /resources/clients/react/item-tracker Bumps [webpack](https://github.com/webpack/webpack) from 5.76.1 to 5.94.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.76.1...v5.94.0) --- updated-dependencies: - dependency-name: webpack dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../react/item-tracker/package-lock.json | 763 +++++++++--------- 1 file changed, 386 insertions(+), 377 deletions(-) diff --git a/resources/clients/react/item-tracker/package-lock.json b/resources/clients/react/item-tracker/package-lock.json index 07a4acc49a6..a5ed7f07491 100644 --- a/resources/clients/react/item-tracker/package-lock.json +++ b/resources/clients/react/item-tracker/package-lock.json @@ -3882,30 +3882,30 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -3917,9 +3917,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -4713,19 +4713,10 @@ "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { "version": "4.17.13", @@ -5180,133 +5171,133 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -5338,9 +5329,9 @@ } }, "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "bin": { "acorn": "bin/acorn" }, @@ -5368,10 +5359,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "peerDependencies": { "acorn": "^8" } @@ -6205,9 +6196,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -6216,14 +6207,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -6324,9 +6318,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001344", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", - "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "funding": [ { "type": "opencollective", @@ -6335,6 +6329,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -7558,9 +7556,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.143", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz", - "integrity": "sha512-2hIgvu0+pDfXIqmVmV5X6iwMjQ2KxDsWKwM+oI1fABEOy/Dqmll0QJRmIQ3rm+XaoUa/qKrmy5h7LSTFQ6Ldzg==" + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==" }, "node_modules/emittery": { "version": "0.10.2", @@ -7595,9 +7593,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7672,9 +7670,9 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "node_modules/es-shim-unscopables": { "version": "1.0.0", @@ -7701,9 +7699,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -9439,9 +9437,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/gzip-size": { "version": "6.0.0", @@ -14764,9 +14762,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -15178,9 +15176,9 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -18159,9 +18157,9 @@ } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -18247,9 +18245,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dependencies": { "randombytes": "^2.1.0" } @@ -19005,12 +19003,12 @@ } }, "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -19022,15 +19020,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -19054,14 +19052,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -19387,6 +19377,35 @@ "yarn": "*" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -19507,9 +19526,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -19540,33 +19559,32 @@ } }, "node_modules/webpack": { - "version": "5.76.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", - "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -23123,27 +23141,27 @@ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" }, "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" }, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "requires": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } } } @@ -23154,9 +23172,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -23701,19 +23719,10 @@ "@types/json-schema": "*" } }, - "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "@types/express": { "version": "4.17.13", @@ -24065,133 +24074,133 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -24220,9 +24229,9 @@ } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==" }, "acorn-globals": { "version": "6.0.0", @@ -24240,10 +24249,10 @@ } } }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "requires": {} }, "acorn-jsx": { @@ -24870,15 +24879,14 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "bser": { @@ -24949,9 +24957,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001344", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", - "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==" + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -25842,9 +25850,9 @@ } }, "electron-to-chromium": { - "version": "1.4.143", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz", - "integrity": "sha512-2hIgvu0+pDfXIqmVmV5X6iwMjQ2KxDsWKwM+oI1fABEOy/Dqmll0QJRmIQ3rm+XaoUa/qKrmy5h7LSTFQ6Ldzg==" + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==" }, "emittery": { "version": "0.10.2", @@ -25867,9 +25875,9 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -25932,9 +25940,9 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "es-shim-unscopables": { "version": "1.0.0", @@ -25955,9 +25963,9 @@ } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" }, "escape-html": { "version": "1.0.3", @@ -27212,9 +27220,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "gzip-size": { "version": "6.0.0", @@ -31222,9 +31230,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "normalize-path": { "version": "3.0.0", @@ -31513,9 +31521,9 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "picomatch": { "version": "2.3.1", @@ -33544,9 +33552,9 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -33617,9 +33625,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "requires": { "randombytes": "^2.1.0" } @@ -34203,12 +34211,12 @@ } }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -34221,22 +34229,15 @@ } }, "terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "requires": { + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" } }, "test-exclude": { @@ -34479,6 +34480,15 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, + "update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "requires": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -34581,9 +34591,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -34608,33 +34618,32 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "5.76.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", - "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "requires": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { From 837fa5881d4a61b967884a17a4a9b49848f9bd0c Mon Sep 17 00:00:00 2001 From: David Souther Date: Tue, 3 Sep 2024 16:21:48 -0400 Subject: [PATCH 59/98] Rust: Bump toolchain to 1.80.1 (#6805) --- .github/workflows/lint-rust.yml | 2 +- rustv1/cross_service/rust-toolchain.toml | 2 +- .../bedrock-runtime/src/bin/converse-stream.rs | 5 +---- .../examples/bedrock-runtime/src/bin/tool-use.rs | 2 ++ .../examples/cloudwatchlogs/src/bin/large-query.rs | 4 ++++ rustv1/examples/eks/src/bin/create-cluster.rs | 3 +-- rustv1/examples/lambda/src/actions.rs | 14 +++++++------- rustv1/examples/rust-toolchain.toml | 2 +- .../examples/s3/src/bin/select-object-content.rs | 8 ++++---- rustv1/tools/set_rust_version.py | 2 +- 10 files changed, 23 insertions(+), 21 deletions(-) diff --git a/.github/workflows/lint-rust.yml b/.github/workflows/lint-rust.yml index 201cd32955b..f5c0bec4477 100644 --- a/.github/workflows/lint-rust.yml +++ b/.github/workflows/lint-rust.yml @@ -27,7 +27,7 @@ jobs: - uses: dtolnay/rust-toolchain@stable if: steps.changed-files.outputs.any_changed == 'true' with: - toolchain: "1.76.0" + toolchain: "1.80.1" components: clippy, rustfmt - name: Set Environment if: steps.changed-files.outputs.any_changed == 'true' diff --git a/rustv1/cross_service/rust-toolchain.toml b/rustv1/cross_service/rust-toolchain.toml index 0820522b30d..947b162e317 100644 --- a/rustv1/cross_service/rust-toolchain.toml +++ b/rustv1/cross_service/rust-toolchain.toml @@ -1,3 +1,3 @@ # This should be kept in sync with https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv [toolchain] -channel = "1.76.0" +channel = "1.80.1" diff --git a/rustv1/examples/bedrock-runtime/src/bin/converse-stream.rs b/rustv1/examples/bedrock-runtime/src/bin/converse-stream.rs index 403215f0f1b..0dd578c2f53 100644 --- a/rustv1/examples/bedrock-runtime/src/bin/converse-stream.rs +++ b/rustv1/examples/bedrock-runtime/src/bin/converse-stream.rs @@ -125,10 +125,7 @@ fn get_converse_output_text( ) -> Result { Ok(match output { ConverseStreamOutputType::ContentBlockDelta(event) => match event.delta() { - Some(delta) => delta - .as_text() - .map(|s| s.clone()) - .unwrap_or_else(|_| "".into()), + Some(delta) => delta.as_text().cloned().unwrap_or_else(|_| "".into()), None => "".into(), }, _ => "".into(), diff --git a/rustv1/examples/bedrock-runtime/src/bin/tool-use.rs b/rustv1/examples/bedrock-runtime/src/bin/tool-use.rs index 090aa51b942..fb29a5027b7 100644 --- a/rustv1/examples/bedrock-runtime/src/bin/tool-use.rs +++ b/rustv1/examples/bedrock-runtime/src/bin/tool-use.rs @@ -240,6 +240,8 @@ async fn fetch_weather_data( // snippet-end:[rust.bedrock-runtime.Converse_AnthropicClaude.tool-use.weather-tool] // snippet-start:[rust.bedrock-runtime.Converse_AnthropicClaude.tool-use] +#[derive(Debug)] +#[allow(dead_code)] struct InvokeToolResult(String, ToolResultBlock); struct ToolUseScenario { client: Client, diff --git a/rustv1/examples/cloudwatchlogs/src/bin/large-query.rs b/rustv1/examples/cloudwatchlogs/src/bin/large-query.rs index 2409919c5bf..90bba513d45 100644 --- a/rustv1/examples/cloudwatchlogs/src/bin/large-query.rs +++ b/rustv1/examples/cloudwatchlogs/src/bin/large-query.rs @@ -27,7 +27,11 @@ use sdk_examples_test_utils::wait_on; #[derive(Debug)] enum LargeQueryError { DateOutOfBounds, + // Internal error is used in Debug output + #[allow(dead_code)] FromCloudwatchLogs(Error), + // Internal error is used in Debug output + #[allow(dead_code)] FromChronoParse(chrono::ParseError), } diff --git a/rustv1/examples/eks/src/bin/create-cluster.rs b/rustv1/examples/eks/src/bin/create-cluster.rs index 4bd38bffdc2..631dcef2c7f 100644 --- a/rustv1/examples/eks/src/bin/create-cluster.rs +++ b/rustv1/examples/eks/src/bin/create-cluster.rs @@ -21,8 +21,7 @@ struct Opt { /// To create a role-arn: /// /// 1. Follow instructions to create an IAM role: - /// https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html - /// + /// https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html /// 2. Copy role arn #[structopt(long)] role_arn: String, diff --git a/rustv1/examples/lambda/src/actions.rs b/rustv1/examples/lambda/src/actions.rs index 9f1aa51feb1..4187776afce 100644 --- a/rustv1/examples/lambda/src/actions.rs +++ b/rustv1/examples/lambda/src/actions.rs @@ -20,7 +20,7 @@ use aws_sdk_s3::{ }; use aws_smithy_types::Blob; use serde::{ser::SerializeMap, Serialize}; -use std::{path::PathBuf, str::FromStr, time::Duration}; +use std::{fmt::Display, path::PathBuf, str::FromStr, time::Duration}; use tracing::{debug, info, warn}; /* Operation describes */ @@ -50,13 +50,13 @@ impl FromStr for Operation { } } -impl ToString for Operation { - fn to_string(&self) -> String { +impl Display for Operation { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Operation::Plus => "plus".to_string(), - Operation::Minus => "minus".to_string(), - Operation::Times => "times".to_string(), - Operation::DividedBy => "divided-by".to_string(), + Operation::Plus => write!(f, "plus"), + Operation::Minus => write!(f, "minus"), + Operation::Times => write!(f, "times"), + Operation::DividedBy => write!(f, "divided-by"), } } } diff --git a/rustv1/examples/rust-toolchain.toml b/rustv1/examples/rust-toolchain.toml index 0820522b30d..947b162e317 100644 --- a/rustv1/examples/rust-toolchain.toml +++ b/rustv1/examples/rust-toolchain.toml @@ -1,3 +1,3 @@ # This should be kept in sync with https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv [toolchain] -channel = "1.76.0" +channel = "1.80.1" diff --git a/rustv1/examples/s3/src/bin/select-object-content.rs b/rustv1/examples/s3/src/bin/select-object-content.rs index c38931beecb..c29289a992a 100644 --- a/rustv1/examples/s3/src/bin/select-object-content.rs +++ b/rustv1/examples/s3/src/bin/select-object-content.rs @@ -51,8 +51,8 @@ pub struct Record { pub description: String, } -fn is_valid_json(data: impl AsRef) -> bool { - serde_json::from_str::(data.as_ref()).is_ok() +fn is_valid_json(data: &str) -> bool { + serde_json::from_str::(data).is_ok() } // Get object content. @@ -133,8 +133,8 @@ fn parse_line_buffered(buf: &mut String, line: &str) -> Result, a Ok(Some(serde_json::from_str(line)?)) } else { buf.push_str(line); - if is_valid_json(&buf) { - let result = serde_json::from_str(buf); + if is_valid_json(buf) { + let result = serde_json::from_str(buf.as_str()); buf.clear(); Ok(Some(result?)) } else { diff --git a/rustv1/tools/set_rust_version.py b/rustv1/tools/set_rust_version.py index 2ed12e0259b..32acf66b695 100755 --- a/rustv1/tools/set_rust_version.py +++ b/rustv1/tools/set_rust_version.py @@ -36,7 +36,7 @@ def update_toolchains(root: pathlib.Path, channel: str, dry_run: bool): def update_actions(root: pathlib.Path, channel: str, dry_run: bool): - rust_yaml = root / ".github" / "workflows" / "rust.yml" + rust_yaml = root / ".github" / "workflows" / "lint-rust.yml" with open(rust_yaml, "rt") as file: action = file.readlines() found = None From bb5f5db50f857f68124b5a648e13e015c2d0c8f8 Mon Sep 17 00:00:00 2001 From: Scott Macdonald <57190223+scmacdon@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:25:32 -0400 Subject: [PATCH 60/98] Update KMS scenario (#6785) --- .doc_gen/metadata/kms_metadata.yaml | 13 +- javav2/example_code/kms/README.md | 42 +- javav2/example_code/kms/pom.xml | 24 +- .../main/java/com/example/kms/HelloKMS.java | 51 +- .../com/example/kms/scenario/KMSActions.java | 700 ++++++++++++ .../com/example/kms/scenario/KMSScenario.java | 1009 ++++++++--------- .../kms/src/main/resources/log4j2.xml | 18 + .../kms/src/test/java/AmazonKMSTest.java | 110 +- 8 files changed, 1290 insertions(+), 677 deletions(-) create mode 100644 javav2/example_code/kms/src/main/java/com/example/kms/scenario/KMSActions.java create mode 100644 javav2/example_code/kms/src/main/resources/log4j2.xml diff --git a/.doc_gen/metadata/kms_metadata.yaml b/.doc_gen/metadata/kms_metadata.yaml index a3dcaacb0db..3f4ba0851d5 100644 --- a/.doc_gen/metadata/kms_metadata.yaml +++ b/.doc_gen/metadata/kms_metadata.yaml @@ -1,8 +1,8 @@ # zexi 0.4.0 kms_Hello: - title: Hello &KMS; - title_abbrev: Hello &KMS; - synopsis: get started using &KMS;. + title: Hello &kms-key; + title_abbrev: Hello &kms-key; + synopsis: get started using &kms-key;. category: Hello languages: Java: @@ -785,6 +785,8 @@ kms_Scenario_KeyManagement: services: kms: {CreateKey, ListKeys, DescribeKey, GenerateDataKey, EnableKey, DisableKey, ScheduleKeyDeletion} kms_Scenario_Basics: + title: Learn core operations for &kms-key; using an &AWS; SDK + title_abbrev: Learn &kms-key; core operations synopsis_list: - Create a &kms-key;. - List &kms-keys; for your account and get details about them. @@ -801,9 +803,12 @@ kms_Scenario_Basics: github: javav2/example_code/kms sdkguide: excerpts: - - description: + - description: Run a scenario at a command prompt. snippet_tags: - kms.java2_scenario.main + - description: Define a class that wraps KMS actions. + snippet_tags: + - kms.java2_actions.main services: kms: {CreateKey, ListKeys, DescribeKey, GenerateDataKey, EnableKey, Sign, DisableKey, ScheduleKeyDeletion} diff --git a/javav2/example_code/kms/README.md b/javav2/example_code/kms/README.md index 31ee5f2ec62..8fea02a2792 100644 --- a/javav2/example_code/kms/README.md +++ b/javav2/example_code/kms/README.md @@ -31,37 +31,37 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav ### Get started -- [Hello AWS KMS](src/main/java/com/example/kms/HelloKMS.java#L6) (`listKeysPaginator`) +- [Hello KMS key](src/main/java/com/example/kms/HelloKMS.java#L6) (`listKeysPaginator`) ### Basics Code examples that show you how to perform the essential operations within a service. -- [Learn the basics](src/main/java/com/example/kms/scenario/KMSScenario.java) +- [Learn KMS key core operations](src/main/java/com/example/kms/scenario/KMSScenario.java) ### Single actions Code excerpts that show you how to call individual service functions. -- [CreateAlias](src/main/java/com/example/kms/scenario/KMSScenario.java#L636) -- [CreateGrant](src/main/java/com/example/kms/scenario/KMSScenario.java#L592) -- [CreateKey](src/main/java/com/example/kms/scenario/KMSScenario.java#L682) -- [Decrypt](src/main/java/com/example/kms/scenario/KMSScenario.java#L529) -- [DeleteAlias](src/main/java/com/example/kms/scenario/KMSScenario.java#L489) -- [DescribeKey](src/main/java/com/example/kms/scenario/KMSScenario.java#L505) -- [DisableKey](src/main/java/com/example/kms/scenario/KMSScenario.java#L322) -- [EnableKey](src/main/java/com/example/kms/scenario/KMSScenario.java#L703) -- [Encrypt](src/main/java/com/example/kms/scenario/KMSScenario.java#L657) -- [ListAliases](src/main/java/com/example/kms/scenario/KMSScenario.java#L302) -- [ListGrants](src/main/java/com/example/kms/scenario/KMSScenario.java#L566) -- [ListKeyPolicies](src/main/java/com/example/kms/scenario/KMSScenario.java#L399) +- [CreateAlias](src/main/java/com/example/kms/scenario/KMSActions.java#L221) +- [CreateGrant](src/main/java/com/example/kms/scenario/KMSActions.java#L313) +- [CreateKey](src/main/java/com/example/kms/scenario/KMSActions.java#L112) +- [Decrypt](src/main/java/com/example/kms/scenario/KMSActions.java#L423) +- [DeleteAlias](src/main/java/com/example/kms/scenario/KMSActions.java#L620) +- [DescribeKey](src/main/java/com/example/kms/scenario/KMSActions.java#L135) +- [DisableKey](src/main/java/com/example/kms/scenario/KMSActions.java#L642) +- [EnableKey](src/main/java/com/example/kms/scenario/KMSActions.java#L165) +- [Encrypt](src/main/java/com/example/kms/scenario/KMSActions.java#L194) +- [ListAliases](src/main/java/com/example/kms/scenario/KMSActions.java#L254) +- [ListGrants](src/main/java/com/example/kms/scenario/KMSActions.java#L353) +- [ListKeyPolicies](src/main/java/com/example/kms/scenario/KMSActions.java#L506) - [ListKeys](src/main/java/com/example/kms/HelloKMS.java#L6) -- [RevokeGrant](src/main/java/com/example/kms/scenario/KMSScenario.java#L548) -- [ScheduleKeyDeletion](src/main/java/com/example/kms/scenario/KMSScenario.java#L471) -- [Sign](src/main/java/com/example/kms/scenario/KMSScenario.java#L338) -- [TagResource](src/main/java/com/example/kms/scenario/KMSScenario.java#L376) +- [RevokeGrant](src/main/java/com/example/kms/scenario/KMSActions.java#L385) +- [ScheduleKeyDeletion](src/main/java/com/example/kms/scenario/KMSActions.java#L664) +- [Sign](src/main/java/com/example/kms/scenario/KMSActions.java#L532) +- [TagResource](src/main/java/com/example/kms/scenario/KMSActions.java#L592) @@ -75,12 +75,12 @@ Code excerpts that show you how to call individual service functions. -#### Hello AWS KMS +#### Hello KMS key -This example shows you how to get started using AWS KMS. +This example shows you how to get started using KMS key. -#### Learn the basics +#### Learn KMS key core operations This example shows you how to do the following: diff --git a/javav2/example_code/kms/pom.xml b/javav2/example_code/kms/pom.xml index 4582ab64c01..5f147da99af 100644 --- a/javav2/example_code/kms/pom.xml +++ b/javav2/example_code/kms/pom.xml @@ -42,6 +42,13 @@ pom import + + org.apache.logging.log4j + log4j-bom + 2.23.1 + pom + import + @@ -51,6 +58,10 @@ 5.9.2 test + + software.amazon.awssdk + netty-nio-client + org.junit.jupiter junit-jupiter-engine @@ -93,15 +104,22 @@ software.amazon.awssdk ssooidc + + org.apache.logging.log4j + log4j-core + org.slf4j slf4j-api 2.0.13 - org.slf4j - slf4j-simple - 2.0.13 + org.apache.logging.log4j + log4j-slf4j2-impl + + + org.apache.logging.log4j + log4j-1.2-api \ No newline at end of file diff --git a/javav2/example_code/kms/src/main/java/com/example/kms/HelloKMS.java b/javav2/example_code/kms/src/main/java/com/example/kms/HelloKMS.java index 4a77a91e484..0c96206328b 100644 --- a/javav2/example_code/kms/src/main/java/com/example/kms/HelloKMS.java +++ b/javav2/example_code/kms/src/main/java/com/example/kms/HelloKMS.java @@ -6,10 +6,10 @@ // snippet-start:[kms.java2_list_keys.main] // snippet-start:[kms.java2_list_keys.import] import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.kms.KmsClient; +import software.amazon.awssdk.services.kms.KmsAsyncClient; import software.amazon.awssdk.services.kms.model.ListKeysRequest; -import software.amazon.awssdk.services.kms.model.KmsException; -import software.amazon.awssdk.services.kms.paginators.ListKeysIterable; +import software.amazon.awssdk.services.kms.paginators.ListKeysPublisher; +import java.util.concurrent.CompletableFuture; // snippet-end:[kms.java2_list_keys.import] /** @@ -22,30 +22,35 @@ */ public class HelloKMS { public static void main(String[] args) { - Region region = Region.US_WEST_2; - KmsClient kmsClient = KmsClient.builder() - .region(region) - .build(); - - listAllKeys(kmsClient); - kmsClient.close(); + listAllKeys(); } - public static void listAllKeys(KmsClient kmsClient) { - try { - ListKeysRequest listKeysRequest = ListKeysRequest.builder() - .limit(15) - .build(); + public static void listAllKeys() { + Region region = Region.US_WEST_2; + KmsAsyncClient kmsAsyncClient = KmsAsyncClient.builder() + .region(region) + .build(); + ListKeysRequest listKeysRequest = ListKeysRequest.builder() + .limit(15) + .build(); - ListKeysIterable keysResponse = kmsClient.listKeysPaginator(listKeysRequest); - keysResponse.stream() - .flatMap(r -> r.keys().stream()) - .forEach(key -> System.out - .println(" The key ARN is: " + key.keyArn() + ". The key Id is: " + key.keyId())); + ListKeysPublisher keysPublisher = kmsAsyncClient.listKeysPaginator(listKeysRequest); + CompletableFuture future = keysPublisher + .subscribe(r -> r.keys().forEach(key -> + System.out.println("The key ARN is: " + key.keyArn() + ". The key Id is: " + key.keyId()))) + .whenComplete((result, exception) -> { + if (exception != null) { + System.err.println("Error occurred: " + exception.getMessage()); + } else { + System.out.println("Successfully listed all keys."); + } + }); - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); + // Wait for the asynchronous operation to complete + try { + future.join(); + } catch (Exception e) { + System.err.println("Failed to list keys: " + e.getMessage()); } } } diff --git a/javav2/example_code/kms/src/main/java/com/example/kms/scenario/KMSActions.java b/javav2/example_code/kms/src/main/java/com/example/kms/scenario/KMSActions.java new file mode 100644 index 00000000000..45ce986bf01 --- /dev/null +++ b/javav2/example_code/kms/src/main/java/com/example/kms/scenario/KMSActions.java @@ -0,0 +1,700 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.kms.scenario; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; +import software.amazon.awssdk.core.SdkBytes; +import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; +import software.amazon.awssdk.core.retry.RetryPolicy; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.services.kms.KmsAsyncClient; +import software.amazon.awssdk.services.kms.model.CreateAliasRequest; +import software.amazon.awssdk.services.kms.model.CreateAliasResponse; +import software.amazon.awssdk.services.kms.model.CreateGrantRequest; +import software.amazon.awssdk.services.kms.model.CreateGrantResponse; +import software.amazon.awssdk.services.kms.model.CreateKeyRequest; +import software.amazon.awssdk.services.kms.model.DecryptRequest; +import software.amazon.awssdk.services.kms.model.DecryptResponse; +import software.amazon.awssdk.services.kms.model.DeleteAliasRequest; +import software.amazon.awssdk.services.kms.model.DescribeKeyRequest; +import software.amazon.awssdk.services.kms.model.DescribeKeyResponse; +import software.amazon.awssdk.services.kms.model.DisableKeyRequest; +import software.amazon.awssdk.services.kms.model.EnableKeyRequest; +import software.amazon.awssdk.services.kms.model.EnableKeyResponse; +import software.amazon.awssdk.services.kms.model.EnableKeyRotationRequest; +import software.amazon.awssdk.services.kms.model.EnableKeyRotationResponse; +import software.amazon.awssdk.services.kms.model.EncryptRequest; +import software.amazon.awssdk.services.kms.model.EncryptResponse; +import software.amazon.awssdk.services.kms.model.GetKeyPolicyRequest; +import software.amazon.awssdk.services.kms.model.GrantOperation; +import software.amazon.awssdk.services.kms.model.KeySpec; +import software.amazon.awssdk.services.kms.model.KeyState; +import software.amazon.awssdk.services.kms.model.KeyUsageType; +import software.amazon.awssdk.services.kms.model.KmsException; +import software.amazon.awssdk.services.kms.model.LimitExceededException; +import software.amazon.awssdk.services.kms.model.ListAliasesRequest; +import software.amazon.awssdk.services.kms.model.ListGrantsRequest; +import software.amazon.awssdk.services.kms.model.OriginType; +import software.amazon.awssdk.services.kms.model.PutKeyPolicyRequest; +import software.amazon.awssdk.services.kms.model.RevokeGrantRequest; +import software.amazon.awssdk.services.kms.model.RevokeGrantResponse; +import software.amazon.awssdk.services.kms.model.ScheduleKeyDeletionRequest; +import software.amazon.awssdk.services.kms.model.SignRequest; +import software.amazon.awssdk.services.kms.model.SigningAlgorithmSpec; +import software.amazon.awssdk.services.kms.model.Tag; +import software.amazon.awssdk.services.kms.model.TagResourceRequest; +import software.amazon.awssdk.services.kms.model.VerifyRequest; +import software.amazon.awssdk.services.kms.paginators.ListAliasesPublisher; +import software.amazon.awssdk.services.kms.paginators.ListGrantsPublisher; +import software.amazon.awssdk.services.secretsmanager.model.ResourceExistsException; +import software.amazon.awssdk.services.sts.StsClient; +import software.amazon.awssdk.services.sts.model.GetCallerIdentityResponse; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.List; +import java.util.concurrent.CompletableFuture; +// snippet-start:[kms.java2_actions.main] +public class KMSActions { + private static final Logger logger = LoggerFactory.getLogger(KMSActions.class); + private static KmsAsyncClient kmsAsyncClient; + + /** + * Retrieves an asynchronous AWS Key Management Service (KMS) client. + *

+ * This method creates and returns a singleton instance of the KMS async client, with the following configurations: + *

    + *
  • Max concurrency: 100
  • + *
  • Connection timeout: 60 seconds
  • + *
  • Read timeout: 60 seconds
  • + *
  • Write timeout: 60 seconds
  • + *
  • API call timeout: 2 minutes
  • + *
  • API call attempt timeout: 90 seconds
  • + *
  • Retry policy: up to 3 retries
  • + *
  • Credentials provider: environment variable credentials provider
  • + *
+ *

+ * If the client instance has already been created, it is returned instead of creating a new one. + * + * @return the KMS async client instance + */ + private static KmsAsyncClient getAsyncClient() { + if (kmsAsyncClient == null) { + SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() + .maxConcurrency(100) + .connectionTimeout(Duration.ofSeconds(60)) + .readTimeout(Duration.ofSeconds(60)) + .writeTimeout(Duration.ofSeconds(60)) + .build(); + + ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() + .apiCallTimeout(Duration.ofMinutes(2)) + .apiCallAttemptTimeout(Duration.ofSeconds(90)) + .retryPolicy(RetryPolicy.builder() + .numRetries(3) + .build()) + .build(); + + kmsAsyncClient = KmsAsyncClient.builder() + .httpClient(httpClient) + .overrideConfiguration(overrideConfig) + .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) + .build(); + } + return kmsAsyncClient; + } + + // snippet-start:[kms.java2_create_key.main] + /** + * Creates a new symmetric encryption key asynchronously. + * + * @param keyDesc the description of the key to be created + * @return a {@link CompletableFuture} that completes with the ID of the newly created key + * @throws RuntimeException if an error occurs while creating the key + */ + public CompletableFuture createKeyAsync(String keyDesc) { + CreateKeyRequest keyRequest = CreateKeyRequest.builder() + .description(keyDesc) + .keySpec(KeySpec.SYMMETRIC_DEFAULT) + .keyUsage(KeyUsageType.ENCRYPT_DECRYPT) + .build(); + + return getAsyncClient().createKey(keyRequest) + .thenApply(resp -> resp.keyMetadata().keyId()) + .exceptionally(ex -> { + throw new RuntimeException("An error occurred while creating the key: " + ex.getMessage(), ex); + }); + } + // snippet-end:[kms.java2_create_key.main] + + // snippet-start:[kms.java2_describe_key.main] + /** + * Asynchronously checks if a specified key is enabled. + * + * @param keyId the ID of the key to check + * @return a {@link CompletableFuture} that, when completed, indicates whether the key is enabled or not + * + * @throws RuntimeException if an exception occurs while checking the key state + */ + public CompletableFuture isKeyEnabledAsync(String keyId) { + DescribeKeyRequest keyRequest = DescribeKeyRequest.builder() + .keyId(keyId) + .build(); + + CompletableFuture responseFuture = getAsyncClient().describeKey(keyRequest); + return responseFuture.whenComplete((resp, ex) -> { + if (resp != null) { + KeyState keyState = resp.keyMetadata().keyState(); + if (keyState == KeyState.ENABLED) { + logger.info("The key is enabled."); + } else { + logger.info("The key is not enabled. Key state: {}", keyState); + } + } else { + throw new RuntimeException(ex); + } + }).thenApply(resp -> resp.keyMetadata().keyState() == KeyState.ENABLED); + } + // snippet-end:[kms.java2_describe_key.main] + + // snippet-start:[kms.java2_enable_key.main] + /** + * Asynchronously enables the specified key. + * + * @param keyId the ID of the key to enable + * @return a {@link CompletableFuture} that completes when the key has been enabled + */ + public CompletableFuture enableKeyAsync(String keyId) { + EnableKeyRequest enableKeyRequest = EnableKeyRequest.builder() + .keyId(keyId) + .build(); + + CompletableFuture responseFuture = getAsyncClient().enableKey(enableKeyRequest); + responseFuture.whenComplete((response, exception) -> { + if (exception == null) { + logger.info("Key with ID [{}] has been enabled.", keyId); + } else { + if (exception instanceof KmsException kmsEx) { + throw new RuntimeException("KMS error occurred while enabling key: " + kmsEx.getMessage(), kmsEx); + } else { + throw new RuntimeException("An unexpected error occurred while enabling key: " + exception.getMessage(), exception); + } + } + }); + + return responseFuture.thenApply(response -> null); + } + // snippet-end:[kms.java2_enable_key.main] + + // snippet-start:[kms.java2_encrypt_data.main] + /** + * Encrypts the given text asynchronously using the specified KMS client and key ID. + * + * @param keyId the ID of the KMS key to use for encryption + * @param text the text to encrypt + * @return a CompletableFuture that completes with the encrypted data as an SdkBytes object + */ + public CompletableFuture encryptDataAsync(String keyId, String text) { + SdkBytes myBytes = SdkBytes.fromUtf8String(text); + EncryptRequest encryptRequest = EncryptRequest.builder() + .keyId(keyId) + .plaintext(myBytes) + .build(); + + CompletableFuture responseFuture = getAsyncClient().encrypt(encryptRequest).toCompletableFuture(); + return responseFuture.whenComplete((response, ex) -> { + if (response != null) { + String algorithm = response.encryptionAlgorithm().toString(); + logger.info("The string was encrypted with algorithm {}.", algorithm); + } else { + throw new RuntimeException(ex); + } + }).thenApply(EncryptResponse::ciphertextBlob); + } + // snippet-end:[kms.java2_encrypt_data.main] + + // snippet-start:[kms.java2._create_alias.main] + /** + * Creates a custom alias for the specified target key asynchronously. + * + * @param targetKeyId the ID of the target key for the alias + * @param aliasName the name of the alias to create + * @return a {@link CompletableFuture} that completes when the alias creation operation is finished + */ + public CompletableFuture createCustomAliasAsync(String targetKeyId, String aliasName) { + CreateAliasRequest aliasRequest = CreateAliasRequest.builder() + .aliasName(aliasName) + .targetKeyId(targetKeyId) + .build(); + + CompletableFuture responseFuture = getAsyncClient().createAlias(aliasRequest); + responseFuture.whenComplete((response, exception) -> { + if (exception == null) { + logger.info("{} was successfully created.", aliasName); + } else { + if (exception instanceof ResourceExistsException) { + logger.info("Alias [{}] already exists. Moving on...", aliasName); + } else if (exception instanceof KmsException kmsEx) { + throw new RuntimeException("KMS error occurred while creating alias: " + kmsEx.getMessage(), kmsEx); + } else { + throw new RuntimeException("An unexpected error occurred while creating alias: " + exception.getMessage(), exception); + } + } + }); + + return responseFuture.thenApply(response -> null); + } + // snippet-end:[kms.java2._create_alias.main] + + // snippet-start:[kms.java2_list_aliases.main] + /** + * Asynchronously lists all the aliases in the current AWS account. + * + * @return a {@link CompletableFuture} that completes when the list of aliases has been processed + */ + public CompletableFuture listAllAliasesAsync() { + ListAliasesRequest aliasesRequest = ListAliasesRequest.builder() + .limit(15) + .build(); + + ListAliasesPublisher paginator = getAsyncClient().listAliasesPaginator(aliasesRequest); + return paginator.subscribe(response -> { + response.aliases().forEach(alias -> + logger.info("The alias name is: " + alias.aliasName()) + ); + }) + .thenApply(v -> null) + .exceptionally(ex -> { + if (ex.getCause() instanceof KmsException) { + KmsException e = (KmsException) ex.getCause(); + throw new RuntimeException("A KMS exception occurred: " + e.getMessage()); + } else { + throw new RuntimeException("An unexpected error occurred: " + ex.getMessage()); + } + }); + } + // snippet-end:[kms.java2_list_aliases.main] + + // snippet-start:[kms.java2._key_rotation.main] + /** + * Enables key rotation asynchronously for the specified key ID. + * + * @param keyId the ID of the key for which to enable key rotation + * @return a CompletableFuture that represents the asynchronous operation of enabling key rotation + * @throws RuntimeException if there was an error enabling key rotation, either due to a KMS exception or an unexpected error + */ + public CompletableFuture enableKeyRotationAsync(String keyId) { + EnableKeyRotationRequest enableKeyRotationRequest = EnableKeyRotationRequest.builder() + .keyId(keyId) + .build(); + + CompletableFuture responseFuture = getAsyncClient().enableKeyRotation(enableKeyRotationRequest); + responseFuture.whenComplete((response, exception) -> { + if (exception == null) { + logger.info("Key rotation has been enabled for key with id [{}]", keyId); + } else { + if (exception instanceof KmsException kmsEx) { + throw new RuntimeException("Failed to enable key rotation: " + kmsEx.getMessage(), kmsEx); + } else { + throw new RuntimeException("An unexpected error occurred: " + exception.getMessage(), exception); + } + } + }); + + return responseFuture; + } + // snippet-end:[kms.java2._key_rotation.main] + + // snippet-start:[kms.java2_create_grant.main] + /** + * Grants permissions to a specified principal on a customer master key (CMK) asynchronously. + * + * @param keyId The unique identifier for the customer master key (CMK) that the grant applies to. + * @param granteePrincipal The principal that is given permission to perform the operations that the grant permits on the CMK. + * @return A {@link CompletableFuture} that, when completed, contains the ID of the created grant. + * @throws RuntimeException If an error occurs during the grant creation process. + */ + public CompletableFuture grantKeyAsync(String keyId, String granteePrincipal) { + List grantPermissions = List.of( + GrantOperation.ENCRYPT, + GrantOperation.DECRYPT, + GrantOperation.DESCRIBE_KEY + ); + + CreateGrantRequest grantRequest = CreateGrantRequest.builder() + .keyId(keyId) + .name("grant1") + .granteePrincipal(granteePrincipal) + .operations(grantPermissions) + .build(); + + CompletableFuture responseFuture = getAsyncClient().createGrant(grantRequest); + responseFuture.whenComplete((response, ex) -> { + if (ex == null) { + logger.info("Grant created successfully with ID: " + response.grantId()); + } else { + if (ex instanceof KmsException kmsEx) { + throw new RuntimeException("Failed to create grant: " + kmsEx.getMessage(), kmsEx); + } else { + throw new RuntimeException("An unexpected error occurred: " + ex.getMessage(), ex); + } + } + }); + + return responseFuture.thenApply(CreateGrantResponse::grantId); + } + // snippet-end:[kms.java2_create_grant.main] + + // snippet-start:[kms.java2_list_grant.main] + /** + * Asynchronously displays the grant IDs for the specified key ID. + * + * @param keyId the ID of the AWS KMS key for which to list the grants + * @return a {@link CompletableFuture} that, when completed, will be null if the operation succeeded, or will throw a {@link RuntimeException} if the operation failed + * @throws RuntimeException if there was an error listing the grants, either due to an {@link KmsException} or an unexpected error + */ + public CompletableFuture displayGrantIdsAsync(String keyId) { + ListGrantsRequest grantsRequest = ListGrantsRequest.builder() + .keyId(keyId) + .limit(15) + .build(); + + ListGrantsPublisher paginator = getAsyncClient().listGrantsPaginator(grantsRequest); + return paginator.subscribe(response -> { + response.grants().forEach(grant -> { + logger.info("The grant Id is: " + grant.grantId()); + }); + }) + .thenApply(v -> null) + .exceptionally(ex -> { + Throwable cause = ex.getCause(); + if (cause instanceof KmsException) { + throw new RuntimeException("Failed to list grants: " + cause.getMessage(), cause); + } else { + throw new RuntimeException("An unexpected error occurred: " + cause.getMessage(), cause); + } + }); + } + // snippet-end:[kms.java2_list_grant.main] + + // snippet-start:[kms.java2_revoke_grant.main] + /** + * Revokes a grant for the specified AWS KMS key asynchronously. + * + * @param keyId The ID or key ARN of the AWS KMS key. + * @param grantId The identifier of the grant to be revoked. + * @return A {@link CompletableFuture} representing the asynchronous operation of revoking the grant. + * The {@link CompletableFuture} will complete with a {@link RevokeGrantResponse} object + * if the operation is successful, or with a {@code null} value if an error occurs. + */ + public CompletableFuture revokeKeyGrantAsync(String keyId, String grantId) { + RevokeGrantRequest grantRequest = RevokeGrantRequest.builder() + .keyId(keyId) + .grantId(grantId) + .build(); + + CompletableFuture responseFuture = getAsyncClient().revokeGrant(grantRequest); + responseFuture.whenComplete((response, exception) -> { + if (exception == null) { + logger.info("Grant ID: [" + grantId + "] was successfully revoked!"); + } else { + if (exception instanceof KmsException kmsEx) { + if (kmsEx.getMessage().contains("Grant does not exist")) { + logger.info("The grant ID '" + grantId + "' does not exist. Moving on..."); + } else { + throw new RuntimeException("KMS error occurred: " + kmsEx.getMessage(), kmsEx); + } + } else { + throw new RuntimeException("An unexpected error occurred: " + exception.getMessage(), exception); + } + } + }); + + return responseFuture; + } + + // snippet-end:[kms.java2_revoke_grant.main] + + // snippet-start:[kms.java2_decrypt_data.main] + /** + * Asynchronously decrypts the given encrypted data using the specified key ID. + * + * @param encryptedData The encrypted data to be decrypted. + * @param keyId The ID of the key to be used for decryption. + * @return A CompletableFuture that, when completed, will contain the decrypted data as a String. + * If an error occurs during the decryption process, the CompletableFuture will complete + * exceptionally with the error, and the method will return an empty String. + */ + public CompletableFuture decryptDataAsync(SdkBytes encryptedData, String keyId) { + DecryptRequest decryptRequest = DecryptRequest.builder() + .ciphertextBlob(encryptedData) + .keyId(keyId) + .build(); + + CompletableFuture responseFuture = getAsyncClient().decrypt(decryptRequest); + responseFuture.whenComplete((decryptResponse, exception) -> { + if (exception == null) { + logger.info("Data decrypted successfully for key ID: " + keyId); + } else { + if (exception instanceof KmsException kmsEx) { + throw new RuntimeException("KMS error occurred while decrypting data: " + kmsEx.getMessage(), kmsEx); + } else { + throw new RuntimeException("An unexpected error occurred while decrypting data: " + exception.getMessage(), exception); + } + } + }); + + return responseFuture.thenApply(decryptResponse -> decryptResponse.plaintext().asString(StandardCharsets.UTF_8)); + } + // snippet-end:[kms.java2_decrypt_data.main] + + // snippet-start:[kms.java2_set_policy.main] + /** + * Asynchronously replaces the policy for the specified KMS key. + * + * @param keyId the ID of the KMS key to replace the policy for + * @param policyName the name of the policy to be replaced + * @param accountId the AWS account ID to be used in the policy + * @return a {@link CompletableFuture} that completes with a boolean indicating + * whether the policy replacement was successful or not + */ + public CompletableFuture replacePolicyAsync(String keyId, String policyName, String accountId) { + String policy = """ + { + "Version": "2012-10-17", + "Statement": [{ + "Effect": "Allow", + "Principal": {"AWS": "arn:aws:iam::%s:root"}, + "Action": "kms:*", + "Resource": "*" + }] + } + """.formatted(accountId); + + PutKeyPolicyRequest keyPolicyRequest = PutKeyPolicyRequest.builder() + .keyId(keyId) + .policyName(policyName) + .policy(policy) + .build(); + + // First, get the current policy to check if it exists + return getAsyncClient().getKeyPolicy(r -> r.keyId(keyId).policyName(policyName)) + .thenCompose(response -> { + logger.info("Current policy exists. Replacing it..."); + return getAsyncClient().putKeyPolicy(keyPolicyRequest); + }) + .thenApply(putPolicyResponse -> { + logger.info("The key policy has been replaced."); + return true; + }) + .exceptionally(throwable -> { + if (throwable.getCause() instanceof LimitExceededException) { + logger.error("Cannot replace policy, as only one policy is allowed per key."); + return false; + } + throw new RuntimeException("Error replacing policy", throwable); + }); + } + + // snippet-end:[kms.java2_set_policy.main] + + // snippet-start:[kms.java2_get_policy.main] + /** + * Asynchronously retrieves the key policy for the specified key ID and policy name. + * + * @param keyId the ID of the AWS KMS key for which to retrieve the policy + * @param policyName the name of the key policy to retrieve + * @return a {@link CompletableFuture} that, when completed, contains the key policy as a {@link String} + */ + public CompletableFuture getKeyPolicyAsync(String keyId, String policyName) { + GetKeyPolicyRequest policyRequest = GetKeyPolicyRequest.builder() + .keyId(keyId) + .policyName(policyName) + .build(); + + return getAsyncClient().getKeyPolicy(policyRequest) + .thenApply(response -> { + String policy = response.policy(); + logger.info("The response is: " + policy); + return policy; + }) + .exceptionally(ex -> { + throw new RuntimeException("Failed to get key policy", ex); + }); + } + // snippet-end:[kms.java2_get_policy.main] + + // snippet-start:[kms.java2_sign.main] + /** + * Asynchronously signs and verifies data using AWS KMS. + * + *

The method performs the following steps: + *

    + *
  1. Creates an AWS KMS key with the specified key spec, key usage, and origin.
  2. + *
  3. Signs the provided message using the created KMS key and the RSASSA-PSS-SHA-256 algorithm.
  4. + *
  5. Verifies the signature of the message using the created KMS key and the RSASSA-PSS-SHA-256 algorithm.
  6. + *
+ * + * @return a {@link CompletableFuture} that completes with the result of the signature verification, + * {@code true} if the signature is valid, {@code false} otherwise. + * @throws KmsException if any error occurs during the KMS operations. + * @throws RuntimeException if an unexpected error occurs. + */ + public CompletableFuture signVerifyDataAsync() { + String signMessage = "Here is the message that will be digitally signed"; + + // Create an AWS KMS key used to digitally sign data. + CreateKeyRequest createKeyRequest = CreateKeyRequest.builder() + .keySpec(KeySpec.RSA_2048) + .keyUsage(KeyUsageType.SIGN_VERIFY) + .origin(OriginType.AWS_KMS) + .build(); + + return getAsyncClient().createKey(createKeyRequest) + .thenCompose(createKeyResponse -> { + String keyId = createKeyResponse.keyMetadata().keyId(); + + SdkBytes messageBytes = SdkBytes.fromString(signMessage, Charset.defaultCharset()); + SignRequest signRequest = SignRequest.builder() + .keyId(keyId) + .message(messageBytes) + .signingAlgorithm(SigningAlgorithmSpec.RSASSA_PSS_SHA_256) + .build(); + + return getAsyncClient().sign(signRequest) + .thenCompose(signResponse -> { + byte[] signedBytes = signResponse.signature().asByteArray(); + + VerifyRequest verifyRequest = VerifyRequest.builder() + .keyId(keyId) + .message(SdkBytes.fromByteArray(signMessage.getBytes(Charset.defaultCharset()))) + .signature(SdkBytes.fromByteBuffer(ByteBuffer.wrap(signedBytes))) + .signingAlgorithm(SigningAlgorithmSpec.RSASSA_PSS_SHA_256) + .build(); + + return getAsyncClient().verify(verifyRequest) + .thenApply(verifyResponse -> { + return (boolean) verifyResponse.signatureValid(); + }); + }); + }) + .exceptionally(throwable -> { + throw new RuntimeException("Failed to sign or verify data", throwable); + }); + } + // snippet-end:[kms.java2_sign.main] + + // snippet-start:[kms.java2_tag.main] + /** + * Asynchronously tags a KMS key with a specific tag. + * + * @param keyId the ID of the KMS key to be tagged + * @return a {@link CompletableFuture} that completes when the tagging operation is finished + */ + public CompletableFuture tagKMSKeyAsync(String keyId) { + Tag tag = Tag.builder() + .tagKey("Environment") + .tagValue("Production") + .build(); + + TagResourceRequest tagResourceRequest = TagResourceRequest.builder() + .keyId(keyId) + .tags(tag) + .build(); + + return getAsyncClient().tagResource(tagResourceRequest) + .thenRun(() -> { + logger.info("{} key was tagged", keyId); + }) + .exceptionally(throwable -> { + throw new RuntimeException("Failed to tag the KMS key", throwable); + }); + } + // snippet-end:[kms.java2_tag.main] + + // snippet-start:[kms.java2_delete_alias.main] + /** + * Deletes a specific KMS alias asynchronously. + * + * @param aliasName the name of the alias to be deleted + * @return a {@link CompletableFuture} representing the asynchronous operation of deleting the specified alias + */ + public CompletableFuture deleteSpecificAliasAsync(String aliasName) { + DeleteAliasRequest deleteAliasRequest = DeleteAliasRequest.builder() + .aliasName(aliasName) + .build(); + + return getAsyncClient().deleteAlias(deleteAliasRequest) + .thenRun(() -> { + logger.info("Alias {} has been deleted successfully", aliasName); + }) + .exceptionally(throwable -> { + throw new RuntimeException("Failed to delete alias: " + aliasName, throwable); + }); + } + // snippet-end:[kms.java2_delete_alias.main] + + // snippet-start:[kms.java2_disable_key.main] + /** + * Asynchronously disables the specified AWS Key Management Service (KMS) key. + * + * @param keyId the ID or Amazon Resource Name (ARN) of the KMS key to be disabled + * @return a CompletableFuture that, when completed, indicates that the key has been disabled successfully + */ + public CompletableFuture disableKeyAsync(String keyId) { + DisableKeyRequest keyRequest = DisableKeyRequest.builder() + .keyId(keyId) + .build(); + + return getAsyncClient().disableKey(keyRequest) + .thenRun(() -> { + logger.info("Key {} has been disabled successfully",keyId); + }) + .exceptionally(throwable -> { + throw new RuntimeException("Failed to disable key: " + keyId, throwable); + }); + } + // snippet-end:[kms.java2_disable_key.main] + + // snippet-start:[kms.java2_delete_key.main] + /** + * Deletes a KMS key asynchronously. + * + *

Warning: Deleting a KMS key is a destructive and potentially dangerous operation. + * When a KMS key is deleted, all data that was encrypted under the KMS key becomes unrecoverable. + * This means that any files, databases, or other data that were encrypted using the deleted KMS key + * will become permanently inaccessible. Exercise extreme caution when deleting KMS keys.

+ * + * @param keyId the ID of the KMS key to delete + * @return a {@link CompletableFuture} that completes when the key deletion is scheduled + */ + public CompletableFuture deleteKeyAsync(String keyId) { + ScheduleKeyDeletionRequest deletionRequest = ScheduleKeyDeletionRequest.builder() + .keyId(keyId) + .pendingWindowInDays(7) + .build(); + + return getAsyncClient().scheduleKeyDeletion(deletionRequest) + .thenRun(() -> { + logger.info("Key {} will be deleted in 7 days", keyId); + }) + .exceptionally(throwable -> { + throw new RuntimeException("Failed to schedule key deletion for key ID: " + keyId, throwable); + }); + } + // snippet-end:[kms.java2_delete_key.main] + + + public String getAccountId(){ + try (StsClient stsClient = StsClient.create()){ + GetCallerIdentityResponse callerIdentity = stsClient.getCallerIdentity(); + return callerIdentity.account(); + } + } +} +// snippet-end:[kms.java2_actions.main] \ No newline at end of file diff --git a/javav2/example_code/kms/src/main/java/com/example/kms/scenario/KMSScenario.java b/javav2/example_code/kms/src/main/java/com/example/kms/scenario/KMSScenario.java index d63d3c35535..216c249a1a6 100644 --- a/javav2/example_code/kms/src/main/java/com/example/kms/scenario/KMSScenario.java +++ b/javav2/example_code/kms/src/main/java/com/example/kms/scenario/KMSScenario.java @@ -6,59 +6,18 @@ // snippet-start:[kms.java2_scenario.main] import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.kms.KmsClient; -import software.amazon.awssdk.services.kms.model.AliasListEntry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import software.amazon.awssdk.services.kms.model.AlreadyExistsException; -import software.amazon.awssdk.services.kms.model.CreateAliasRequest; -import software.amazon.awssdk.services.kms.model.CreateGrantRequest; -import software.amazon.awssdk.services.kms.model.CreateGrantResponse; -import software.amazon.awssdk.services.kms.model.CreateKeyRequest; -import software.amazon.awssdk.services.kms.model.CreateKeyResponse; -import software.amazon.awssdk.services.kms.model.CustomerMasterKeySpec; -import software.amazon.awssdk.services.kms.model.DecryptRequest; -import software.amazon.awssdk.services.kms.model.DecryptResponse; -import software.amazon.awssdk.services.kms.model.DeleteAliasRequest; -import software.amazon.awssdk.services.kms.model.DescribeKeyRequest; -import software.amazon.awssdk.services.kms.model.DescribeKeyResponse; -import software.amazon.awssdk.services.kms.model.DisableKeyRequest; -import software.amazon.awssdk.services.kms.model.EnableKeyRequest; -import software.amazon.awssdk.services.kms.model.EnableKeyRotationRequest; -import software.amazon.awssdk.services.kms.model.EncryptRequest; -import software.amazon.awssdk.services.kms.model.EncryptResponse; -import software.amazon.awssdk.services.kms.model.GetKeyPolicyRequest; -import software.amazon.awssdk.services.kms.model.GetKeyPolicyResponse; -import software.amazon.awssdk.services.kms.model.GrantOperation; -import software.amazon.awssdk.services.kms.model.KeySpec; -import software.amazon.awssdk.services.kms.model.KeyState; -import software.amazon.awssdk.services.kms.model.KeyUsageType; +import software.amazon.awssdk.services.kms.model.DisabledException; +import software.amazon.awssdk.services.kms.model.EnableKeyRotationResponse; import software.amazon.awssdk.services.kms.model.KmsException; -import software.amazon.awssdk.services.kms.model.LimitExceededException; -import software.amazon.awssdk.services.kms.model.ListAliasesRequest; -import software.amazon.awssdk.services.kms.model.ListGrantsRequest; -import software.amazon.awssdk.services.kms.model.ListKeyPoliciesRequest; -import software.amazon.awssdk.services.kms.model.ListKeyPoliciesResponse; -import software.amazon.awssdk.services.kms.model.OriginType; -import software.amazon.awssdk.services.kms.model.PutKeyPolicyRequest; -import software.amazon.awssdk.services.kms.model.RevokeGrantRequest; -import software.amazon.awssdk.services.kms.model.ScheduleKeyDeletionRequest; -import software.amazon.awssdk.services.kms.model.SignRequest; -import software.amazon.awssdk.services.kms.model.SignResponse; -import software.amazon.awssdk.services.kms.model.SigningAlgorithmSpec; -import software.amazon.awssdk.services.kms.model.Tag; -import software.amazon.awssdk.services.kms.model.TagResourceRequest; -import software.amazon.awssdk.services.kms.model.VerifyRequest; -import software.amazon.awssdk.services.kms.model.VerifyResponse; -import software.amazon.awssdk.services.kms.paginators.ListAliasesIterable; -import software.amazon.awssdk.services.kms.paginators.ListGrantsIterable; -import software.amazon.awssdk.services.secretsmanager.model.ResourceExistsException; -import software.amazon.awssdk.services.sts.StsClient; -import software.amazon.awssdk.services.sts.model.GetCallerIdentityResponse; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; +import software.amazon.awssdk.services.kms.model.NotFoundException; +import software.amazon.awssdk.services.kms.model.RevokeGrantResponse; import java.util.List; -import java.util.ArrayList; import java.util.Scanner; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; /** * Before running this Java V2 code example, set up your development @@ -71,160 +30,345 @@ public class KMSScenario { public static final String DASHES = new String(new char[80]).replace("\0", "-"); - private static final String accountId = getAccountId(); + private static String accountId = ""; + + private static final Logger logger = LoggerFactory.getLogger(KMSScenario.class); + + static KMSActions kmsActions = new KMSActions(); + + static Scanner scanner = new Scanner(System.in); + + static String aliasName = "alias/dev-encryption-key"; public static void main(String[] args) { final String usage = """ - Usage: + Usage: - Where: - granteePrincipal - The principal (user, service account, or group) to whom the grant or permission is being given. - """; + Where: + granteePrincipal - The principal (user, service account, or group) to whom the grant or permission is being given. + """; if (args.length != 1) { - System.out.println(usage); - System.exit(1); + logger.info(usage); + return; } String granteePrincipal = args[0]; String policyName = "default"; - Scanner scanner = new Scanner(System.in); + accountId = kmsActions.getAccountId(); String keyDesc = "Created by the AWS KMS API"; - Region region = Region.US_WEST_2; - KmsClient kmsClient = KmsClient.builder() - .region(region) - .build(); - - System.out.println(DASHES); - System.out.println(""" - Welcome to the AWS Key Management SDK Getting Started scenario. - + logger.info(DASHES); + logger.info(""" + Welcome to the AWS Key Management SDK Basics scenario. + This program demonstrates how to interact with AWS Key Management using the AWS SDK for Java (v2). The AWS Key Management Service (KMS) is a secure and highly available service that allows you to create and manage AWS KMS keys and control their use across a wide range of AWS services and applications. KMS provides a centralized and unified approach to managing encryption keys, making it easier to meet your data protection and regulatory compliance requirements. - This Getting Started scenario creates two key types. A symmetric encryption key is used to encrypt and decrypt data, - and an asymmetric key used to digitally sign data. + This Basics scenario creates two key types: + + - A symmetric encryption key is used to encrypt and decrypt data. + - An asymmetric key used to digitally sign data. + Let's get started... """); waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("1. Create a symmetric KMS key\n"); - System.out.println("First, the program will creates a symmetric KMS key that you can used to encrypt and decrypt data."); + try { + // Run the methods that belong to this scenario. + String targetKeyId = runScenario(granteePrincipal, keyDesc, policyName); + requestDeleteResources(aliasName, targetKeyId); + + } catch (Throwable rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + } + } + + private static String runScenario(String granteePrincipal, String keyDesc, String policyName) throws Throwable { + logger.info(DASHES); + logger.info("1. Create a symmetric KMS key\n"); + logger.info("First, the program will creates a symmetric KMS key that you can used to encrypt and decrypt data."); waitForInputToContinue(scanner); - String targetKeyId = createKey(kmsClient, keyDesc); + String targetKeyId; + try { + CompletableFuture futureKeyId = kmsActions.createKeyAsync(keyDesc); + targetKeyId = futureKeyId.join(); + logger.info("A symmetric key was successfully created " + targetKeyId); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println(""" + logger.info(DASHES); + logger.info(""" 2. Enable a KMS key - By default, when the SDK creates an AWS key it is enabled. The next bit of code checks to - determine if the key is enabled. If it is not enabled, the code enables it. + By default, when the SDK creates an AWS key, it is enabled. The next bit of code checks to + determine if the key is enabled. """); waitForInputToContinue(scanner); - boolean isEnabled = isKeyEnabled(kmsClient, targetKeyId); + boolean isEnabled; + try { + CompletableFuture futureIsKeyEnabled = kmsActions.isKeyEnabledAsync(targetKeyId); + isEnabled = futureIsKeyEnabled.join(); + logger.info("Is the key enabled? {}", isEnabled); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } + if (!isEnabled) - enableKey(kmsClient, targetKeyId); + try { + CompletableFuture future = kmsActions.enableKeyAsync(targetKeyId); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("3. Encrypt data using the symmetric KMS key"); + logger.info(DASHES); + logger.info("3. Encrypt data using the symmetric KMS key"); String plaintext = "Hello, AWS KMS!"; - System.out.printf(""" - - One of the main uses of symmetric keys is to encrypt and decrypt data. - Next, the code encrypts the string '%s' with the SYMMETRIC_DEFAULT encryption algorithm. - %n""", plaintext); + logger.info(""" + One of the main uses of symmetric keys is to encrypt and decrypt data. + Next, the code encrypts the string {} with the SYMMETRIC_DEFAULT encryption algorithm. + """, plaintext); waitForInputToContinue(scanner); - SdkBytes ciphertext = encryptData(kmsClient, targetKeyId, plaintext); + SdkBytes encryptedData; + try { + CompletableFuture future = kmsActions.encryptDataAsync(targetKeyId, plaintext); + encryptedData = future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof DisabledException kmsDisabledEx) { + logger.info("KMS error occurred due to a disabled key: Error message: {}, Error code {}", kmsDisabledEx.getMessage(), kmsDisabledEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + deleteKey(targetKeyId); + throw cause; + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("4. Create an alias"); - System.out.println(""" - - Enter an alias name for the key. The name should be prefixed with 'alias/'. - For example, 'alias/myFirstKey'. - """); + logger.info(DASHES); + logger.info("4. Create an alias"); + logger.info(""" + + The alias name should be prefixed with 'alias/'. + The default, 'alias/dev-encryption-key'. + """); + waitForInputToContinue(scanner); - String aliasName = scanner.nextLine(); - String fullAliasName = aliasName.isEmpty() ? "alias/dev-encryption-key" : aliasName; - createCustomAlias(kmsClient, targetKeyId, fullAliasName); + try { + CompletableFuture future = kmsActions.createCustomAliasAsync(targetKeyId, aliasName); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof AlreadyExistsException kmsExistsEx) { + if (kmsExistsEx.getMessage().contains("already exists")) { + logger.info("The alias '" + aliasName + "' already exists. Moving on..."); + } + } else { + logger.error("An unexpected error occurred: " + rt.getMessage(), rt); + deleteKey(targetKeyId); + throw cause; + } + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("5. List all of your aliases"); + logger.info(DASHES); + logger.info("5. List all of your aliases"); waitForInputToContinue(scanner); - listAllAliases(kmsClient); + try { + CompletableFuture future = kmsActions.listAllAliasesAsync(); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + deleteAliasName(aliasName); + deleteKey(targetKeyId); + throw cause; + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("6. Enable automatic rotation of the KMS key"); - System.out.println(""" - + logger.info(DASHES); + logger.info("6. Enable automatic rotation of the KMS key"); + logger.info(""" + By default, when the SDK enables automatic rotation of a KMS key, KMS rotates the key material of the KMS key one year (approximately 365 days) from the enable date and every year thereafter. """); waitForInputToContinue(scanner); - enableKeyRotation(kmsClient, targetKeyId); + try { + CompletableFuture future = kmsActions.enableKeyRotationAsync(targetKeyId); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + deleteAliasName(aliasName); + deleteKey(targetKeyId); + throw cause; + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println(""" + logger.info(DASHES); + logger.info(""" 7. Create a grant - + A grant is a policy instrument that allows Amazon Web Services principals to use KMS keys. It also can allow them to view a KMS key (DescribeKey) and create and manage grants. When authorizing access to a KMS key, grants are considered along with key policies and IAM policies. """); waitForInputToContinue(scanner); - String grantId = grantKey(kmsClient, targetKeyId, granteePrincipal); - System.out.println("The code granted principal with ARN [" + granteePrincipal + "] "); - System.out.println("use of the symmetric key. The grant ID is [" + grantId + "]"); + String grantId = null; + try { + CompletableFuture futureGrantId = kmsActions.grantKeyAsync(targetKeyId, granteePrincipal); + grantId = futureGrantId.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + deleteKey(targetKeyId); + throw cause; + } waitForInputToContinue(scanner); + logger.info(DASHES); - System.out.println(DASHES); - System.out.println("8. List grants for the KMS key"); + logger.info(DASHES); + logger.info("8. List grants for the KMS key"); waitForInputToContinue(scanner); - displayGrantIds(kmsClient, targetKeyId); + try { + CompletableFuture future = kmsActions.displayGrantIdsAsync(targetKeyId); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + deleteAliasName(aliasName); + deleteKey(targetKeyId); + throw cause; + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("9. Revoke the grant"); + logger.info(DASHES); + logger.info("9. Revoke the grant"); + logger.info(""" + The revocation of a grant immediately removes the permissions and access that the grant had provided. + This means that any principal (user, role, or service) that was granted access to perform specific + KMS operations on a KMS key will no longer be able to perform those operations. + """); waitForInputToContinue(scanner); - revokeKeyGrant(kmsClient, targetKeyId, grantId); + try { + CompletableFuture future = kmsActions.revokeKeyGrantAsync(targetKeyId, grantId); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + if (kmsEx.getMessage().contains("Grant does not exist")) { + logger.info("The grant ID '" + grantId + "' does not exist. Moving on..."); + } else { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + throw cause; + } + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + deleteAliasName(aliasName); + deleteKey(targetKeyId); + throw cause; + } + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("10. Decrypt the data\n"); - System.out.println(""" + logger.info(DASHES); + logger.info("10. Decrypt the data\n"); + logger.info(""" Lets decrypt the data that was encrypted in an early step. The code uses the same key to decrypt the string that we encrypted earlier in the program. """); waitForInputToContinue(scanner); - String decryptText = decryptData(kmsClient, ciphertext, targetKeyId); - System.out.println("Decrypted text is: " + decryptText); + String decryptedData = ""; + try { + CompletableFuture future = kmsActions.decryptDataAsync(encryptedData, targetKeyId); + decryptedData = future.join(); + logger.info("Decrypted data: " + decryptedData); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + deleteAliasName(aliasName); + deleteKey(targetKeyId); + throw cause; + } + logger.info("Decrypted text is: " + decryptedData); waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("11. Replace a key policy\n"); - System.out.println(""" + logger.info(DASHES); + logger.info("11. Replace a key policy\n"); + logger.info(""" A key policy is a resource policy for a KMS key. Key policies are the primary way to control access to KMS keys. Every KMS key must have exactly one key policy. The statements in the key policy determine who has permission to use the KMS key and how they can use it. You can also use IAM policies and grants to control access to the KMS key, but every KMS key must have a key policy. - + By default, when you create a key by using the SDK, a policy is created that gives the AWS account that owns the KMS key full access to the KMS key. - + Let's try to replace the automatically created policy with the following policy. "Version": "2012-10-17", @@ -237,506 +381,237 @@ It also can allow them to view a KMS key (DescribeKey) and create and manage gra """); waitForInputToContinue(scanner); - boolean polAdded = replacePolicy(kmsClient, targetKeyId, policyName); + try { + CompletableFuture future = kmsActions.replacePolicyAsync(targetKeyId, policyName, accountId); + boolean success = future.join(); + if (success) { + logger.info("Key policy replacement succeeded."); + } else { + logger.error("Key policy replacement failed."); + } + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + deleteAliasName(aliasName); + deleteKey(targetKeyId); + throw cause; + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("12. Get the key policy\n"); - System.out.println("The next bit of code that runs gets the key policy to make sure it exists."); + logger.info(DASHES); + logger.info("12. Get the key policy\n"); + logger.info("The next bit of code that runs gets the key policy to make sure it exists."); waitForInputToContinue(scanner); - getKeyPolicy(kmsClient, targetKeyId, policyName); + try { + CompletableFuture future = kmsActions.getKeyPolicyAsync(targetKeyId, policyName); + String policy = future.join(); + if (!policy.isEmpty()) { + logger.info("Retrieved policy: " + policy); + } + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + deleteAliasName(aliasName); + deleteKey(targetKeyId); + throw cause; + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("13. Create an asymmetric KMS key and sign your data\n"); - System.out.println(""" - Signing your data with an AWS key can provide several benefits that make it an attractive option - for your data signing needs. By using an AWS KMS key, you can leverage the - security controls and compliance features provided by AWS, - which can help you meet various regulatory requirements and enhance the overall security posture - of your organization. - """); + logger.info(DASHES); + logger.info("13. Create an asymmetric KMS key and sign your data\n"); + logger.info(""" + Signing your data with an AWS key can provide several benefits that make it an attractive option + for your data signing needs. By using an AWS KMS key, you can leverage the + security controls and compliance features provided by AWS, + which can help you meet various regulatory requirements and enhance the overall security posture + of your organization. + """); waitForInputToContinue(scanner); - signVerifyData(kmsClient); + try { + CompletableFuture future = kmsActions.signVerifyDataAsync(); + boolean success = future.join(); + if (success) { + logger.info("Sign and verify data operation succeeded."); + } else { + logger.error("Sign and verify data operation failed."); + } + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + deleteAliasName(aliasName); + deleteKey(targetKeyId); + throw cause; + } waitForInputToContinue(scanner); - System.out.println(DASHES); - System.out.println("14. Tag your symmetric KMS Key\n"); - System.out.println(""" + logger.info(DASHES); + logger.info("14. Tag your symmetric KMS Key\n"); + logger.info(""" By using tags, you can improve the overall management, security, and governance of your KMS keys, making it easier to organize, track, and control access to your encrypted data within your AWS environment """); waitForInputToContinue(scanner); - tagKMSKey(kmsClient, targetKeyId); + try { + CompletableFuture future = kmsActions.tagKMSKeyAsync(targetKeyId); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + deleteAliasName(aliasName); + deleteKey(targetKeyId); + throw cause; + } waitForInputToContinue(scanner); + return targetKeyId; + } - System.out.println(DASHES); - System.out.println("15. Schedule the deletion of the KMS key\n"); - System.out.println(""" + // Deletes KMS resources with user input. + private static void requestDeleteResources(String aliasName, String targetKeyId) { + logger.info(DASHES); + logger.info("15. Schedule the deletion of the KMS key\n"); + logger.info(""" By default, KMS applies a waiting period of 30 days, but you can specify a waiting period of 7-30 days. When this operation is successful, the key state of the KMS key changes to PendingDeletion and the key can't be used in any cryptographic operations. It remains in this state for the duration of the waiting period. Deleting a KMS key is a destructive and potentially dangerous operation. When a KMS key is deleted, - all data that was encrypted under the KMS key is unrecoverable.\s + all data that was encrypted under the KMS key is unrecoverable. """); - System.out.println("Would you like to delete the Key Management resources? (y/n)"); + logger.info("Would you like to delete the Key Management resources? (y/n)"); String delAns = scanner.nextLine().trim(); if (delAns.equalsIgnoreCase("y")) { - System.out.println("You selected to delete the AWS KMS resources."); + logger.info("You selected to delete the AWS KMS resources."); waitForInputToContinue(scanner); - deleteSpecificAlias(kmsClient, fullAliasName); - disableKey(kmsClient, targetKeyId); - deleteKey(kmsClient, targetKeyId); - - } else { - System.out.println("The Key Management resources will not be deleted"); - } - - System.out.println(DASHES); - System.out.println("This concludes the AWS Key Management SDK Getting Started scenario"); - System.out.println(DASHES); - } - // snippet-start:[kms.java2_list_aliases.main] - public static void listAllAliases(KmsClient kmsClient) { - try { - ListAliasesRequest aliasesRequest = ListAliasesRequest.builder() - .limit(15) - .build(); - - ListAliasesIterable aliasesResponse = kmsClient.listAliasesPaginator(aliasesRequest); - aliasesResponse.stream() - .flatMap(r -> r.aliases().stream()) - .forEach(alias -> System.out - .println("The alias name is: " + alias.aliasName())); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[kms.java2_list_aliases.main] - - // snippet-start:[kms.java2_disable_key.main] - public static void disableKey(KmsClient kmsClient, String keyId) { - try { - DisableKeyRequest keyRequest = DisableKeyRequest.builder() - .keyId(keyId) - .build(); - - kmsClient.disableKey(keyRequest); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[kms.java2_disable_key.main] - - // snippet-start:[kms.java2_sign.main] - public static void signVerifyData(KmsClient kmsClient) { - String signMessage = "Here is the message that will be digitally signed"; - - // Create an AWS KMS key used to digitally sign data. - CreateKeyRequest request = CreateKeyRequest.builder() - .keySpec(KeySpec.RSA_2048) // Specify key spec - .keyUsage(KeyUsageType.SIGN_VERIFY) // Specify key usage - .origin(OriginType.AWS_KMS) // Specify key origin - .build(); - - CreateKeyResponse response = kmsClient.createKey(request); - String keyId2 = response.keyMetadata().keyId(); - System.out.println("Created KMS key with ID: " + keyId2); - - SdkBytes bytes = SdkBytes.fromString(signMessage, Charset.defaultCharset()); - SignRequest signRequest = SignRequest.builder() - .keyId(keyId2) - .message(bytes) - .signingAlgorithm(SigningAlgorithmSpec.RSASSA_PSS_SHA_256) - .build(); - - SignResponse signResponse = kmsClient.sign(signRequest); - byte[] signedBytes = signResponse.signature().asByteArray(); - - // Verify the digital signature. - VerifyRequest verifyRequest = VerifyRequest.builder() - .keyId(keyId2) - .message(SdkBytes.fromByteArray(signMessage.getBytes(Charset.defaultCharset()))) - .signature(SdkBytes.fromByteBuffer(ByteBuffer.wrap(signedBytes))) - .signingAlgorithm(SigningAlgorithmSpec.RSASSA_PSS_SHA_256) - .build(); - - VerifyResponse verifyResponse = kmsClient.verify(verifyRequest); - System.out.println("Signature verification result: " + verifyResponse.signatureValid()); - } - // snippet-end:[kms.java2_sign.main] - - // snippet-start:[kms.java2_tag.main] - public static void tagKMSKey(KmsClient kmsClient, String keyId) { - try { - Tag tag = Tag.builder() - .tagKey("Environment") - .tagValue("Production") - .build(); - - TagResourceRequest tagResourceRequest = TagResourceRequest.builder() - .keyId(keyId) - .tags(tag) - .build(); - - kmsClient.tagResource(tagResourceRequest); - System.out.println("The key has been tagged."); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[kms.java2_tag.main] - - // snippet-start:[kms.java2_get_policy.main] - public static void getKeyPolicy(KmsClient kmsClient, String keyId, String policyName) { - try { - GetKeyPolicyRequest policyRequest = GetKeyPolicyRequest.builder() - .keyId(keyId) - .policyName(policyName) - .build(); - - GetKeyPolicyResponse response = kmsClient.getKeyPolicy(policyRequest); - System.out.println("The response is "+response.policy()); - } catch (KmsException e) { - if (e.getMessage().contains("No such policy exists")) { - System.out.println("The policy cannot be found. Error message: " + e.getMessage()); - } else { - throw e; + try { + CompletableFuture future = kmsActions.deleteSpecificAliasAsync(aliasName); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } } - } - } - // snippet-end:[kms.java2_get_policy.main] - - // snippet-start:[kms.java2_set_policy.main] - public static boolean replacePolicy(KmsClient kmsClient, String keyId, String policyName) { - // Change the principle in the below JSON. - String policy = """ - { - "Version": "2012-10-17", - "Statement": [{ - "Effect": "Allow", - "Principal": {"AWS": "arn:aws:iam::%s:root"}, - "Action": "kms:*", - "Resource": "*" - }] + waitForInputToContinue(scanner); + try { + CompletableFuture future = kmsActions.disableKeyAsync(targetKeyId); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } } - """.formatted(accountId); - try { - PutKeyPolicyRequest keyPolicyRequest = PutKeyPolicyRequest.builder() - .keyId(keyId) - .policyName(policyName) - .policy(policy) - .build(); - kmsClient.putKeyPolicy(keyPolicyRequest); - System.out.println("The key policy has been replaced."); - } catch (LimitExceededException e) { - System.out.println("Policy limit reached. Unable to create the policy."); - return false; - } catch (AlreadyExistsException e) { - System.out.println("Only one policy per key is supported. Unable to create the policy."); - return false; - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } + try { + CompletableFuture future = kmsActions.deleteKeyAsync(targetKeyId); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + } - return true; - } - // snippet-end:[kms.java2_set_policy.main] - - public static boolean doesKeyHavePolicy(KmsClient kmsClient, String keyId, String policyName){ - ListKeyPoliciesRequest policiesRequest = ListKeyPoliciesRequest.builder() - .keyId(keyId) - .build(); - - boolean hasPolicy = false; - ListKeyPoliciesResponse response = kmsClient.listKeyPolicies(policiesRequest); - ListpolicyNames = response.policyNames(); - for (String pol : policyNames) { - hasPolicy = true; + } else { + logger.info("The Key Management resources will not be deleted"); } - return hasPolicy; - } - // snippet-start:[kms.java2_delete_key.main] - public static void deleteKey(KmsClient kmsClient, String keyId) { - try { - ScheduleKeyDeletionRequest deletionRequest = ScheduleKeyDeletionRequest.builder() - .keyId(keyId) - .pendingWindowInDays(7) - .build(); - - kmsClient.scheduleKeyDeletion(deletionRequest); - System.out.println("The key will be deleted in 7 days."); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } + logger.info(DASHES); + logger.info("This concludes the AWS Key Management SDK scenario"); + logger.info(DASHES); } - // snippet-end:[kms.java2_delete_key.main] - // snippet-start:[kms.java2_delete_alias.main] - public static void deleteSpecificAlias(KmsClient kmsClient, String aliasName) { + // This method is invoked from Exceptions to clean up the resources. + private static void deleteKey(String targetKeyId) { try { - DeleteAliasRequest deleteAliasRequest = DeleteAliasRequest.builder() - .aliasName(aliasName) - .build(); - - kmsClient.deleteAlias(deleteAliasRequest); + CompletableFuture future = kmsActions.disableKeyAsync(targetKeyId); + future.join(); - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[kms.java2_delete_alias.main] - - // snippet-start:[kms.java2_describe_key.main] - public static boolean isKeyEnabled(KmsClient kmsClient, String keyId) { - try { - DescribeKeyRequest keyRequest = DescribeKeyRequest.builder() - .keyId(keyId) - .build(); - - DescribeKeyResponse response = kmsClient.describeKey(keyRequest); - KeyState keyState = response.keyMetadata().keyState(); - if (keyState == KeyState.ENABLED) { - System.out.println("The key is enabled."); - return true; + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); } else { - System.out.println("The key is not enabled. Key state: " + keyState); + logger.info("An unexpected error occurred: " + rt.getMessage()); } - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - return false; - } - // snippet-end:[kms.java2_describe_key.main] - - // snippet-start:[kms.java2_decrypt_data.main] - public static String decryptData(KmsClient kmsClient, SdkBytes encryptedData, String keyId) { - try { - DecryptRequest decryptRequest = DecryptRequest.builder() - .ciphertextBlob(encryptedData) - .keyId(keyId) - .build(); - - DecryptResponse decryptResponse = kmsClient.decrypt(decryptRequest); - return decryptResponse.plaintext().asString(StandardCharsets.UTF_8); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); } - return ""; - } - // snippet-end:[kms.java2_decrypt_data.main] - // snippet-start:[kms.java2_revoke_grant.main] - public static void revokeKeyGrant(KmsClient kmsClient, String keyId, String grantId) { try { - RevokeGrantRequest grantRequest = RevokeGrantRequest.builder() - .keyId(keyId) - .grantId(grantId) - .build(); + CompletableFuture future = kmsActions.deleteKeyAsync(targetKeyId); + future.join(); - kmsClient.revokeGrant(grantRequest); - System.out.println("Grant ID: [" + grantId +"] was successfully revoked!"); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[kms.java2_revoke_grant.main] - - // snippet-start:[kms.java2_list_grant.main] - public static void displayGrantIds(KmsClient kmsClient, String keyId) { - try { - ListGrantsRequest grantsRequest = ListGrantsRequest.builder() - .keyId(keyId) - .limit(15) - .build(); - - ListGrantsIterable response = kmsClient.listGrantsPaginator(grantsRequest); - response.stream() - .flatMap(r -> r.grants().stream()) - .forEach(grant -> { - System.out.println("The grant Id is : " + grant.grantId()); - List ops = grant.operations(); - for (GrantOperation op : ops) { - System.out.println(op.name()); - } - }); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[kms.java2_list_grant.main] - - // snippet-start:[kms.java2_create_grant.main] - public static String grantKey(KmsClient kmsClient, String keyId, String granteePrincipal) { - try { - // Add the desired KMS Grant permissions. - List grantPermissions = new ArrayList<>(); - grantPermissions.add(GrantOperation.ENCRYPT); - grantPermissions.add(GrantOperation.DECRYPT); - grantPermissions.add(GrantOperation.DESCRIBE_KEY); - - CreateGrantRequest grantRequest = CreateGrantRequest.builder() - .keyId(keyId) - .name("grant1") - .granteePrincipal(granteePrincipal) - .operations(grantPermissions) - .build(); - - CreateGrantResponse response = kmsClient.createGrant(grantRequest); - return response.grantId(); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - return ""; - } - // snippet-end:[kms.java2_create_grant.main] - - // snippet-start:[kms.java2._key_rotation.main] - public static void enableKeyRotation(KmsClient kmsClient, String keyId) { - try { - EnableKeyRotationRequest enableKeyRotationRequest = EnableKeyRotationRequest.builder() - .keyId(keyId) - .build(); - - kmsClient.enableKeyRotation(enableKeyRotationRequest); - System.out.println("Key rotation has been enabled for key with id [" + keyId + "]"); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[kms.java2._key_rotation.main] - - // snippet-start:[kms.java2._create_alias.main] - public static void createCustomAlias(KmsClient kmsClient, String targetKeyId, String aliasName) { - try { - CreateAliasRequest aliasRequest = CreateAliasRequest.builder() - .aliasName(aliasName) - .targetKeyId(targetKeyId) - .build(); - - kmsClient.createAlias(aliasRequest); - System.out.println(aliasName + " was successfully created."); - - } catch (ResourceExistsException e) { - System.err.println("Alias already exists: " + e.getMessage()); - System.err.println("Moving on..."); - } catch (Exception e) { - System.err.println("An unexpected error occurred: " + e.getMessage()); - System.err.println("Moving on..."); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } } } - // snippet-end:[kms.java2._create_alias.main] - // snippet-start:[kms.java2_encrypt_data.main] - public static SdkBytes encryptData(KmsClient kmsClient, String keyId, String text) { + // This method is invoked from Exceptions to clean up the resources. + private static void deleteAliasName(String aliasName) { try { - SdkBytes myBytes = SdkBytes.fromUtf8String(text); - EncryptRequest encryptRequest = EncryptRequest.builder() - .keyId(keyId) - .plaintext(myBytes) - .build(); - - EncryptResponse response = kmsClient.encrypt(encryptRequest); - String algorithm = response.encryptionAlgorithm().toString(); - System.out.println("The string was encrypted with algorithm " + algorithm + "."); - - // Get the encrypted data. - SdkBytes encryptedData = response.ciphertextBlob(); - return encryptedData; - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - return null; - } - // snippet-end:[kms.java2_encrypt_data.main] + CompletableFuture future = kmsActions.deleteSpecificAliasAsync(aliasName); + future.join(); - // snippet-start:[kms.java2_create_key.main] - public static String createKey(KmsClient kmsClient, String keyDesc) { - try { - CreateKeyRequest keyRequest = CreateKeyRequest.builder() - .description(keyDesc) - .customerMasterKeySpec(CustomerMasterKeySpec.SYMMETRIC_DEFAULT) - .keyUsage("ENCRYPT_DECRYPT") - .build(); - - CreateKeyResponse result = kmsClient.createKey(keyRequest); - System.out.println("Symmetric key with ARN [" + result.keyMetadata().arn() + "] has been created."); - return result.keyMetadata().keyId(); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof KmsException kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } } - return ""; } - // snippet-end:[kms.java2_create_key.main] - - // snippet-start:[kms.java2_enable_key.main] - // Enable the KMS key. - public static void enableKey(KmsClient kmsClient, String keyId) { - try { - EnableKeyRequest enableKeyRequest = EnableKeyRequest.builder() - .keyId(keyId) - .build(); - kmsClient.enableKey(enableKeyRequest); - - } catch (KmsException e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } - // snippet-end:[kms.java2_enable_key.main] private static void waitForInputToContinue(Scanner scanner) { while (true) { - System.out.println(""); - System.out.println("Enter 'c' followed by to continue:"); + logger.info(""); + logger.info("Enter 'c' followed by to continue:"); String input = scanner.nextLine(); if (input.trim().equalsIgnoreCase("c")) { - System.out.println("Continuing with the program..."); - System.out.println(""); + logger.info("Continuing with the program..."); + logger.info(""); break; } else { // Handle invalid input. - System.out.println("Invalid input. Please try again."); + logger.info("Invalid input. Please try again."); } } } - private static String getAccountId(){ - try (StsClient stsClient = StsClient.create()){ - GetCallerIdentityResponse callerIdentity = stsClient.getCallerIdentity(); - return callerIdentity.account(); - } - } } // snippet-end:[kms.java2_scenario.main] \ No newline at end of file diff --git a/javav2/example_code/kms/src/main/resources/log4j2.xml b/javav2/example_code/kms/src/main/resources/log4j2.xml new file mode 100644 index 00000000000..225afe2b3a8 --- /dev/null +++ b/javav2/example_code/kms/src/main/resources/log4j2.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javav2/example_code/kms/src/test/java/AmazonKMSTest.java b/javav2/example_code/kms/src/test/java/AmazonKMSTest.java index d438951a839..3a8e22ed042 100644 --- a/javav2/example_code/kms/src/test/java/AmazonKMSTest.java +++ b/javav2/example_code/kms/src/test/java/AmazonKMSTest.java @@ -2,17 +2,19 @@ // SPDX-License-Identifier: Apache-2.0 import com.example.kms.*; +import com.example.kms.scenario.KMSActions; import com.google.gson.Gson; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.core.SdkBytes; -import software.amazon.awssdk.services.kms.KmsClient; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; -import com.example.kms.scenario.KMSScenario; /** * To run these integration tests, you must set the required values @@ -21,83 +23,67 @@ @TestInstance(TestInstance.Lifecycle.PER_METHOD) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class AmazonKMSTest { - private static KmsClient kmsClient; - private static String keyDesc = ""; private static String granteePrincipal = ""; + private static String accountId = ""; + @BeforeAll public static void setUp() { - kmsClient = KmsClient.builder() - .region(Region.US_WEST_2) - .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) - .build(); - - // Get the values to run these tests from AWS Secrets Manager. Gson gson = new Gson(); String json = getSecretValues(); SecretValues values = gson.fromJson(json, SecretValues.class); granteePrincipal = values.getGranteePrincipal(); + accountId = values.getAccountId(); - // Uncomment this code block if you prefer using a config.properties file to - // retrieve AWS values required for these tests. - /* - * try (InputStream input = - * AmazonKMSTest.class.getClassLoader().getResourceAsStream("config.properties") - * ) { - * Properties prop = new Properties(); - * if (input == null) { - * System.out.println("Sorry, unable to find config.properties"); - * return; - * } - * - * // Populate the data members required for all tests. - * prop.load(input); - * keyDesc = prop.getProperty("keyDesc"); - * operation = prop.getProperty("operation"); - * aliasName = prop.getProperty("aliasName"); - * granteePrincipal = prop.getProperty("granteePrincipal"); - * - * } catch (IOException ex) { - * ex.printStackTrace(); - * } - */ } @Test @Tag("IntegrationTest") @Order(1) - public void HelloKSM() { - assertDoesNotThrow(() -> HelloKMS.listAllKeys(kmsClient)); + public void HelloKMS() { + assertDoesNotThrow(HelloKMS::listAllKeys); System.out.println("Test 1 passed"); } @Test @Tag("IntegrationTest") @Order(2) - public void TestScenario() { - String targetKeyId = assertDoesNotThrow(() -> KMSScenario.createKey(kmsClient, keyDesc)); - boolean isEnabled = assertDoesNotThrow(() -> KMSScenario.isKeyEnabled(kmsClient, targetKeyId)); - if (!isEnabled) - assertDoesNotThrow(() -> KMSScenario.enableKey(kmsClient, targetKeyId)); - - String plaintext = "Hello, AWS KMS!"; - SdkBytes ciphertext = assertDoesNotThrow(() -> KMSScenario.encryptData(kmsClient, targetKeyId, plaintext)); - - String fullAliasName = "alias/dev-encryption-key"; - assertDoesNotThrow(() -> KMSScenario.createCustomAlias(kmsClient, targetKeyId, fullAliasName)); - assertDoesNotThrow(() -> KMSScenario.listAllAliases(kmsClient)); - assertDoesNotThrow(() -> KMSScenario.enableKeyRotation(kmsClient, targetKeyId)); - String grantId = assertDoesNotThrow(() -> KMSScenario.grantKey(kmsClient, targetKeyId, granteePrincipal)); - assertDoesNotThrow(() -> KMSScenario.displayGrantIds(kmsClient, targetKeyId)); - assertDoesNotThrow(() -> KMSScenario.revokeKeyGrant(kmsClient, targetKeyId, grantId)); - assertDoesNotThrow(() -> KMSScenario.decryptData(kmsClient, ciphertext, targetKeyId)); - String policyName = "testPolicy1"; - assertDoesNotThrow(() -> KMSScenario.replacePolicy(kmsClient,targetKeyId, policyName)); - assertDoesNotThrow(() -> KMSScenario.signVerifyData(kmsClient)); - assertDoesNotThrow(() -> KMSScenario.tagKMSKey(kmsClient, targetKeyId)); - assertDoesNotThrow(() -> KMSScenario.deleteSpecificAlias(kmsClient, fullAliasName)); - assertDoesNotThrow(() -> KMSScenario.disableKey(kmsClient, targetKeyId)); - assertDoesNotThrow(() -> KMSScenario.deleteKey(kmsClient, targetKeyId)); + public void testKMSActionsIntegration() { + KMSActions kmsActions = new KMSActions(); + String targetKeyId = assertDoesNotThrow(() -> kmsActions.createKeyAsync("Test Key Description").join()); + + try { + boolean isEnabled = assertDoesNotThrow(() -> kmsActions.isKeyEnabledAsync(targetKeyId).join()); + if (!isEnabled) { + assertDoesNotThrow(() -> kmsActions.enableKeyAsync(targetKeyId).join()); + } + assertTrue(assertDoesNotThrow(() -> kmsActions.isKeyEnabledAsync(targetKeyId).join())); + + String plaintext = "Hello, AWS KMS!"; + SdkBytes encryptedData = assertDoesNotThrow(() -> kmsActions.encryptDataAsync(targetKeyId, plaintext).join()); + assertNotNull(encryptedData); + + String currentTimestamp = String.valueOf(System.currentTimeMillis()); + String fullAliasName = "alias/dev-encryption-key" + currentTimestamp;; + assertDoesNotThrow(() -> kmsActions.createCustomAliasAsync(targetKeyId, fullAliasName).join()); + assertDoesNotThrow(kmsActions::listAllAliasesAsync).join(); + assertDoesNotThrow(() -> kmsActions.enableKeyRotationAsync(targetKeyId).join()); + + String grantId = assertDoesNotThrow(() -> kmsActions.grantKeyAsync(targetKeyId, "granteePrincipal").join()); + assertNotNull(grantId); + assertDoesNotThrow(() -> kmsActions.displayGrantIdsAsync(targetKeyId).join()); + + assertDoesNotThrow(() -> kmsActions.revokeKeyGrantAsync(targetKeyId, grantId).join()); + SdkBytes decryptedData = SdkBytes.fromUtf8String(assertDoesNotThrow(() -> kmsActions.decryptDataAsync(encryptedData, targetKeyId).join())); + assertEquals(plaintext, decryptedData.asUtf8String()); + + assertDoesNotThrow(kmsActions::signVerifyDataAsync); + assertDoesNotThrow(() -> kmsActions.tagKMSKeyAsync(targetKeyId).join()); + assertDoesNotThrow(() -> kmsActions.disableKeyAsync(targetKeyId).join()); + } finally { + assertDoesNotThrow(() -> kmsActions.deleteKeyAsync(targetKeyId).join()); + } + System.out.println("Test 2 passed"); } @@ -121,9 +107,15 @@ private static String getSecretValues() { class SecretValues { private String granteePrincipal; + private String accountId; + public String getGranteePrincipal() { return granteePrincipal; } + + public String getAccountId() { + return accountId; + } } } From 7d53594a5ce61c66cfabd1272c9519aff2aaf442 Mon Sep 17 00:00:00 2001 From: David Souther Date: Wed, 4 Sep 2024 11:25:32 -0400 Subject: [PATCH 61/98] Rust: Bump Weathertop Dockerfile (#6809) --- rustv1/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rustv1/Dockerfile b/rustv1/Dockerfile index 7e8dba08ebd..22940b166d4 100644 --- a/rustv1/Dockerfile +++ b/rustv1/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1 -ARG MSRV=1.76.0 +ARG MSRV=1.80.1 FROM rust:$MSRV # Update image From 73b28c2ad270dd41bff8b20774a252eb9684f8f1 Mon Sep 17 00:00:00 2001 From: David Souther Date: Wed, 4 Sep 2024 12:00:05 -0400 Subject: [PATCH 62/98] Tools: Release 2024-09-04-A (#6811) --- .github/workflows/validate-doc-metadata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index 9d887d40a72..48534c4d296 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@2024-08-29-A + uses: awsdocs/aws-doc-sdk-examples-tools@2024-09-04-A with: doc_gen_only: "False" strict_titles: "True" From a4038338a11a364add6a08f6eeed35995229064c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2024 12:00:05 -0700 Subject: [PATCH 63/98] Bump micromatch from 4.0.5 to 4.0.8 in /python/cross_service/photo_analyzer/frontend (#6801) Bump micromatch in /python/cross_service/photo_analyzer/frontend Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8. - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8) --- updated-dependencies: - dependency-name: micromatch dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../photo_analyzer/frontend/package-lock.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/cross_service/photo_analyzer/frontend/package-lock.json b/python/cross_service/photo_analyzer/frontend/package-lock.json index e6393e78a13..305225e9353 100644 --- a/python/cross_service/photo_analyzer/frontend/package-lock.json +++ b/python/cross_service/photo_analyzer/frontend/package-lock.json @@ -11901,11 +11901,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -26137,11 +26137,11 @@ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, From fb196fe08e5d2288609743ed67a1ded246a9e4d9 Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Wed, 4 Sep 2024 15:04:12 -0400 Subject: [PATCH 64/98] JavaScript (v3) - Remove deprecated jquery usages. (#6810) * JavaScript (v3): Remove sns-sample-app. The sns-sample-app is triggering talos errors for outdated jquery versions. Upon further investigation, the SDK calls being made are handled better elsewhere, and this example isn't being surfaces anywhere in the code library or dev guides. Additionally, we've de-emphasized web examples outside of the canonical "get started in web" examples. * JavaScript (v2): Remove invokeLambda and slotassets invokeLambda.html and slotassets.zip are referenced in commented out code in the JS dev guide: https://code.amazon.com/packages/AWSJavaScriptDocs/blobs/8933e5af031e5e807de06eafdac71fe4f0703e06/--/latest/dg/tutorials.xml#L272 They're not referenced anywhere else. invokeLambda is using a deprecated jquery version. Removing the example. * JavaScript (v3): Cross - Revamp the the photo analyzer app This example was using a deprecated version of jquery. This removes jquery and makes a number of other refactors. * JavaScript (v3): Cross - Add missing SPDX headers to photo analyzer. * JavaScript (v3): Cross - Set min engine version for node. --- .../example_code/lambda/invokeLambda.html | 107 ---- .../lambda/tutorial/slotassets.zip | Bin 1102616 -> 0 bytes .../cross-services/photo_analyzer/.gitignore | 2 + .../cross-services/photo_analyzer/README.md | 605 ++---------------- .../cross-services/photo_analyzer/css/col.css | 43 -- .../photo_analyzer/css/common.css | 48 -- .../photo_analyzer/css/styles.css | 29 - .../photo_analyzer/dist/index.html | 67 ++ .../photo_analyzer/images/Lake1.png | Bin 378510 -> 0 bytes .../photo_analyzer/images/Photo1.png | Bin 76309 -> 0 bytes .../images/cloud_formation_resources_tab.png | Bin 116124 -> 0 bytes .../images/cloud_formation_stacks.png | Bin 43167 -> 0 bytes .../images/identity_pool_ids.png | Bin 68165 -> 0 bytes .../photo_analyzer/images/photo10.png | Bin 47273 -> 0 bytes .../photo_analyzer/images/photo11.png | Bin 47225 -> 0 bytes .../photo_analyzer/images/photo12.png | Bin 99451 -> 0 bytes .../photo_analyzer/images/photo2.png | Bin 38952 -> 0 bytes .../photo_analyzer/images/photo3.png | Bin 40267 -> 0 bytes .../photo_analyzer/images/photo4.png | Bin 17145 -> 0 bytes .../photo_analyzer/images/photo5.png | Bin 22443 -> 0 bytes .../photo_analyzer/images/photo6.png | Bin 19402 -> 0 bytes .../photo_analyzer/images/photo7.png | Bin 25580 -> 0 bytes .../photo_analyzer/images/photo8.png | Bin 23121 -> 0 bytes .../photo_analyzer/images/photo9.png | Bin 22969 -> 0 bytes .../photo_analyzer/images/test.txt | 1 - .../cross-services/photo_analyzer/index.html | 100 --- .../cross-services/photo_analyzer/js/index.js | 243 ------- .../photo_analyzer/libs/rekognitionClient.js | 33 - .../photo_analyzer/libs/s3Client.js | 33 - .../photo_analyzer/libs/sesClient.js | 33 - .../photo_analyzer/package.json | 36 +- .../photo_analyzer/scripts/deploy.sh | 14 + .../photo_analyzer/scripts/destroy.sh | 10 + .../photo_analyzer/src/constants.js | 12 + .../photo_analyzer/src/index.js | 255 ++++++++ .../photo_analyzer/{setup.yaml => stack.yaml} | 16 +- .../photo_analyzer/webpack.config.js | 30 + .../cross-services/sns-sample-app/README.md | 439 ------------- .../sns-sample-app/css/styles.css | 29 - .../images/cloud_formation_resources_tab.png | Bin 116124 -> 0 bytes .../images/cloud_formation_stacks.png | Bin 43167 -> 0 bytes .../images/identity_pool_ids.png | Bin 68165 -> 0 bytes .../sns-sample-app/images/pic1.png | Bin 27810 -> 0 bytes .../sns-sample-app/images/pic2.png | Bin 22155 -> 0 bytes .../sns-sample-app/images/pic3.png | Bin 30657 -> 0 bytes .../sns-sample-app/images/pic4.png | Bin 48225 -> 0 bytes .../sns-sample-app/images/pic5.png | Bin 17773 -> 0 bytes .../sns-sample-app/images/pic6.png | Bin 21513 -> 0 bytes .../cross-services/sns-sample-app/index.html | 125 ---- .../cross-services/sns-sample-app/js/index.js | 154 ----- .../sns-sample-app/libs/snsClient.js | 33 - .../sns-sample-app/package.json | 25 - .../cross-services/sns-sample-app/setup.yaml | 150 ----- javascriptv3/example_code/libs/package.json | 1 + .../example_code/libs/sdk/cfn-outputs.js | 45 ++ javascriptv3/package.json | 1 + 56 files changed, 532 insertions(+), 2187 deletions(-) delete mode 100644 javascript/example_code/lambda/invokeLambda.html delete mode 100644 javascript/example_code/lambda/tutorial/slotassets.zip create mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/.gitignore delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/css/col.css delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/css/common.css delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/css/styles.css create mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/dist/index.html delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/Lake1.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/Photo1.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/cloud_formation_resources_tab.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/cloud_formation_stacks.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/identity_pool_ids.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo10.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo11.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo12.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo2.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo3.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo4.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo5.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo6.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo7.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo8.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/photo9.png delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/images/test.txt delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/index.html delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/js/index.js delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/libs/rekognitionClient.js delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/libs/s3Client.js delete mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/libs/sesClient.js create mode 100755 javascriptv3/example_code/cross-services/photo_analyzer/scripts/deploy.sh create mode 100755 javascriptv3/example_code/cross-services/photo_analyzer/scripts/destroy.sh create mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/src/constants.js create mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/src/index.js rename javascriptv3/example_code/cross-services/photo_analyzer/{setup.yaml => stack.yaml} (96%) create mode 100644 javascriptv3/example_code/cross-services/photo_analyzer/webpack.config.js delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/README.md delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/css/styles.css delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/images/cloud_formation_resources_tab.png delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/images/cloud_formation_stacks.png delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/images/identity_pool_ids.png delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/images/pic1.png delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/images/pic2.png delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/images/pic3.png delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/images/pic4.png delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/images/pic5.png delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/images/pic6.png delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/index.html delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/js/index.js delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/libs/snsClient.js delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/package.json delete mode 100644 javascriptv3/example_code/cross-services/sns-sample-app/setup.yaml create mode 100644 javascriptv3/example_code/libs/sdk/cfn-outputs.js diff --git a/javascript/example_code/lambda/invokeLambda.html b/javascript/example_code/lambda/invokeLambda.html deleted file mode 100644 index 50b96298170..00000000000 --- a/javascript/example_code/lambda/invokeLambda.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - -Emoji Slots - - - - - - -
- - slot wheel 1 - slot wheel 2 - slot wheel 3 - winner indicator - -
- - - diff --git a/javascript/example_code/lambda/tutorial/slotassets.zip b/javascript/example_code/lambda/tutorial/slotassets.zip deleted file mode 100644 index 776c201dc585e6c3618043ec1217cb9e8504b0f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1102616 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 z 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≧66bQ0Lr`+OA3g_3K*=^KuK9E8 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

2*x7oDXO1Hd-`g>!E72|=>B=*B2u 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

W&?qMKn14dYE3kGLW^OH)(d}TbI246x-i` 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

hq9aP0pGyk?R)5X;!M>_S|Zq&P3fa-jZx zn899_N=RxNH78Nu`Pm8Zfgq2%R_zB4)JXzi5RB}u3>rdsV}#K6g^|(rf2yqoSj@YO zzlDQ&RU-TnA<-(o@1rrmtk)*Md+NFMA}(SPjgE)kPbl;M&dMwMlm0y>JfgZ#LlxaU z*Q6%l0+Px2BEtCe9GL~wUCcV~QN;36DFm7Lt~;>#cc$!3Zk`3GzB#J&8s21I91ogK zhtL1$K-Kgd8_Glu-xmL$)_*{n!kuOS2d-Fm@xs56;-rUeDKTmKQUg?39Z}C`po$8^ zkLk5yrpf0XL;eD%?9r9O*ZA%?ONOT@`bc2Jw#)SWL96y*vWSzY-yAmdfK@?JW#L9+|k9B zS3=&V7}j_<2v5{VV8O63XLd@L@+dVuQvuN;Tt?X(DqVo{HUQ+it@7zYysyho9Nr$f zcdbVXfDU(y`Mf`dE=)MLy#5CzvIk7yAuFskIpi{a9pTn)%{!8q&OFq0t9zaAkm(&D6PWo6M$&DhG zY~VuV`I0y(-Ny{I5TM!UhjnL*Gs1(C_mW zoxeNIE}i1^NNT=(Rq*ipBf6#0r62TcJ*lvFg6X@~Hs>*idwjm|cN`AA|HHSsPg9)V ztR@4G^mCwU>3qZ`c^N@`2t;2U3y7C4k8FvLQY6bqi>DD`5lWc zBplxSnIN1UbVKj>nHlw9if_PloCJ-K|7Umt4 zg}qe1ZOAttM-bKp(<`CB3pu%E&Gs6sd_mXqYc%4|aGGGY=-@A7S|27=Qw0G`gM-0_ zL$|C$@EZBu0h3F&=->t@FTbQ`hCj9D^27QEe&W)-hC-P-yd&k79ud)NHc;xebTuRu zNid*bwah)7{BwOr2GP-Oy}G$%376>{-ZIHSUYaipy4mNzeO@eVcb(V3d2i}s{*E1S zWU3^{r2-f(ULX0f)$942@KQogJbiAHeO2ghl9gPBcjZm?pA#%H*cR=fDA8vXdyOzh zP)Y-`TIg`-3Je4PqmR)H%C2|xaqE^jQ#+cwxtqCHSE2#UM7KIzR>bJm6p!nSP+)dM zeo~e@Y!XKs(WfieHPif&GuJ=}9UQOdO)6ys9uZOfyrK&Q5#sfoLkUecAqJEch+Dt*xZ)CXZ#oPVKV{EkkqWvr zSVlAL2vKf|>|_Y?mAr)+YGy#ePUD$ms`bJ>sSL)I6|n_^n$ka_v$mGgKCvV^-G6JM zHK53_S2+LC%oaqxBh{|t0j^ahe@6`mWe6#JR5>3x3A~tYdUGBs!czb{K*YZwdy}~H zxhk$!xO=6o>}{OC(auG(!R?LsQV}Ic2loGf!&+G2+tCOL4hZ-BCmj0jEXvFsmHVK( zl}F6(%o~7xzfinW9=F*`4j%XPbBjpm$W}hw_g&1y?vGc#m-)&ykBP?biwQFdmyDTh zpD;JiOS3b(Q!3_lGJ?;bg;&P$+IchGY&Fzlo5vfh=uMQ@vB86`QSHRugjL?#nmLVb zt&XFJCpKRIA!Y{arLL2GUH=tI;gE;82PG&pJ%2{60qolxqjAJM=(SpZAn zRVy^k&Dc8~u2Y9(aRj#H#;yx_nm0Mw8*0xy7hH<3bLOPsV&`Cnaltz|k%C@O`%B=Pz!t#Bge(s0gdckdwZz0XU&ZnO`A z-@}>QC$k~&triQM&sT)Jy@85@kOacG8`m%-hW>=rEV+&ng`YR;Ofj4~R%4{`T{_qx zHogAnyh5Yeyy;~h3>JZSaSCr1bG!&Q@dMU$cVz!%tR;4!j(AyFYf1AMs1mNoTTD{( z+vKsoAl5rLrr!r5FKDp*C{Kl|>*Y=w(Cp$_(MGjt@C@O!IIn#+&ZaFAG?~1vd=fMw zM1WlsV2sZI-EuTTwL2R{Z@0ovt)oUf;D0>sH^9?eZSUc(W!@!WI<3;6-vze}6|Xt1 zq1+^2fe?*PL;5(6m2MDl@gbd%3)8&u%ZepNgq&UXI0Qa!@yD6ywGXX0>eh)!DR%za|`TFYRu!atR<&$y45hS!lXc7GlEovkx2NuPay50qcB?r$99$y z5YAG>H1MBXg>XAS2>q*DXjNi#8*svU+X=jl_j*g^={+a#Ezz(<6-p8eYNm0Fb5^R) zKNtkM_;0Iv!SN;euFQbmyQu%^%Lnu%rXpdZPz<5+lk$&U4?MW-uh@$ZCb~i>8-yI6 zy<%IMk1$danGDTDMyh;pCN!(YPjLM!DE)*Xu(FO-&}Od|sk7w}2O^o3*+(2I)4yLQ zw8;hxb$^S$tHbZ&AIhhYh1FOFKZ#u&SKtNVYYUU+7>8hy_b|7$GACKS;~{ME`KHuL zfU#VA788Fb*p4R4-%ldu@|vF`RRHg4>TGK8SQ?j#WeOd`VCu_TL6K~b|b%a7m+3FjRMANi_4uIYdn1^$+ zhuX69=bH^-GuR-OUkez^j`81Z3~lwM8DNuQyk;Hs0(jl^AtKR(sw7p@d zjE2j3+_}XXS>)U{8izs&(4(Eawi*mnpf33#mXg8G`6-QqXH019IoEKtgJ#L@G;z5m zbhS-^pdV7`R#qAZrG8hX5_ht_P*PG5c*fkVA$Gs*HUaCrLAWXbE?L;tS^qtove7tG z@;|}YhH3woxUG2Czd$|vb;X|1tOc36fuG&>^>F6S^^CjAJ?RXi^dS9;nLZjvjNIDC z8$2y`9H2|a;e^|@R6oxT)_&i^?JdfoAhOc_RKrrVzs5mrn-Lx$Hs&~Euf0H&(|JAK z8H@qIV122yhQq&k@8Yi0eG_nJmqp{h*%N6iJoTVhEspJVV5ZZ(ShCukSpPqia5bdx zLn&w4nLKdar9R%b<)hM%I44^n^SPT(dMEm08M~s}xL&%yE^Rb#3 z+kGN{=JvqA3(NgQf7*b14}9jcVyJ5HHep8AxY)hKrgrNMF4f-oj19=oYfmn6j<5gF z34B^y9BcnR@7UVWgWqo3zdUsUG!G4(f@efC{XgdpRM?oQtdS4+Hf2R8&X3HR$2iGm zKh>KqG@{u6QlDMBvf4_7?=JsJ^KrT)kp(!d565+bQ!w9-N>a=&L|-olwP+UF1aIP> ztma6%AbYlIj#zCiycG@_X9={v2v0tH9#kgu??Ff>U$G~u%@q)6!py9B2q7x2Mz_p< z4DM>tsXhM76v5>34PMR#&ZVO?!$%?H1}sbstsyYllxUnH0SCjh9dkYO9=IiRA+-5# z7D~(p1Rnsi1E?u9&rT=4rbuc;kvnDV=RjIfu`ImOS+AOQ%=!zmB}{Lj2nFXg{inAR zL1^Ik{EN7csJo~NoxskWP^t8BI*=Rtk=egKTt9uey$IKiE<>;TMzEsL_m;v6U68-# z(*@h3Kr{kECrq4<7Mzs!bn+83p8d~r7yklDPv9?&V#(G_6x`2d79W4}r#RA;;X{TY zl65qO?r+H&DDlgb;i5a6gR?%01P-9NG4s9JD*T#O>$^e>aVKZ6NPCQ}18vF4mlv{? z>Sq_)H55o1Z&zYeMuLL^hZZ#Ns2(kPHuFroS*XT=#_omO*?=qYBVVico)x;hFoOd7 z^&FHJvPltkcnvE&q^`M9FvWj(B;{CnK(fMAo%R1CV zS3&m>IHZ1xdsvtx6~S<$F_pqQH)s`riB>NuQSdavsErwj>st$c7bE7&M^~S-DB{zY zX6aRq)oVDiB3P|c__y`h{j2Db9J0+rt5j&D+i^Qkx;VXdZagUR%APg^k>d9B z^fFm8%pQ_*UC)KJZKeJ#Bfvl@*IVY3hMzh`EFY z96${B^kjn6U3W;I9Dda3VpF9_(qP@lSF?FD{cv05ZNf0OS3>(K(wI(uCJb^BR`nbl zl_?RWb|;>TudXDG*)yW%FNCH*&H8ncN`?pFzK`ZK)xptiyEmzU^woaES{JCDoVP{+ z)5ouSC}#Ppn7PS)AMI&Tf;&qeUP3cTy>EmyJi|M?xU zTtBJjLc^*JT`6OHiAoP|u($Z4V?af>00)5he?OdB>B1x3lgylPB7yibw1WnO1*U;r zkN2%@5MIEAb7YF$)o^JrE}2Xmq_#?yh2qk{;1ZYCr$E0*$^UipMo@C~L==QNe#}?E z8fuk-ebvpBC9Pp%j6Z|kKGY9%0+)ge$)$H%f-Y|bh(KmcT9s_pqWuYYbA;_m9Vd*DQFu{N>Z$C+T_#zD?xtKfa_$}LZQso!s4g%JynT|_~0N9xj+MaR18&= zhH<(=-Vun5sb&pU2TQB;-0~Q%l>$PaktQ0|EvglQJ#R5Zk;6n|Or76~8^>t#CwpP) zM4imxOp$uLxPbcyyceo)XDtGM)Jw8H4HYBxt@}Nk^-Ld4B~qpot)$}{l8GGkI&GAC z(Cth?vF6{m)qJP9X=>k|a>rr*G@+DGgjLFG`pl_N5)g*whK zQ$30?56pr6dI1J%g>%Dlej{sy{O`QoCHk|dR)J<&<-1G7uTql`wX+X4-9D6T%1x@I z1bvlib~IG`ncf6gr`uSx{c|0+kTFI1!!af4%*j1oC)9o+ll9;-a!}aA8TkIWMMVRj z^_1KH{KuG(siu!Vbn1VS5t$@4D-Gtyr`PaXG5VN6<~io9!)e;cg!qLq{ECd{&LLLWBJr@AhO(e)rzDzVf2xi#mN@#cUf~)yTr>ToWb<{$^Ur znu~Vp5t?il9uDR1Rv5;JNxh)HK=Ia|pRe%?fZBV;G`ys*L+D}2xgq)^qKP*ag?Cgz zwcPdlxqRmurpYj{LnOPE(=1b@GU@%YnbR_Mc1^vju}V|lEji83?+7jgEEErFwXA7| zd&9y&y2TvzjTUfwn%h8B4$Bpk;u{4sN)hp+X+ZMi!!QwSa?q zj~+>O+$zL%BC&^=gTi@(9IT)OiBJK9rBl)abE^TqvUH%`E86BD3V+F8VwVO5_fQe+ zmh-{+bSrFA#`3m+TW3*W9EF5*Js(sFbTzL4Y01-{i>VbQkpW_yFo_akbm#*o6nd@% z%=JGx)jF4x6XAPktcK!g&T>fhU!yZAD)U7?MN3XQyqB;)afO~^$VV53o$A}oeVFAk zbo@<|Fg=t6)ghZ#WtxL0uJ&YN!!P`s^ClK=v>y&XU;hEFrgW?xPGaQhg)y!^Ct6ft1N_YT zD8{^JaasM&Q^syY8z*UJbq`FpW7Rd^b0r9l`y{9OYmb!0MM~9crCBIsF**2N7iimp zr$?z-@NvJx)o3~()s)u;*#?3;ZoEssPJhTUgCUfxmy;*o8o%)hQ{=s9D~KT#xcPY_ zmGI7FDGw@;g!H`Cy0W?3MSYulN?v}G+``oeEgD&eSUA()>uqZcN00#NW6#6s56#+p zHDQ+Pv-tjwDM{6s6J1U^F9vaYEPh`CXGEVW^+~0m&~xj@*e;3qC{WC-HTTo@$~@%i zvvkB>c+`smeJ?&roS)%Gh|wtGlkKcQ(liVh>HgK7FeZHwl{ay}Eb6OJXyDHm4>rQVCW)jpqt%B%4wt%{vn z!3)H$L1X0jE#(L5Tb(4UQHI zjv)7%s{ikXHt?%xi5QNSeQvOzwtO*SF7UvJ9rvoir(e*NJ|L`2A}H~#>ZdUlYrB)B zn*(R1z+fV=31-;->zAc@xC3&pz=)Fr2<*tHh2T7<(*mfm_h~L00Ga`J*(BFJ{paad z7laZ0;NPi-8hph0RT^duzw zk&X1epAPm_5p?fAmIKRh3SRcZ6DM~Z_i9g?@`VM&!_fbV@%7F9ZHJbD?4B;h{pW>6 z8TIhl=IoLO$Z2s#=H%2!Whf^a$@nuC^3SBjjq>lPye{<=AnO%fbu6jW>n@~NcKCJm zJmpTc`o;JnsagJ}NC&?uX7X<$w)m|6>n1J&rc*ne+@BFB_<~Ja)ZkZt! z;0(Lx5K`brGO<3$eP=#)G7!c(n}CnHjJ*E&EAe=Xw*InT4v;YG#N{z|t~GgZ0A8jWjTo6Cn0G1{Y(XJx_%MU>pDc=!t2!3`zd>-%wn z@}_4au8YiUyP9h(~G_6&0KU4W#)7jMXEP`fD7t<-)RPe*rOq%DC z9x{`3@CmvWYT)m$_8cXxHr8^N=U-vdOr3u#tzigDF>rh98{ln4A(|1LzPZrs+|lr^ zMFNf*tW_J+G|P%7daWsmvUJis6nDss+S!M4NuOdyWytxnEn=PQ3vt5{)i+tV3*!7GXVCcC?h*2Epk4jxaRIzm|wHcJ+g^0=O2v(x-* z*fI5(v*`mWU%CIi%dnq{10~@Z|NWK93}S!zwdfc}_#paRs#n=l)!AX>r0yir)_gtz zHp~g!-VDE?$L!rJ@RB0*I!v+y@m#9J<4h#T=u6yL2yvl#Zh^d{PB(Idnv=05VLjR4 zjG0z1#BBxof2#^VB`d_E2`%wz53(KWeaiBySqmD8)Z@#BlZZUMQn z_wQ!mT*4pAT}%)WQb6ZydC+1g>5X9~S3RRq6axD%da*GB5#BzzaXyKbO)$zmH}RN<)RkW{cIaFU$t)rteQVO0QBh0R zPfakAxsyPOS@KBy-U0&a@LWW^O6=ENZ21YI_tQWc@=$cM2sQ`y!M(UmS^?Kc;&b7D z{WefaH$1;@k6o>t=L*1q;5Bv~!1Jv3U6^023o)%C?du`oi6;#|H_kWK(Uwg6n^(BG zx13oKN$lbhP=n9ut(m+UFR+%CKUqLmDzD@3F+q3;Sk<)a8tyV| zSY=sjr=204EJN~Xf|SsM2?D_b>h2$@v2x|>O}de2W@Gu5RrSqSR3O>1IaBbfk}kqn8mCocRB@wMv8f+B)i1qt1fi5gHl7u$5QWAiYvzv_Q% ziUmB_Mqi=?w+6)K{Bk8}IvP;gl2tRhVI=oqP^bx^cHOI-+O@`A>X*~sKa^{tJr14D zQ>#2ER(L^VY9rdnY-DQODow|k&Md@?ZI0R3UtQ@vm)0GhrL)MD{^zBZ{%m(|2eVZ; zBI&iW_w<{*YA+`lpPB0YHTdcc=|6%fM(G<~Cs4*|{|C`wf<;6OM=v~?TjTfb=l+lO zZ%=mY5(bGw)or+@&YeMv$?0Hk|8EP8&(vml@mUFB5d0sut9cYN{I2pPi?<5pR3Q5I7EBUX2%E$$lXud-0w zG}c-W&bD_++i201LK-drB`QrLh%(095B|6|D-^ECxAki{Q=PQ(uOs%G7e}?pQNgP% z-cZ3^4dHkvIxioNXltsV&i)s)P>nxt2_C9@tV=x4h~Ks6oWy5Ss*A4k@mmP8WBK%% z`xw4#Pz)BN|HUhhHP$6c@8KRI=Co3Zvwt(O;vXTL5$P&-p>z~Cc~}H0Jf|qmf5O_# zPk7B{dRf>-Xx2=!95iSDaSne<9j7&|r|Rd;uAl+C<|TWj^9CJ@hL)OTw5`JHUx%AG z&Gc*;n=ueq&*Vr~*XqcfIB&N+iFG6bxJK+wY%j&3TU68Xt)>TPPGEy)2UM*$R z;Au*~RujgMrNkg8O!l?eow6*CR)pJC{^5OMJp|@|I%5L-VsA<+)V9(mU5Mz6eA4<04ZlTC$uSV7pdB9`T0;B90?S;DWtf}gu zDnVc|2bBb64uA9?$jT=}6CI!rcobBzRvP*+Xr(+(RG++qQ#zl~r=zTR%s@G7Z+(0^N#tAJ87**m) z5^-HF@Z|zoT7zQa7cs=LNI9tiBu70DYxvRQSWl+|VKVtL70lUWT_wa(J==nQtl5WbDITS7p-cFMb3HCt$pFKws5SLM;0goi!~9&-UOiLFfo zY8C1kn+UI1#yMPge9bkw@9=5Y#TWQrGj3^|4TE%=-er+bEjM?aduDzeQ)n~0jk0ds zYAY-?!6*pJ3%l!=T6ZV=n$|v5>?#ev$n6_&##OlW%Z@Y-NJ~-0oF}s$@!j_rRNtLS zJm4D4n3H78^3(L82y^pe%`n16rpYKRbGalHv_Fke$Qn->3L|Fg|pa6^btEs}0ghRN0I5Z^gPs`~osD(6CZGP;-wePC6# z_bSrO#S3*giFbb5m!FP@Wn09jG<{bj!^58WT*N8E9n|TFGuiCe>Zcv=Q0$S+S$fi} zQs7%`&fM~5R{k_EsY5YqS4;nL#)ksJ>Ktj%UO!exQ!Gm4SlngR=Iw@OW{jyfOitR2 zV!RN2MB`9!KR6KuQC}C^ z-H15lQu7iH5CA+HZ6e2^n~%x`*38%AL?r9EJSWhYOJHx1Xc3j3*M&DCIpsa!GBD

{zvjX|?qn+YaJq|^amY<`E=xVsjf6Vdab?B9;pFhZxioc=RlzV?0_pX@u zQecb6 z3#T;J7iU1;Yu*mOx9>SpPFG1MTIR9Dn-+}~GSDRwC928ED8l)nXb3oZoYC ztsk4vb&>{d#gj&)I6+{N4fZD>Z`2qijG33D6lF&g_2rDVkZ^q>;?H*(|Iq&^Hz`e%K|q`(_30?#PlKyNe;sqI?sS_06ZvG&JSUu43%By&>n<`y!kDcLfm zb=aLPB2QLXR{L#bP&ny@ETFP_APdf@?r8BCTgpS;9z~!fqEqYTR?)nhU`PRc)yd>L z9@D`;Y*feDl-0z(+#ffDhU(9hgS~UtBu1k>5-T&q{68$-=G2~Rh zyk63hqozSO zHck`p9e0h+et2A433^?bXzK1mLqLGHs;TD_9mM=*J zhH%Q*Ni=LA93QK|<{ECg*clQo_^USd#8TC?C-4(AO;F$AMQ?xa5ei5hhT7M&;gQBO zoFUJ7n>9N+RetUslUZcXi905CW7g%T;jagO}gN^oI`N-Bd0j}-?^ z|Ckr8UnLXuB`@e1e|QaKLNG2sXs{$qHB~5AS1Z^TIHa1 zIjxfp1=Wn?4{!?aoLonywf5hEp+lrvN$FA4^?T^*Pr^|P=tqrU7jO$(^!n&bT=iVd zXqlZh)ObKaqa6u%%?2@bT^`#KB+v*hqadXyzf^EiuV8pQ-PzKqob7KLon-Ig@?!p` zB4SiVvBgyXk=XZolD)diR zq21gj+p@kE4>#Iv312d}9|s11t&+|Q56X0D2UCNkoKLwlc75V9r*Dugp1p|Zb) zGGZNt;vE- zwkfRKt|zMmos>YLrgKphS3-*5X0$gw$^LFqgygN`j)h+nkyAd$_*3h@#krjQ#&ut6 zjZY7k_S%B|t5-|5R>%Qc!STb=G$W zYrGv9Hj|JO{_v~P7E+%3EU>Bb=E~2IzP(aHkb>8HT%?q@g0KIXfl;5OURAU7fJ3CzX`yIfjn}zfrf1X@juftGdDBK zRee3D&JMUc16M&mVdrg*UZB(>BJ~w?H9f6|+5u}rr&lY!UYHAZgxWT8cSFMOQG`_@ zzGD9VJ%pAhEsO9T z{o5Ex1AlMhQxp#1D_Jj+&e=)sb=JoLk%!Oeb-4_I2DlUUHHT-O+OYY7TqYLnT*E&y zA>Q?kRetKxsm7zvYoZ;u*vic<^|P;FWodClhz4`gccky9>z?NASjk2pMrZHc?1c^* zN4JZAj=U7vT@9Q*G)VSfQ;_pR&H z1kS7PCEVEkcvyB~_5Ww$q!MwK4g*Iy7d z%hIBpP~3VsT~5HiCNlzU${W^ryV>lZxCZ9rt_LnZal-1@9bg~A8V3Ly{CXYG210)A zc_y${RzDNPVXQ$+j(8N2b@d)`(GQYYUS6a!*9$bbGl}-3a5vFDW!mYn=~%?dHI}T$ z=#K9Jir}%n#7_AatG@iIXW@iK9r-wbKICGI6NrXd#wm|taNR{Ou?obSq{pJ`16E4P zC2)sw-D1AgnwbCPE{l&t#@_3hqz_@aoBHVlmW>O*q5ZW`z&Q7c5d4_c_G^eLVX+8} z+pTNQT(oaH+#je9otsldgbJ5pKK=q?_+?1=HaCG>U0y+!mIB*(%0Q-{NSFuI%>*nc ze^UT;T+JqBO?y%}g!$OK8ZRE@xZC-bplHqXKpNOBv~1O%;!U8mm6I=ed}!R7mS<^o znw8{6JEyZTPiqqxMPDD5Z%OD%rKqzf|KE=-H%i`)orf6!k!k{)I^Uijp8C;n*_7C- zLb>@uWuGJL45#pA22@;&_J{a5^fPkCAxz|72Cq^Y{dN6aPZI4{9uod^o5mfKPQ>Vj zuVIi{t7;R^syuP!J%j>;o~&E;xFPLH9jmo$D1suFgTSrZ+b3rl=p${W~?yMSHI@G5M^frpzy1kz2AkrvSeKK`QU5diTR}Ee zPPmhB0j#6nA{)vd8_*(%rzQC|nk(wRpIJ>@HB$Ao{G-Y2Y9|}ttMXqX*mLfGT!rIP zk*s!ySMVGroEvZ6Jn1D7V%3|=Mo}vOIsf0ZX#XPh=TUZuqp_7lwzq9LVe$_mD$29=o|i{pv2$ z1zJ49>2z=h*_rGO4By1OOLIEgK-6Zl!lrwjod;rdei6wEP@Q37_Qarm?!%Sxc>OXLUoP-J$^P7ZkxF}sCgy_BG&6yio$mG+T zCCz>nD)|NUJ+M?yTxc*hUCIh2vFnV{QE!$TZAIQAH0IwtSFW|+p`;>-lx|fg!tn2i zSoUfpJJk`z`75jyoW)#Aa5Z)BZBx`#b)Gp5K%sD&cP(Z=VvaVJfe$rySR3tHW*dITn;6xJ zznJ9j+efD{*5Ik7z26mIcHKkxzD>(E`llXntCOy=kk3)foui0|VE^2J@8%#VShw+- zts&ri_+|r()C&(}sAXqa#g0D>3k|8es~jcYe2E9v6c+~|&8-j#GB-|fK?b3M^im{{ zNTIA>$A7c)_xsZCaOfns#^9%~&vVbIO;7)F3UDlR8VDX^nsdH*w*KXG$0&zkb`S<^ zD0w+l^^qJKiLc3$B%c{00|&Sdz}=@Mv?YLJl5KN~ZX{F>O8^NYh%q~diA;OhqxGSZM_B!1s$ zXwkSm&YhmsoHpzkqu*ZQqbDrQ+lP#zC!Fme zSpI`rwYw=k4dBOetVLrjrjK#bDg}>W&phZ>zO+Ic(bNrM<AN7BF+z7!i7xX9{|(UH2eFEwrkC``S9om7@nQJq!u2=HZR6S zbD%+1EUMxWUAk2{@!zh<$=7Rr)K2N@UJ(3?mupzyGgWHIiz)rG^#56Ef}*9DAD@ez z!46#>ns~?x{uQ*|9EOU@6-_~2`wIUv&boae(A~k&bJ!U7AtKZ}LiH_5AnRaE*e{*<}Hly1<4h zu~*A;wwW8t2qyx9wBmk)`*P4Ph}jD9sfK;lh4xX8XOl08Pw=FDlh~Y4NldgFNWIuc zhw2R7@W`z{TApzn$f8qL{Wlkfo<8@!n$_u@o#~QD$3KGN1BE4rSurF zp?9X%?n3(){S72^Lf0;cOT3=V*8c-^6h#p#RBjTRRpx_s4ZgWKO-kPJlCN431jEaa z%2f605kJlos~%0ax%-I)eMzpH_ht~M)nprB&i9mhvmfCbke(z|e(Eh3lgo=0k&ORF zsfqcZp4Ex4V}dg|7Jq5Xdw8$R1CC9|eCyyPEw$fE_piTCKpNQ)g#d34wKV=0bbboH zG4xB#j_1tBq^XXTk#!2P;g;SQGW<*L%8q)Dz3;JlnzuwOss68XQf1K{q};YwD`-4g zh6crYDnZ!<*q=HK&Mr$^Q29IWH%*I&c)k+(;cGRBrhSHSI|XA7ETuPL+GA<~5|y4z z`|x#LJq}y^JrtzbBX6SbLxoW*-gPebX>Rai&|jhZ3*ua0y->O&d?P->MNp-C+2_IcZ?*R3fT38T>Envi ziD3^RTIZL>Qn^au#^I?YmBP0?d7#?ME@d$<@`j6_i1@Pu!scQ8{|z9|mF_ulHsI*%uy_CDIo)^Rv7+tmyh-mN90~6e1|Cimj3acV9 zd)9XXi0N)o%yD zy!vmn2X-_ccD*Y}zdJp=?k=Mp*QHNG>8ZU(4AXdZOjm`uk?!)98ZGH6S}J-?P)bz=D|Ozm$@4~2g5b)RWQU*KM()9lGLNWp1z(x6K+fo7r!PpBo;uaa#O zaGJIPn*%h*b*}6)E@|=|<&3+l&|79FCxCh^?<3L$u&Q_tWjh5WYL&C{xK< zRbyecg-o@~T zCxIRXFtPaw?Qu(nj?$mcrykU-_S%~;0+?F<#zag_D_`7nTv}u?&D2|7f=%;fhpy{t zvfi2jv*PxB8F~ePtB*b1j{p&KNo+={oHj(R;fnEmJf?I;x92mH2gGXUBayw=O^P|D z5FGv-AC$pvo_18wk@t0Jln)I?$y;SkKK!F?XlCokqhLt{4f;uE)fqUJ5Z!9;{hMp7 z`4-pT;Y6`4$7k!o5cfC2_*y(C)&Qs*sAeWsb{pGV8ExS4Nz_r?naWf%1s)!jB?s&S zqJX*h&i!4f@t6GQK3w#j0BCqc&0~>}Dm8>Meu4A*|DcwlHT55>?cOqbva9!<@ZvML zBTw=mw1x|^J*a+7aRDX{x;~faLoB)_QS|Gjss64qahKIx>tJYz%`M^S=M6FC?N^_b z{ow*0g4bXDR2b>Vev8hEU|Y(ai}Aq|%U?j4an@MF#c_+}5E`wl62%6G`D0rtyNM&p z@M)95@d?*J!Y`Mnt8Jd6xFY?W4)0}3e>8S~u3zP|9Ud|lxhEg>2xcFm4}v;Wc|mXW zr*FR_&LBFfz8PG`qwgGI#+OIGQLiU+E4ljf!+X_{9xm4_7-9XcBXO+QjBZEK%0q-| z#s0c`FhZ<2avF7DOG!_A$7a7arH*JfwL3*J;<5}A7^dK_uid> z1B?2a(_`fy%=fx4p}a2*z4Tc?3m&HnbQ&Wz8;zN!+Z!$BVIHa$x@;6ziR zR6TbIS{k8G$h9jjW`6wZ>A3aQb#W_$!d|=1i8Zvpn>#TxLw-voEd3Tp94(X;1got_ z4B%R=c#L--($}#~X2qx%-=Y&57d6XOOt-W;fgFYs=p37N4lTuHzoZWI)n#nGzUcHb16KdL}Ds@5u^X0 zvccD4#%0iH0y2MeBL9YK?u30NJ*wsu3{Q%mrz4-PK>`4)pGK$gYglRduU6Y#@#Ko* ze0;?$yTThX4j}AH&JqLVH&y=kwzn%(Qg?WL^W1IbKVK`QcoA5}dHt5?zAH!NBoR zhX5Keg*g44fbtZ+0{bIX&R}=iImvo}Z3RU!TFXoq{Q3G(InHWgCKoi0V)Znrc5@pj zZ}3e`Dtil)*WASk)l0|ZIuNCKqp=Mna^77%e;L+$)xAJKe=Ju}PCJJ;JafpC!9vT( zyVJ9;Aw?bz&U}Baa&rYA+)`IhqkbS2_r%=M838Q52mtmbU|;ES%Jt3BEVJAKO%liJ z;!&;&VhXS7nybq`Q>b$~6m#Hp^?~MBGGLKv!?h{kuDgS|1y~7?8vP;DW|}gqIEo&u zHz<28u6>}3GXRv#$@FIhNwj8ApNMIyminV673`duO0(}kCu5qs>%u_+I2zY&lA zni2ROxi(d}vLW2!HIB0B1eYLh?qJ^^=z*G-M6u>RM7@7TsT9;6Qz~MpNwcBEcTz-g zF}&e-HOYi<#_E*#X4JR!Uv`oREFQD1QIQq=+N@f#mRQTHmO@KVzydO!!u9kme9($k z&!Pn0)VSD{huBVi?GhdGVY)=3#whs|+V0Nn`)v)`l8CZ-N_PG4l7m^u78jChBl4C2 zUMtov>3CwD8JxdP?He`J43hYMAA|chmiIi2tdJ`dz#8{aDQ{_I2s55WrxpK)+{9b_ zuGKHw@j|ePg~K$z~vV--3epMF<@fxzCYm_}M_T>H*{or`IjatrNn!TSH zxfh687sw!wQK1hL59JtpxfKiqq7|azGVav zg5Kil)qE(Ibql323e_j|r8%KhEL(X?D~dsq49HrH9WJA^PRV6N^@lm0L@yfmZWcUw z&TJd+qgDU1Izge4Xrqi(F_U*WPsh+T@($L(#xahj75)>~RBovwz+&JQA73<)!Z7BY zEK`YJ%iI^0B@PLJeCR&ec$as#x~zTo-9L}vn6-JW)D1bRig@*ZVee_%CiD)DQule7 z1HF1V4Vkn*t|cN*y1^Y+OGh26Si!jHW*gd((MKzhu#n>4>dnp5+FXx{7?~v{bS=h6 znu|90M`-c=`@j)bE|_=^Q|A2y3ut|3m(WzlxQ%e+;PSs06LoM2>xkD@c+Y~eq4ml^ ze`%O8SeY|IH| z3bRsq^@^SFr*iW_X-j{g%cI^a?q{CFet%|Z7eb33X1J9X!O-S*?}n`R2}DvC7h zP`La)U$_88K)S!d9U-gJM?h2hRRrtUkE2Hlw*rLcw15diI(cLZ0DraDWy1k|=2=(uE8lw|CXe-N_~m@8EJ)DmepC~F}(+#x&dGwgC~(|!SR zB1)j_a84Y7Or#W&KBxMl+Z5GPz^qu+}S> zZ*JgG4x=8;FyZ4*TmAn_Fc{RuH8#0rMnNrd*EG*fgc<2THafpnh zUL|t#TXhog0LmTTnNfaF0>F3{?TxU$$n_iY(~0&_lK%Cq2Ecl~Y)&`yEiy(w?2wf4 zy2{HThdRNkQxx0TgFq^#1G8JFpPB#9^s3L*YzW-L;i$R{bYN1PY;hKd(udt1= z$1RmB2gW@ZXH|7)y}N(HP5&~8lYE_lGcAeu-InHGU{~4$FihZ|Dz2!D4Bl4i$@48kC+uLnFX}JAmPoivc9!c2SNokjEnTe$%n+%h3 znQuA3856j^Wk6x|aunjI$>sys!wcnH-xRaM35PFbMvO31lD|$(f_9#p$|_I3Oa}zgnO}60-w-7e z#|16$l#Te-wA=}wTZwnmKM$-)Auh+W3knCH*XgqK&mfUm*~~+q!5*7~tjy1QiR!`J zoEO0ELh?lGZ{L7rT{}R- zulhY$TwJ|P{#Ur>*`Oi~v~>V;5u!1n-hTD$Tmt=pXJ85=j4M0@i-$!M02J3;f`t|R zP8dKNSJfR4#@xK~NpgD^WXsjTe1}%6ymeJqEHf~x+D*28e|0oe5ERb1B-iZNo1%&> zaxhO1brH>fH0@@NBd3t+9tha(z3dvB5P~Bs3e5cGvla7b$q{`OSv->tO@ypE zOcH~YOEko8@!EIs+d+R|b;6Lv*ncJRm5$A*A$>(KZlp97`TSdgijO|`3}4gkFD!;9|)z(}{zA`R4O3(ThV_*I<(fQo^ z4H9QkFL<|)qdn4&^|^4!ZQ(96#d}sT$a;}z;*D^rG&7{zH6^mx6*T6b7BfF$3@%e< z(b6gFvs-2cpH_Y`K+Br60C0;;*-ObWE&_9y@C4^F;tD19GCJO|`fC2g|EIL`5t#yK z*#hIpeDl0BZgKC@_rE!Je$wwFnO4sGp`@1-TywoS!kIY-3+;JrVZWG^b*Qn6+#lgg zS5UkEz+}d&l?!y)Ym4D(zlrkuN6eKod=>YnCz-DlzWjC$9JUJWp~W;oG(KtTGMFnk zb4yy4@FR}O;Q6ehH_RdxG-7nG_R+ohBdQyB1-nyiQw4domcL+U#v+`K*<{(-HGAgK z+G((~p+q`3a$~UBKl*nQfaT^D%70CMMWX&(nY&d?f)g5ucv%f1PKqk-dWuY@ zQ9eq)uF%3k-R3oXwXk>~y-)Xzt`pP9FeBt-K7F;wH?{Feg01QX830m^}k52`4y5zt0p=sLq znmtBfRgTXkIze-10S8bJE{`0)cgn@rF9VYfUno_mOIf?if#~}*hPBfN#Z1?{@NFr; z_KRl%iT0`e$7O#T6J!i~?L}&baUib)mCgL`-|5iZ(RsyIo!n5_pIvB!TbD#}+R+#= zNx9N5=|iRKsyN=Tpcm#K;f83a78gj=nTy!@zuD2uJ{V3J{*q5;zWFTK zkD^(=SS{@jC~*VmcjhjSXC)`}n)#mJQUo5eS;= zC-v@~Lix%QAr8;l8->O(lr6a+6U)6ztN2;KUFQIFd)en)0pAQ;PGb*K?7zTkWg!l_ zrSpaJ;AM%#fjrVWu#uhDq%tcbsFgusH!cPKZ@baR zgePhUU3U?}Z5N!NrPo<;`zmX$!jCIt%2oHADr#hRE=pm)JslI2NLu1GPPZwU0oax| zdJnJ)#Dyjw7H+A$LfoXo!QOcvt~cxar!w4ukoLv1yX}`P%^0L1v*7=-dRPp4lRf8V9 z)RtH9!T4n8cdSe-y-+sdI=Fg|Gzpm29G9(X?GKc;6);gg_00{qWb4?`8Q&s`-n^mFciX$x)p zfIxP3%$$|iJ^-NrJ+G`Imf$6vS^G=tk{Wf+n~nIaUe*3?F0QQc z)>8@7&-B3kGGWV3%lnfOWgj8g5%i|$2U#pov;qNUQU-l48F(Sxw& z`!16b1>+e&D=EvNH!29(=-uL|ZbnVp(cGa{mMY0tzqdMSOb_X;Luv^tfKjDffuW7M zvQ5(miqTtUhJ7c7KUVmrax%4M>G|8xQK!7mA(7Us@uk$&(cVFAXXgW1J)neRr_m&( zC{b6}^J<=B1Wj&((`0MvHld=|@U+fU51yCWpFVchGtITpRO z)=bclke3Br37)5503RNopoKJkwD}~6r5HOH!$$kn^%E=VoeWnWlJLvg41X!u$s^08 z1csKbQAXAVaN2e?+hA^vS(@>Zm0X-%p2r5TJGW%_ZS(bMK&CK=hYn!kNOkb#H)M~| zxr;Bjff=XPh-He#JRqJKqnr9VUUyw^4vAv=-R+N-;*HwLZ`3q->Q&LS`A}12;M2+X zlQ$x;^EoI2=h))l4sru4swHDB(pe(4G8;&^N~8ck;O!%B@p zo6;|QwlvW(cN>ZrTzh9T{gVHtgNII`!%NReAi>Q&4qOp6>~ZPC5H6n8v>N1x}pYzBF2jU+$iA zya#)(=lD>3@wvs(Di-L@e^BUq;h^GVOzXFk{n|vepr4u*z@xLCxUagMs*}yMZtbnZ z->5<2aLaS3bZ*6G36(aKu^M+}0x@~$h%Nq@xuqdm$-3(=zmot@HD+cA_?XZ|_*Sv> z^2r^e>RVr7Xz5SavTD*6?mKC~E?C;XS}x^IGtqnP&Q&;1hu1JRa|b@C#t`knPF4#= z3x4!yvP|2EDN<*$g-|ARDYQgsn;v3!v6|S@ea>7X1r)Uu5%UJz;A#Q6-O0gxHg-f%;M@JqU+6&P&KA6hW5-H`s%vR*WNe& z6hfn-n|A()wxqw|uzd+XzRuu6`BK^x--@CF|HrV!_aDiGc8&bJ>;B}h;u{c6lQ&zv zr(uY-r^_Tx-zOvk&v$+K+lT)0YW5PesVvZ zO|Gm7SHc^~u=9 z#NCQjrRD{D#vt~GJ^9^p=*UzY(q>quu0mGD1AfFPb{$n-59gHN|2A0DzdeXvZm%Qg z;K!ZD@lS{u`UET01H1>n{>i}Ghy8hb|Me?6BXEf-3+$|!_)A>uqqV}UMolby!|p66 zYrbRRwSdjv<2Hw0_OvCZTzn7wDxg_DMp22(DhemRPM<<-jMrJ>K&co28_ z-%HmfD!Dn52kk)2b6{gJCHo)*nXUYrqR->Cv8=9VX>BylPjisZ-|`#I*woVrB*i3# zBX`nmMn%_^jmI5U8ynU&hsw?#zsD||=CiliG`O;Y*xyL)Z*}$oXJ8WALa(o_hi*j^ zI$TKOZ2|6&p4*&7M3scR1h(SlntVdm-%*f=gEf{m#muBuv=JWiC}mdi&!``2PFDUd zg>H(NwM(;7-`4OOuDJx6!Vm_+LT3_n?H>_`gN)hiLQ58+k*&jZaCSe*g@o9Q1{ey z4I+N04Q8(kOEYWPZ82%AIN4X*X0ZVX3rH#rD5=s7XBg}wU_$?LL8dX-@LNk{deUMAM{BVr zpRjexnZYfURQbRUZgThgm&&TN_tv)0ZU~yJ*`I3@DA=y(0hSri4CnpSMi>z|0roy| z=ymFhKAsiSauV>wa+I(i;YZ&z7t=Si6_GnRdq2>LW%fWe1w&LL2WDVJb_hTq5Wyi1 z0fzucaC|aZg3CApz_Szr7@$cEP~h7!*^bTthXL8c(207zNACOad4+lLeWkYAY1W#1 zcq+HIt){EuT5h#YwB1!Y|N2X>iLvanlNy?OSsmsDgL z=F0ZX3MSa2xvbx|01HZG??gO@<3c|?8`>WDNv4nlJ^aR=W;Tr)na|h#p3nPWwg@EYbYXl zJ(6uWA{ZMWa}pb$q`)XcW`0WM^blFIY?YX+ux2NG4r{x{^!;BGz^7(Ezt=Fk(aA=! zr=EX+HI#bFP4su5s6Zq?9WheF!dX!;pV(1cT1hj`zIqv`uxFkZJ5yFk_%XKy&d<-M zn6%VzYQyefRrBoY4&ccmrSYQucC$y{08e?mG(TpwYnRV-&FdIPk$BvyLBmJ%nD7bR zlKEEL%m2%k9c};od%|=65nSoy-d6W{y0Y#zGEp~$zA!@j>@Qf zh14=rlXN?eOF7BP-tF@Jst$mb{pns>>O!%RC`+!!3hdVf}e7B-gEz@f|{qJdH zSZpSr2W$2fMV~nr|l64gm{pKaow1|634!JE9k%N*z3!}&{CdOAL zOqj-RUj%$*Dk!Yx&YxRd%G#r@HKQlTn3pFTKmKPp=By)u_FZTPR23 zMwT?#l7;|QI#iIl9mU!t+@&Y+@1BNHNsOJG#X#4|%#jJV>akY1el8SJJ;9M@iy4uN zM1f4Q^@R8&09Lh4iPT`D`zym)NMAJkDEL(*{Mh z!6EkJKG6EqX)32POGVgVEzqPIo6(#bN1Ux=S`Kj-F4XRFv&R3kH_rBzUx-5%!Ee$x zu;*mf;IEL>+mYJ7g{WLo%C#T(GPLtRA+nPA<||O8&_%EYEjnM^4;jNa8(Uk+W;1#( zS>{l>-cr}P50n8geeb8&S~tO%b>5NshMgtYA+X!oPc};BY^nu<(7VXa0FWoYjjBis zDbvau%Ks5b@3s~9u(%K;^T|yTW`BU8Xs@at^kKQPXr!j9u9-GHA9{?QEOHkW43{Bm znAD)vIr^6DZc?a^vbGv&0_D&r#zGNtxo3Vv!(eSYJ4ryDdpFWROXvKbep#mUU~js3 z&nXLP`1lEuIR1ZUzQM#XByrwZ835g-R-}R? zTuwiOKMijeo;{k{>i;<1od~`@4QtY7Ld9O>nv)PynZr`SNVYWzzH8m z{AV4UrALr}J5IP}Y>;0`6}%1qAPt%(%v&_XO5&QP1#WH70K~k=x37j{sAr3bVqqbj z5n=E&PTRs2z8Thy*aF%)r+|@^GsbH(NvEO{1|QCuJQ(K%%#xwHEFXwX9o4@G5VwBV zh>}f^iH;(klz5)DK%mwnZ|#Dd%TwMn{GFWw5|F^t&Uv?x^F)F&A)VINo7e5T8J7~M zQaT~Pj`rN=y(YINyHPf6;+=sJLOw%twkotNiyH)hLuiHiD7~ett;QCSGn7;GPRJpC zOJ_q=)eh|0kvQa!0TmdoQ3u7ekrYd1N+kX6RAk%u@>F9GI0s`W5fjX%3NKF6c5(L2 zWbpHtK$v2;JXGcY)9JV9K!Rm!(rw?fJw&U&byUe=`sxQ{Yn3SVOaTvR4v!IaBw(ugN`9CPhHC zoB+z1PB^3yx*h4O6E*+?kiC(+!#m)?d>DNZ=@NpiVAgU?9GO7>4m!2PA06W(Tw@KU z<2(nXV%>IfMyge8CBe_sVip9#8ez33=%?X-6(HFI_dC5EG~sq2c!72uO*vyaZIcE6 zG#XvXC;n+^2MmAy5@(C>CAMPAh&V0qD*aO&-b`1X7BFb267C@J{Gr*qA}v#fbv1y%^h5#1(Ec~OB%VMiABGaesa3AsUPkKS)OHO{n zB9RTKY!0}W7?mOgM$PpctwwT#fqkjQTAPF)HCqF}W^`ew=9;NI@Hq9abMQUy)UT%-uwMS`qo$?JEFYa&1DKUhT05c@Y%{8xIDVQC6GnSjx_5=@jl~E!CdtMo|@9z(xEPb8H@iYnfkF7HyYap9mZ&M^N+ui2$7WE0G)9t7=p)ctN&<&2CJ!SO?@{sf%vg zr}54KY#4%@`I37Rk=9}S>&!nkn1Y*R?CSJVe1FvIryA4`*YZ--r;%BvoTt5f(A3JS z4hag!>DLLg(UDxeiqwcMc@y}om%5?m)cH=7NlK{;Zn!*bn`zV>@DRp(3g(TOr_Te^ zg?@`O-$9aCnLkZ7*TefyO0Qw3?Nmr)_8ch@^J}xe^dh<0E01rj_^4(7iJHaHUfT!8JyA zjgQvA`ioHAN{XaIC*iHASj%nF+Ii`U9rCiJe)IP=?Ray$L> z(Z4-!u|EqwSRT1+7Puj8*;MP@Ng?7FwY|tp>*Us7+(@%AnzZQeG>WV0NRNK)rH+|) zRVM!@2qoJ39;txU!K}QmY!erB?)mwAC^+(I^g1$jPTYRtel)YY0Jc_K%eE9&>(28j zYc#VgJtqNaJR0#m#?l6U)6+R5NZBuS;&9X2EZ{z^JR?@lB&?8P7JqUX>XiO~rVRAV z#uWlWc$wuLEuP{IV#|aY3B8YIb)_oxtHe7(XJb1g-wU~Q87uX>+d!ivoEO}OlO^O`)3bOLZ{_Ybg?4Icp~* z&XBVnYoX3>^a22(S&7j34$#!UpJ4IN_^q$%l}KFY5|1`JvQsi{eo3F-J=uRC2J;(g#{(Q*SG8EI3BP&4K8OM zV@&+N1J$=Xqzs&p8#fnlFUGIQql&EAMAd(NO3tOz-SULL76-uI$J!ym@Msc*-hk89 zmTnHGS05VfwIWze&hI_`x27w0=RQ6q%KV`e=4pX-7z+SlKAN*V{-et$;l;J~m{01* zSoMm&J8H_>m2wTQY#-qvjap6$Jd`ZgHU0&f(6?5zxQ#vXev!&do}GLV&~R4#CNf^? z*16a^4HW!kDdwhL8k~s|X2`;63#oQ>Fp%zE^l4hrWgh-rVyb)XTG+$d)%I_&P?_vU zvhkWt2llDDwyTocS5|G44leoQM|ZWqHxJrggP=h2?DB3o^bG2+Ub9z87L8VWq$qvj zU2q%97MX{mRv$tk_PBVrO}5LoVDpca`3@GZ_}_07!2k}UnoHvnKY$>_iV?%buSyGb)LGXI-SwAA>{oXr7LIgrjuQ-gJQ?4q)d zv(Y;50wd%teqPw>zTDN!I987Zn$_I7BCd5BBrKvP@=OUkqLA>*^qseFd3+Py!Gu1Q zUmvbUOf{8Gnox(2nU}AlMPivjj!Q@|d?EKf<}zAWNdWc|R>%f6lO_xrlV)*QQXvb zT;dv7J#YmZ6VOZT-^h$=4Jo-*+xZZb4L;n9V+nJ#8S$R|;NV;==Yi;bT?RJpPQ6m<6A;+w{CMD5vgOiwL3;FYqh`MJQ=| zu`kVDvZFyp#4R~ds`(B4^~^^0`R;_yObj3GlPVXQ?U{L3*Tqi6B1}HVX%CJbxu^l#3vP06prQGG|V+8 ze<8=n!(&Mk0M>}?sUQrGj5>I%C^8N^Xc{a2A6AY3?IF8P0E0kL{03&0yM%7Bq6AhRgBwYkK=P$K_-9^0RF0hr2U0%LW?7h_Kgly=S_kiPpv+A>I;UI?B ziEvsIJS{o+UciH}UU(~xZ*)U@2skKTItQMKc95(c%J6wdzA#grzyHK#dU`u z?CIl2FkAbpjZ-7oRabcR{|oP>7&WcWyl?Z%uy4y6qeG0?uPee1;5N8 z%u7hr%x#eo`3Rat`0?dg$@$CH=8uM@Ti9c;`q)P#zo`zCdgvv05e3d}c+ko6e+&S! zHq@LoSTg>!C^x0QkDfhCb%ar;0;`>eg2~IC`wtzod8eb*MSQcAI|nJiPdxAVQ|Qmx~xr4sBm%toXbN)H_GZxg#nL&JpbJSF=DM%!*Wvm>S(&?9ad>(Ci;| z1sTb_W%lJ5F};KutF}lRY)GTMv-z*kf&_@M(Q9-NY87$mqRH4TY?P6{#-3CoIdDz- z87##vt0y;pPr~6o9E?26-Ho9{`#>uhO$_$JWmwkQM`jPUv}ys%yyUkCI7&S{jZR7f ze!t#}b@Li_z3Zx($pc_Aym6khg=a&J!}UXsdbqVxn;WXdZAyOtH<(YK;U#LYHZk+G zsM<&)Qy8{Z&_h#_7Zu0(G~Rp<+y%3`Ve#$%VwWU}$-=iNbl{U4_|3s!u++86WfNSK zYvxh38ypjzY-kR7=wy^k0|H_Jc0BVp)CW4g3GoHfSHIs!%ax~E%K2uY86x!YBYdw03@r< z#UfE-wv8lpdj2$<(BrX-H(nM_)T^3}1WS5W3L~-kxbo(7W4VcWn+U?QY59`Zc<#_$ zS?ZkMI*Ak6bW^HT3VI`Ue4oLG68mm`b$Z_+K;oFJHg7qVV7DXm2#BhMa@S3qKj7*(k$UwN^pM{eNSc+ z9<=(bdr$Q%F+%k4iO7pamQBS{w>5h4y+NtgYhD4k&K|L=!<9>g3MS3#MGaXkx8&kB z`~pUs34N`>XLNX7LaBLyh=uA1qM z@qM=_W2X_-DrnbM8ad=H2tZ$Jp%OYcq110!N9O)eJfL^&I9A!6L|N=1W04$MaQ!T} zx~VG>z^Kax6KHUXQWebuOR`%I|6mhT3zH9BBEk3-d7#2>|0E$7o1kY$`sw?>A|LHJ z<^h~q@U7bw^;467$aSx~ZxliSX1zbPQ}ss|tB%_&tqwVw$WkkWTZ=kLRZcQm{Cr*v zNxj2H@$rrAiB|PeKchl9RI1SKezS$qO%Ep#WIe`j;nI#$f7X(Lhb8MNGjjlup5fI( za2?q7Ee78SnL7ynsN3qsflF;2eWfLCj2F{;V;^h>@m0~ubGqn74wM6R0%_(TTfSOW z;4ngY8G%>#tCuQ0=v9b~_}@vsuS`7dQfZ|%=%pmI+Zz_<7WK!0>2_Z zhFrD(+{Gk-voiwr?C}eD^Iltq=bnqYrukbhuj51NTkV!}S7@`N(52h5F5_5-+K>@K zb*CgihPUGLA?-T%fD2h%ZK-jN!HAGQ=3UR96-E9Mh=!*@Iu7SqyI@@35n|n$uuh*Q zdv70UE!z=hjdi`?ouh8YR~sf0+ih`yS=;(j3H3ekMXPJ7k?t4HbB?3z&{DfEZvueU z3dy-qgN+ybCD3U}%HNjPId1l1jP=H^H0nR&0gO;=47Z|=K{_>v+FZ9uvk z=RP+M7S}6z>1Imr7%zcWO9K=4UYVO#SO@0h;lUjr0{9$UFW4t@+ltwv217|K<&8!H z)iRSzpE3f0ROW~vWdRE?%RjChS%20S=;yU%CuJYtSG z%k}TLH(I4efuLbGT2*~lD0|?QFZIvO|K9Sjy7^OzU*^Rx5!GO5nipzL!$R!m#nmHK zPbuV6e-P$!zRG!isW*)y%cXx0 z&wAsG#8sgPJk{7)74kOQ>lzlXTsa5UfITIw*U|0mT0$V9sv5_OCVGlBKL>$rqu?df zx91F`t=L4S^IK=0v$vV_UP(7@tCfa-r!20KPJ>_Hy-L;4QK|ePbQ)3d)5-4HC=}cd zwr!phS8*?{E@CBdw85wA*B!@=!l|(|H4cVLuZsAjm)*v;sXYkA*zjc)taZP03JoL* z?z(Q=zhT)k+>YPc_#=k)BID!Eqm$?4s!a2GvF9W9Pt=r)`E)SyZYm{&0(c3Q4V=a z*Matu#9xQ}nzVdvYSJ|Fo|ZoBsM5}X9345tg@YdY%95n0L7`97lq%oBR~kj}Tp`wD zkbQDh9LpqLB??{aZ*5zQ>$ME$AM^*HXMgO}ryWf|uOIYdtywGf(=9WQ{8Q21!Y}5k zEE+l=&iFl@<5jgIng6o1H^=Z8h*qNcbc~OwL9#U6s>3Sm)SzUw8c8W^ZnC#1wign& z&Tp>EISp>|rD{je*z=+CKEdMA)mgo$1}!w%E#; zYmS$DXx!S_oo;~ltJnRI0@qB_qL&3^ddIbp&kP6a`mx<{d6Z~HQpoL*@-owqxw-yX zj&KzzR1p&K$XouI)M2Yf88>1RW+VCKz%Zgq(Fs(^O*_=!wS`fUFn@wF>U~88L>J8UAyGe6ZQSZ7O_{e-Vh+M1Mh;=i~gg zR^0ZSe0>+TR0c61g5$OM{Si%#cClH!>j!cCi_>M`=Bj9EH;m0gXjY{HF&+$Vt9Z0I zw%pxXaJpwVSb$?X>|Hg!dFRw+*w^doVeiHA)_&)u-0S<@SG^-@`8$35|CX`#C8tMa z#gCgkqu(Q_oYtm_efZAr=@Uno&(t8v*x9`=84?(ch1!Yk`fne1em8n-^$vAHE${eB zd5^{$M!X{5O_=~UekCdydVtl>$dH}C4MvI{HA;K`#bIgEkq4`$LrZM?_3G)5YfwrP zUyPJ5_6qK&Iz|44CDR9`rTy8cpGwCCuBMiR zt!tqw&`EFgxGb|nz@RXC>#jXmRzI4Rzh7fR_?N(7h<^FFYmmV5B<524nBmcGSQ)l^ z1{p1U1$MRH03}l`0FBSBZ^G2Tm1G1}ROMgn3JN>MyO-**DE-}w@a)*0&HDhMhF!D` zKmz$@Qov@oN$K4O{3UY5KO>o<;(yPy;x5r0&5}sQsb|O7qIJ<`VG$HQ<;m<81Zn)^ z>LY1Xxxr*aCjHCdlL5WQnn6G}G*iV~jkMu-bS+vPbYQFs(_<&$Y_e`ySpi+y$L)xg z67IpKv6qc=S#Y1wq%nRk`smT(;#Zp~?Uzs0b($f}Ljr3c(SRC5b%b2Z(rXt%h-GeJ zlC9VrxZ}ilt)mU6RKcI5l1yCR8XhMY3Iqfa=T$+72JFb>(}$HFujy3=|Ab8+A6dbi z<-D?dDq}LBYpR!7Vm|o?K9V754)MiPvtWa60#7{XYCJ0*Og8kMU*RNzC+5R51pFvI z1^Z2AC&>OP&fQpRXX%gbWOAX#SW>D637F0J@b%nkij35*C+_-kmZWV9G?oz1*Mx5>q32Voq z(|cK@)PE(ZNa1><2R=*@L5=4k>duP96e~njrsrmD@fcDO-{B#w zqf@P6vBz7EG$}}>L*s(SG->~nl{NkxZHDRSV~08KMLVZ~FUYU#w+Sh#hPc`YXB_%8QhI$|YEjTzVXxZ+J2QPvFe{Eaa!=z^V=g5LYvnfiWAYZ9>0>>pw?)U;)4>dXYnBc-?#?yr~ zN}n$^yt%{JnI@gnl}0bG84m*~q=z>CJm6WNNhj9-FJBFCnn@XPW%!$z;BRrPZ1o*n zK+D#8+%>7Hd~u{^Y0U5kMe0k z71VuYi`)7Lx1mYu?)wgEf)1EZh_&`;FUF~D97ZK1>EuIfO^-+uxX5wC7)e_0L^fT< ztw|qAA2|E8)0y5#1i3~&Da!w%u~cynVO7fvJ-v5z?STGneDs5$ds|2e zR=wlGNb^J?{Rog;ey@&NX$ml{ zW!F(HDNHRvIf^lI^LKe#BP0F4*?m{xJ}=}qc=+!52n2e~zWc|HG_9SWmKCR+IG7AG zL`AP77hz!u+{UX_uRXC-gcMo(OYf+{7IM2Qn_-xcUf{iF0O-gPePJ$ComA9YpnZyj zS3qnCzPTc{MuIAU4IR8_sHs=lH;E@0K)X%$!DLvOUyQrMyadK$t)lLap|UX;@>vg9DSr8PITpjSHl8tifIRYmiSwEIa!d;*`4h zi@{9sHuKgD{b%KpNjx*a*9N55GmZENX#wH*;WFv_gxipSvvCBgJ zfnQuflF1-5xrGxVYj>r(ph@gQQ7JJZ(6S(`4sLlI--#6!rWspXTXK7+Y}Da@sgha{ zLQKRP`|640$$l*m?rbnz)wub09bA1>EI&8v(Is4(+1$#P?v*lsomeG;|04(syWhm0 z8Jn6hXXQ853$HJcDT+q&wHdf5>6Y6(E@Fw(CSXMjJUEJHLV4nmmgIYjbMpOMIlJOg zuab6q4ZnfLVn%kp>soyDy9qwC_DxD7dpfwTcs-QsrSy&l);#{SLlKt+PtN$Ppz*%3 zPtSfCC&Wd!({UwE5&8qWH!~9TKD;eKOpJ#^S>!Vf+7T=9>vW{EUlEe%8w(;E^&i`% zWpWt+B-Q2%DDYJ4No`zk-$F3_os;i183-uv^rr12cYKSUBzZdt=T;_IlZoH6eK{e5}07!ZkJ6GeZO~d1Tr3KS_XncVW}T`sBGvP= zed#5Jivo`Mdx7b6m|~^rJHoS*Mt)6GTLsvSbMk(?krmsF@MXO-H5?sWG_~MD0hwTM zZ`^iw_@3c#fL%MJQjkQDq<}4w$DKwp!j1RK#@R*x`Y&=RIE8n9tMj6{LLdeb#ceB# z{wN@DewtU(QB>WpV%c+aTNJ%^_}dv2_~1Jcc@j)dl9$c$O0U2zbo6Wf)&iQ6ugZer zt7A(%4!$pzD$l%MnA;`f06M#=Oxvc%s@(GGtS@QWXsrp?0ryjU_#?T`?=A^c3mX4P z#M7#F3ZrT8-u6K%v5TCxWs^$Z+CpgVaB;gjLCR5Ny z$z$%7Pv@bDpTIp1N}hP57f#1vov15PBCdJHy>5cZH*G3FdxN7YZ}KRRzIWwx=LEBY zjA1ZsN)+Qn|M8cC$EIww>hQSRyDcu-ZO6Zl-l_L`)exu*4qo1$_(*4y>4zCl?Q9Yf z*UcJ#z zp-)9Wq+C%<@oS*#{jHHDaE2D)47c`)4|M05S-1Grymq0TvA%7bAM2y{D@5g#356Ao zySaTo9ATk8mn>vOX+KZ2oFa3$?+bTC=9fz<-3z{g>W!XVW7dJp#H3 zJFYYyPOA!29HmiiLGJ9g=uH4?ll~Vs-M5Oy75^beUs1v?>{X|6V?no8p-qng3~UB;tP=>ACsOLm%nEpP{wL|LnPzlo9vhUdqzO)-6rgvNKs+ zeI+Mr;q)vk|FG;O!Fn21!TS!``9!-9~rtj~tp)EmF?~zPN@= z7j|SO%Dzw&5xtV#9JisKHTnJ~B!_ZhLQJ;OdlT^noc9tnB);@Jro+Q0=?AOPeWA*H z%G|rJBxc+#Eg!NP?x78mC(Y%NF}n$lXdaAE9mchI05w3$ziCo+1;#dYQc%+bKN7h@aYv zNGW9Yx1@jeXJ61&B!Ld75i`;jJ|BoUrJdnIeBz6g&9zhxoNXr5b!`JFFKOE4sT~VE zhF2AYFiHZidr`?WK~Bb`Y{|-YPIKH+kE`}?m)YbwAC`%lZHt*fW}~SZ2NS4)NNmJO zH9M!wO!K$rjy}5VWoL^b4B4MR-Yq-4P*by%t5}JRtndS?nKFp4wf51WKuowvE$gwC8QS_4;0zu#d8?a2yKT$JV15L z3(tQ247u~TVNY`vOw=!PzsJ{)mwQ4vAF|TUS|pj97zinNh&uZ1l4V=kmPz28*8(YN zZz+hrRL!aIXjI_|&&EWink1s98>t6X`^VWo;8VLZzGTswk%Pbrqw!5i)Cfo(Gg@+4 zlvqwEsLr9sV0H73r-to~+cbJjzjtHK;`n^MqsfUnab!uH%ZO7fQYOA4S!H@Z2sJ%^ zRP8HJAKShYhLS{!%ThN551fdQED=hg%v;#`!eNs2-5pp;;tR?yC6!;T>PnKi#qMe* zP{@?&&D(jRSvshS+EPM&IOTZc&TfC8vM9xh8e=M~d=zQ%DQVqyS>$TzW=w?fxvHlM z7*7`+vW|LD8>InOE)2Wxv7RqN$cm~C04(a8=>1j37`oz+q;()Lv&1%|3iN%?;q1RD z>CS#T7S%BS;UxfkEM|Q*I8>3C`|13+Ic~o^#A~CgA|c`%^lPNkgB*mAYR5fG?Swqo zW@&Xaad>z4gno;ala$jseJ=fAW7V;DV%F&Lp=GDSqM43ZaIdg3O&jIBQ7q#y@FDIQ z$tZvkTk4;Uq(g{T-2hi1TL|S&STvFU?+?KxAZjc=!GoI>?HhJ#NP0YUHf`30q_Ace zjYDam2q~q9?4oP24rzhFh_%*{*c5W#K=WCLZC(_W?cf{PcosN z+kR;fA+4ea6=s~bZLR5O8oTH2yPIo_%03Yi5%_kGx}Pc9w>_1m|!cS zD74wh#~Yt$dlUbGf_+86;S^ou_H4O1Hz6mlff#T|_z{|S@*09%e8SNe{60cd0j=Kz zxMyESjo6%U#Bu^SfWRAU-TwtVdU?#0ewyedk%kq4aX}xbSy|dKFT5p<-_tApc0MRf z#DO68{5DDFk}NCcWA7L=K?swk%2~)(g4mYLCJ?0A?F`Rhvt;Ea@_diZ`r|3ov?BjH zQeS4oF-=k!lHNv|)6%@Xbc3)PgvCz8ogXrs9(N9?Zq>{#S9$J7r;2tkyYC0a!Ru&R zZ7Evj0(U=WvfcZSB#Fc$ky+GDzGiq*TW)LzygfI>c%mOxVd2YEt(_oD&9iq8 zEE3a2<`!fQT101BoNAR9A?p-17tFdoKt+XeNB>6|gjC)#(K1oEo=hRKe8q#jopu#E z>xQq&XhsbKb5J5MGX1ihsI0FlePB6>gG^t~Vn>3MiOr0EEZE8Ha+$HYX*AwBXz_6K}0V zB8WuG#V^H0F4$YxU;Yb*H!!q|t0e(Ea&eq5{0vMLghfHlQ8|*e{UN_2NPoY)iKW=j zFL`DAHz?1;N$JwRX?!~e7Sn{ZOrBost44X{Eq}~Rv+5t{=E_~m zp*m2&u7=h9;eJf0u5td=ca}7);B!F9Aoh~I)8eow`Sf>t$)~sk^`StSr4&i|Lwz2f zr-_h z5{fyn(V942TF0Px(kAHsGxYWf{6Spjb~6VCA(K&&6 z^UnM!aNp++$f+fDlCOhT83^c4$;RGBPKC^|Fk0@n z-j%HvkGNrHQZv6;y>9L-)e0R4omwwue*M#om`Ca|Fhue)K`!m5YHM~;5x6Y&cK^ti zF*&V&xrYS&h%-72i%%l{8%IQIW2&vh%tCWCaW4c&O8G+i2nTT6$|S?zh5bw!=lPQF z@RkY#;ipBY%!EMPj=c7ZpHzg5{aKgl6l{}pWB7!$=rdCQ9Zwv#zx5laqHP^}&vg^0Q1kZ2GT7YF;xvpM z_$762J;&zEnsE60F{=0Wsyr;2m7QNMi0G_qKI=_?eRvkgIgeC%J$lcL2IBH_J;Ro) zYRmEm@)gIEWrp19y;2iMjBLQV65$;3&eCk@mwXa!LN^7C`QiXRM=e|(lVaTxjqqTik|J)WDe%m;LzP;b zUOoGPkYu>mBM6CZj#49|@nnLiqjE7Vju$U-oEGyH znd62WfPGmLh|1I_im7plx+Fy;s_u&*Y+RaTZ9sQliN(iKarA9h0h%PA89@b5LDW`g zuT7&jz&H)bxv?3@7l_ZDi=}@=Sp^c~8!oO?G5Fo6Tba#U9Q3d%!aajKMy0cy1-*>Z z2tS1kfc~dQOULN6h1tbqBk8d;Lzpd0e)V&}i8)i?De-b&mi>OSQZ3*!!({@LSX?8$8)c6^oA<53Hh4+1v~zM_@^6aJ^HWr)*T%=Ne=MbJ}@X{r6`fBDl7UUs`@sV$J_FdkgdbBKZurn*{fpfqN`!+pSM%Y zK9*hBW0WOLpf%{StIM|0W!tuG+qSFAwr$(CZQHh{`~Qn^CYK7&zE!KFvGRmbIfOFVLE)d4x#Ray{_!TurJ0(OgPlHZ zt3u3@=e%OrK1?cIV=*h?K0A0?a@f;bXgj#;#`vKdF`Au1XaW!#V2>yLcT~_82GXzX zWr0+pkv$EDscDRHCweBMt;6dZhv)7}eu}%`f{D#x$Mzw~_xvt^d-Z8|CM7*ZJt`6e z3%J-Dw5NqGNDU1kMMeWuD@Fq|Q4q4~HHuR5ZazWyI9;X%xi?8oQe`=o)W!v=j-izg zUrS#bswV)^*+=-!Chz+!QT$D)XD~QawedAtL-J!{`*!<@eemVksk>r&s9Y^$(k;z9 z$Z;Oa33#m(nUhX zN!*ba#EYTVP@ZMl?nYwqK7&)j?b4s9VU-tmBRH3{w_0+GKl&xw)k#7RX_@$5iWnU< zP@Q>SsI@ZNSmL5rh;XOU-YI?g>;0}sCq7r;>Dt!AYI2+-i*uMFNTGg_Q*coDK4i!I z+`4|ntaMcYx5-_PP^(%$Rj@c1b)+yct0~7m!(UdL%)pyae=M}#7M0W`$F`!d9Bcjb zi?fc|@1HD{nl#Tg$B{cvBS#=o*g+s5Vu}f_03^zgF)IqBHH2$5iIjK$K#t8m3i)V= zU3|&e4PiAdxcvEbD_li%5)Q>e0B0n>QZbherX*!_u(N@MqK4Mng@o688z{^e5uywXvn#f@6kI4BU>rH&MT&?=SvOv)T@ROATRR2WKUSi zY&|`>1k$2OV_lCJyudIz{UByKA)xdFhW1jE&(lm&dscy?3@8lcgiAmK3Fw~xnqeMd%O;yiKGub*Ov+1MJm4pT{2OfoVO*hT z2!VH>jdDZ9enMYdy%NN&s*)Kmq_%MUC>P@CejsHG`CptKv659*@+R_y(%?IuB9ydk zK0(ty&7W)Me^){^-_=|qIBH`mxHot!Y;AP#8Tvxxek=$b%C~Y(Piy71 zq-Z&s6ktEGanAY1pE`;teCsxCISev$Ud2P_8j&EgbN&DtyS7tT#vpUVT(=|=vV4Vu z$VdiZTh{P*;O)bSuvnhSQWOMJ@-wG%k1eGfyC+RWeeio z0idmU=l>H_u%Zi{$%8)3X_BwT>uM=sub_*u5;<(!Q`R$FVqIplAf{oN9cl*mDyCO( z@&iu4zMwDuGS1-dJ04g>*YL@vm>PV$c1rcw-CV|xypZ(fVksz$31WLkG||(nDkbBw`2eg+?P@(tpYLIuXGG;xA_*kqD#4csCi4O~Obj5X=XFlboC0(cIHAF87 zN3s^KS4!J!H?j!fvtJ5GUQ!CbSP+(gyPlaj(rHShWMIc@gLxi`8Fh8{znB=FiXeNL zX1-M!=b4Sg1{2#F(E?d7pcL@j1@6GMU&+XH1 z<+>fYfP*mnL*C!60;tmEQ=*%LC3%bz*(Cnm0FlJ`@x3mS6n@jFW~;cPntW?UcKfDK z!HI8%3oXP4=`FdO^&UJ7HHmqX`(9H`Ha65d0bIi^XUwEX1g>l+Y+_YE9UZ*Nn5!oO ze_BjOOe=6fJvto}{KrYks=n7a4G086Bb0w24_^!?ZraxCgopU{ zLZVDTlFfy(G0C8=N~L07qCUPbS)p9V{bHtoCx!>ViTJgz|6>;WxD{-TON~g{30gYa z#DpBBMsM&LX!_fmnM(5#D-VIyq~ceZ@0$iCNO*SOQxx8}lQL^H1=0?@?Y$P3^K|K` zAES<|9b5T4R>zu#AZK8!e=UrE8C=GEmdpK#ZC8f4o@YGRHQ%On ztxmLet0~+x1`S6EdonP#dJMH8>hcfAQX5%UE(Z4b@iA8~v*q3q9NulfUg(YRaGY(N zutX;D4wu|xDdqY%5?Q~DL_|5p+Lx7M=e`#GmSl(5ln<7a#O8z5Aa9B>2vaX7A$eU# zBslM4eTC78^l33U=-V{}#SP?TDZ8=8kvYAVGlxHs8rrt|M7nWKV- z5ulw@uxMcBrf~TdjUV}iUrouFP!rzWs^yCdh)z0;{A&u?CV$}nK%@HvHkEh2b8EVf z1^+A<;K8hS=ND$n!dtnzBWWYR)gMl<(ft9XoF4RiN+KqnccCD(QGdQF7DOAyhaQn=87bIDa!-<1EwG$ZT1##lripn{H4i!f10xb0`i z6yJkPY&`R+(OxekGT>8#mS-j}nAJcXWQaZ|@ykPZ+4^blQj}Q88 zo>^(m%!wPIBdH#>D7fNV=XLeSLTH#C+apkdkNVs#{!5V?nJFleVmQN8NhT6sGXDTEEIIAJ1S1tj*TQ>9uhS`oYD4; zYXn|AfGa6jVI?LKs21TwAnq-)9UQMqOLX)JiNqR=Pk>gK4WX_2D_HGm6 zk)bfy6OWn5AhIEMu$NeHg^OS*;6o@S08!&=e%=mtF5%x2!sQ;y2izyW`m^R7EAdFu zIgESPLa^*Wh)rR}CLl|KqSK73K#p~-m(}1lDogd=el$GAOnN3>p?OLo=9*|-lTAGB zO*QwcC?X99{I^X?aeRU&}Xa^e0_4amC;PCfOC~+t6FTY|5r>zz=scfH#gGW4@B)=xqlMtiK|**D6BiP|v7@r&2*a10 z(rWkAt*CO`ygW+^Gm|WaJMfU|;dV^^k&_arCDy`0@o=V`mJMpIi z;q0`2u#5gy}#VtL5SdC*?y$?J73BK%(Ssxr-oV6^K6SPAOdyjB_&gJG9!q3CF!ZqXEPCM8Y0vi2YEsWh zZ{iQ;A8o~Ha0ZuE1y(!O!tk}xw$N+b@KDrgi0`L0wH51mfFGjKtSElq6ltS!4mhXu==6spLxWih9 z@SxD{=M}hq^BqeN^veLS=OJN;Y>b>m7ZYlmlSc?*J%5AT0?GcmOo7JRAQrm7k>jlb zt?x}&4WDNZw2=&2*%imjxMd}4-K4C}pGtgh&3)3;_KnYuq%Sc-bdEt|;UAe1bU<+@ z&L@yVaSJ|hH0E*fWn?DIQF2|jCt(F!c#)A$@);v=^ygV(Ca>!#yz;dIk1MLats0r@ z`G!6CL9@;f$vyin6Q?Nev-lR5dEx>*kL%AjI0ryjNjAmFj&EwLO{5vzJ0sXE;@mu| zTE(js)Jzw}WpkDDyy>+_pZe%^UHW|dWXPKCk-1B=Adr?!!@y_8B9&V(Eh9bpCC?N& z=-u8xzY?WKZ_ozrI`G}TD}`W`=wBP$UI{3;_2I`pKrqSZiJ3djoEEL74t9IqKhZ1R zC)8N|!u2R|Me|ZzexvgFYrlQYXm9u)7Qh=ih%C!-$C1(9A{#g2il;X0-uyxOglrv4As+|oM$NxCcrVpgg zXnPFLu@}{aZ9q{M1b`BsXFY;;^7fK=zu<knvDQnf0-7}F$D-_|$(rTUM@-h}ht#|l4I@@GKXZzSQ z^T8ry%EZ=V4(v)=7Jbg{AdHi;-V9Ei7nVKq&zT*4EP|z%V>^|(xgFL0J7N+iiM+WTf1UI73A_$&QVE#sHNhZ#NK_9A z04+~#mgctP^B(bv(&UM3CKFPu_=}%z4^^?Qo5h0IiuJeO@0s#4xbv*}jWu;I@W8A$ zihj#=X?>mYy~PQ*S+)6G-+6S3iM~7W*dCSlalQh=@^!@(Vz?}gC+~&|50vH|+cMPc zJ&Y1dNZjX7@%X8`?T4L!yc00bKFT@KKY(wZ0ueF7?Urlrqqc%g^%(bTJK{B3F6}*a zcJ7JYQNm*njpI~ritwU$?$no*@#?=xe>q42z9z1UL4hgzV3eHN`N?Ygb$^l2`H1N^ z=xVm{vL;$o0Fu3ZTi(~6Z>;-hs!MGu{}5J`G$XQx66{`h1CL!ExVJ@gc#t&r1Z8%) zSsbkzyt~{t76=K)+y}JiT5Taq243VLCGUiNEOi&1Sh|j zC=eVU`x{gWWamh$wA~5(rdy39LZ%}QigzsFksr%}$2j{~p8UET%fH*jfZ)XjZCHRg zu>-bO&kq{^@@03U*Z$JA{h&7Ahkwj5N7kOk+^_*5S z>ZQISU3Zo{TjknzC!CeiFb;E8PUCBJ6?8T+Ya^#nZ<^R#C8~pB9SuxH>A4bmqKNLq zo333lfE@uEHZ`1t#}7B*lZN_RXV!Ea3Fshynfvk)Q&w0%)LKP_kB5S$XUFQ- z^h_yddg$}jp4XCiCQXyfhIDN_9c^uvylV=L1ho4`N^#n+)tWA7h|4R%0!QB2X3aHY z<9!)b`V=8PaIxc9w`26&St;ahQ5;x(9%Jt&#Ox81r;^^jo2d!LYeeu9cjxG+53Ta9 zXH!J4tCUxyOA_>_pZH~LGczYUXHJEbH%RcTA3fl$F%pGo6i0$_#-`#@B#6>%7E5yG zrMylpq3JrQf<0)=i$IE~&2c=fdTan=IDK4rZaw=?=j%=+r?)F7%*w?6WKuxvt1%J$ zS8ntMMUk_IcH}l?*(C0GN~1$|-nNFzoEiGJTOqceQ*a5ZAz0;%hY5(gSwY-D-^3|P z93JzU&9RqT!{7tlxXnFFdUvUzyKVqvpacnh6bQ(NQBk8cUn)GE^!|9aF3)N(Wc-! z^|7})<>8Jz%FCwKJ4Yz?kV3wV1~MWQKrM?Ya$*7T;Fx5f+$UXN235n&V4tNiJ`CQ8vLL~_c$Vk3waFhzf#CHc6LeEquGvP#%?B3h z;|5Ao&4iO34_rmFPL=kU*P!PWi|oECw=n!ogDjrotHKrOOw;{~G~WLfwVy0V$0 zE`rKg8fdJ@M(>LgFEE?xH>?qsxfS*uj|4*nGJ-k6nmXHVtDvoZ+l)KTXjgO`UJ&{$ zC$qOoxk1!wv(G04)X$rot$u?&aaHdxHWN^Srl+T6PKX;1I?c%WbM8Qhbqa$&h`9|$ z+qo4(tVD9lpXaIKj_Z-}8b!4PEEC!t6XEH5G=Dr~j*ab{09<4c9;eJ@COAiuY~hBn zF!r|x*!#fC-An_%2pwI?jf`Z$t5^DR$^lt z#JFSVcN_u-+!+_49@%T*2#hq!HPAFdXH;%dzPHNvl9l;r6K)o*9XKfDi=7nhf%29E zT*1dQj9Xs5>4m{@#mj#2ic2dSgQxAy-*qYA8ug-%1R>K2=A-5e7l{FWVv>#DSbey4LlNq%YVkDru$!-WIgs~LhRjAZ;WO`m$a2ME-?n-bOVhlvaIN9IqgB&$PHY=Hkfh) zZHaH5kq3Ms0i;~|JD{Rdh1%j{U(|wm+38COp z!m^wpk!E6VgfJc5gSSag$=(Tr zu`j?}+__s4Z9qT2qsuD?(6V9Jmgsk}UfRe%)jqi$qB3FKH)mn)lpU}fjz+`e(RD`b zmaz)R?r3Nj?&!$S!T7~Yml`e3l9{n(PkHx=)2YB>;px91M@Tw_C_MnCtF3!GA!TCA zVp*5IV;HD0?}mg!%1lv*zy~4lyamhjgmn7OlZ(whR10_f71~Rh-pRXiXPJKUe?&#e zDTihp0)}wQwJO7r4SXLz4@RA8k8gKCBuHdtiMc{hyo69<4_rd43R3m1M-2vz8;bH; zwj(}hhgba~ERaMK0>gk$)0JV*=0>a)hOx4aGt^5eanb4=&Pz={XCP`sD5YA>!P!Z` z2Z6y8KzYa?4)*(D*tc{5+@q^S$3XCe4I z)XWl}q6X&HkS)j5mb;EuhYfyAcP2Ze??KTb6q^Q0#D}O&{xH~IYqIk)d;sdcktbtt zg1-VehVQ)~%Vd*Fc=8cv_*iUtaiQURtajQTuab!6TZ5#-r`dROcul;v9H;1KpzPLi zB7j(>hvIEwYhjc@EDbt-Yt4Gf1b?E%<|$rvyHZD34}*gq zat$IyF_7B$pNYfcXBMYtqIX z4E1)!^)L{JKY(S*A3-o5U?A3tyvm~(i)NKpg2$J^kR42$O81Xe{dZArvlibP8Vb=OR7SdpfsiKuI z%c}x3BL$(XdSG;ob48K>Youasz7FtxQNU^hA&`?3jMMMHtFApq{b*72l8DL2lx2a$ zxsrINwxYmxR2J7oO8n=Ti9jLdOQXDm`ooo}Ea9BhV#9#Kv+57*g0BlzE2n0K&+oc6 zOVLi&hES1@2qh_z3a4!|G@>|nBL_~vJNFsCaU;oeYd~#q-kDP%MeeB{;^0tB1>Zp-Q;YVu)>}&oCO3a$rWCB| zGfPUj)Igi*JgG%=GVn=O1hDRpewD>avvj7#*Fvy}II5ef?s4pU-m1C5>OxwL_V4Xt zWQ7GB!>gp~yF9Y_mmP*?nbXhH3r>Bgmvv-DWnf-0n^2hdk#YA+y{~QrpZR@fCSJWZH+X=HGu60X(&kP)KX8i2F_VZ>`Md-G}9D4v?rnNVc3&RIgF<~v*{;wY#Prm zcYjrhbG@E}64T>(6arqIj>+)$ND33f7AG{fbj*{<)3E;>2;KgaZHSp-O#Lb#Dl1nU z0~NqqjuR^eXWRAi*?n5?4oyq9=jBf5AkP{Kt}j8&;{((E2{MoQB=X(7X`VT+#hX#L zC8*@9EV(s^XLhc5uo4&JV(soDOzI7vP@Xm-MlCNYa&kA%4jr_yd!~!@W57tM+P~gq zrM^+2$3n}Bopk#k$@F{LsK`5uAeO6~oiz?cZ&WP4KT~#$86vxEQvcu_>rnIMDU$`q zxcpJKuF&`Stx4>zPP8$mW(g5Jqjc^z_pON7yOZ91pncz|=oLv; z+yWA6{Y_&x>_Z(N-Y=o*Ta&5X4;Nlw98XVnRY5oaQ1zIr37j=N9RWAptqX> zx#Aq|I>t1~g#FWhjF!I8IQL!N{akcq!j)`U6@?r%A8R48qkvviV6A@L^Zd|IHmGfp z;$9@o^h4*xY%+@VJ1P%Z&LwKiNsCKCWhWh}M*Q4Lg?kEZu41^6wm-6<**!KJJpV;^ zi8^+SH&0t7Laig4M$hW?;9$|zH%;NQ&8~XFn%3CNi*>g(RI+&?uj*6cuH;^i5a%}gQ0V=d9+%!x|lsiuKJ<0~-b&nS9@%;5OiCHgCx;Mq5&X%}RE zf8)3k^Uf*oQB5>J2jrHgbp_TbL%s%NrKK{N>W@e7ZQcl8dIcJdG^Gqy8Bnrhr?3Vp z3@B|#HTVF1qe=3-#q;a4#3{d&Rgf|>e=x;NH2+IFChRbSV&x|;#{>Qqu+P0+P9Z&?vY(MG6iv6EiJBN`;7m zbikpZLyM-sdWTH!RJ7j6BxtiMl3FY&CK=Et#6`HY<9mZiF&Ec<316yg3=Y0Rw<;>#uU_+E8c1xEG}~3Gh(8pjV08*h)M+F<2|Wwx=MwfpljZ^g4lMM z5lBBIK>?vA4zctR`m`~5UjonaDE`RWetMMaXzBDGzcAHeJ6oZRWx9pC;0CQ^Cy(iY zn@@%8ix`S|dud`Y%*#*6u9eJD-N;3nVuwL9(6-3m?DG;p zh81Qcw9C1wNmi&fFMZbHIWuB^g_Ky?a8N~dRQw#mo8M%acqiKOMgq31_;6%dZnOAO z`x~WQm+S-mcH5V7dhoc0-d9pT8_KDfH&U=;)!77y!xm{^^f{SUNO|V=XP-+}{L$aI z5@$8yMdQ)g&YO|7gBnIZ8T>*mjPx;TVngjRRkYq+{dL38`Hx6K_xF5Z#SmHcnCG=xA z6t^N@yHk$vFtZ45mc!kjyvYT6J|U+|QGFBSYj-&Y-HK+&vn$g;W=4VODutvrOna^_?vIgUGts7y6KmLDtA|N%yg&^HDgM7{zXqL{pAaw zWYur;=&cORE^hgCnv)X_JviRGD5RcgC$7GH(cw#K6}^sZ9m>u5=51ZT9Y})sXc;7+ zY-S`W2&KxS7&&I?V+|aebBqw41K1_|BI8&|eYlaI%XlX`_9&j}V*~v1az&lA<>BYH zj4W5)swuMibUFs1NP7Nxe;kp^tD9Qa9WY)vfB&XP=ZdGnB0?gVyU@wfqqv}21QrJd~!JQBz#Z#p}j zO=p-N7x*JE&;r{`(yWGDG6| zblzXDYAl1gwFiJ2R~AqgIb7*YxX+qW0nIA3`gXQuUm<(qsN2Iy-J?@IXV&vW;MH4` zO|jL+Sq2$Q(z&2weM~tp1gh9<@|fb#e8!*aiW{72Lkpq%Ga-=jvmhmp^U@aHSN&ja zq$Myt{Nv5#_rl!j2!ag^FcQ}pT*JGjvtSzV9EvKN)+X_|OUK8r7dn}zr^CBZcgQF}huest@%-UiRcI!~w3M+uO4fzS9n$NeznnibiJJ{Rj z04}VXaNGQ(RKh4nr_sgxMO9;s*%LmUih7f#6+;xtg95Zi8xF*`texyPb{oN6UC(?c zwmIrbQH+Cy8T}p1FalLa>L^tcx)oYNH}q=UNc&EPKenr0trDz)dhW++zPUJVKU59_ zZ@|e3b*(-Gg)ZnaZEVSf0}7&6)KEk&&`913DxEJ+XcXo*gW-y$t`jy!m8s>3H-BTo2Hs!TbXSX-j|(Hzy<%yUxajrzWj8ZQgr$6jgPL<(gf}K|r)W zMH8~GivpY9^`9v!V)yWnP*~k*w?TsD!fBa$~X6_5$MVSqQ({clQ{|thGbdt z%ZsHV^nDurC$Q5{DIjQx@QR3D<~9*02&sGAn4lGlCUA|{7bT{Xdh=BI-ym5brQCZE zvEZ!ioIbRCA)qWqG+Z1kbWI{!jAepdjZJpUElSd=qx#c5vacOSQEoyN>|HT;gng&) zv^;$a#LkV3#C~;1$Z*s;THE+H0qdNt_uy>rPPLi#evoDAqFp9JoU<7!1>K#@3ZUR8 zErD(!AG07RO}TSrZPT+y?9|wf9!Rwhkr}ntGVXGyUho|2Huxfr4>mg$w_apbUfe?X zS7Upr21P|tV~6`UEd5TpOlLAP8T=|=wg#~|m1b9e5%H8&v&m<8R1&~QXP#1Bg4rst zwvDx041Y}pJ)=}RuY)87u)r`peST*RcW)Qph3qk(9lm|jBoO2BbM&klQp6TNG+}6r zvHfIROJ#GB%<>TKfH<2tnbH=ho)vf4Ug?hCR{M4=)Q`+Oq(`?sHoMioVlmWvS80b< zdxQOy@g890yT1pm2e~_n-&W6D8BMxRg>q3wRM)mYzT3_{`?`V|<#~uz@e^I?`NAtEd zt&{wFailzyx-6gTc!Yz36^m8YC{r)RDPDWZvE;q%Ey$GVG`U)Hn}f_R4H>WM&ylPQb12c-rkQ!h$tv-XUNPb)Y4Tn&+U8N z7kFmxAUKzb%&k~rSA0E<-0o}=Z32e^BGjiVlL#(CHi3=KZD>FjHX7cNOg-|#c9@;p z>KxR~4h$DTl^wpYLxr^u(r@WV#c_9^V%xOsHw30RcuIaOcwyGXyrqN!sw9AN)CK7hD-Isl{ zYrylvX&sg&=PiN-hn85yLC^hCHwb&|^D`13&gm0$@HYBL@grqW+Dlf8!&CRl4vkA= znk1BZDqwu{%GZIG**%kciD1l>WI%07G70SL0g7kmxR^(?yPI&N4eRe(gIGtr9pg)F zpW?&XO01%ZThGD2>jW3q>mB`sbtKaQ?-N;=*O$-6q`%#UOBOX4I)P2&WH49EmFGYC zRZ*;rldCeGaQ^tUrFZV~+b6yP=0KqKa%=v*GOl-6Xr^W$m%$g^3o=f1jJ9*=G_r!hg9 z+^%*(h3b6uW=XX&p`BD9XHl-1S`#sLousS~t4X@0!}62*P52`RWOw=6z=yOXzT?-l zoM28ewQ}0UWw+jEgIc-JV)O_1)$;*&VvH?KSTFD-quIBgDJukz4bisEbZ;%$< zc9{U+iNU!(cDZVLf1v;{O0Pu{TT{C!Bvm1S;i)MR#TH=<&zZ>KrmDB*dH zU!jFSYYcyc@DO+~NkoXtwJgFO$b>#5LFm4}jD0l6uXcYOPKfU(;c`2dq-$H$L?ty+ z=%#YFyHGV~#RqDdxDu(VHCxh;lclEl_me&I7U ziT!s4%(%!Fs|zjG`RzM&?5r49Ph7MvGv~EI8)B2JFKX<}F0#tuL7q|AaFEP&i6xVZ z3^NV)hc&u9ollE-jdLt6?qVhbz=+GX#iudcag97Dt&ggVMLp;eywV;IH27<_i#irx zGAT2i$}WKnZ3z5m(}9wYyiO!v7KzSz)~-JS$vM!dZ^EaA)O@@EBo%mA0C|I51Ue+| zx#z=&N8F}IXNwv-jM%<^w1v+7sXG~iL8>}##dg`4y??xz;}c^!-=c)e;uFL}V`T(Z z%lFKDD((Ge2;ua=y9dlGFaycYa{cHvl_=`f*Rf84Ko4e_@NjWyi^9^K>ltZ0WncW; zeM{08^MO69_N#8?RgijX{ZUAj?#YPi2_2#m!|Da`mC!hV%$nMiR^azmu7CQhqK*zt>eLK!r zQ^Py(Sm(7iftA?cAj_&l25JOU4;Ui62N6bSggh+tpVE?!=a1pslK08T1{G29Lgm^i za1kfQrH{Z+LWaRN&qj_Zl+)}IH=*>`h}b7Z^x4Wd)~`en&Rc z?pIYULkEyDXlFC}vIRcBDg;P-ntM8o1?DQnn_yOoh?-mBhaj%_SYH(*Op2&JeE=I} zkDr}RskPAFFdrUv5!QYb$y0aF+E14{9+qfD#NEUKXJEfnbW)!31;Ib`DwD03S#vWm z%|(V0#0;K2rGwIQHDA5~KUYK_1tHrkqN(DwO)8z#*PgvOO)?qqW@-b`$5qsRR|jUqN_Hq7 zyUv(tr?rI>EI2Q$mFF!Vfts-kL8X6is)P1Sv!_u?Gpwf>%NO8lOC}Z>Q1DB?Dfrx3 z3L#{uz%SFU4APue{|K%v)3=0rKkc~yTEuD4Jwu?uqpm0&*sZFNFmH8mZXd%BhHHzT zX?;RE-Mi>>FB?~qzl!Oljkjdi2^~RH4Evy!7F?NpsVwP#%lYOKcvO7L+W z(<#sE!8;ic_k1<3p?F}0-!gi4yW+;_7=Nc#`Of&R0En|DQsK(xYR_qppq*Iz0;pkZ z`2H0EuIU8XLwHdCUUt;!ZBtIXpf3YZU-{GaB5#&a4fErBJ0T;Z_H%Yd5rnz^rcQzF zEvF7U%iY}5pnRJXg4-^GTgs=Fucj`uLmPo%qJP6(hoj7x&B`_oQ-rD-B62LX7xg~; z)W$oDXR2$z$ZW^n850s*f#cl3VY;5{;E1Ic)aL1*1-1ST$c4+CQg=Ln@e<`?OFL?g z@f5qhG(4ZAKS}Bp6z8(BNQgn29AQ&eV?|zNM zOG){=X3M7ttu6N502Vfrjns~{lE|+hVX^+1Q>%e}@;!TRDv9Z(E&8Cq-T%rfS9j1y zZpW0=V`31g-H}*!jA>l zP{e2G8Wi|M*x8-Mcro4@&~OdT#LKMplGTqJL)F$g{V?9>;{dy5PsaHHiw#Uh)T=Rk zN(@PD`@O*6fwPrv8>WOAf72lIJWrc7$}FYjG-M|EqXN>i zqnI0sCzwwGHIG*NnWe6ZM7FNDau{(=P1s|Ir(mBh+T8y z0MmLUUiU*z($MGDb18ytmZ4Nkb2UmrBeMnPjydG~``RGcD(UiNFRipu35cU@gC>wKETy&? z_7qZ%_QWo|N7E#VhlOnxtijEu*|p4g#}eE|Gs~M6wAI7D0?3!o19$qovYhC{`8;y* z>IS){(~_+L42%gUM$oIq8;}y3G0e0x`wHS7aZmYRtagb~A;=Z<{-Zq9^JzYRdA55bb0$byCM))xx5p;#&=$yLuh9%_MJX)m=@Ct=_$*nwfAc6Xv1>tW{{;) zQo^h+6M9P0O$oF2^41N2b+(L~l|++8QWFu2>rcNO4+tn z+Zt%&3rFbQWQxdCgO~u)ovAL79Hkg!6GO%z=(ky)xXev}D@}=0G3h*Q zmTX7;(YBEnopo(w*G4`?g<}IN-nt{v=TuuPF$=BGu5ZHu5#^rV-+mfO-2H$9Z9Wh@ z1#Mf8;a}69l!aYoIZ>#9STyINLY8YSwZMB2#5@)f85v+CMp)|sBncnCe*nu>IYyPI zCh=EDTZpxJPdu7>KJ6s@dfK$j5cQlLLcmB4kke=z%bd4y&9pb@tExuusd47V*EVxv znsS?R;kqr4rGlI@Zm)%E=q;JOL7Aa*b@DYR+(L$g-=$+iIIt8ks*19|@!867pbf^~ zZOv_N;`=Ro0wbHfy~zgQF$AHi?Z>CA81Xl^X!`-LMG}GJpBfs|g;ibj$@87#zcNaD zE4uj**`*53mu1TQvQ|)YDC2=hQI^J*f6aJ$C$LbG-oGVUKS;qC=sLw9y45)@;XD`< z0DMLJL+#+IS5P0Y)x8s7E`=74x}|65WlgD9~GFgQfrw{T#u_q6$1Bb$Zx5-1^u= zVsrkg>#ui}RpbG?uPoh9l3q}k=HIwg5HC-TV=O>YPzI4cI(en6IpAsK=&S{NUrO}t z8WGy14GPqLvcnx9Qi)Pz=g_Zr;s1)p3Dk}$KhFfWL>y7Ih8j|bVrIcDN|clYfh463 z(8D?y*QcH1worBOBn35kVJMsCUaB zQ5Kp~xsXR*gHW$D2rncz$QzL{VIoJ#PLu<^ z2i}Ae3b~%rEw6hPatY3MYs%18WJU`4HDSnF2M>a5e#vPf-8|-gcWOVUa&lV{$m{R*!ro~PEPz`4;p=)#ctVn)>8$pK**HP7m_Gk`a;e(r0N?7sbFfnPs( zYm19P`4-x6VUpE+_pt}jB_@Lg+E8I}_QSpK781=;{S3dcoXyffWskU4C7~JZy$ZeZ zfC`qiVw~BER1$8*CCN>XyD2d6S~OoXeGqd;P~kVMmZ>MdWkX4;qYk#@>!HsbQd^HJ zHz|Ef$tpnAFS*`c_IVX#qe(Q7l4?jaxyG3M7}+^$5iz5Lk(AnQJ7d_>dlz)*GJP9X*=id`%Gcq`F@{5EWlf`71cpAZg9pev*& z10wfs(`60!qt}2P?_TEVPgN&)+#EH&4`htNEM;Mc-GP;Z(zOi&Es4y`j}2bx>DW$c zI4;P{>D}1=K$+!y(?@0IJFPKVCk#AS_T6RRd)3-ke<>-%EL_|wQIdp-gpK<|*rmB^ zYzGvnaDQF*pG|?*2=h;i5nUsKB2`RH32vq*`7+LVmW|UQoV0o#)u|Vo46GYKX~$R_ z(W5>mrcJ@bEWFAusp&mBn!Jj?Xr%BqV<+Fzwhw4#YJMO=hqu^{Rg=Vw&d4(*x8?~J zB~DULP^;xsfUXyM;ZJT$!+2FCPNz+FuP!+qD*7&yns}ZWCqVG{ohd2Tgi7Y)tD@{;7M!h7Z5XX_0vzqC^X` zv^a@N#_E#xKY(J6sajFw7qvo}i8IDc>F)?ZF*5bWMH+2q(y#erwSlc38b68ze#Vwc zxF*@)cEB9Pj^!zJoP+B&*)={YrIS%vrFJNG80Kv2u322Pec1dfyS3 za$5a*^n~b3c*hsRHUp1ja%pB5Gi%Ms&8EJ7xh-N_0q4=OZZDCjn=UO}=i9sS7$0VD z@@)7GsM=MymmcNFS9`W=h$y`XTac#jV5LTBHU;50sf^N8L9U=W7{d4Awt3QXBS6hh zeW{+`O-Np0As)TYGZK-k3+sH>eg!kq{BPRl`FfJ9WH`a@c3Iv|TBiUiwihg~vV0K3 zq;6;F{+T~B%_&{jsCz#q(58%)Ij8M%ef1?TZG@2_qjxuV;=LYN;C6(ZWD?^`J>(8T zFS>2*GmxXBS0Wncb|^B_vn&i!sLEE`XD{Jn`Q1l>7{Mw4z{^+oS4>#V5Z-Y8xnh7MXd# z8dVm(eB(f_NPEOh4N^QBk#RiHHpNkOy*`~gUQ98WxUF}-MF_XAZ;cx`A23WM(u7o* zWRD5yLW39Y(?6<`F&r4|y1^~=PXmkNb`c#o5gZN+w$Zmu8_#4X)4I=F(_SAFU96~G zLI~FBR5(nFLo_12*v~hKzSacSrt89Zi?3D7>SFa0Ms1AV)Ll6f`#VztX;etgpR*~Z zzj*B%X&tb4Xh?8~&DO~)B@LNfz;4XX)4pBaCPn`+L^db#HUwPla(>CY%hJO}M$3)l ztW5YwGcUZENL!=m!}B4qvc<@;-AK54QpL4KTYG*1zPya;z3`byY06qzm8gkTLJJE? z7ug4LOuW@f$|WC*HTUw)`(V%9R3qP9Vu*xpCnW(e z6>{@|HcqFtyl4`HGJ{lGBdo4mRO1ZagDH8RKA3wDThqgdEiYHLLo`qOuk^7!rR<8i zXonLC2!`JO#)T+^_gKuqd%sZ=1N$k^Y8wjeA=oZajS7uk>NMDlEeQ~hYzzMbmn!(; zMTq1gHgiBT8T#7NU%_et*abkacu9~*mfLVvsu9ul%tQ^7hf`JSXH%{dHCKCPkyXJN z)#hK+gLAyi{!TDq4Cy-*dz_Y7A^iD6?e_CWUy+J66mU2}&HIvE-J?)^Ds2ZtSVpa~ z?R}JHt^LW?x>ZwJ24!-&s0JcEZsZH*m77Ju@D#WEY^vqBp*@VqGBDcXH*8z3&D0^X zdrrP3EzfRS5+Hk_9l3J8YND$B@0^b=t7HY>YCqZ*#;)IVb9Et$DARQxS!W8>0zjOM zybl{NCO)twi+!uN_C@@r7Ysa%`#B(?makwNb?GSxZ>@1je4kV?FOB#WzR#&Y)RjN) zkqwiQ@tV_M=gg(OJJ5BZ9~Tj=lt=K(ae56kD7?3ozNKx&SadV=V%;PNz{g!VORF$b z+b1w1w=;KYufQq6?p`f?aCbrd~1!ti&En2qKcobZVro#h`ig?kSns#uRnep6e$kUuX|IR;=S66Zwjt zVy-RBk+{o8^xag4>^rw`dN(w>d4!x;N_}XCz79}B-H$(%$Z=XjLJCosVpd9h zdzi{MTnrZ^Ycyj~kqTK8ZKRbTayS4bNY)$8movEJ3xk9+WHyf!#4Hn3E#(qk;f@wY zI>%a|%SHJ}mG+KJv37Q~9|pWsHUZ&?OagYOUG#4b6TK9g#grn0Sm8(Y@5FQkR;nso zhZm{$Lhggj^5dq_P$&(<1AW~q8E~g8@L!SLL@wFTA1TfWGICv280J-KYf$M85CWoO z_W(8uIBN|x%uQH{$JL20b-|rTI@ueGw{66b7Q6$9E0=uNHHAGof^;dykxKd9NzEb8go8`5>lO!Y2w3v6@! zn|zkbboe8`geKePHohaV+KHBmNkMl6mbr!rW?JX;WiTQu?`oN%D3O2_jCx$rZHl(= zmd1XdDdz5#cowx#hTy-4uL_K$&9%A#2=-BT7=VDG2f;uV(EI=kXgKNrHU{N?8)Ii{ z=WO-Aoe|xZe1iJhnOQzyIwirsosm<1@kPmdEzz@PIT4N@r45K{{avq$Z@mF>@7EY1 z%@$8d6Z*SW_Dy_pKEq+1D!||BwHcTMdy74-U5wxB`4M|Nu#3IjyTLC2j)!J?Nr3QB zNrT9Jvp#vN!le=y>u?d`lM+=^31$3|x?UnOJ6S+PDu(BtM9Pme$E%js2CSF4nCr|w zJ%V8|rvm>t8dpW2Ht04x#bHqjkKYvUHSsj*FpMH!Z98;_=ucoyZ z8rs-RvU_^?hV=uqdArsw66eXEznh}YCe}T`Z*og5eF6&FMna3sv=V-_;p}9Ui)MEQ zmeukqT)K?2&(>SmO|oi4R~BriV%EQ&ZOmycj=k5RLS9NKsTGN5o9i9agn)~jyl4j> z=c_oHi(A>(=+)_mnOei-%guZ|38`}Lu-s$>fR!Ir{^V_nf_MK4-CW~3V(MF5$tdC(5>{X4UF`uO`L5Eoy=`* zs2z=+obCSa@=eFo>6l$C15TQK0;of`Y^&OP2u)F_(KojXs&A z8&1|DOqRy1#wJM+9#R&Kl8k5es*wuFuIP*sj(q^n*6GpKX#9pv+}(f<3_gy#F&2V% zO00yk@GF*W9q$sF>=h0lP@Xi;tpVf)s$i_*lz>&S56q;$Zwy_Aj#o=C2|B$!+Ot$- z<-94FWtZ;&2P>hD68pZJi1jUYeqEdoGy-8$4@3}*@M{OJJ7szijH!UL;T9tdhe6+K zC)^8byZQAi?ia#gZzl>m=lCZ+f>?n;q#7n^mXh4&+ntDlT4K#tL{ilF6@k#WM88|? zGKAT=kO8sPEOdRPIRTW{o;KGkE3RDGE38szL(}Kw@}{}wpRJXhWdjCIYtMibH0c*L zJ-sZ?@$hv7&d^VIRo*5lw>mAuqjU!MmA#e+etdgQ@+Ly*lw5;^1l&^ShX!^Zd+?CM z_F*+f5BV3Yc^vJ7h*jh^|ACn+blt!WSxn!yN|yJ-Z**P}?;QS`!x=mh(iAdc5nt>- zOqb=47G>8hfQD;Gw5B-jJM?JY{1y@{+7=y1@U&<3HrD6RvB8NPH z*VD@5`PDlcpI{vEHM~u5XG+X6&gdCLGK7P!Z-oPWsc1mIFBXgEjzr0RZ+Dz!C&{I) zFw+dBM!$0+XHF#A+pUNa`bFV9VEQrUCu73edOBz2%#d`*wyo%|>1i-r11QQcg{8~) zZ!UHg&W8ARHDY1gabo#3Bgy8dmOQf^g-I)>C!Q(epZ@l>IKkAUR&%~BMd@3t^Ng!7 zj}{0hv^7&%@x!GD0*0;v2Wf}*103c_>G|6n^})3&2a(B>*gWabh;oUU)Tp|iJ-RILk?-4M5=WmHc{ zng!uvE~alEn>?^jPTGz#-pby5yZs``#z70ehmR4YT+zm4T8$wCj|qe{KN9jtcrn;Z zN^hBqbLbCI38%6^;(AmRuu>ExKPy7S!)A%KRrVTB#~LOWEA|`BTMW1+GFBK^i?cX} zH){~H#1T*Iu;(6)^$c{GCCT@O1ES3YLE{JnA;r5jE(Q5A(*z8kUG#e&S$c+l0!#d* zj%h*I%M6yeJ6AOC=`S`f8xV!v70opII`IMtCsZbOtz0$KFn$Eh!Rdgfj8vhE1!ibT`UTX;Z-)(l2sd=t&-cwsg>`(v zRvx}63FLmqC41^pcoE`0+UUi9Ho(4xdxGse+h$hAl+fL}0OcX}iX5a$HRdClEEO3a zaGI6je*oNqB7oCcU}+5!2Dm31wyN=2W7S4Nv2abl53>H)V!(YqX_eSgJt=CIN42jL zPPXE6j^$SZj*|%Z8)3nFpoX;@tBJ@H{Q~9vSMFk*T5$2;4OHem*=8nl?4rQt9UJwi z?;Kr*#(;?R>rIy0CUDFQVFHWsJexxRmger{A1E{>BzNBiMbp1S-J%x;y2hE_2YxF2o+@EJIW63E~1 zfRAG{$i)5CLHV-&Hq6ExhB*aMk z_e^@@gJR({Y5|T9X;TR8K>#2$PYxw!7F^+hZA+92+d1V0Pa5ty-CHqf0}>?i8p(He zbgR6ieK3RHE!Ejk(Npm~erL%m3K71alC3n5?6BL^W9jzk9lmMnt4vf=&OP5jbRAzr zJVVc&KxiPjkgqqsDUS*!6|xHUD47P&aR5?hEM{a+PPEA9jR;Lx5O2M`$%A$?%G`SMrCo zzBxgTJw57HA&5o<;HAynT{fKwO*ABXVu|Cma?Nv)e0xbhezw<9 zFo2v_vtQM2nTEe~maM~O|MdKF=(HsewBxn<0lZ5M!>7IGKGan-L4O+NLb%<9uIcVDj?f~(sGy3F*$?Bra+HE zAM?>sNrss(CjhMNFz*Mz#i9kvyZtO2*_Yn?%!ALT)&|5p6t*ao^&;@4-R5eu)8=<| zq~Wgh0Zc$gI`5O32Bom4d?ZfLZ_Be7l%CnL=B24Fn=&*Eo6@ATp20O6b0J7~p(KPz zMoEH?B8~s6B(?~~ZiOEeUZ+4tDBRcX972G!%4C>|(jH}fBA)HarffW~#OxJg^Jh;GO zyE&9;cpi_>_i`F-4b`(66h@yiyxK9NO&>gKs?-)pq=Blf5`e`klb4m~@AG$kR?5Ll zhQEA$lOB6f)~pWMZDH#5H+mvu1p`z0M2LauQBU~VO}XID6koqs^0@*9hm>Y#OJ?G`tYYX`%ZTBl((-y-C^lU1PMD!E)nX_(A#h9w-|kR zhaZRbgh#C`<@f1Cy@)Fynj~gVrO}g|#gQ93kVhbq3|I+z5YPX?DeZffI)jPE0rB`V zGKcO7D2ojQD4ogN+LFUfJA0_OCY)Il53dBOotU3 zcTTX3Ni3aKWTFO^yD*E%*c>B9kuH5J2Z51_(S1~O#A7zAjg#(4U6wLov9Rqg^n3xq z%5-erb+ZZjS}couL4moO>n3AT(NhpNsH%Udw zdFCE=V6tnc=xG(y`N>-M<(jD*wpSY>L*&r>{915Qwo?~Ayf_W$n@Cy=2MctyF8LTX z?LWsJQ#W?>ra;x}MYZLyYAk(UTX|9bim`)*^QI0ey7=Acg`FV^QMi%R?Re~8sOCq- z(R4?Yn=V&hRvU+Strbcuw=inrUHKXkuu5e7;?*8xzLU6^4dXjB=Y+x}fsNe2lHhcr ziFVs!PTy`nDzHlvEz`wq_c8pHsY>ATE&X$|B)gHhyL{FfibFBal)67vitNtG*X|e@ zpH+!C&SFG`XNZoc=(dj1(Tf(02IzO24`$&FnisWOw7-x%KI7@9c_802>(zcXn6Fj3 zALVhW(u6jOr++t}4Ab|yZ|-zbp_(6fhrY2H$F&3gdU9D&Osgzi<-jIMlE=5ZN26>K zR`N)+eM=R?rH7OBQA?+U?m>BY;Z+HD-#EEdJCDk_#0A!R+@r!znHF(k;X*H(i6*JW zAEEcFbrj!kc z0S-^_X?Oy9g8#YWX#kM+j=zrIyGQ6hXYoJoK0*4QE9v_^-gcu|D5IjICnDnf6i}(n2r%3XcUiTpMV#};6M*eg5|Kk8U zl>RyNcJ3ucfa-T#njOnq^?$D9uk&mF>%5TEY5zGRbA9Xo&8Mnw`On$VM%D@P4yM;q@@~u|%&%MqAfOPl#btR7y z|LgwCXZ*+EpDP8K;bjCE567XQQDTn#=f3_vZ|>jo7&G9^{&WB3yTo$&=PH?(cNhV3 zI#2dDqdx9XMh&t>E7qA~(ZTw~GXN6;$$b8&z7 z;pE>w5Qb6u{OA75rwgC)&s7}EIx+%8W@FK0`Y8hapL`1dAk)2n9lFRG#DDI;e8&aZ z|J(r~=K&+Y@fapeT4^1?Kj%LO0J7Be*HH%qxBTb+%V*7+|IZQIGrceaw7g=_vHm0| z{Qh_A@d^YI`ULC;NJYUF^Vh*x8M_!eP#f9&j}&W~{U?_(+EJMSLjBO_I=|{u|HT=T~PK;D}F&J`_N;N{<3 z9qsgu{&!7LyE`}kI(@-AT}FVlJ|r4mPWRz|ZsPA=Wd3_cdnE5f{&WAWsU3dLKc}p$ zCCCV{`-n&b_%1{I&s9tTfV}^6Jhj*6|GEFxbUdK%pF>8NnPdbAEkUHgOd-Yo=bHb{ zGp6OQb1%-}{?Gllrn=md|D2#DZ#fS@*Z=~1#hlIZzni4lcMy>3Fi<~0Kxh}9f7iH< zR<=%d&Q@0XHs;p)|E`m0OwCRH4dFm}{BMa6)nR+t0CI<57!i++VQBsi5t;!5a*z+} z2k0y9-1&D1xPL=f>l>Px+x-1&xBEZO&!uImhFSo`aaEBA1_c55zW`860|XQR000O8 zB3S`Te@%6~c?<&pV^ISD4*&oFb8K&PZDC_*X>MgMYH(-leFa=p-PZRZq+3M<2??7R zU>HI`S{_n5#VNumm>EFffx*N=5L6T-q`RaMQBhE_sG&hY=@2C(=bITopS<_J@x9;u zeJ|VJ*=O&y*IIk6wd0(l|2kssw8hJC-01<`UqntBy8DALQ@ zs8@Ta7r?yEKTf?#18np^9Lpg9u$OP+u7kkAkP?=jI3kYViSw4w)00qC06`@7nL*)R zSQ>FZKqIItsH!V~BtRf_1vPaAMF3!q00361Ze|5VMNs0pj}!_3BrmLLDr+*9qzx9uiVM7PQS;il_B_-GO9bK!h-KnE70dUcMa?>*d7%7tg z54{E;Lg?*Xzk#p{-lDZ`~@y&qYuCT>l_3aC35U z^KkR=@bGQp;o;dv%Xqe}iSYj`3Mh{Oel{QxNMvG=1Q_`lnD`keJygdyD9;$Qsa9@b zpr>^QnW(ddc?%0G8#@Ol!yg-|5n|eCC~Ht)9S?l<{X9^;l&ht-pMnh7-VoNk!-O=ttQg44x(vRdzJl z_9MSOIA7cBJMhhL@6D78#kZcde40rudEWYY*3RAU;_bB3I`ZHg#K_*mKQubMtiEk% zo*!Ujq*}{Nw~3Wy3z%-gZjb;o)dC;Mty>h&+}K95;E7e^7bR)fNBr4HJ?rgog7UNs z3(Wx5J>aKJR3nmiAPj6(h{*mQCj7kxdw-fh=>)i#=za17+Q5u|hqG2}XP=}m1yBx* zNQk@kM7n(8vFFnGg{X9u<5QzWLRx|T8mlooUp&q}R$NuQ6h{G)x0~#Rl1wN-HR59~ z1&IFsHrLhE58eLj)cQ$Hlhvmp=2Z!?FR@4Kgngl`!vtUWh>xAS<{b!?x zioTG+&n)&@EJxNZj((lYZgzWSk3JO`^a>4gOWBXkPCk|}pf<-xu1OaNWV+3}ddh(G z{mIJ{-BTT%UrdU^Kc{-vSQQReDF@^VsHJKGKV?rP&gIUUL;_%%4O zot`T##dyxF^xe5@~%lqhUL<+z!5rB@$l$79nAilD*PkcaJ<{2;~DlivO^*?z1z|mp=B-EZ4NG%vqece(;u1#NqFi%Y9_5 z^Qr~Ji6x;;*`<0qv33`C^@mh@Er>l-%zTo ze7la{Ws;MRJ~~Zu4xQ0{tEsVCJ*Z$7ntG;dX72pm*|7t4kx!a>hUTtnSHow86Xp)T z!g8Tjn_hA?MxqF*AuFPN##__dUx9o^(?&hv>`SOamrun9J+34N9Iq>?d8gNVc$Y3D zLu4`70{=aEC&@>vFZ=wf8tvF~GjY(_wv2?=BR4)M?rQ$tek;NCn}ba2Ok=;fg?Lbo zBlvT7_pTb9&$q~PR~Wcuatg^R=cEA_aG$tDNpv|df*4Z69;$Cugk>GUO+(Y=@q8WaUQM1D3@K00vT1}7z`=f`D)FRg7Sx6TGNF&6yV7Yv)Id5 zzV}*?80Zy){I19Hr>x3s?JKKce+vDxA@4ZNB+v7BpzUS*tVcsZ*oN; zjP)CK^?*tlf7tCEYJD+nitOJjQWY#x16;~F9u{gPTsqsYGOF@MK~N7n+% zTqEX7iWL~-3hSHmE#3tW1^VZZgIwMo+S`(Ns1NniAED~19j1$y7DUQO@F%5EwB z93K#WoMn%82TIxf*tKqpl1d6-KXVQo=XF;syu+CSoILO{zd3MXMYJT~cJS5N3s1y* zgufrW;`**L^q_pc@Ac&H#___i7q5_hmR*OqptGac<4XQZ4qdpcSM7DAG*VJnb0Jmd z(PYWxz`{#84j-N6;c>piP>q99Jn4b>jOQI5nJDc>x8cS33!|kLR;5$9LOs6@G+qad zKQDlihZGAGy3DlV+>*4y?1Exvg6kI#QGj2<++4aE@c~}BQ$+**sS)xy0kRLHoejkD zw%oOaby2Mz&Q?i7tVS>7A8#p_s;zyhO7g4L?$5sB;^Ja-bw0m!RSA{svEunIh$)TS zCEk)-aVzf4R(B1Npw+7JRosk9;VcD6F?!sv*y^|av`|vk=);y#RM0hK=!AU@$5qX} zWy8+Vt~IkYO%y=oL8bc+@Ube6NtX}4dlwal4;JDNFAmnJY zujzPK01Er+)r+UqB@cF&6r~ZDcAmIjQXSqiI^Hou0gRT1(#|};*7J1Fe0hD^%bj~v z?p^S^G1^>OlWU{2Ke}l@SLNu}gMl%;nU_r}Z}s-Q%^$BxO(O?inT;ipA0-D1JtMqJ z1&ksVC4-|&PCCZ6B{XL}2?lr)KZ7f{E2}5-r9{7PYbN9fF4iEj`ix6S-G;Vd_8lwQ zj)e52S(V{Y$-~FrEyws=Gf$J!dtNpY{8cqYW$!WPnHBO~=|~Hi0M_qi1L+nk4Wm*N z0O?~d)O)$rb;jrAceR8CaCeYS?aOBmn8f#AtkP013{I)0#6N255NE7$^`_exVsY~a(-)&40ph+ZEfh1&2fU>KkJ1gUAfhjiR+E@g z-D}e0!!DDOI;r!~i5yi~>Z~9%HFHICN8X27xm0tJN^=>*rh!owh*_?0jZyQeVQXBQ zk9#sHiD}8h?YjS0Ci| zgb=%Ru~w?TJ^S13+x}+tn42!I?lhnRnM{s&c8+CW;>k-vuf_s=iQ)Qo?fEnCPF1gV zZOMJ!G0T49rYkPBfqe{NSpCQ&<7B%}Jh`ovtVf^JzI?e@s1uBuLLHpFSFdb|@+_!o zE-Y1{}8gyzgy>B#GwMnsCYO>xHXOO*BB%1}=)G0jn%>>09aZuT2OmmVD zH)_*o9JVt1IsD0s?G^Q+A6TNd7BTB+S5ttq^1qDOYs``N-;sOS0G-F#k{p(ye+`<^d8sS=w|f0 zYoUW?B@p$t0kzbUam>^70Q36bKCINv%Gdc;UGnKoY0qYf=mR2iul?P3H1EXjcvNG` z72at1ZKS2%@kZdIM!jJQQ0)Kl^J2o6jyR*S9X3hJIf4O#@WU-_MX$0+83(kgw>#I2 zEDE;I2et%|$UOIbli8nMnZ~aAme@KgXY|Cpa(=K-UDoBBkVIX+;iF5OQ?AEqU)#Tt z=4E~J^-=hHr!KF;X`YU-s@2X$uPY)4rAB)O#^>T8O4}Q!Q&Cr+oo_wdYiN{x zx5ekGp22BN38wC7_iAEZB34_Vd^y%);$a$|#m!{zk|S~~-*>?0ds4b~-fDhx0>Nq5 zoYvWnfkgu`j#;#zT^CR4fX_l?VQ`tdqnqhPQE?uTnU{f@WgADX&E$9C@zYDedbehl|6eH}aAS9z_hW4TuIR`bGY`gd^0XBQrD z^7HfZkWo=m=1kRHccxh9*y!7X72~KmwQyhVl1J&wf(ETMs~~>c(GFYfukPvZ&(%@@ zwL%I239#-S-Txq?eaMjWpnU52hk!_5So)Z@?Q_Z30n?d*yC-Cm5|K%DrSqhe;O?s{WZZ+9hV0?I?X&2U z47djaDs345gxcTT#38&aE(}*BWiTU#PLY(qvQlMmNeWw^%?EnQtNkQ)k)DI z5w*ay6P%O#I_Qm*m#2W%Cz;e6b{cnYz&Sg-avXdn-Rmz7zq5N#`KEU+urv8Wb8J-e zR6`GMlHSg=HViI<0$3Yqf2+Q97UlLiNyacdVMTt0ozgt~y!~ykjOsV8QWqDl$PXgb zO^mEUemBG81fXA<83EqPVW6>--g-#U8kxEWDQUsJMQ~Y)QEPif?@SvgG5%j`9_lNMh941z}MYgya^9M?Ni6 z&#=KJ*zA^KM9JGzhsp0DEwL=idl4E<+0Cca1WSfWU{_rZG=HeX6&8_8>p$Aft1_bf zG_8kJ7wZD^E{UK7lwpWU zd5A_3Uzl0&M7@v@h*@2GIK80EF`~OSGk#H+q=Pf7_`3UZi4(RMv#KXNk?^Qeywm2c zb_&zmG79j?USe60QyfV|7et5+hB9rPfO^ks43`LxCb%B*%YCoC%QQJW;wQ~pIlr}sWKVpG6nbFjkJ9~-sL}9#@T;%2r4- zunG0khsI9rk*Uu*%+Rm%O!Tu$GV5qbBE#jTai1op9QT@`67F*UV{HL`Q>IZZ&Jp!i z({Raw@I}oDxp}2#(h9Cw7sTJWnts{OwCJUau4IiL=pqH^31Z4EtObq>3+c?e^riTV zqqMW()o2006bFW-oO8aP^EEg-vb>?AEMnr+&=jcYirOXxZqq~Cbb1|KcRpi33%y2>+ z@=;#fQr6r7FtW!?{(i#iZlEGGw0_89kaQ3hZ$<_$1@S(J?`Os6+_Gbi#Qrup@)ztc3}@Q8J2#$va!#`e+5*51(_x9r%8|W6`i?wQqm_%R zK=ZBAuKw~OXyr8Di`^I?)wx(imQV2ma~Xjt`r_v4i)+3Dz4q|K=fPb4XR7p9U)E}@ ziTvm%1oI6^63#npfKkH+RmdfXwVGl9LRRKKx$ftt8$-q2w0Qlj;>`;u_Q#)x=bFf1 zInn^{7o@t0cgwOY{M^jz?5hH7wcw(4_0HR|M)1M8eNDVLA(D(cx>hh;dY&>MWM=6ZuMx;vCqV+5BGIQC}N3c zog*4ck<%49btJa0L8Zp@hy6!v`0b9ybYZ87|Mg=Rele*mzh$W6J&XQ^gjlIf@4FXS z@A#Ax5Qq5k_nMJW=fF?Pi=UIJ5J&G=5-;Nz4c-;^XhTy%bKPh}ZAR%Ip&TH(5b=hONM zGhskaAWX+!-N?$0dm!a>Cyk>Cx^64frc}QlTNQ|dUfkP#?A%cYzWp_j|D;f?=g{b% z7j)LpmEqmzT0)H~iS~tyMsd<y?}5t|qMeL%lAD1b;0l z7Ij7FJzqs-d$|1f%vE(*IGNnK;K);?O;@#)b>Lt|YnKA3+wqDXyu-a=+@=OEXN0ft zah4^!QP$H6tyYcIrMjGY9AQxmXHxc5HCZ>FnHTjG;3vz_;AUKx3vxZ{^7mJtQpJuD zYi3sEivFd+RgUY><}%)gz#dT-GPB*>x~wdzN!?lF3Ko7(-QRGiwIBZidD&hQ**OXw zr^+oEz)&{RSrO^%RTDt_vxc*B-N=KH4jv+@Hh0)X)4dLO1hxVOH92A#(7aL(M@ z+!(RM*DMED_a+CuJ6?7ttHv9>B%dEh7Zrf&iZ#^ZcVz970p0>E)T1JoZ&}(O)ziaw zMK(_k!Nhyp7oeuY+qQ%*kX{s6l zlSp;U{GD~}dT^2O=8}1>1Wucch(Up$rbF070~y*1MHA{4BXD_j!N5y&6_ek+yaCAn z-Po$(d#cMEz=@}Lbj+Cl(z`zN7?)*dRiHeqOE3de3FOO!x3gO1bnNo@kfauwD#h({ z{7a!%sC({BR9+O&c;t}V1g4b+@c?HpO+e$#p$G5h+8k2xb>cp46gL_ie3lLk_Qv;O zqT5S>gvp)qM??1&CwV~jR2LXo^=LBpP@7(g(w)JqGw$mvn9%Rj{nmNx%u4SV^3f~S zAw21}QI!ouMjpr|i)*Ykp;j<8dm(WW;NW)p(V6WoA)H(>ZIJaV2TEYNx4~$#woOWw zP`fmS4wcwNUmZcdmhzb(vR#{KT&m=W+nhfnkZgRO_ShS|UztA(u4Qm{Dd_r&Pu?R- z_INR}7I>a@s~*pSKsE@L@Txt~bDZ7yGk(7WOLq1?b}YWGkdVu1xZL#Q?8+1rpuk-I z>rNcg<$1kQZNI=OoSS{rp!8Cb!EDg~C-8~Yqar_!N7b^#1x%2@-7+Ne19r}ev5#g+ zN#4TCLVc0Lcs-C`IB{KznRDPKiCHqu@lUmrs&WD;v5P8=!Q{l?i`c7#Mv=7qE3jrw z#Krg-pW}be;ae-~(R^Zs2Jc(@e~0@RGj2av?0Ok*ex{Et{an0q59%gfiv(J zMkgUCrl0Ab+XnUbL=8kg;!r~gx*hf0h`{+csw#{9CCp;n6npRLXw}^pyDKQ>g##72 z>BzW_T&{xC(ma4(ZU*Icj?vR4@02N67_e_N_*9O79`GkVR_H%)rCZG%+(LE^hJ%K9 z^Z&C$S`ZrJf1EUUF0M>(fNoSS#7Y-H#UwJ;+0(CS2IEHXn#LSoE{*EysVAM(vp)SH zgQ5sPekpJ750IK>6J+N4U1vhZwTO9r_RmL4wdDtSc({_C@R}U=ob^v&Ch^wU$j~di ze{y`#;cE+qLY$|+>TH;tjE;FR@G<|sB^A_rN|^AISYO%Y;)E+8tS%tNrjJ0})Sp9) zv5dJ9H^X2-K6Ph`G(9`A#u#%?k)NC$mtLbt_nG0^vgnjkP09{-u)5Vm?2C5QjF@K@y7uTz|H?F6%RS&ldS5T*)cGp98 z+XzGVtPQH%%bww?JF| zkoYwR_0TpC2bmq$fXrFfG^VT4+KWHmC|#1eu#{=_P+j?0QuYs;N&lo=VxM;TV7SLQ&^#F#DQ!(;%lp6x*091N_XEPr;hT- zDsLqTuV58mUwUr|@Zn{v5NYl=D zzY_RY`opW8FYOB2WpTRS65QPnCud7ecJIbpvsvwPbKir0uW|jZY*C;I$=w2jcf9nP zkEel@a*%Qp>(f1u*(KH38?o5Vn=viY@x45(Ki+`AT?acOfuPeKS0Yl&ekuU7=#6L~ zc6-6^rLhoG=x=~X9b7kWmuY4|Y3~}sds?j1@??3j!$OgGabE6*R zpJm10jnZMCT0TLX=s3h6|5-VP(Z9gZ@kmp8if7V=W$=K}NWWCS^9TW1cXkglp7Io* zd*bdg=6U&$m1RV}7N_4#&sZNO)RjG-z@w@Cz*4ay*o?;SWz`_nD(R;37}qGb&X_k; z;*|N$bnx`IVR&f`zILo<>Si~cSf?Q89j~b#ciSwVurAJ%-<|SFKFIAr@;Asr5|-?a z0qHqy{yf2mfAlA5&Cs(*wj{vzuQR^O+=^9et;>9-Z)c7)@_!Y2dMWF(862Y=RbnW| zWRw;VBreT-GJFgB`Vjgl%OMOz*tJtxs*txXulYP=-@!0#tD7|QyAN9)3z3H1za2T; zN0haYc3-0$?wzq~l~Ss9)^j&>)`_9=rF+9iVNl1R$9iqF?t`J!*Rs!NJIBLuy%AGz zTtBOt(y89h^K-yx9P5vl9}`+m#^otP6)^iiu8#oU{aWRlzCz_LwZ$QHwNZYvl8A%A zaC($)i2YllBs3HGe*BQ-w0oWGE-7eV*wKbcPDg-U8NW24Nwe;O0dlM8iX$hLU5#Bg zKK@z z*_X5H70Mh=^kJ$M->|P_-GMw#Bh=S^nW(iS=SO@O?;buQ-a9_OQUJyJGBur^RqPgt zt2-_o#O=}pSsHxJ9%B2ij!Y6~)@416*~DMgpHrVr}v_RQCvL&sZcwa zw1H(2Iwc9*|H`1v?EZXP(TK3!- z`S35U-Lq!R$7lzEmW1~V>N}y#vjFu|RJ zx~>N8y0N>6Pl$@4R^${VgeBdpHC^!yrWN*6Jj;^d0&WrP;B-K^|GZ}g1n@IeQ@jZlMxubf=SVoSY^)Zga9AOV`4fwu|hedggS3E*<|%}De5 zj${J}b~0PRSpI8s7~Z&cV-@_`7w9HGd*|ja|Bifn10;t@OO6(t=X!3293Yy0W^cArNaoCL8Uz-&`gGI1JeKEsq#*D@P3Vb|-2Fcd|NbUOmXk`mFEygp z*=VBTM9M)50dWCA5dF8=pxl?1I646Z=|7f(YW*@tfE7yqkOEVIz__;DLhL4b!LyFa z3>_|f7W-~@9!ryXS5HluKs*1zVG&1&9~v(R_MQqkMmr7~+N|g)azsm}0v7f5G-4;O zsIn#_??K8=el=tTXLaB&tyo(C;#=hTw+%rM7+g(E*4j#jP@pUr_Ap8m^(RUNi!Hs- zUq&UlPB%}xJn4j-{G3iKwfuOK5s4>LOXmFGUJAM)H<}Kww3G%|DFrlWMHM{_alt?7 zkGQ_DJV7a4b;B!YC{ff4ne+{Of}=+JBB$qGD zc0h}P3LXlcQp_VMJgQ59%wi%+;=B_#iv2A(RF``DjpR!EiC_W&h%RnnCY1Xm1Wu7I zNWrxtf~es<4=LQiQ+*qFyq09`o;Zj+B-o{-7D~$M5kkI|y;#-sGXtRTwqYNdHQczA z(Tk;eO^uKui|L@if+j_F)Qp;>&^t)r!d1hms4HzPSw~SK|IoqjRZvTpje9AvQ+HPr zsTvYR(uqhT6Ia6pS5H<2?+`adJBISYA*eWNs4H(K8ic$HFZ8!g3P~EMX(-8S2_u56 z22tTu3O%C@@Ic6P5s`!Y;iFg4fz;i`51AA$FFX$l@h3h~_9hV|qX_CTiF*qjRK(HS zJwNyIC4$iqszsrU|NA4ZL|9s5SXl)GLS2b8xt;!mhlsa&6U17th%*xq` z|0g7^n7VLUm!mC*f6tRgjT8wQFuBMtxp@~fR}VZw#A@m{rayOTTg$3(z;cWbI$v+! za!r!J6?sbrnBU(@(Sw$-|E4GKlNdSqO02#g%Lz;hzNoOOh5}ZC=%8uRFf^NP8eiCr z5Jt3eFp-EoGW#;Tr=Jq#tHSVaWr!+guC@v3{&p1L51;Z_2oEh_mihh;PbVYPN2HNJ zDzv<`r}TTz3vA5DYJR*x-%Ir2&m~3VFe)4Q&I4EM@SGR9@UXN{Z|{P>BbB`7E@F(P zfxe*m=$=QY&|&X4peu)vL+abZ{atYk22M#`H83c#3C8epP*pvQdTMaFP)Z95t+cW{ z^bc?~70r)M+=}1}RHztLLm%|Ar@9CQFY~U9YwWVUQE*;cJxd-EVu}w)C223OmL5s2}EoO zXlizq-JQiOFIo=;_fSopZ$A-ZGD`B|(8srRRIqAbqGoA3#Ex2OSgAbflTu)ADMBR6 zs{6m{CNGNo$`I5+!jn}kJG#i!)o_x*W=2&~;#v(fQt)s^3jC4Diw0iL8TF{Ys02TZ zyI+9Tx5Hmf6Y}3D^gnk*ev+e)Ob` z0ZG-Q)MW+~SY2o+6%}5asU6R+{1cpCu7aChDJZO`%xe@bx4 z;_uNrr?n;hZ}79=qm5|T_uRj!-b!LQb%%G;pVfeq-+N3cT`+jNM4@V6vig9ng8hyh>j4Cj#j)dIePm?ZfB9rhm`MuR7d!Y_~9o9M4$h#aQgzHkE46uh<$)`0wKTL(O8_cxiEk zyzQ!Z=a~xIo)`4#jxC&RS0IDIxWq}{LhTOmHP3GB z+dLOM#%xNvAUjKhDvNiBvy*-+qY%T-+^*_RcHZ*IVIhrgg6t7>@s}>*ZAfGC>y+ZG z#v`vAeBi9}a8%!c2}Q;LWPPDrDLF|49iim(?I@&}7r|90_hHF{te}C?+64#)C}@4e zQ5Uf_@TJ-C2q-U?}r^sv%g?>*VmR8eB7Mfphe*fWj|W1yg0i}k58me zVK+gT`z`XltW+RA$~@Ki)BFB(P^(}o#j2{GV17pe0&{n)FIelWIQR8I59sS=nD6?0 zy18?%sK_n&?z>M=EK>Ue>s+@7$&4W5{Xi&vqoP{3f_r(g?3;~1pTQ;(=Z5>pjZUuX zT&iNt0#iIJaFbI*gtXlBd$z-QSDxJ)BM4pHsDLShl#u@xk!ywfiVp3jq=S zn9i=9b?Yb&dX!|>+g!T*mFEoXtXEtj1=k&tBh|i^sPfbe7VB(cU3Uyd`#wi{%{C?eDeqMG zMAj@lY3{x1d3Wo`+pHj9m{4J?+=^6rLFQms6 zM+E@9Sk&Cxdtx$FqQkRWtj}`iz;Vv<@T@D}yQ1TkK&AI!`-&wM+es1+n>q1y z{6ROe^P4eOnY^?2YU(!;5IKjAF1oG5yz7x_aceSO7f5y88bx1)sn9b+L9~8%hu-1P zXR>}(%YZ2A?F4v zhoOM$9YBx5B)M$*_|DxCx>Gn$}ddDSLaum?IHhoV<_y?>9i*=d)Gmj+1qVqKfhe*Z?U@@n5j3& z$`oCISjFu*Jajc{=r%Gs;cHJ%5N$N5NRR^-RFDIgT+Xn2n4Z6_?^8R}ff z#{L3}+SU=G{_Q+d{f@k6;ezU^sekm#ewI;*4>|*$lRBQTvcbvleSsq0z1#ZPnZ}We zwICiF!o=PqPqEy+*3RHY+ZMX`sEV_wrp}ypPU1T)G$)Y{Vn8iBv73bBw3uJonI#e< z50c~R_Ixs}t$B>zSrE(l@$vrg!}wE4`lW635hSXa3s1LynX-A_QBCx&s-1d+_dh~Pm-==Tb)~d>z&)| z?ib&Ojppog&8mD})a{Tkl3uNa>k0U!Sny4l470+O&1?BapC8m7@9JvCSnkHy3Ve?u ziog@9L~X)A1pnVf$Yuf{OnhlTOuT+oz#-#j3K@n;o!T#(k<%IP;z?h+paNFEoIE-& z_p~|qj^+HgK~j_fuc+-T>@cCvQ_Wk*0tX}8Le-w*>UXgTRY`8ZS;6)KJ$B;PQX;e9 z#Yw2$2PgE{lCB)RXC1CNyY{axo_!W0vu&##r$1T(WJz`_NWbEQMA+Y|xf%Dp-1lKY z>2z(lqF;uC7%MS=P`W@g!1(>acsvfGZ0(+KSUljc&KjSd?SP{vu9G_3XUe~JWdk)6 zr9YM1RFgZLqj6EiAD1B6=_M;yCgl6FQF0x6UW|#iD#wtPysMchg#P*`KA?XwR7I6B^%+~CwDcP3Eh#x%VOPB!2Shq zahNe&pFmu51}-P+UtrGJ>}nuB*@I4hKcw0BDAV?#Z(eW~cSqyB?qFb4D#G>GYZ{B* zvnNIf14~c_p&-vXVhBXCXn0!+eZf(f(^Kc754CxE#S2#^!>Q~wO!2nS*klt-UZrz> zc$?7~kN&PikBak?nGlGPucNXa06V@_E*Ut6_FJj za~1Yqm};5$kM9h~%DyjunzY@m!r6`DLaRUPmq<;Dq@Q1-rvce0Oh%fK=TauQ`ZiS} zu_^6Gk|I(E@k6@xe8qp8{%zXv!_VbjhrP<}-C)0)6X_n=4XH`x;)ph)=(<~0V*HZV z$Q2By%a8qtRBJ$doK>>2zUP5#k?i9FGDrWo_H!t?+l1n=`??^^UeKNAO*wPW#reWI z2nnqIs=~@GPUqoiPr5E#$3D)zw}LaN_-!;xDc*H~7tr#ldtkmn5;$*p)m-wQM6W=e zw?bvI!(L-MN`P&Tn0-ANwJO=}?FZe%^X6Z%cw~2~HkQ2k}U(`qE-xbM%G5uZ^)C+!T$M2YBb25d zz?+Cv$=&Rz0|sYJ@+VJJJA}vr;d;bp`=DAKA^YdUSV7+mmpXjU5{)-hy_dLC9Pt9H zCd5w9fDq|ykHB8_d~Gr~*>LL6%*6UR;Xu$}tweTC83^AamJE`N8KU;2a^`i| z8({!Xr2U)sZbE_ngfPj<`CTFSC74cCz~D6u@lUOX+XEgROZW^N?4@m`m;(%)s=K6D zI|Bm_??E!4rtMzA3gxo$(T$iT4L3<<>= zhM!s=Ppr~K+CJhTd%JLz{X{4IM}Y|qt6kKTkDCd;YMx2;ZkAh$LtT|Bk`JY+;&7;O zHEQMKF~f=o5=fWHlk4?NP?3Z*%E_zTN89WqO#jD`z5maA`zypuk!C=%sP)3`hwfCL z@(^xh6XEt9OD^uW3b`ujR>Al1;`00?^s!lOpn%D~xd(NXr4cI28|@r^iVvx1eDbca z((HPy%DQ(_6Fy_|3Y7kV15Ve!=6C5|*q}f-q(z$yl#JU!>EhoDP@|8myFu zK8I*HeOOlqtN|!ktx}p`&lI+coCN{+^V;!ryr)lovunO!<>zrg>pEOOg3ghwBxeT| zwM7MSYPX`X=woU_w7ShMuKHX6(n`s~^UlviMy6miA!CcI8;Uri6!b_t9ZpRrgkV)x z51^SQfBY#t$!Q26I|_+nEL~ePuqct&bieO+;|aV)8JA2w8|ARf3L>O=N7fkcLXAh> zXx>l#z0pXQDmKZ4I}$fTbRvGtJ0?4H3~T12&s3>gzsz!vUQCiitP2{kp5I?xjlE>% z&kYYrHXn_&^>M&`Fe4asZBE4|Lks_M5iecpW3+d+bW(Xi`L0G@JHt0;-c*}f5LO~uS@y1{O0bWm902` z?BKC*Mg(fcF~uEyXHpf5tbB7EdV4HSwL{)YIp8dys2IT3X7)tUhVpE0yVBIRneYj` zuc_-!Xpp4vY-s>7r1~m-)^o@SISA4>eznycOIc z1W&9ORP>f}$d->-a(0DBiawCly+f|<)B`uiPu^{*D1hW%o5q{l=Y4`rsJi zHqSVbhL*3pL2pZ$vtZq^tBwrQq)=K_9)I^%vR7s^L5^zb-*Q%FLctaEEB}hK<+L(4 zHcHgm6i|jBP=_H!6iWHp4_3EZu=y~@vi0HS@nkqW7-`i6CK-+?iT(A}OoWBv^sK&x z=MztA_sLtE;T zM$NcL&IHY>R5ap;lqmBMM{|+^tYKYd`0>ODL(cx|ox+I#^uIH59kLoXegE%xgaDAU zFZhWLB{Y>#Dcot6Y)$T%_#&I0$Ft3|wYt`NR?(!Iu}uhwW;JR?#*x+}Hx~*#xo;hK zxG&WDudCK3>lMzQ;RZoS7wSg;s!yaq71gy>Jtrp_L+tV;VL~Bp%U9HU_*-m})i$_+-8pyAvZ+-#QCuj+*qzy3q)G&X;lj#2Ea^_qS_+kfGh?PvG3=O4tGt zj|*e=(YEebRh5Uvs-A?i;NLzQ@%4C0JG5P!%{1bvzYq%17-*0UFi9&Fw%#-eeL{Fl zjseB79?{Sf?iJgC;6*!KpT92mpe{%LFP0tLCeMJXi`^&Se@&h1#xFqkTF;n%KxB(5 z9t2%Gb%)5`uRNUw{5|hH!>)B0J1%RjZRrqmUO+X_riik(m8+$C=-nDY4vN|>*zsj^ z7v-wR%d}8+)+6?&HT>!lN%3)jOC^S*lFOu#+^qE+rOo!LvREda|1wYaz zR_%V^enWsVvP9|U1MvRyZ8^jW*JILkqZj21gItdhVqjND739C_msN^MqxC*u*ObeS zLh-s&<^N=Td(Eo>&f+9h10J&@-WXDCO7RGY(kYs`9M~uuf6}GGFiGA6HxjU;Cv)Ya zY0>Td^ZNKSClj&!e00_TozFtTJex$_sf?Ml%*3 zy6kml`M+SMQF8oLx@bFad}vW)l+{own)jX) zWJOc160*!q1Ej5?;45qQH}ECxH0ZCCW!sY4%+4~Xkb=9w)Ge|y#v{eu@(TjFGIORl zDE?&M9fw2yyntUX@cPuRz%rlj731$po|Ny-$yBvnoDL2~w}~F$0#|}}!8U!qdj=I* z_vEFB`O8WA*WtQ4L#xF6&jKI^Iu)On1L^z3%{I;yr5f zCt}y?Q8DiGQkHzv=wIb;&J4kPzbef~XK;nHBx>0{@`0OzFsE8dS|l4qAM(w{J^d`E(uENsqK zWPYV`r9?_1XTjwEXIh2}Vl_HgT@ zK8K}p!!JM-vg-V$C?NZQ_iH*16TuI>VZ`dT^kG*0zr$B~xW?grryeVGJ^LrTzIvn6 zJz+va(n2-lu~|$~?xP;ZJHq^L@&|fq6%9)}xe6yMm0VGs)fZHYmdxm=y6x)5s%9m< z&Bd-boWPg;zfgJk?_r1cuy*1wn*g>dM&axIP;}VETPfgD$FAivp6{e8&B@Rh1pfmS zm}ieJ9~?HHcaBL@7|#r9C*xLt(J@`qiuJC_JRrK`hl%XvFHL5Zl=3n78s-XEeEiV4 z>h1Bz$E;P=x;04vp`8bj?2n+a^|}b)5Y^pAFr7R0!~=gBsuX2!SkRl!c=hd2Yy!{) zQei-WGa6%8sxP-n~})vWeaXXY&%VI33{Q?V?6m0d_~(;9KZMh z?MEpzALqd8)O#s;2wze*^=}?}LlGO+#$TSG8np^?YJy~&T;|?&iCv0n`Tzc=qJFuO z=+tq=)^yYU|I({r6dr+n#M> zQhu48W!^}#GQX6yogg0ng)OKy-gF@2hkrcrT!Mea>S$LA#3;*zS>jLi=PK-Z*18uX z?7Pmh?%EncbCh82HP^ujEzCIbwQBEsV;+d5aT3bKLHBPj01&aLlXl!eRpNt#O0@l^ znI54S-1HHi;uJgJ6gEzROQ`i<5`Y?UsoG;|~@idP{8)wC(Ezld-KKE2wfBzWT*99=XJNXGx z8(}H%gF)bsPR_B8Mq*(3EN}=qul{<^+m$Js3?zsRj1UH4V>97{m&UmOlM*?73S72z zG$&!2N=KE=p{EAO0qe((-+<=f3|R|ni^r>jnj-{qBnbfZ zIGya59dq#1zpmv$ca!IYy2TvZ+@3R-uWt(8A@}yF*U|~vZA9uv=1MC{{Do{GGd+@{ zIv*-i2(p{>_go3PsRx1A_`S8;lkTOC0bF=cOYV-0_G+5(u zu;Xvq<7Jml&WD}x5Y@ARW3H!c)w9cGX+U)?@ppBUr1^LXbHME9?9cD|HOa!fTb-3H7;wmKLvawM|6)GiM;_0J)*Cb=icD`bw_XgS>dAjec%y z;bjhVanUa4iTFU(fePB_4}vP8#0u2-u5|J}O~Zn4!;#&}!>aIRc2XHH0q?k{m7OFH z493cA@Nq&>e562!>U!44iM1{B7v!ZFp86xKe@PiS7hw)(ohCN#Tj)Tawc+v^I<=Mq z?a%a~U4!F*1Kt!+@6|;(6vo>YeDb;9KS;zxml}UIkEX1gH;thAY^+_18)0N!Ch0{Y zUR^bgX=G1t+TPO-_1}>e=Mi>?2V2Ggh%#fAEK$P1@IO9;CpOCh2Qx#wfL0`3Br|^Y zJ<`Dti3d5>PY-tqd|rKfcjItUUJCfhJsH&04bC~zf8>!@Bp zJvwDFSXfNFu|p}XSnAm7>+CX8bvx_D^TBG-AlnPjPGzVK0yh1cUfW?qu2!ih?+ars)Bp3+xj50Azahhs% zi$KCDjvBG7>zfr(7w_G0X(@8+c)?SnEAd!L;lwkm6ydk+!9@6SOAEISxrR$I?%TNFT_{GuBBg8p@#o9DE`^sSPnS zoA-EE2dot@fQ3*E$^(H?k!(jZRu^y>Mcx{+lF2j^pz!M4=Chj5;7lb$bQ5(PJJ{G; zAj{EEkORd3WfcbdK9ODitZ*d6#Cz09hInzOe?E2=hJ=+T)WuJl{sK(<1JIc7Ao5 zva`Fpb!omcJ%YM-C@_g=B-)$Dbd^<(G?WQ&Mg{i@M{S&)h6r6tq5RLf3BJ|ZxIrqD z64iPV5;i4Pqg8fd#e8YorvaHjd^lG@5#uNalk0;@+B{p`mG@shSiSr$`19u{DBTK^ zC>JT{gDNyq>T}uB?_hz)xKLV>7qVR})YBRkLmZ?ku2|W*YXo~^FC>sE83Ws=JfHcc zmN;uJ9^YM15GeUdM2t+vQnkrgw0K~7lLDeRt`DyoOeT$9*Q9d2gosoCN(&uW-JVjd zZWY1I+#D)L3U+OY{mup#o;@;?FuWmhBjM> zmLE0RI1VT@n46ddY~4mTMzeb?CG18oeak6ADazIBi<`J-icN%Sf75{r{P!(1DNY1( z`McqGN2_%%4sU`90IoacyLJ~jgZ);IuZ68plB43Hhx_(lUxB&7>{$7fCMgpz%2Y1s zKzxqn`(`wBW+z;W44gp+Yqj6JrvqBq1BRq0o~UkUGVEA8;bM*hQ6i(0WJack_yWid z7n9TZ44K=MD+H<+0j*%~ z>O$E0J640sbG3dYro&OMfvP}3vgM=d_EWUQH|mDq;eT;cB~A|3pT4uN-3S|ms6Fon zMN(&mRTf2V*s(dW*wP)L`^bmAl!(JyL?AUWbSW}jwpv+Vc9sdL1JWD~V};`cMhIAx zHQ{-aIv<;%QStM%8?2cG7D@81`(4+n;w)X85?c)p_=qmYZQEk4{NK@#{B_9* zr>T>n6W7GGb?uiHodjCGql>^~ zsYf>FBFh3a_6+rAqyBzVpTrst8WYZg3Hu$nl=sV*OLv=b`T{j^FlBEqUXW;yhpS1A zm-pTKrj}U_p8qK2>KG7s{r}wvqfh+}SoM9GYPaW&#A@Z%i1gU*C@krxpls{OIvGEVrA0% z!D=V%e9k5Bjb!pYU_zi04*=(T(;5mQ(6HMp_zNblTpZ%j+TI-2p%TiMW&4FcNN&|5 zF9qnUhCdH7TGr=^2WtM>pA{3pmJtEIc~mY2DsvTMy?MPHCOJ2(xiB&F=M!VK3 z8!SL$fx$~z!_&ucCRkQo1P3=_J2O&)_hFy+c%U#&MtJVr-st(DA^S54YhV!6_(?mQ zlWcT=#wHVUyL|lP>|d*Zt}HyRY#^(#AM?gm^2PlvO}tY&D#owIuw|YdmFzpV@B1<_ zTT$IOc6xGWNmK2Av%y^p@%W4rolOoZT%n+9PXGT`I$GB zF>e33!OJ7TmD`JRJa8OhO=oLOKOe6+Rya-^-FL_){_Fg@p+CiCfSq%}Y%MI$_#T+K z16{vqTLJRVdKzhxymrbXLiejAVs!jTgC<8+E2u)>^}kdG$hjJP`}1}AlrV7$0yiC! zaJu^3aa89TKD;Qqa;uo{5MDlPm-V^_nZW~z{MOI}Vuml5Ov(mr3}uFydpho^X(Kpp zvns0Fs35Gw%i;_z?eZl01#z`AF)~mP=HWAas>~~6{$Uyg8R9gN{s6CiXXZ$j%~nh{ zb@DDj`BV>oDO>DUqK9F&wFg-)i?d8FpFz}`iC@FZMX(O3@l;sh*>K!z2$0h01wy*; zaY40|;_PI^gGwd|IKzwAjsGpK1geAU4{YCSUAjSkjI8X^^M6pVgp?zjBSAk>Y%FhJ zZ}TzyqWg9d*!b(e7hxT8+N)qm+hffKC$RkBu?j_cRvV5isc?%d)0rm0c!;lP^haL) zo8*0k1iupa-%`9gl9D*I=MZFQjGsvE*>}Fbv7F5mn@b9(ojJ+B?QN9W9OM!A*fm#Tu zL#8K^C!&#aa4zV3L~2gX5CMT$%<&o60Zy?xU@WqX3WRFaJ5d~Je||b+U~v>h?vq&l zShlV^*HlWL>VS?K+cxM;uDL3cmM@Znw+g38uSRjjKqazTX4kGy3I`B+@VnmmXhHbp zb_{^Q8~GQuYf#HBDYx~z2bdCf?L=Y6n(74T`$-!35H7w%ky@IRP|Y8@Z5Sxr&QSD+ zsO@)3HUe%d8fO8bbyGDVBiiqXy;?oOeoI_t=)wqtg@}2~hh$#IH1W*av?ZlWzDWm! zIjlq7b3Kk~uk$Ndctu(I{QmjF`njfv|M@XojZbEZ|0 zf<>totyDZDzXbbWjC@oF$zwXAC#(OZBwn?j{G%l}BC{@vM-J&Ov>+}6`Su1o1Ax@> zrm#fnf3zQ+w;r5Y3y>n_=lGG^Zszm2-a>v}$?7iM|HHM%1CigjW~k3;Z!g zUyRADMT%S1H=z{s$5MEvy}BO&MW;7#-F}zM_t)G4H9J%?i|$i!1Db-ysk4$g&mG%- zcbd}h{7sQf5}j_XBK_+UNB#m%oy7(ItrF>?x?XCd!TtlI#RIz&^Pg`@XPld3qJ-@K zbUgrcIwrWlziVQ;Rdn8K54}MfQ|W4{g@GWoI{UK}l1v4M;?6DpWrx-?28v=mcls#r zJ60>5lX*`Nbk~43Qh&sFMiG}~nWtu3fN=Yu{AvC2Dp?Vm4ivcJuX>Bn z6!ZYd{(A3q%LYCJWygE^8Ti;*MZ79`FD;eL^*v!KID%|WT&QGYu3H|o97Xg|W3j$r zdf7>r6Q9j7a@P1m-zw`z1jdj0hPWwrRl@!EQ<-!gCy>FqPOuucN2LCd3GE_&tRHw% z*s2b(sqF!#Z0SF`kG*IXC^1Mk)@}jSQJtj&(06PtK~BooqRcQjsR1IYbxJD+cyUF>R2npHJp5lWY}Kr|WR7I3GD<(rvIo)}i?I_?`Ie$9oK zyhEc}Mr znd4k6Xs@6-9?wY!J6Y!#wSp8uwX8RUKPA0nzS+)!_}^mMI+S}JU-)}vOxAJMDzW=uCcRtH97*g z(nVd1K~dLb25x=b=li!zTf)st8(y}MLVRr9np%dbGiIao$QXMd0N_W$IGkdi=K)%p z{^XtpSXnQcR0_HPjh;>wh17jQ5KDL-0VmH$>gy1eH-=EBEv`Sk`F2$Z9%`0p+~x9V zu33I&J@Bi1i@n~{;0HiAHkiF{bGAjml+NGkkF?FUDsT^PoPlYA&G9y8X@xUnd}rJ1 ztUd$cMFVm;&bIOs&I&rg;VzyL+xBmchjcg-m>Tzcg53MS1zSdPmBxSE(CmVVSN@yo$#$ z&op~y>9!2Z*shIs+&(MP(^!}3SuQUut3=x9|GZY^kgS;+^2W!x>_D^^J_Au!gt>wdJ9I6O3006#P1WDn8x z%h2|B`t>Odag}cBi+^6)X^*p`Lre>?m?}!*9RP)NBow$@de++pJ?QVx;XSM$==acx z()hv7)Sc#<_Fq+{6?F;+9i-$n@Ukq@+8ItC0D%KAC4~1+c3fhJ{2gU4%6iP=_4>X; zKJf3k_O_JNI@JXYGHP9mNA4Tk1D++b79j3$rC=`XTmGp*hPAOyL?EohS{F~obZnt~ z{_o0xP+~LsNF#vay%a$u{0TuIAd8GUvQ}LEm{BcX9`!>WRgf^3t1`p4GtCR7DX>J6`-BF1{%rIN1RF=LT|IhQX!6eD=XcTy~3@6>=35{7we)Pk{ z)eA+<`2i>IN;ROJMWix77>_6=5n~b)Hm{}ASxMDzkYp)fYKBe6YX2(3aCKuf+#MgJG$bBEXZ&qDnCI7ns(4twmrm5PT zxv%_Z()?!Tn&_=}R@-J}w`!@fF8$Bm8`(A;l`zi9N&z?UwWg-= zT)W!EssR4qJa$g(QP_}Qfhu~Uz5sG*94i{^0wzv%1UmIeLS(Z_P_r*6x6N0{$q4qB zHFH0uYX?l`MuI>1iBU)%d&?*95>0H-SrWg}JxbPwHI8XlWce1&g%xDJoAM~}TU~tD zU>ekgDvENaM@KBn`z|0b6x+9OdsekHmKKKkh@2yvDH;LlJVFbrs)_c^tR9PtYl)dU z{OPKk*w_BQO)@oEcN3nOeG^Q8))E2wCAk(RC&np+M72D zj~CO*>IF$4kM&f;S23j?63gh$i&-RsT}h&N_48R<^rsQpy^V3yrC zkF);pVo#AiG+boShuU`_WRav3HZh`xf;3y^%cD%hN?wU^;BZ>Hvx~>Ri$Xnro?{*X z&iP)nzEx{g*zUe&WW_97SZ?2Ve5dloorhI+{l`&a_2)Y;9_m8cg*U*Se9rF4zhcx9 zskNIM4HpwPSrCc-DekG_`96_k0urTTO6}&3=h#IakqURu|0-Pkv2BkFa}O{MNIa?ptx4lWs3|J=sS_ABojPC(>BUM zUV4-Mk){zE^2vg>hsnO5|7+**=Db+QpV)NcYO!>nf^Xs1Hw}iKDyc31FbRc};VyWqB z;x10N^ZkmV>*0M-rG^T@}YaJ_TLVkIR>9ilZwFdgjX)+K>w95UTQ8j7jjDQp)rYHk`4B8wj$c zn87g084HM1#NEiG?)zZ3{=?2-wF%Sll%Bq6LD3P5qCGHl;EZfXz$;qaL`ZYK;>RYNnC-#ZNRU<>i zyYXtdKPlVvjzDsjO{xGkonr5`ilz7MKWbiy|GCoTbi?WI(b$;4l_-71OT*Nc$JspM zO4C2IfviJ5hWO$%M$?{0uuqdOGhAvg5S912z}pD_G*UwQJ&9lX4*)tER8Y@UYe?Ny zcH92HBLTIO|3UPdQU23&cj!l@411@C_eIk#_v50O{to~kxY>t*RSa#TF#~jtL}mAK z++&yPG&R5WE132toff?6Hd$dmi@mKsz3ca0L#LvD40Y>h{93jqW7;|^=0rGmQG#VAh|y}^);mfX3X6bx$l{31MABuYC^Ru1flgl zrpoY6*4>vs^=@2#>L$q&1S}mN6m-|L4eZtN1@%~pe6Cdi8jei^P#IW)-HV?U|LWD48bHQv>^2G^tpng~8a{e^Zs^vcNP zQ-UTP*ss%3AadIxeA?uYx^FsXhp|@6p~@O|p(NeaG*z8qWn(snC@Wx0>M*PZO{N#1 z?|#MD7ugaSJZ1B`F(T7y%!D|Rs<0uvMTVoNT!)Jn#(8v#pq2kk+$$h=nJ%Z;r5pa& zOIH#rWkv=!!kb$pN7tesAOnGQ<19mB^9j#k-p_Gq>i8wddeuY-@-YxepyU>eh3*d;`OMMoBnOcLJB5Kqk(1z;8KAXqFrBrT< zJ%g7H+2Hx3dU^9Vss;g(m4=ZzdCZX)`tY#Dm)=iqFb^6hL@M3E(wyro0H zm5ZeURJ!=k&LV(uXfdU2yR0fX^>UEeX*7Y|~(G zBYv19wW8||&$M8|Zs49^_V(04I*}jxOS&aW8$AXTk%kkmBj*A`Jo2TVlw6pTdwQ`Y z_RVH)=T(jL9+B5zS+gVD2a6z>wS^KP_Gd>F{!Fm5G;vD%1Gvk#5iN_6P29kspL``z zEzHaT&{%12>IH}(Q>JLXm)&9$I1M{yu&kY=7en4{o#U`4Y7b3W*g%%tJzcYwO=x{6 zaludq`(+e?S9RFIQ(`35OVu}01Q?DK+V5zE*ce%eZ1KC()p?IT@J{4N5&Zi1GC?Ci z902Kv6RPAc8$zgt{Vi$`-Rz5tty6bN5QnE;M-CrHA?EKqw$b`3p8C1Z-wA?hBm-#y zA#xM}ow>4!SFf(HD%6Zr8Q&RapRQ&11C!wV^7V#Id3Xu#0O5U0FCzO^c zm}Y;88g)SuNs;2X<+v>SYb0Y+JU%Uto*qMFPM+g=#nkG`-(^TsIZN z1(FVDXu6trKSIUPsRShFpaLkOa$^kuS&uGI*l0KI9n|6VGWC84X^gWuU=n3%A?1B? zJTKJQujc-u_=RW~ZA%zZUdc+teE&svg5WfU!X|uSRpm6X^t4W|e)C(;U|uF4NR-Q` zmD$$K6CGd6_fNp1pMm7|Z> zu=P?v%|F@3XdsYHbPcS2zwgcY62xJzLi@b0D=w%�f(~TWK}f1G!~rg!N(S`*Td| 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�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

IVk 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

RnZE&>k-Qm+xh1WJ{b+izmps6=qAt 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

lK?SVg- z-pxtN^C^8BY@bF6FjT{iqzfQvEAqO8{jh z3oyOOhvsQiNV7jw<;?~JnEsQ(%*reT+TTfp-vA-S%b3D6tqv48PX!MS=n+9yvN}GJ z4-i2F(2a)Aa9I`HF`7g)9&vD}%#-Uc$vkIRL0=<6gLci~f6wr9Cd@Ff-I zP;jStF}GmTpTWV8Z28Cg0Qb6Kx$^RuNXW~g!9#`3^7Z2%g=SL6DIAb@b z3(X1B`GbQZ=Ioe+s0Njic!zuPo)%FgX91YTA_{W~y{nO|iL9RNX={jTaIs#`b#*45 zIU9?OTD_r|F(fxrOqxG~J$u}dEA4a2z31kO(~$7+7>*44zyXbrjZ}Z5$e5bC5jw6+ zTkV3xmW99F8U6d-hllvMRYG;Ub5mprue3MS3z3)rgE~tceNt8JZ?D=L{kQm>!D9Ie z8JgBw8}WQb;0Vt&h78KgF-N<3s`(EkmRvO|GpTs>cz@E9jAS2%Zd#oUqm9Br_MeR3 z`DlGcblhS;uG#dEUz&G}7ug&XY_s>u$3qA64yjY%-65?qSEWPfxYxT3ey|?Ib#7&~2ElT%a2-Ey-`2O~s z6I*J`>P2N7+}3n@MPyZaw#e`PUTeb<*SgO1VSBC7@DuhE^n0DBl)N>S9vY>bhkkBG zloyGzSXeGkpWk0UGKS%F;@liZ9FMD?9qy)DntGm6W>eNfa$Kb~p(44T8@iFSFqYO4 zTfEsGclJ$~O6c-A?qEu`O;@4J<){|Tv!c({X7v@91;zIGvL~==(H9#Fj?X!OXh$C7 zgd}U5@McWdnl@GC&EeQt-&wa6u*yn{Py08CoLDe?egL4K7ARidY*Eex}C3)3RBZ%&a0wgj@BG^ihF(1Xfs&8J})v4wV5)U z(*Ec;ah-Gx&2TGEhy7D!b+NAFUP2mvGj&-(^GKr!B+p}PetH>Q2UDWr?}nY-uuZ~S zUp)P$JXrWSO24WJ2>R~w-uv8IbR_0QiI1HtXhD19c*FKACb`B+U0rnCZlZU828|4@ ziE#Ar)w)4rxiDvHNoLiIZFQ-+E$q8dPcTGoCN1Nf#Jq*5gNJmK-VlZXeWz%3ZcNpL z?xqfgv1naHPBykO(5SAz#q8z$aecrYS&qrwfXYBmKF9zN za1;FEan~tU)0^k~D_Z-Xi3usW&w@ zwhe|2DzA#9-3I0edT*ZOx9zCtVXg^Ra-JG39x%(b9en$W$|qsPXw9rAVCoM&!E;rO zPC*~6QPZQbOPyO!y_s;f+F12L^)`kTzthl8LG|j^ji=V2BB_&JUL;B65KSvG%Q*T zG-n#)&4tL|gC2LH+W6k*?YSdMthxv6#$lwYKT0mR68pUC4Rw=T_>+uARDFGIBJD5v2&X!{MvX2z$|W;Wbh z+%#)i#LgS;bLekV9mnXW#HRipBWZTW<&o{g?bg5NvYW4`#l}_;i$0579HwvUF8dFf zzNqIWOwf&1;5npLpMFfqzZA1AElN+|ZEt&eB@3zWlK)9%@)lXQa)nI_{9tj89>s{++_`6Vk8SH}>^Kda)r z*vP-~l2D=z6EVYArchGJ$i9#snNN<5FbLV}Dh;ediR};e{`OLP)B84deZR+E-8z}W zaN&jC)ZA5v$O>?%uMLSy@l#BxVgZ*HIXmgCVY4crk%kXi^3O#Og9-g{TQTAI4G`P9 zf+9V|B!=l{mbBrZ916zAxJi~!*%S0LWqFFpq&i0Mp*#^YqHhL|FD+Ux@wWW8D*x*9K|=4* zCbN4T?Jw|k@UV?_a^Ka1!XWmT`(~d)6%Ef`9y6IUYiwdqygeuvfVo|3M~rVdFwFy8 zJmM-(fU3_3l9?)rzZatR^!kh(Hjt^Lni32vWc*@>t%B5JBUOKxpJt0ERD~Yh(<7&9 z@*AnTJVf-Y4^fp1m>%~mForXVCI2a!XS0VpHR z5`2Uvws$p^Ae;8hc35DyCl&!(uwQS)76w%+IDa(bQyL!1ZcE?p$AgU)HKj}~C2sfE zY-vt6ekQ=%`Xi6*nXPB@AN#)V7A>pv6Q~1S+Y>jDTzHbp)h~ zjYaNEx!JO`vNEh%kD!>6vN%GLUPaUBC)(P&ReO!IN!&a8>g>5#FTS+)Ia<~YsfmUj ztL?H@VIB)u*h`yC{@8 z!HyYut|xrx4RCifbj5B`(p7hE=cJQLNt*;hRxvMtj^kNL)uj& z3z;xUx^V z#mlxU9hQjNx0+u{*o048G@E>tT|Oya*u>9MZX3eHdQ+8De1A&hf?}sba4rZ%7X(eu!>jKMBHU0}H*9 zzeQtlV*n6%8?O?*rwKGNrKKgxTTwGz0oG@m!^b0=-`bUiI!A=LXbFA4tPO(#;oT0P z>;xnec6&n5ituGt+TCLFOwvs&ckrpz^J3tA9jbI>*6QAj#k;KqfZI${(6=Q@jFA4_ zLMG2>^#dU6VT8(6NnVelKj6_j4(1#jQ=rw^ZfO}io?pUr4J%1#Tp=4ydti~>Nb4lo zFdTK>yr%EEJJWqQHu>U$3}HEc*}a^aK~>r2I*aF?6L4baH$rxJ%nxA>v+96_Qw@xf z@4k2ryliD63BTGsO~?y2G8RuqYTfe(f(&y*>X}yRnuqv#U3IKS8;lCA?dmSL9ST`D zb6)McfV0{4z(R>R>*nT5Rd35!XJo_*C?iaee*7b6Ykb(`)mV;k@9{%{O^?XsWh{i| zR~(i!O-ou;AwB$ie*90TE7ff$11dBBUnI^i3lZK;vM#HA5nLB0 z)i$hLl;bb7A3d2QGH>*!V0BAU?_NBfxhygu5}F2r3#VIta}W)h{Rg?SrD}QX`U0`B zz@Q!|okc?4Z*|{PGH%i912+6QMpnTSZT7&wiQ#nDPwT@*Dqq?9RZ$P{VD3&MRu7i& z2Qo~>C~b?WdI=T3na8XZ2Np$6Q$d;|(Q8H3CMcgIK~bY)KQgr3{5m{tL_9lmgV+e` zC)smFyJ09(m%v=U#{0aDt+hfC`a8lRXTIBtt8=|p7sTwI5PCCbt0PV~sb#kRl5I<1_1>3S%V+1c63AZ@QpnaIR z!osi}36O(}q5oDIZ|I$meM&sJOcM!;S+$(8-XaR_gu9FM?*$-u%7#) zAu+2I&}+95C7v|_a@}!+Y|*|{?ZHL1uShRq_EtKb^gcwTRUDCPQ>j~8M?yws<7xRu z0g|bdXq)l4^KYWT3ZJI5wk{(hW4-&GJTbRNpebxP+IqFyB3Z_P?~JM5P{Bg!K}?%K_~%eHGwYs*J9G4p-_+&{u`zPxa09hzI$4Ssn6B5Zo> zEK#da%yzGX&g$n*UP*zBNC|L5-M+V&r?0wt%adqk3)1XOhbi*zm_FNy0K28APkbu4 zK5Tv6uTR`=Zv@~or&~v1?6;Hs`gr;ANQdBPP%uGWcWzeN=A0begYIN@4ExEl_7uJ% zKk*-t;YLGkuv#7_))KjSn&10H0I5vs{6~=xs&sGwUP16)Ux%9Lb{g|Ym}94U4GqvL zX&%YO?V!i;RAzl;BWP=qEM}ge(AbZduP8BOlgFbO-K4v?@nTP?E?nntoc-ZM;zpza z-pGV#-Cheszd%kGujn#&lOtNffU8&5_)3{5ySeC zn;Z8g6dqTf+djebJfi}SoVvC1hC61E+YpS*AS$@F!F`FJe?p~ukBn~3gg=YfDH z%89c%L<*oDbYi^A)%N1%5W)LQ%K`>a=btu2^TSo6{>h4Lu&gpkHqJ?ozTA3Nslm`v z!6I}j;YIAk(wCcnKwsPLJ_>kLZlymw=a&2X4I+;sw9?OUgiX2! z$bfG}T`>>S6|#zFvaBT)|Azsx7i}00-da4pI$rw4s>)=_`_4Wd2=Df-uBRt9uS8yD zXjdw!<9E~2lu5Q9$oI>A%~nA0;^AJLa|DakoAwG~t}ctJupA$hv5L-)u+#x4pnkMi z3X&fhSq7+=^NQ#>M7ZDLIuYSV{U@N2pYea9p0fw`fkoHp7#G^eXQ?JrR38#??U7V@ zHy{ri3`4%RZIs&9~P6y!#V=;fmJ_WfZm zO(2(|PD7;We`q72ksU~}EmcX&ino^EB_!V8h6``$L8U0TABx24wxc6mdM~mti$iG= z)b8EIW-c}o#c7>6#noo07wV!N-CQzSP_V{9@q zY=6Q{NFX961{0R}ZcNIuJL`+V?vKVb{pUneM>pN8YkR;cV6VSF&*9|sh`nOM_Z?i^ zo3*))rPDLVD6OS_JKNJh-H98E8BUdGp8^2EfzgAZ6l{y0v}$V+<@MA!iwy>Kz0S%8 z9X@7We>)rxsZ?hn09}SLOg-eH0EzT-Q1u0~%}EVxf}T28oxPu0KsPo`TOzQR0a*!F zQ4{Rxa&uaWB<4-w3x=E8ji31&+$TGb>mbIL0t(e)PBiR4I4dvm6D^ck$j)t}CNJ02nn zLnmL{@6bG-JF^iGu+hK3abQ^4Z~sPI<)eN6Glw*1a@)JkCcyJ;a=1GFX#K^FJ`tK^ z+sl_2xCFf=jWc8NH8+rmlAYdFsoreO`>}-@)beVm9{ID2TSvD?)OXA3BPq0j)*DDw zn(r29yP@6f^fkY+$K?tdm{#js&s`F4xvuZZp7RjeP4CNi(!Hsr=C(#^A``;gj-$71 zTH{BGQrsbEk2t(NtnL>7xM_7^#IbmU4nQ2XAO0{d%GqwWY)?wyAXM||v7PpkOKsP= zJ83n7KQf;Y_g>ue$1!g|+3$oyp$irPJs*7U`*v%$Z{FWsd?(g5L38n81l$ih^`6LK zNjT_3^p{2|$PLf^hJzdUql%2hYCF^8d;a4^|Ka>SvN<(j7;HC%?gk$=Hn`S>V#N>; zgfSxb@4^zOX|t(!4m%R(O%N&vegS5VrVxu^1L+PlOpA9`a{HTJr4c)|v>Z|P`)stgUsOiG+=oJK}#;EXgPkPv_0317b%ngjEl5JTx590rTgu_+R4`~Tq> z0vFJtSr!&w%+c@#&nZ|qM|96<@es?S{b^vAmW}oTe#rtlo8+K;{b1%3Tg`Gmcw`ON zIqIOTGmRV z@$^;a7r2d9GoH-n(P&1bGv&?Egu$>38~S9FN^LDDNCx?#>GSzEczwzcKsCOgf*u*B zhh#VYM`Mj^EVI@9?K|BI#?Ica_?Z?4QYg0QfIA(9pS!)H5iTF?4E@Gtt3MpAi$*Nt zc?K1aR5!em+2->8(0+Zr|GG+Am3p%8`_608#FmF-eI{>UIXAhPjGem~b7kxsLM$8r zWJ${}ii*h4_d5`8&4Kzc%YD4-D;QB5$~fz!uEVg#m|v5WrNYaP?SV zeCB4DLhJExk$q)M;kw-I7yYM_jUVxG5uR9>Kq&7Y!LL{2tN+UlEu77;heS`1K3>UD zHqPeXv?VYUbo6OU!%clO?%J=P{^{iO8Qa+S_`A`pzs}`XS46PqFO`WqqJ}YulW`b& zBz;3qZAeUv6QO7&sVA6dJh%?pVVJiMjXP^%sGXhphJVynI%`plqq8r!JYX|AM{DBeQw9bt6xE1qWW2bRWYkKxxF6(q4EGl z<&egrpln~v4sREcm6+Cvw%x%4JD~}P<+|?Ka`2sWQev)RIvtsrseOF{Xn1nEJ%h4_ z{QBO9el*-}d{Du3E!Ui9f{*Mp z>CkkY(YnlFglJ=@D|cId-~Pt#5f73>f+%)WpR4mX48-g>B^<3|@%R$Qz3d1thK)u+ z)j=P3>1>QmrVtrR`)zKFyCBW;ssQ^{#p?7rJhLsrz=p}D3sehTrQX8eWNjLXoN<4~ zR@N+GdUv^;KuSHc7q6H|0-`ahn#l0d#NWKW5Yd1P$ncgQk0z;dn;ddL^rjVq9T(!1+Se0Fc_};bMg>qPxD8 z)KdwB6_i>jFJ~=y5hM=#h^pUvwjP`v5&@brH76y(50C||4rL9-K{iq?2xO*A12#09 zU-^=)6O~if^37xE8KV*HB z2&$=Hvm&kNhin}a{G0z{vP@LwlEr!T)R5zwzU51pRgaAKeP|;tr}8@js&!QO6=J0+ zsBh*TE!6N#-I9?Ms%XtvFPuY*9!^LZG{}?dzv`v>Ym~~amqEl!lYSF!eyd~=vMSJ& z!C~%JkERBYse=CA(a~}F{ZVlD;wV(z)%o`LizV$h_(?dqsYSX-bYEZJ0Dkvn0nxNT zMP#Gi?#cS{GEBwRsi(C%m~lvepC373WA8KL}6eNS();OqYaoFO@n- z>Gi-d%qYD@pI{i&pvI8*1PzntC!Bi5cQ&9J_D`>REq#-E3%=Eu-;j&tDLXaZK!WjE zNXqKph;T-Ur%0B24`%o+ClV8CY`=Ur5tKb{m(Rl(CwD*T%bLaTw z>U^syqN!wK{x|{x=E*>LH9`()O}69&Db(V+hLxUSg@zsO#*Z%nR(@Dw%cG8=p@r+h7=TWDYRqQf3 zhoCwY8X6khvym;3a9JQJj5p)U?YqmXD@l-@K>AoZ9+3E4e>{bk!tIn{ci8~S~g z(dln}i7}6y;;Qqs&!>vsMeH{D1vb__=rZ3Sp)S?tAC*K8KFGC9?}i;R2z{ZYAkH7-5sfvqpg z8U(F_k>ss6m|en$fWgzBrbZy?4-Fmr87vwg0XgNUO0lJTu;nvKSv$OH$HUZV&T4;J zn&|D)mQ6RxOAXBZbEGphQD=~NQfvm|6!3c!x15hr&+Z45)Ei;GWsVTTzHR5c`pRzm z9iTVgUfpe=#hv?J!Y79r?M6oh8ge{Yb3~o+I}EwrJ3Mw%FPezjQGp(SV(UDK>Q!k~ zoOgi79SqYxxqAaaWl%$9aZcuw?Vz^|hHQP6PYUZh@l$H^nzGk_adnP6(6(ysX4HKS zb!m0}4J5w2b^ZC0oU~lnaO5WQfIH6K7t4>V-a&Cho!CAY6QG3X9BubTPqLo7Ul^p! zpg2;BN~2RuMK|SiFPCgiX4sEqrZ}D@3Ig@NgBp-#_y+|js;2v66j%j++n?|?^#}eU zA|iU1^44>9)z3RZSI^8(51y7-M4R6>pD%)K5xy@R%_36EO~|}TFP?mDSy)vH*gXep z%v8j=+xe)k*W9hL51iAKSabDoi}q#rcbIDJ-)(uj_#^7onbVXCGj#K;w;!LNa8W5P zAPZy-^0t}bA)FvCE-vxLi!g+s{0Y{0snoGX#s1g@VO}sqep@psTisjw%eH54gHmU; zrWU^Y$TXou$%Fs0S@?wGb#ToM%&!+D)tm`Q#e$k_az)Nx=%*}Aj1>6AiI;&Q_fElu z0w@^rU7`UQ931qbca0oE7@CnD#HOeC3@HE~6^gHf0jC&6R-Ds4Ioa+Y8+3#o9MUh~ zdepoThnhWXX!5Q6%6#7y58_yQ#Kru{7vKUz=|zQ#?23?eh^N_XlRl#}-MR5--L{Rt zlMVW(;~hr25V%aqB0UMRJBS9OuW$>U3cQhp@Ux8s0Zaa|YqneYpNY!T5NH~Ua|kl7 zraNjVxwH#=QMV#25(E;A?t>t1f{6 zRZxdSVES%}+P0RWQW1%IA_z42CI)Vw7>7!0(JDr>RO6KIYOmvEA4-q8o+;J$;HUs} z6x0=TR_(`pd(sF8Z5~eA_o^fHaUPYbTB1?8f93pxv(VMbcK@Ml98%;_{pBR^Yv&sR zU~?91($ryZ_g^D^&OeA>_~pTXDJcNpsrjGIMpHd|M;*QYMEszb7Jd-F?!QTKrup$$ z5+tdwQ#{6zwUNxfHALQ*ComF>NEwZOa=hiV;_F1#$TfuHWaDT27o-G!7{9sB-~VpX zOV|H?raMf3`**Raz804SA}6F5Q7hkfOL zt^IG5{-%xjQ>(ZDdtF1Ln`A1Efbxb zgs0|98ICN5j8-7yW-gf z)VI-iP3#!^RYb`ipqqqN2E7R5E^&+BzEs8WZ{I84OdOlnl>G-0Ct;{x^f{#qNyntl;iIa8MmUdTc`I1Veu*j6M5?blWGKs3G z4?C!$!`xk2M}{ZK?!LnK>7Zha-9*_?hAJ9IcOmmJISb8Ln^Y$Di8V;@Ub5n(>A@&U znQYgg(M}=#AnXp=g)NbGE|S~K!FqSF)aH+ItHDhBiL$#o?0jBvz*sM019aX~gBX^v z+-w)rl1U8bcB=F6UUYT7a`RTHVa6g(<;uB~WHp!C91!_^r(S(lhoE_D@M$yR-g)`=r5b=T3+E^*gnX`mpK`vOmGo8``M7OR1S$ z63%EIP2UysP)(=x*H@`phmk~iI=>xBC`s(KPTIiQG>nHfd~r41ZFl*ZwPs!wjopnc ziu@(I$EA)>6f82Ej?`OpGuLEBzY&uU<5TNCf)dh@-xGUBwNft)M@$#s_84$_w``BW5ZVwNveG?H;JgsY0m6(F+4N zvLX{7^}wkF2d84WVk0IVIC7l}RwlmdY(#7X z&I%iIOPe+#mwM)^TpXJH`=|POt{K3o$mWgi$SlU0WU4ZSTZ6Yp3QGc%CVe<(mNc1* zGJW9$Zev^qP!<)UH|t+E1{#IuUvg+Kpqbx??Ud~|>Q{?f zD|0KA=*?d|mgMCv=e>zkkN?gHKODRnNB)ddiZ_P1M>T1Cpf1Dy2v5hHqE?>#Pg&7b zY~?fJuhr|6R)s$JZgR@k*;W(NQkg)T%b{retpK1%x z7Q3j7?`pL4M<{I8e5|XKo5kR8oJXO+;S0Gn8ilOPU-YjWxBnR0F!s|Nz9n~|z9;xk z3Mn6%7q4wO8#4tg2OHWd+l8tARM2#o`TR?7vo^uLWUZ7tGMzEyjzw(a3+JY1nD}kE z7?{h-ufaqkiW!%#R(+56ka8jQhauGrsgv47CJ(Rlp@@3a=~$C||w-j#)_RUQ5lj zhh~?G!7;JKu9f`m(IFjcBU5^!IZ40jCV)m$t z0>v-!g7pxnt~VXdQ+WStiE4#UnxLQ*&(iNj7knW9@bpRl&XQ(qzA}hblU<+fZrPPO zxt7XmKj|Vv$abA`;Z*(MwVJSjPy;;wU^4Z`>FRv!s8+2CFWG{~CU&n*K6&9`W2}3& zBgXaQaCbJ#>~J3MnwAaGdOuvYn3sBTi*GF762>yPaXO>nw`Y(f%VFOYuvWImlNxu` zZ7X5nuYik=z9sF}+RHIFifVLdnwqIh4V{LKYc&HIh|RSr!RtPSg%U<$m*Xi@<*4je zjeKbdzT!2StEllXYKW=Ku`+V~CAW>+6YsTfF)d~i8pbcP4-}n22&rR~b>)n6OjoNd zn4#qpCUhIx98}zP$yV9Eu@-F&1Kk79jn{wooF)R-nIXry?>3(29*h1G+WTKWBH}Vb z+Z6Xt`TB^&h)wPoj|#%`+zHkB z3yjU0gP_C2ve#r0dF?l16sT~TZu~OOyg|la7bkd$HrN@(V%BRNtZeVK7n`r?i>qfl z;PVAtzatEb3v!jN%4ycN^Ojh-Y+&7OR=IRe5u*3dS{k-rIf_d?);Cq1bvCyW11K~E ze^OkRSn;VLuk;t1tYr7PI!dTqJ%>FVWs>>B_%F}8e))HG98I16aDEBW3Cpis=v>8- z16z&Nlst+Vi5d-S4rh zy_zyGytSY7pH7d)?#A4bs~~h|Ep#d|&RX}j_o~0{RMX?VhS6SZIP$Y>rs3E&r!c}Z zaj`imx#@Gixj`aK!2tnEI3{hr)+Q3hwqCIa3FlJ+;4e3TIC2pnuF%~o|92cIDye7T3qAKpv@zQEPT(~RGdCD89wzAL=V#oP>hI+k*gWyy zNTGec7%&2Cz`gJfsC+<>I$cY{1lfBjwJ$Kda56o+Z+*hogf3U4ez`@YFkk<^Qj_7Y z8Ap=8Wv&9%KtTxbLPhd=@KY`>yshtVF_%ZtQ*6*aHb!0G4r=*C(X!h|V|p33C+<*9 zqtL^jPtylpc6nUBZP6r$Ovr2!vY$gh88HdQ(+`Oa?}B(9T6lnl`wcvcN{&O=lmW*O zEOOJL*pCr0M3M}tN5lT0n!F}7%js`+|GZwmg!03bQ4y;QAn4h;@`eUcZan5)Z&i)^ zA}H^OWI;iLPa;JU?0#&t5qyZF>xV%S^5gsU>)AoNz(9xS#@@h?CiD#G z(NjUc^wSy0D&ut7nt{r9J9@4$W~gF!TYWChpaK$|HckO0Xz& zoRejYEQuuZO)-2j@|c5Gc-1L**Xjv^d7uUT5rlx(v>Hs}5UwPN)LViO#W7$Ih52^H zzvqcQIym)e$rE|TGyQyRLAih-p!x+6paXi`avmS;guLLn0&eRoeop=gvhma*0&}`cGDm1gHhXz@hfx{L_rsmtMUcBz?WWI+|toxAJe{>!& zALLMMH=^yLtaaXkig&6rtqn3zZrT;-P@h_rT!+x`u6uuq+gr--ZBtKi0)25{Lom)>mrKREwekNkhU{#&>22Rfgw&X+;b;W*R6!!lFe zT@^kH1OPBqW8VPcn*#LeC%7K zVFBFCwvCNpg=^V4xG)z>856G(oq=U=#e%Gaxwg?*axJXYJLaz1AD)r13EM6@r%Qtq zQW1=t1)*ayK|7Jb(TnoW%AE948Lv^W&GY-(NB=#$s9`e3NDqlqA=ESKh0u+vnc4M5 z)>hNjN={{z=)e<6QjmHg#eId(s~6OOKw!$masD0s>j{e!T&6n_S8AF5A1A$S8{Lil zuCh!3F}Ip#P-w}rRS>+9K(z2_x1Ea8Rp9fs_i>^zb@!+VzFAKXq>?tr!`ZF-rthh` z)JeyXIZcJQnY{l0;Ov}&GYP+a{Y4W_JmJKg*v1#znb@{%+qP}n$;7s8+t~TE*Vz6(tdB)xtvhba^4s{dwLaggASkh!(FJ{mf{}=kT4_u`SaH z@TW}sxT&F#Tb13GZ_9(K8`d8Ym9`Krb|Uj4;WqJNVHWOxj$ciZToHJ@oU}~FAKI>) zwiM;o-JbO3pTs{eMYp{{w^8xV)YN=bt~n=@lqGarjPKWXOoCa}keiopR72-pev)4%Q>4n0m83{A*NtOx{I6qQ*7Npq6QE1!Wx59NNsbI1y!Tcas}A3MF?*w+%;)w^>;C=f#5MU&pKH%=6Pl?o<3f{6<8{b9>k~GZuM?)nHD5NIY6~Ww|At?Qo$x zq*sfXt__ne%JDmhv-4B1f0oOnI{(~;n$N(r#{&|YsR9wB28)U&eI_S=KcD0k(|Za-A?k&7dspO;QyE@* zev*h-{@o9lX_=Ivlc;i@NS2D3E+I z?5(Ri*+&u^RC||nBs5Y)vakXk9cYP%^yL?KD4qt{jyC09imqpHZu+h zP)JFpty#6~{CCkw276uP;fvXQd>AURypJ>ULLz83|8=^;RoUQm_wL9vUL(G^vpE+E z__ujK8ShIo0wFs>qUL9cEjFRT+-l%NLOPfC%$Rjoo$i%yK}*U>{2<9>hrpjr*JllG zALk_RhuJM{Rpb6(N~L7Q1r3&(tAuvr_BN8RVL$0O*10|!?Z=dH$RnfI@x#R_-a9Xc z#NU;rRY=MQ(%lqG?gKb3!I{mh`h4UB)oW#x=v7~nuq$$`ER|b2{NIBX6Gp}a^!;r& z>3tDw?#(KYfM~w{s7v1#k~Uk#+BTiU4DO%VohWf7WXqwZVN7L8R!6is;OA2G6Y69zimO_mc`|RU5 zr@r;q-H=Ftqum;)RB2iwiD?asa7dt_LyjO%Jtc|muAn7hT4^R&BqgQE&e(;{zwX@0 zN>k1)Y%4boC+ZV;^OG3gWZ)IWw8F#2sS%o3PT;#zO%$Q24x~F$%&EtzAyIY4#b4k$ zF)e)%6igV}WBB4qbiTaT zH-K@j9Xli+E^nw6D&Hj>tflE`^~|cxi~dPU7b)~l2DLoxuO*Mqfx?!jCMt|@oX2b7osAZv&}7F74k zb*DIfIdg1o-H~lP;Ws5ai_=jMj0|k+q>By;oeycB;Z{XOSs7El_xI2_h8jm1vYp96 z*bP0~1z(&Wh5C7Sbw`&N`3B!*URiF5RMA=`!g5O(0AX5N$absO zc{2S;VAKZ$YaLht)Z@!irs8)fl(9Dg0$ZdNm=p3)@*?_lrsL+;En@SCTWwp9mUkEYCat zq?1#sC=7SHY{!vPhQuh|><6=}0uX`EGKI8V%1@45Y)-v)ugXn3L2T*^0eQJJ2V zt1)jnpv}%{l{pPTCtr|@b(esokx$TPXDs8Yfz5cpZ!WE~5#sUje0yA4Sa1#+Ik3ay z@z~$)?Uzm-lbnxO_&0gg9lAcU?zJRiw2)2iM5MJ{0U78|8yy)*Vr)P5Xl#*DUPW{C zoW(;i%FT8jRAnaCcT5?f&*7wPJFy>(dlDPB+xhpi`*Y!F&Y6}zEue>QS;DI8%%N3kE)k2+4B0uOh_|s zfq-}laUPl9F(K z`Mkb(Z*62U*{b}?1_20Z*O&_ajT(+HcL}7%xCKgMwwkS61e$3L#?t>Dj&L>iaP>C zWo5Z`+5pS1OwmQ9d_FcPX;5Z}X)TtIumLth2dq|_USTj~1Y*4)=&$>mh^ura$17yZ zN(yw!p+0QBs|oYR1iu$`VRySP);~R+Om9>XeuMfmRa|i!?5E7|A)1~v?GT;8EvF(B zDnpnB8Px8;&Hida5&`6zoHZBoxLoN$ra_Ouoc^4b?j)E7;6QP(kQD)W55NpSdoW)du^PeWZ$ENVN(h~=ccq5XdGmG?0bgLV-11y3YZ)ay z`UNnM{FmZ_rQP&ZQT=hzI!N^Hfn`>s>tso$+;!)<80usi7X3lO1w6NkD$$Am=IU7H z)Km$9;o;#6c&gX_u>Sr~^&t21ax%+qPwNp8xug!{V1|KE^6ovhBGFh62i_A%z`E7C zuYJlkmYnRMCEBS}r!#7~Eo9|=D+}-|)(y`kbAcg**>~4*f#C*yQ;jd|ERR*xk>xSu zD^OfdfjCT*BWf3IiPm{|*2eHlI!+c=qR$&+MImNm^qK^iKa%hVf#|CX;yGD}c-mjn zbG$8d13xl#0G&+pn9I-M!HkT-sZIXiu%vIPN#27Sq#`~n3}9F^<{>oTtx8v2%>u5V%=9xJw}q=96CE1O$W+MaNEAHJr}W4rXUv2eB*t_t-2)6z z85Ss6>!55OOs&zcXUfu7M-3gPAw8C%*c#15L@7vG8WeoLL>y;8KOG{WTbhLT#e6eR z;OE363B6)Ky4W8)><03h^l(OrfD=(#PXC*Ju=Vs=PQN;fhucRIxd|05i*mJq)RBxp zZ@7epmwh++sj#?Es5jk!<5-QjL$%i0dVR5Pq$+KW{|v!1&`1Eg4<~uBtuK*X#3=(U z4VzG+WvQj{dAViMeq%@MOjrB$PlZkP;FG~>wJ81+lu$P*2(wjZJI+?zB_0?FU|9Qg zv7YQ3!jP453kx&qJ6*#Qm%8}n03J_?r)sN`>iZnU>Wo71bH3e{U!(%4U@Qv3Qu*=P zHIc0dn{Xnk7=wR(Ua)3YER_$t&tu|o0ptrdTWPnjCLtLb>bleT!Z^3(L&2~Z%2o(I z+WZ)kl@(tMi?wW&Eg=$A>^AU{rgCBj(P_cKbKkAUb$#u_s((*Wf^->~Lch)IY79r` znRC(WhW$ae9JE1`zg3h|$Z zeG(VTCjo%Ea~F{__RAeIgPl>&2V%-_G6(jOQyYMT%Z*>E+8!=Cz+kzi5K{_ayq@#- zJGi0PB>^uS=DE2&|5IbO=cmQNXTKE&uq@1o|Fg0?i{o4`st7TrqM^dQzl*_j(SJEo zTS{@m7%CDRa$2TeA$3K;x-HdQRMgQpuW3Pkr#I7#8k78~hm;Q3AGZvm;Qdwtv0XSQ zl#e!Ww`h#%Bb5^zW+`2Q@SX%`9<35z(o8s7^iW?O|CgA28rtzk(5j8ugm`!$G!o@( zOsWe~A!IYrx>T=OawV==UDyvWT%F$DK0oKpxQt9mgX^}wVxUgMn>jgd_S@xv`VZ6Z zMgD>>(zkW3OXbNhOCyf&kmEcZ`Fv;=G-OGW-Fdx{j>Nv?C%kVwhaQC0*KMVxkdT+y zO_1(yT59g^j)^zF7n_k{)!((Ib<2Cyf1xjFi;PoBDl< zEP211S9s=^PIlG#=!@9nly!7o)E-$#@D5qsN<+&Kn&)m*>o`2fxf1~=8ohU>vbHvY z&P1Iv-p70578}-_<#Fk5n+lh9TcOkCd0Ckmz+7A9S!1V8wbqUIm#5-8*QSf^S#aPK zH;Pb|5+St?5CECyY-V=i@4Y%7LB$zTvlOU0+A8oZYV2q@kFx&Ehk2il5Jxck`FlZb zJ;GftJ^IkI?k;%aPCRVVrDiM;3yk^4V~dUW5T1CmrDpSFg*^1qFTLg-hIJznSNFr3 z@#?GBy=V>w3mYW(*6TSU^~@4#3~lNe&xL%%VXs1jng zrKhM3+ZeL;pEP`Ws2s|nX!p0*m4^UdEG*~+4oxGbP$063sg8~2zkzz*B=>h%$-g-> zz--3C+zNR3&=rPr*3L|RHJsIXY-=?xCt+3yPsMqx5{8@~v-A@IURZVKCG?;=``~(M z*!hh%l=8~lU@eDHsxpR>CzXV9d~^bg4j(lzEllnX#3`alaBriF30v=8eAPSozkPrx z5XR&9LwgWr$nJtu4g0DmIHzhIv=&ZK%MiZ_5t|!wr1B3ZwXv4I^svjQ77(&=6Oha@ z_f1cr&c*o*AXmWkI-_lKrHc?kfIo7`%RZi_Jd6gO6l3z}PJ}x!kw>(+1XW9pI5bc+`hb@s#vsnzbzmq0qUfM zg^MCbQn?&8Z_4k+0LWp>Tx#@_}zwIchtZrt+KdnwtcQ2 zX%tLV;q6k4O~0}nO&9A*c@=yweNTg#ziT;quog4@(`!lpK$MG$X8p(80;3VlCF^b8 zN_LuN4f zVE*pzuEdpxOERn}%drp0z2c0{c0KkbW=0lnrRhU8A}`+Zk8a(?>zym9&(a^n&?P|c zpAtcm8EhABV#|J4T-WX`glFYON1pM)+qS+s^ zz7m`ld>fhw7X8iNs@|W(E(Wt-06u zKWviAUFo9z1B*Xwo`PG?1r`HR7=?&`>DJ+futM^@d2-2X8&fuy{TnsvI&Yp6_sm7h zjApIFL{?S11_PWM2DMyaqDoRzGse$}e{yv%%cynTyP67GWd5VN1ty!zw~G2};2xm= zR+pP&FjS!npafc3Jnzpw4!k9KTZ(~gc3Xa7T7ETpo3K;&3@T&yIsSB9{1>_U)evcb zC^vSz&wYqc{$!6Gu_-ZZTn=AZ`U|I?c-2ZKNCs-;$vfLchA!vJ8?ZV;lZp{0M)-f{ z(OkcIG{R5{FIjQ`!1z0s?mrIU|K`!m{x@>&V(r@@oLL|%)?G_HGS1ByM6VxVcrMWt z8{4#IK{_UBG%6oj*GL!`q8J?_noy@G+CZ?H|Ba*NKIQI~e)DL>zd9#wy1JjDpHi-D z*X`5KIwtQJmt3=t4zPxF+t=hdAy!=L0045fWp(%KE35Z%IXA4YzmlQEgWV%G=bkM9 zd{zmYP!LSWBY;l@Ww@Z7{hjgMvW7Pc&wc0N&E(TX zt~%qjnE;$69${>_#;1@@vY@(AwF0w(1BHv98B8~riVnso9LzN=uA%IlpNf}JCdvU7%8F;)rdxZY7R(ym8aLe_50xMM%mD;MvVu(O0TBRS(K-af>(uCBrwm|dhgyAhv!91Q!%R&x_ z!D>|R!OeTNP}yecEP{Um`9SM2r61U~d42;qTo})NG@1@Tn2-H&FD@!H}_i znUxzF`+ZWtdMwuXtoyVj!V=vcUQ#(^#Y?7pR|Mb0`93gB~Vrcb$5`nR~;NJF)z-^57z>GiaWkt zH()guS_!2Fiqp%nfndm=<@f$x7+2GnvE`V3s&B!AyC z=Lkt)st;G_0B}mR=GJFo;UX{A?yJZgpQ|48G{yvo|7@1q;Q>mjXZXWQqvP0xAUzyp zYTX0!A5s^;{jo+~8s|984tT2QqiSbMtLx?K;tGW(5LD}*2b3r~TZ)i>elTxa!v2(u zZ1>iH5kZnWa+IElVBF&-&eSYd#-S$Cbro_$D|n&f8@GlOa*u9U^<74qP;-Yq_%;Za zL)ULKX2eCF%i(ek)6u#|^3}(fwmko8N*pOt2HY=3+b%ejc+M1F8Z{qG#ZY_)G3i-E z4{sFQ$YO?;v8S>MNKY}Y8G5ul8RdRO1cwUB6V)C5`~9c?6-b=76SwdO1uPZy^g%(5 zY#$c;Fp-LrK&$bCy754<>yJ+&!&k zQA(1nlLo7U@$R#u=UllPRCln8_R-LKU|}S5fm=n?trN1FoX{*&u!48YTEd#enjd$= z8(fsJ-uaPfv4*E8EO}zz1)~pjEAm?Af@kSkje4iL{j@U6*p%J|9#PiRJy%twW5!zk zy#GmTL2*8HXOxi(*C?-KmT5xEdfBl}>yX&f^Sf%w17=H+Wf{D5tB}a!R@zbZA@4ZH zi=Q(4-OMM1#GI8|v*uO3d+a0syHrUBf5vFjAb8Q{`Z&A1eTu!nQHG>556jcyWNV}W zG1>z~=TlDvm<4T^SL-Kf;=Xy^8_v_&rScNw$PjGQFD{yxJFMF_X=$#mQG5H^%H&+* zCEL`s(m*W;RjX>Q1@6=#sk=ScloyM-7ra=W{529!8g^|vl8>D%doxF6M=;4Kj%KQH zAR{oB&dRevuJf|A2r`}JSh+CTO!0z=lFbW4gu#L7p5_i?b%-wcR9u_YE~Z(rNST(_ zlH6`+Z>1WYSG~duZcoEEuNsP6R7#={brro0eYKOrT4Oys+3~zXDsd{^&)NN8+`E^dm$X>`HwUrk=sa?sYLrTGbf4+z;8+xs?4drM?-?rglr? zb3NvY;7g&SkhFK`LUkV7;>FZ=QxN!3*K)T0z?F3n{n6xK#s|7H^k z16Q0=lf^$Ny4Aei&)4I!-r_F)9q=8b6BK1*-JKuoN`U=2QeaWG+T=DPEkyhR*2?O) z3KKs$3|qW2yzfOE`hy*&({_tpfTbp&6(+p}X&%&9(N-B7x*BcP>6g({wyXsqJ6Soe zy5YnM3mTNMa<$oYt;Ie$ZHyKpSz6aKj4_IBI+Uv`h801gj5qf6YZ(A z)w7tm0{I+H8?gzDh>T9WpC}|N*wQA z{c^OlMzL0MU9F+9xJh*GYcyL-D6PNqWMX83>YqyUFuJp~INwxmW-{Rc`oF;;x1rRl z9b(zT#=O}GesxaKb?LLG#nQ!S##D0Ub+MNGSe{xyZPGQOdT1$=HIUB3YCYFL?l)-W z;U41azrkK#bPnD}gnztaZlp_%a@05-b#W+OEv=VQ7FnmZ0d*ie3w`Xmr6XNmb&9i7 z${UR~HcH2R+;uySSdNm^H481wJ3OX=pMHh@kFPXH?q8BsEHF#07AfY_3P|B@XQegU-l~YYX+0{hhNQ(9e_Guw;`Q z^x69Em^Q05ir*cqU9B?W zSvCA`-`_(UTjcxNuANqB5>F&{lf<&{GuGs)@EnF3YqmHm*={?m0wjRs|`bFM$!@RAFq6<50QU7Xt0(ngcs+;DWcPjAl6(GeWZIXydS zy8IUVO!V)$z2T-F|4LGex@Q$(R9tWGmv**wUx zS!g%4rdi`&2}}%UW^)`rB6lr!^W|5=4xT8iwq{HiiQI`dHE&0yYj3pC2kW$g`+i0I z>Ttrda4DLog}=JQPCEImmE+^xqPsMRB2#GfVebD!0ZhX@kv>H?{Ur6KcWJ75_TfkE z!{yiz65hq?7xNx|&^F2?n_$Nu zp`vSYnn@Q5PAHI>WiJOo6+}qH5FOk>-x3f9-0|p11Bi6f&Z@Q&2>qGyhK@*$7@FV6 z8`*|L`D&j@L;Ig(%)b@E)1aMObh=NCaH8nXsIy5}vl4lAUTwlh$bR`gPOo8Y+ zMTURqddO+4=#V)B;2HTb`b)_LP%zMfftWjz(->eFSfLC*V%ZP_eTn2;h~c9Jdp~2* zpZ3aTlAuwx6%Y8{S>H;BmnP1O$+BgP@$CPy}~u*bqa1%$Trw|H#0`9ry3s z?$x-M;_DiyEwV2qpn{M72Ok8zDd2Vfz{N;St-9>|YOKkZQJtf6$=kYTj0ES;h7aQl zUTkA$`_iZ`J6({aku~vSvzohg-v%D%KF5CLOrXRe{pY<-)}ui#n|7C&B<^Lo>*(L< z5^ZkwGXYRuk`!Tx6W@D$p7^mR0jbj=eR_;|Mu?<8w)b?4s8*n3#;m)nyr8@zF7i+~ zyR`zt7Ebs#_KBWvpMr$YWiYUF_P!+*I=$O^pwIPl1~7ls>1%9we@DWw_U7Uf{eTZ;?wy9(27iLitz4OZ@Dtx& z<7wuJlsX9hQd4oE2pR+u+LE(PLYab#{&om$py&a%~0<0pS z`kVxZ@M0CILBqlm&d(*FLX+~(hm&Jt8w}9}4L(-!s*8vb6<|U(^)u3e-cHaZ%{f=q z@G=cR>Bj6j$IQBSk>k->=`mIV>lr5 zgpjY$UQ5a|xh2sH{#1&Y`+2{uow)8?Uj*N0$mo(Q3$+n9GIf9TaA**P!T|3j{o=hX zXOsK$s~+;k-SgpVpU(qK_9It^G*cKHdOI4d`{^8Nd*G7LN5PS3XYKN~Fp~Pk6jgFh zdiL8PY+ojxsyB7(UqUL%1n;LGDd*+K4GZ~{uM466{jv({#}0}Tt$Qm6XgiY$2zb5C ze3aNg>05vg0pDv71NPCOzzp^Ldei74O6Ii<4~C*;0N&O&TL&Qn@CL!x-rUonLEtuZ zJ7S%`MTwiIyj_UxxX&we;8}?EQ72Qh{h?4nG8{IYZA}!p{Be-MZ$c{YL&PB2dnG}i zEw9^C{q}rxln<-HUgxdek5LA_vSg4N9JXI&Sg5?+1qk^Pwi5x;bYJJEcjn63+AUs; zt`PMuf=nP87SEity{QNGS==u}=50Erya*p$YmvW%5eii5pQjQjpT8Z#plqeO@*>&R zPM?3C-DR?&v%s&5zcc3^&&a&-$AhspYC23RZc=!2$quWu1^; zxV4CYye5#It-W`5JV1pAXwMikz()oW!2GzmkZcK}Gl>joE@8Lazed^LKg@El=d7f( z8O9>ITB)zgD>cZpa>%EqI1z8Ee#0t^fn%@4#I-?_ZN1!a(itF3gmz`d*-3^~WQiQo zoU9~nCnhgW9UEj|;1H+xc|Xz4{LZEaTV088cWfqSWE=N%IsxDR@fWg{7Qu}HmeTam z(&)2zePexAjsNIq@<)+6RTPdIw*$S43fZ7R1w&l_rWpaZ{U#evez}>+T8!X#7Sj=^S>L&UFir?KDNvgERs@hVE*J<(= z&BO)iTf*51DGJ=Drl(~`#bt#h!bccyd~;RgM8_oJgD8b@{Dc7lP<(lPfidPo zn?A#^`Nr#vwhZX0+D{A08Z(YC{DWN$n5Ej%jFbylx2Ve?Ac$C3r65>9Ux1$$!zgpb z`D*(6ZQ$^*=$5oZ2a*#MW>lqi=Xr61G&uT&EC>oB0U;2G6PW3T_>2Svj19B=g8eLKt+uI%yN6?9e7?agD(>M9<&I!+XrG9N4Vl6!X{H^1ZUaAGqmEg}=^EwF zW0WQ|sPFu;e`I@9!*v3r$3*(2g~rXSpR3divv0rf!HF)jU#D8b>n=i)b7fJ7fFX{y(i(vDCvL#h$As> zZUVHSfIdF_5VoW-7ucQcHgK8%SWhTjwztPve=tMTvSX?o`TkGH>?W1>2X22v{y`qD zGa`G%3^?B$#omHEN)i&1%@jYw0BFWh4t2rBKe0ftHi>0%P!XxrSqcRt72(0 z@Emi-f8R{IHmRwb6Uc&KmQ3rwz*%{MKHax7=Y-2jNVEJ)xm zh(LS6z7iukCjn+MenmvC^#FSO-a~}5?A-(D&qmZt5bS9opr>oAl^(OZ;L#{Dj4bfS zd9UsOqqdDy(TO=ytQ(jzds0s zR)Ug^jjdc=!v_E$>@BI-<4AN6v#q^*3%u7Sl4?*1OwAGXpKZ?`GEZrsDNiEZ^kU1l zeSa>B9BTIPq-UJ7EwI?`1V{A6VV*v%c>8*^I{dsE8y!`{pR2{$dibbDpM5G~?|NLW z|Dz&^BNPxKiTxu2YvVCCW)&B5vek*&=0H2Uobvl||BS-xD%e!#1bSn=UXObhdR`!y zLFNfkjq&ClX0kQ^eLpmoiE`ZrX-;1soub`r@EU2nr-QXnS3-@#wSVmSG&DQ;1(5@V zXj}6%jpXZV={y7BJA>hfy`pArIsH~Wr4Vk$tWi&-3<80sW?wOulrmnVDNqde)Q`an z9zLufTcDRA=1JiA@G@7t@ht~UZ>J;UmK+#Si?|i&#nVcA-bjP_sq~YcL3)wEViIMu z-V{z#he>GTEj0mWO66SDvBWeYS;?eDG1%2iY&2~lbm5;S1ZtTqIe88smF1qLx8Ve~ z`3(+_+vsGu6@mg3VxQb4N|9J>)e+(o)K9PiC*e0X_Spi9{umm4SVy{OfEJgSk6W@a zN{_Hyq3$yR=MOCoM+MWQ*f=QhUlBCzwwL#qtQl9C%tsOmF3!-PHUfO9KT`2~1D?c| zpSL=WVb8J<`7s2zoHN!7TXLdW$X0&Ol+t_Qn_##uDV6bozIxpnnJ$H_m#{I@smT7l zyGZwhu_K*n)2KX=n?dF|U8gj=kr%sFZIn|7y9qE$E5@&)1j6v=@m}zlg|8hgmXN=oS*mONAz%oG8>ncKMZ6mD&G|gR6%SZ0Tns21w8pWL>bC8`KUS3{ZUCpHBrJtxk zD?KI@V2}3|Idn&;D1vlam*g zHw}jg3LuLvq*ZGkho{2%I36JLx~T8yiDDtrP*ufjxehHw%c!;zra}*}HDC5EMQN1qZ|RTCOb4EGRD9S?&xSl2F6sv|sXPWHT_L zMeR%>+so-34B<2a&h|D5D^c10fR)2_wjFw}Pbj66obK1LabK}`&;CDelYi{F;aVTEa1u;>cf@U;#2ID5Z7!wcP?c@^8l37HZHBU(v|ewr)W`#Jr8a( z@9ufMn>~7spFt$po+@NSI8t60nfgj_Oak~SoF5|tUY_h`1WMEsqlj+O;o;G5PKzF5 z1CRuv3P+Qcb5vVp;<^vPs?-RXUi`P`E8SyL*eqvAO0Y4`t@JDHtcj3)K^LrG==8qC z^yp5u)PCRF$Wg`6q4xV2>KFYSm1J9R3<-p_NSRjV#q(Txo(mv&9Ml&QzQ@f$D&Aov zEi+S3KsKDcks;_gq0i5K+JL;pohMiQp^ zVxlRI2_fk_^k{ilv1Y2@5tk&nv2*D4evZ?1QVCy2s- z(IFmK`L63EXoWnjBNxd=?z%vqq&E?9-fx1q6g{1Q1@CNcaetmM%h+Vsa=d(jY$2SZ9)SWPq*mA6L=uRo`r?3SEw}1$`&W6*;NDK_^7Yr2Z zU%Jo5RTBC#gxPS?{n0++8(MKbCPynYB-a@%Y4GSGA+V%-y}q}M3R17D%&Doy=$agg1-p{mqs)pXY}O*Veu2u~Tq#Y>{)8Tf*=IrN za#eh!CDVvpHX&!##oa4z(a^~k-|i;;>S#O8w%_ZCpND6@;1Cpo#Xf*Q3VuPA?ln7B zm9|D`TEmM~W5&5Kz^@RL+GcnG;Yd4f0{o}C!F^eaVtC8cHV31XHoD5Sg) zm<@|SO$KAC`snM(H-w~Yb5i#v`Ox0 zm2NOYEEu@C70FUO{4GBr0Ga&#pjADRI)&s)ayk59ZDGd*duMLl%ibO|VSect^Fcx| z&69GpcVrKC)7n5+n-ZB_f{1inHk|b!>0dCEfth_Wz=n`sQqi8^88NB_%`-3Lmv>B?0X0zh`3G)p0Qe(tO)F`Pud2 z3_44ei*M9bZAf+nh|RFb@R zJ1W^3!34%tr1=LepPOlFbukTnV+EiUtW$zJx2|@azuY4?7<$$RmSKeaBJ!04Y2NU- z^$%S#!#*cl_%mFytc3#8BpF`rAdM|T;&a&ql>`3ve-@(+4L!~>f+y6`GaFM^=KsWG zFgdGuVc@F)Ace%;cx~Ox8Bgpp%ViC-jnf+xz4=wreqCOu7lTldX%2ZjQ12)y(9qo$ z&(zqOdk%hw8&(O`hFOh$UbZHrtRR1y!PgBK8_}#3{xl)QKvVsp&M>w3i8cFyP~-^Lgpd zLq~~(Y`8n_4N=t4J1)tWGSkOQ+?284H6g#y&DuOSQ$emspDItTY25}iU1(t2dMsNq zP(hPwqxMitfPZRWb{y)iiJ1K8pdmu=puI3P*Ux2i;d;AW0D`_v6?U#ckbO)AB{X2w zthQ(scTp<3$OsTZS15tW2yHn+ygHRRsr{rXaRjI^g!`!`;f#(EpFKV3b z+wQMtOYpFn;c_;VqFxqAw|AOGgm!AV_J~t5YvZn6#_ETx9H8FGZCjl>6G#W=dIiqrO0b+#=ET@`~(?8Fcf9A zb}?3p($wh+N(CxbRB0r(O(iPaqV5+Kx(K5Wik3AqN=sld14JicKY~X$%ypNpK5@%- zcVLug7EJnKhaVgV>qrFlw_@w=q#bKMj8g4fXf56KQT2SAlVWI$yu4`Ed<~32HZ(^4 z5zbfkz-kS^MYp+ojGc<+nXw?FNe4adx53H!@QSnJs|{ar#(fHFS7!rC#|#T8pO_b7 zBJk*`96tLlBXtYqf3CPYHz$@wm`Up>@>^7%zs=Ww<1S7Nd=|5^QVbtX=Qd=}N*AA6 z6_xZnKV`*B2OXMv9B0>3>efQn)?3IOdt?Dbq|$b{TpC7=A2nC-)?n|7r9Cpbp_sv} z`)KU8soW%~W(j7fM1xZim#17=ZDbR+>+Fi#Cp5MdMci%WCm*0U41PnB4qS>T0YhX_ z_Mi7JsbjbQB=^FSW4Su|8V=K2DWftRygY4pOI~ZNq)AW`xtQ(tnwu2?B{McoPm=*% z{@5O}QsulcZVW{Ed5epbga$ncCy$#S>TYp^+?r))VIBUatf*`Y3!YChmA1JSo(5AS zd%@K2p8&e-cB1IekFO6j z($+14j}~icjgHuV{{pZI34DE%@6rd}{34aI#aX3ZSF+KlIaIWcoSI)a;j7{bE~lvP z#d4(dB#lnP+)Pe_HAMbwNpEquH62Ju7vY_`bH7Pj;8@N)da9F3H<7{L@_D6*)LChp z!B7@kzTYV3IB#|E3rG*%90%}q>6mJtQQb9GOfk}8hR`TCmUvlhQiK%ogi0vjSr57! zZe22?<04$LE^DcJ8H;Yw;@ixv(kf-OpN13;Q*SO$P3>bUE=mDB)3cM!D3;E- zkKbQKpJIAcyA?Y-hRSeLKDHwgkCMPzD)W>jBtB-y2xiD?-FusF;Ll<|L@3jfEZ%oN z#TtYpL~*zeYO{9WMf#-E*`up0r7c($ZvA=agTbF0_&tuYxF@IRk=r7q76Cu!)r->@ z*qF#Q1^_6;eluQBE&iCK0Y9izZp#$qRh~ZJGdKtrlp0Bnk0daYXpO4cTsB@DH;0MU zO%x>*S3564WtNi6>5vr75Phr&gl;aFe`$l(rTHA7ahV zM#RS{TTGzK;H@S5sUwO`uBW6Q{C9>)zF`g^|Pyd@dJeQ^nA+t+1bdo@ov}= zqF&kZy<%Hw-df8F5L$X_{MNkY!2m0vJh^69wOF1;HCC3FMk0riS&>SOTYp?MyY}_+ z{vQ6w@*N}d)gs&J?9t!(r@vtzyI&ymigxg+xuqs@Q898`i&@t7T^73*qQ-hE>xO8s zzS}FrTvsi=d9^}wYRtMl(4Lsn`L_Ub_zu$JKX~&x;wGEFDO9h}h~Nb4#5mR0ZLR*A z3s~}+5#|W&!i^oS$MiRzYCfi$JuT>vPf;fpsy5mZgLg3{P+%uai!BYYb-xjE``-q6 z=c$+1AW(!O%N`N9T-q53bG-vbC}}0JSqA}<Nf%`?0yo*ksie`1~mZ^q1rOsaWFLAyPcm>WS_=_w7L{@tGxEbFZbQV9WHncR-o zeoKXU>F5%aAO_i@$)vm;mp7P6hw`tJDFpi3-tDS9O3q|!EY^dXmPH-r4-l??BQoEk zfX?usIRzhYwZF~)T#3{Ahn#qzbcv`*UoJHTCHVN{Y#sy0uedjs&^I9@BI@~(eZ-gKQ=}?%C2(KV9e_+K-h2Mtx z`yE$kV4w`4U8v?!P@sN}&LDAW;mMgE5Bfm`DsA}t=>jUIGX3*ke159Lub+Q&7=^f= z56M=Rd@)^FPrlEG+l<}O!DnX{FI8srJ?RNg zYo@JMAChbO#cGj65-5)VfO}n(W3m_j%MSpXdR~BME#8oFa)UsAf~qk+%`Gt4T%%PK zR2#SO;>HZCPaz1}-=_8I2FkPWLuxgOMQDae%KqK)b1vg6jfW{?5d-}?z~--1qOEPd zly`>AEP3Hinc^t@%Nh->TbBMGNrk z^f<6@pb#J?BrRCQuj3~x0S5l9x&c4|JifU@4B-_hHVObhTIc`Z4$c3UJA8W^!lPcK zqK+$IOd`gd8dn*V)Th!nh9V-eoT~T_cW4kUu%ad%H;PsoRZ&V#LLrAruu3FNFp_J} zPqD+PP@MS6ymaO9^`dpxRpmP9aXIDLoi+8b{xoE)k$gd!X<<-^E)E93H#asv8THm4 z@m>&@-qZev3Z?hX`X{QA>>H0igwfIiuJ%Fz@Gr&*5tXX$jlRJ{YZgc&5&RxD5Q`sU z$?$+)1jh9g;^xg4Qlbk1H29m?x8KWEVR3ZI;hC{_$c+y31*qqH3-G+M4y{~kqh>*) zjTO%)?am^X@(weZjRLP-g2}6~8*5R6S0&hG<{U2_NeW0FWAC&tyo zFQ2w!2v3gIt8l$VTQ(}2;X0qB3W=H90U$<@)3BT+1>jt8eEX@Ds}owFLLj!{V!cwLIQL_Rr!s!TbC(c4w1b|^D zeZJnKA*SANFiXN+uND`PCnZAl9M0}hgIxUr>duwnC;>1*#`W1WdI3*6fWAq8UDymR zSVb0!VN|fVdO(1L$2fzIFh6O=Lg~L22C0a@3CYAB z@d3fXn|c?*oP`H>5jm!^X{lO&Mavi{MuDHvz1V=5#FAm{i)|H~d<{AM{FzJn)`#n( znzKM9jJmqnmam;kOrA*SdvKN46Xrx_D}e#v`S6H*XF>}osA7iH%m9=yY)o=5S@*mIi%K`HXE*1@hLXFI)!(RRneHH=5U`( z<77r%(Sb`_4TJ}h^w}@T7kAsKlmQR_@?e7aBp;lQH8+wJi?~_4ucI>E^f`=^nnNRw z)U35b0~S^Pi?nkJt}Oc7^oecTPRF)w+w9o3osMnWX2*6qwrykb|7O0bxtNQond@Dv zYM)bQ?^Elyp7(iwpZz(LlCdHK>SLmjIxcD-pFITYNZyO0o3ZYsy|)cgYzjF_riKB7 zvD7*!@Q0g#Zq>3FVarlkS_N#eDYKS2-^R-Bjh?Eu=O!}mj`oI-GSgeBi%3o}^pbO8 zD0yMhi>(SSuly=c!oJtKY`Bc(-w;N=y0VSKxQ04)gqELFx4oL+)ZfHP=+aa>f)ciD=nO`R@d~AJ3$b`G zSS@Q?X;)J2&DN=qU-K+!p9;{wSb5iqf0uhI)eKlx-#2dSXbK1t?T@x}V7ncYPJ*HR z-Gfq}&2VZ#QIMW^l4<0A<8cXPpx-V zX8|R>ulkQCZ>(p*XHO-eEw0uZVkPD;e zrXy+`HTG3DZFBZTyS5dE9Z+}p6%^eRpL(7nt8kS;>gOp(DLIAfXl~VfN1O^;y9ABc z`{}Z-`rR#qZ|=jlWNs62smGJkR8CTk)T3P!ReY~*r;qbpjpG!Z*HNwL$#2P_!ZMM_ z_ZLeAX8}bplDo$PemKm3;$yrB)$=;ESOdMd4DemiT6n8(cl<41mhwTm2@^MpW}WqW z8=Y-G8)&LvTOYL9e!}WlZtDgg)0gnt=Z^`uo~P8TaW%Rp4aabHTJIc9rW_>Qq}>(# zt&fBLa{w#Cn#)jn-33L=T^ajWqny(@K)FG|$gLN} zj2XmXoB(~&P3;X(7}xDj(+79Orqd^!^WmzM`FVEbYWle`*N>q?W|mxtA|oJcl+0-I zbiHu0u&X4d2Y$1_)v}eUCHbr3MX>j^ri#f)^gg(Hq}5fQuja_-a)x(gNz79T8wE$x zk&%WZXS16Mh&RMlO?*-d8wFz@$*Ln0MP6?uT80hww=Ic1H|@3-ex0?vIdL{4#m-YG z*Nb;|Ok3E=J@~P#)dOY@`&B&isA~^=6oV(1sMuEz2KUw@!Z7ccJMjWmNfNN0_5>8? zh6XEYA~V0dT`b*`f4Xs3;!k8?63yB1_*(1E(RMarbDl`GLRH44Zncc_i_b7-+Ndwe+vz@~t8lo0IRFSsKAOs25PXjon_3Ec)y3!6Kz2 zrz7RzqcncElD?`-q_p?9*H_oNG|tW&5|x@L~2=q9cAoLCXY#H;?c#ky{Ir#wO@ z58>~agpOt2lOTF{*@v0(jC*%GOV_F(2%Y4Q2ccat8Ae-WiAv|vy~)G+%0U>1W7nj! zmrVz{lV=IK$hJH*sfP$Hw|3j}LuMmBAEvAMO~zdxo9DNGT#14+vCOmUE3jx?drx?x z_gcvbXnx(bo9G+W$RjnKNoy_F&U*dHOj;;~A#?9dcsZwJZiM`=mJM0G7eQgArrc`T zR|LMMOVH%(7Og3EG-OG5-ND@If-~(~D|LU99=I*TA5u(MX75g5ov)ky?){}ShG>HL zubVtoqoa3g^{rhnoG7*oH}d1wVp5{h&~0X}eS8cS?JgZCdSySG7qm;_BrQghw`e+j ze!>mG2O0Km9=S0(m-HAT%zB{xrZFa)e%u=OB0sONgwOxX*Wv#*9uf0+in@pH8u_J$!tJG|Qe~lYe}{W*>R|P(6X%3)Nl|zH znRB1BKb&aG`7eclR-T4hdtaFi(Q{V@)3`{T3}y4h;zVe4`<~)zYiux$r-K1=9KW55 zX@l`wQKWCae)#PULQonaR-Hq=ih${y-A}+B)oow}5&G+{gCqW(D9XPiRIs^T}geiwdKoDO@_@1}1@1?~8=s6xEEXy_~EU zuFU2vlAKhQM#B$D{cb8g?lgd^8>2s?JWO*)(x&gHf-G!5MZXs#K%jrq!JP;z5V9c( zXVYo@P#!T3Qx^?sGa@>|h>!#i5Kp#f*JlA8+GQva*k{5+vx~B~^KAyS{Qd;l5dDFl z-k^^}mo80Io@e8Av(NGn|20Ox_}*VNBCJ z7-6D#F+yMvVz?bhQuKg+;`lnhqS(|UeFq>G@a3iXHv-)6#E1^|xRL%q0|kY6z4#t{ zZht6ZMoidnfdER>EPjw_xZ7jFetW-~;V?pieU16{MF4u(h|&81Xf6>ncf5H)4ISLO z(0A2D+&$F6%qNB02W?uV@nyd$ot#O!Npy^^xjTr?8ih33WmOCpFm5M_$%q>edcy={(~f69`qnaR%L@% zx>)?lx7f_SyMDOuRfG|FrW8bhF!u`pa^_{!w}NSIFFz7wV1>{?Qv_o2Aw8x}C`hkM z1~vX>!uMYo?_Ed|4ro~+;(G9pNS08NSq)HN2w&#=OiU5q#|1+C2WG{djCUJcwwNKv z*K*2Sb6>n5iNUp3Cy#jkWLxuyV}z4>4VJ3<9wgaZ!O{V&P!;G6K)!sKFgPR&t|)VX zB5WBYb&OFo2t~U*w9QxvI5c&D-TUkt3tKY5m$ISZ=^LeSQauq^EaSm84{}844kqjp zq8uYra5NGNAC~M;Kw_XQFegOa3pdKa`w(uwmW4N_iAXUq91&zJTi}b8ATgsoG)Pdu zxiBPG&~Jf!0Sj3858E_JN^SI1eQctanb0_|P#m9ye}x2aJyp+MkPy&2^I+AM1z+{- zOB9@t-dn94=mpTO1U!#ESabF}>V?~G#G9t)p-DvtV-Z@!3hnf)+< zz$ZsCz9oJ&?4^!bNe(x{87MUK>$OEa@hwL15+^0e{qKb{cxBP#>OB`jJ*nF{Nv;QTH`?c zY;W}s!uy^~A^yW1-u@K-RP0i9UqA-`eAhSO#~o`LeHT@bViM6vz2J}W9QNZL`h)q3 z^{}q~1cL*OAB5z12QSPHJIDR>X3()9fx79v@FzZ85{ zemNaNU-e@KfRwVxoSwX{PVY?> zr`(c2jV(i}vB1$!=2lb}uNnr@TO;_8+p zl?MfKt0Eu!jb*j-4w8y6q7eq4`eKK2U+U2JJ=tLc{h85|wQeMJG7p5NW~X!UZ1{F5 zak+^#Hxmx8D&eafv!;F#gO_S$rG-V>8My3U%vmSyUbM4S*Gh^Y8*Rl#B{HU+ZYzPT zVeL#q4gtrZPpR6EeEgj+SEpw?NPWZe9V?SxUmq(AM@@-Sj_~aIWWz4}xnkf?8%dJa ziejCj%V9tZw%M8m_R;Pv9V=8M9D=88{;G8p--jaQ4)u`qy8Lyt2~IAzM?PA*W2%$z zeT*wqzPo3lszJz|u(-*(PiQFnBp525|MF9;b7dv6yS=6*NxNzac;4vG&Q4U`E`Y{D zNmC|T`m;poZX>v(E)$QvfU zP%1E0k0G2uG&=fNasn0hYOa~OGH;NgWU#TW^&SXJ(0;}CboNfABdx5%>?9_W_$W1=(buydDlZ}IIj9YnWdgh zJbggShLZi6{zUhQ0PDe9msMuETerptK>(shR|}OlEA^o-tdr{C%#F45t`=6Sx|L0i zJl;sYIyS3J{s0uftOybr5swuPxA0>P^Ms*(>xMAI z@nSChvKHMhU@`QH7cqcUe(cefk>cx@B0h3*1Qj@9=T_*({d1P(`@T zA9}3o_visR@e2xSWm=U582{zz*l$m>d6|mh>x>dh%P==30T3e*TxcBo$8H2O2(hQs z9Z*`(`uA23l5i~ULR>R5#GGEf7V~4;>ZdGdEQ1Rk z52LjmTdgdgp7tB7==xqrr2SnoyuZ7dc5m`;SFr(V{>`1?{(&) zKqxlYvhzhXu%O-g%Vlz9s-zAGnZ+OY$9J~Oy7}wbP=S2o_sbR*LNv$a)xt-1I*Q3- zAhcf~FfnH}nVO{nEL{1Mteutod5MA>XG+B`q;#L z`*939rXWHH;)n4Jg|(oQ1IH1~hX!!lgeNl$0dtF@h!OyqAziQ2YJ9ocON?%{ZofFq z@d3!NDG`4GgGLz-M}J=?_S|7f@IIG8cCsPF+iw5?r$LGAbe$cgA`!P}A<-E%L6v6z zDiLi4pNsICTsFn&B|I%m#kis=rJN%K22itzM7sAdSPfn2s>@|updd)fvsOEW9M|wU zl?j1>q4wnp5XN)4r1wFu1c*SHYGuZV0pQ9UiEm%zr{(!?NGKJx^K4q0=zc?@A$c0K z);e28xP(Y}Rn@Fza;^oV$WaQE{nTmAK;y8FX{oN>st4v}{sQ{`vd?+^pfc~&M$Quw zS29+O)^iaISn=gDY82JgyIAcXJVHzGbZjzgT~%&u<%IhAv_uP3aP5}95)$DQ(KK64 zu^O8jvvNO-8nR+#t4-~BtC?3Kg}-JgJ!JH_1^1!H@l$$Jz66**07!FyA~ZPE*)We= zRPrGYj+?3qwE$wILRhH_X;hDEF9v5DNi*G$_yV;bSdI%Zp0WD;wwdS?(xFz;gUdYM zpFq$>fq;OM2eUf`aqS@}k(2XZ(qZb)vCW{=3lXjDXq}-h4HOG!^G|5Xo$wcO(lGh^ zcjgZ1xIQP4z>|6sn&F+$ z6a*M8Od*hx4!$qTpG#BZ;K=RuLuICH4_ein28@ga zf%wk=g|9E!9jB*r`R$Ga6&e-CR!J9P7VPLM9|Vh|d+pX1P3lP(PEM~E_R)Ec7s`JL zLrSXd6xkGUYxLve;3DvlL?XxSqX%HAXQpFl^Mt=gyuCx9ZZ{uoZt3w6iF zuy5riB@I%Y2^#R~lJUWDOAu_bQaVAR5g3k+;~yb3 z^50!mlsKT*<4F7XzF96()(%>eun_|l2tFqfzu?P7LM{VJO*M&m2HaOvq~(5baJY}e zJlj@K=CV3N{B@_LV`!Rg4Kjc47d$!Itsih-xgw4t{37Jga zH1xhlUi!MZZ2ABx7I6ip8f+h;dWU%NGVxC$Nc0~(03o@&Y!#>|hMukjR@iqArQ{H3 zj-3z}gzR}cKRXnKU}45CW0nbyFRf+f0C?Nq z_VPy^zXOfX1c8Ae^?J{it;}bh>M4&*c%0K@AbwSo*^C#Xp`ymRA0J{e$8r-Qky2|Q zae6=bJbxOQv8a2cDQUfqGxxUal;Hv9QLFxait~NH(_LHiWtj|E=4OOl?j!X0Sgyjv z3{l|D28dvd;Fh_+9R|?%@NiGZDHTlTYER>-2$a<3FZBH%h?)JJ{M~1CWoaGf2u^$T!DqvxkgaVO)aY?@F zyw3&fW+SFIUec4PPdrp})^gpKddlB8D6IH_D)cNbSn7X-wy$PgJCqA^B8I>PWL;T& zR?}UXoHz*4@PK)eT+Q`&Xt-V^tMX7}I3__qD7&|jX%APdv^aeC%rM?tgZLI;Z6?8N zc)WP1x9}A^@mZ%C#AR%U4H8nqmx|!fL}C>Ye?W49o_IpE(D3ZN+EPgS4XFIk0Lfwi zFdO$FIB{sC#bQ3t4E|=|B+a5Q{jD_8rFS&PF1fG|$@Fr3$@<14BTF`%fcgMV) zPtI+%H4A}(PW;C?Rn?W(unhydlM~#@si}6Y>pt)e2Lt=Rr_8{Jl)sxir#4~G|3r;k zjJg@MK^6PCpQ${o9TWvj4Yc?^HgAX7l~%%;1v*i;#Ab2%j4A(u@=mhV>0~=Rs9r|z&^&Fr+1P!ynY#BGCPUG?*Rv=-cr$>c|Zid|7C&zBp) zLThK+Fm1tqKOT91Ch)#Hs9}N=$19stEZlDc!BFK%={0|M+kTI{0(;T{pK)`1{q63# zwo9SMUrDSP8brJufD?Dk^?kDW1zMVI!-fsyoHrg(SCuV#{Z-tK9BlPvpB}0Jv{y5g zqnN?q5|As$Y*}2gzZ2$Pa1&=!==@z4841Lm~qRNcK#k%ef2tggP5|dxZ9f3Xm}% zR)CbzJrbDu*v}*Y8-YtuG^O-w^E4Qz2etQNl%Y%pO7EM`vXOIS(AJRFHWJeH#@F>cqsw-=f$baJlYkJ&MTf zdEoQo@He=x`p)3xST)xwT~&O$gz44J=;Zx3r~AdgpwoXAAAqv0eLm0$W5Bc( zo%KVXEu`>0*Dsc?f9&=%xoROjK1fe8Uo^l>lJl>_ZJ@d^WKOLmV8n67&zgSOXU7s; z>+mp8_26tqI0*gx9FT{%Xrs7&7#$BrYi%`1fr+l}!pI1<{$@O2H6Bf!>uH-T|1fhW zV!t0czs;_)-D@yZ0nrI`+gZ#!C zCeJBjbm1E>Yu(nP8GE&RhNx11Gw^;U(2hlW0--49BeP~%?Ofiu&8!Cn1^Tuf=3in+ z9~HxzA_SAl0M#BSJlT>9TA$zs-w7)o6{3IeTO~|~{~Wj(Lv3eDWXV%PDZ_)XHpoPa z0#=!~Da}0(GNULI*E%CH6{aH;k!Rr8BtUt>n6DTZlc>k74d?V42Zr&H%t340ry|&; zo;#>1kdLwECIm;KStb+z(w#GTRJz*_E6#VKi|^5ydSanTSJD2tAsw3#xJACyC6$EJ z&7m^PfHM+a4PO6+;}|>`n;v53Y9?Y}Ft+w1Vg@ z-3rw1YJuh@)#?9fDiKhwRp@9<9{~3q2%et=+%Nx-h0a>TqKDe^lL`VnhZXKO)e3^q z=vIcv(n-uQjAB$juXP#uh+f5El24gW+nUprd@CcAF@rO z2BeEb3weW`B2O=>*D|D_8+t*ATO9hV!L09l*{UEDc)*eQM)n z>gDlzQe_bwZ-_c872j``M-0N*A2%H!5S(%%?Os?8&uu75RFr_lPbuiuZG? zsx*S{zP$ZkC^!XwNTdK@Yg9RCAp>&6pG_Jomvf{6&@FV29dUbHHv;CS0%{_2En?OaeWuve3?p>@07yQ*ij*AF|bi$pNkk4i4EUm1JuCSBA^l8KH+T$y_@$e5hhAJ&Jm-EA{;Y@v)%L<4#rNq?*!zi0 zBeFNP?N$xO)k+5W&lJMnp9>G-X!H6QK873lpg6nd?dY}g^NnI05wb!>rpvyesc8d5 zjzM(6F^UF`w@06JHsA}H4YFU^Tvym-O|~?tLxh^^n69hruaH8%aamwiH}~c~i!wBT z!hK?bCSfA#w+o~{Bq|(%9bq2xTc zDAX8um!a>MZ~G_s%Mu#PwUK~nL}nC&*fJIe-QyWXY>6050QjgtHN2C3-9MUjxu?~@ zzrh_pn_faS^@ojJVnsPVe4&%#2Lqs4mrWY(ro){s9 zR=*+C(Aj6vd-ZJGRc4$ULO~IE zG7z%ZXM%V}CwtYcv=0%vuNG>{r<>`=j!tK|THB)%0FPu==4rgj`MMc!*&h-8(Z7}K zlAUH>||>8R>8 zTm8Bz1q?b5b&31tdN$Zso|eFCGbY#Po1R~R;%C=Xe7~yY@O1mQH*EFoHJ%lFT7MiB zMeq9)5;A{!Z0`GdJ?ntN3S(-e|3@uf4iL=?-;^vQ2mhHoy3NQ8;AsgP7kUgSyH%RX za!qq7mIVUGv1M2LTGrD}Xp8Im6k}nT1&99x2TBYR3N{;0KaC*}T-xql|Nh<1+5D$I z*iRnKUbvGE!PN7WrxvCvo)sO$CNk4GMS=Zic3@*ZXxrB(b;w~pbXfYLSxr0#&dn-W z|7+%b>=DfnSc{CCh%5O*M&ibULvg3CQhduD2#Cn0&Al){IsW zehxfLM@=VH4A$Q#p7v3(h?{)SRQx1TOn!z10r_(torFb$}F3r0gVT6YLlkjxMLLz3#6Bvpd&zd6W zTK9R&e8xv;d03H?%c>}Ij{qxm79doBL?#=Qlt@CNAkq_Rh(-l-K!(n8XLZ=)CW@e9 zs^S`FrR9IxjKk?U!8W_j9K@Ab_nnw5q{!i~Cy^0ozDjx477Jddh8<-oyl#&$PI|>U;%|YY1m@^jp&k~WvBZ5Lbzg>Zi7>t-BzA*Rm+8#q#`;*o;yC<6rmL%C{@Bs-{N}OWZ1U9W zX^^bW`|^@2@nSF(6DL_Lkzzjzv_3Ead8&kn&C_jkr}aiBsN?(6t}BbV*n=zSL!3d=45M~F2!cj|3fc64L&4+wdXhZx zIWVXB`;PC|anQ_VBk>eyfWcIfc0xje1}2?VH^JXWhN;Trh?po{_Ip>!K^#HJ#N(|# z9mpW_F`8vmfE`>&wEk3k?Sar*6=zjsKz<)3I$*h0dt?CVx&j!fC+^rJX7D`yc4r+C z3KKf~SmVLJfd=d&ceI3go{h6Y`7C#vuQYD8>>MIM_Rb`We{5`5uGJ*mZkdkr0D8CN*3v+Jaq-o{QVR98uP z6G&%U!!B#XVm)`6`!s1jrE}qEhHJX{)#n_So|AJe_RL;#%o&c~s=a564jt}Nf7cNX z;qn_C0G)5@tDv{y`-7AIANbOMAHMWgU`T7{kJobPfA?BC{CCfC(&hGuUHOG{NYXea?7l#!!3>A7xr8H5JB~>L8Yh6M~@;>lMCf!Ug zE=YAxz4m_J=iGlCdre#ayMFuPdw%S!JF={L$LEjEhpR^O`_T%hAvMp8p zS;S6Q&mRil>@a{$;oSc>WOu?m>|GXDmx*J+t6OFH=nuy*CubszfSO;_x&ok=4PE>R zjh+4Z>48T}(ewyt(|Mh*ziLI{itXy1E&9dRY75mb&DG(wTdD6V)!K#SPL4w`bk@d;W|}HnE8!yTiDkNX}L~S!8g`MP-h?Me7dL_B9a+;I8_&$5mcihh@V{U0rzgKziSyvWiTAW5Dd29H3!W z6X4vgX`w>{4>;09;xd;})zepA{*~K(vR2h%rF6{;M?A$+K|OgeMQXVl1@*N^g6XEJuFwKQFY~)f$d)&1z#)LcIZ+@H+HN-)h@fx zsa1a6j3YKpwpZ@*=kuc?<7$iwicO3B*DRC)g4vK?o%lom1}01v zato*Bo3d?fb?Wofdob3yGjjqNU3gQD7Jcu+CvZQ5S`1OMjh7d;e@7dPlqafx!RqoUYJ;p;dk+~-BYpClxD5x0`4kGqUE zPm>Xuci%q&ORMu9U*Sf0h27~mF{}OXxejJWwES3!6Fg(Cj9<)?KHksP&r+RI5O=w; zn&#}zsmpyuWiZe|E=%4&6}ar;C+e0t-J4xDQF1?X(ch9;inh~8JeqbPIokOPvp}Ks z8gAnya|0X6$UbYUW5R}BT&Q|4NUD8D zeu*V{b|L=3hvMgAewpj8lXi0V7~8qA0%_+=CtfSLHiREqRJ^*slc2P%MpNCwgL;24 z0fMYls^QoKqgF;MJ@wUJ)8pv607sM)10(Cyho!SQZ?x8ed+;G+rb|Otfiq1drRnqT zX?rAQ(8MUi^j_s(S*XJ_1T~@>3fKG@0s^*Ot*=iRfr%3K0S^AD3&vEXw${+Nyd%L#8c_AaBbHH&lR z+LF7m5Y6XQ`w`GWx8_huWC;|v{N+WrtJKu{oBq38dCWucBE@o}NugQ@ua~_ztS9u4 zYN(`@=#WUeD9#APpb|P;LE>W&_WEd++`ZdT*d+ISx&_3Cuu=p7&=F7X@sW(3Z>OJXxgv#^sE7i`U3lNd`8I7K}Da|3_@fk9F z`pQrZ3(t*y$sHF(@)Mm0E4_temx)BkZ!i>iHf)w*KH}OX&91xT=2)MTuU=&7M`4zV z$Jp~Hbn)MZ7c|X@^;Yr}Ce+0?0k4M9kftZP?8zRv&cd^e=QlCc?XG(w_>)rGFP{3U|7KRd+lT3Y zF>*4r8rlB)D%hWEv4vC}UugJCa*j)x=XDHrqU#(AE$Q%_101saIu^-|Z`lg= zTrpT@rzdN}ZO=zhTamWhXJPcfe<@(%If_3n>zhG)PQS3>s8{0j_!_Xwj$UnWXLGrn zpeuT?XRIEPDs{Tber89{?)tiL*gV0F5!7Gu1T#CJ_&qF`TwQEe=eKG1NQs9$Ap-r@7pehTFga37!Zg%mOUXNV~{<(F6Mkz2&(r%e>KGTMek$`kbz z(A->2Ii>=CaOhIYgK(U*p!tu{H; z;!!P6is#(y3;xwnig*1p)h=+0~uMGe<51*e) zWdt>W%O`Us*}B^>8LY|J#vQBXwPQ_I-E|VFn*UIpvec}B$7t-gX#hEb72I6y}!OWLH3K?Ab3D^ zJ%5-X!oSakoEw9(A3_+QzN<1YamT|ih+`9$S?~&D{s=73_u&{dbTPq0*Z_*|h%ush zv!JLs{z3y^NLi#~UgY5On4lC+6Mptx@?!RObnO0sKtVylQ9@o)?s%wzTX&xSDp?Nv z2htC9do0us=@Gdk{}@GZcraK-u>Keo$2pCP z8>L|iz?BGVyAZ%&TTgv(Nb!076d}JiM}sf1K~U8E`WP-2`6*d;emyzrf{3^l&4We6 z%!0v|?K6V%!~}&F7swCaapUcsFr3N!WC@4)luEIC^UV#DHD(m@rJ6|1**>akrC51! zYWojgYAmSd13vC!aRDc*Cz-JQ9EFu`6ih-16l$)@Y zCA&G93)QtUQY>$*>~YF3PaB9Y!knjw^#<9+cfB`ffg9YnU;YM3&j%?wQ1D={Ld-$7 ziW)CW7}d%w*rWfr8y7Mhlt0JfLr*J35D-|_RX9OIb*8keO!-9t~37qbKmrA~P zxXmvJ=fj@rselHv&Wall>1ja<86s+cugxMxF`Jwym-APSx2DR2`q|v*FNIJ35Ti#2mW!O>{U+9!n$qJP90fYGw>LFbzQ1c72&a5-dnrE!*lI7An9&cqb4JlC=Ck zW=oKdbdekBef1wNCD2#RBo4%bVf$@^yybfje@JhU54&IZE(2wb0Lyneq#Tr=oy&Lo z(kI0-J(0Q}dTKCH-~y}P;a;vL-|}j@TUW__*ptt~bGLeZ;As!46Z&wuia()-C>rch5KCTkH8Z_FXRpkq99a5wIjAl7vvW z0J0Eh0wQsIFk%2{FeK^!)unIEct6emx26Ac)x001$lb(`*7DO*?1r$7v3!}=3mE{w zTv{8$2MDDC1YYO>?h{rp*AV_wlmPcDC_peOAZ=!=H-8NokfdxgDXSZ(ZCeeqT4Hc( z=J?3KWl4)1KI`rYKuix|Pt8`Qu8mjdmR7WNIX&HFwc7l*g>$9ZY+Ua!d-OiQJn7ZE zqv_#Pf5+Xq#UmzaVG*9TRJzpw!&9tLeZAwx?&>u&oKx`EK)AQl z+yUf;Jy4$k+62!ZD)wz0R8nFI``3e%w9c(v{g%%dj9fSM?~70%6Y7;yvD2!~`+Xz7 zR7>D`Cyb#=bzYacw!i*SM2f&*Uv3|hf555T$3+dWvCo##0E!V51#Q?zbD=QoypT$8c)=mL{SL&_22oJvwZVtzEvNdGK0d3c_JhE(F4Rhy@|HY=SoARs5d z@{@N9qik{06F)oUFK^byHb=*h@FX*PIkle_nK&@51^BTL%wlj{zQA^KBX-;-U%UzD zHxCQB%%o)}`wa1*1^uvQ%0EMA+8ayV@3W$10=03W1q*>d6d)5wtsVLu7Ibnvs5H_R zS!Uppn&7a=D|@B0t&c#V=1{SP69cTl;I^xeJvx_GVVsgf(KH4Xs$6Jf_5FlPfw z5v*xFukn<941z$}0IsI0 z>ao-Jb(C^cqkC_Wb9dKpcgNH^f(HvMHmSaKo8nU0p4N#LY|7uXll=O;As2h$Y*-5c z#+LQ`#9Z8sUR+%2VMp_NblxTAn0SdwD?ew_7uTn@uE-Og&)s;H`MHJvg?79_ZQ$-! z=zNaVWOt(Dt|?U-hv7VepTS)?7HSO?CTmMWv%jb&9F-4MCQ908Uo5!l>20O{Kx3>a%|vnqvgflog-hRB~+tDZ2!4!#-42-;8AO zXr%z_plu>!^z`O1yPWZh>0t}ci3=45aDgQB9&2H}jg6`++P!!b!_;-+ZZ<9H76-fa zJt}vy+mP$9zt3IVQXv~r!J^N0JTq{l(;Kdjou{ZWm%*P2Ao4L%kpE5i&;mZ*aM<4V zgyS0kN954#yNv;B!xvQ`$V4rW6%sC`B~yU32Bi*&5rE#v&PU+?5>xrs0doOYnHF`7 z$Rq#7o~CG8a2F#G(9{H7f+*r{8pNo-&{55*nX<@F|1lUYRU%O|JGuJJ6;EC`7;*rW zC`<~Q%P#*BqC^^(T}Q+GtXLXE9l1W2koHGZLO_{@i0TjD{h1R%PpiT4njUg2)+Wb3 zY&c;!xrW12bR#pfuye#%#f&JD;Qp}?Uu<+`>b(1%s8up zcH6T>|Euqa-<~gZbn#}^H&CCwVKeO+Pbp$-jvOQJp+&^wxGnQ?xB&}JrQi3va z?r8(EUz-TMQEh^Fpc=-bstSwHpHID%4MqicjmeR?IYICXHmqD+XE(nPuI)*L1Hdr_ z8iLV5a%b9Dxw&b&v=W{4BG-9YidkVo;e7nYX|cjd;{8>yr0<4fGTEjsRItM2S|A0} z&fC@X8!h_Mv7ql%yJ||J+mC@3f^g%~?L6$Eyztzgh4noSu<@?e2^3L728566aDT~6 zMNv68)Z@@)-iyjkiIyIRxWqIMRG%-`?lOZ`i!4Uc>R8+Adld!q9y zR=~;mz!7#ufRyUz1>cGUFohF*s zZhLqe5Nx&xEgx}k|KgbxN33J}dLNL+P~Tui>U8M&$dSC^#KZSD#=}aIzTm>723PR! zc>-g69^m_JVMcty*9o^~J`+cfOk1fo?aQ)!Rntf28f~yVQFNXSGRwtfq}8u^tHsI6 zNL5qpQ?c`k(f=s?B=n$%-}C?<+huz6r!d5igPv}S(D&vV^zjdgcuV)^(P)7SiHSUJ zNMinyKRBWQSvYAP=pjBTdGV6YN0<|RHojcTwvvuJ^@#stt~b{QKYdQEX9k>##ZA+% z1+RJw0C=B2W*{usBly-SH|1kbZ&B-zeb}g@$pm`9?3+opPs>XPzug;4LlvjCV9 z>7YUrll%YR?V6%<>4N1K+sTP-CnvU@6Wg|J+jjogwr$(CZQrbQU+?ps*O{liX7#SF zuCBs>^w0JKZsI(L!+^C%#iUy1Jhgq$!C-U{KHYad&;5E$FUeVLZkHJ$ghLi6h6P9U zDAZOLddl*b6eL=3ay{xB)OCrf;7Y5>7Zl2d57!He_*b>su$vr^CnOl$EKJgPmFv^y zHMB*Y(vAsl5k@kqc&ALg_1Ag%7E_gkl=PjuvA{`lOU!nLQw~|8b_N6*w&}pTWd7tz z_BTmSu>X5GAvz%2`WHM6Pj-1F!F6nf<&P@gI(Vu4h~?lgU>|kSJ zVoFyzS1;7$JZVU46a!1jmFPeA@hq{hbj!Qq$dkbyQ}a^Yc6SuTP_3$}8mpwUWZ>@#r!)P>fC7K07!u3l z*+51rb<02^KdbxVG=U^gPeD+vqN)rRH)q68%5FhG^zwKOaY{!K79L)G>ZxIrX^X3@ zd4^p>CQkm)e_`PwjCkq?%#0BxE^cI9hU{Oyvo9ll@1g`^cPajxN6K&dpLkGHk%K%S zM1M}1jk9n`4y*r?LpK+I-}zi>1|h_}3ye&GGZK@2nwdj(=`7ZnqzXvMGFWpd6fD3| zT$msK#hh*!$dnqs+vY@ncUq?251!6gj;3Hi_4uW7lyn1w#H8#CFMh2y$%a#lj)vp_ zagfkHG|Xk_<(3v3J*i$FTV~0)OZvp6ECdKR>!gwMRzGizsQR~DB+VOtj3<$Hb z{rqU019U>`Zd2OmGoOJoQsWcjzF#NQ4KJwA3U$>`@%Ysr`coMnDYU$~ea5-HF~KF# z>EDwuDQM(yFr`z!55nge_=_gBlO(yCN{EPPa5!Rv5(;EwjXUavWUc3*52`&Y515GL{f$W@5( zgw3zvxVeawCaP(mzpkczV8?UzP-Fv^1q!8wlNl`Rtlt%#QH9y(NhI$Lrtfy)PdaCb zh8T@VdI-nmE5jOlDPaPUO#k?tqT_>u;F+mgZZr)okzYq3B2w?rtPz3f)%_%HW_hCw z?HH&t)^zz-Rcq@i#E;_l>j(nT$8)NHzYtaowj88`GEIsio$qV>tg2|gT)rihW;*?G zCzG_{6#=`zgA7w8xDkO*U)P4`ONGpgh#(R3KTfT9AF~^`uBJ`)@Fpe98d4(!-)Ccq z1P{+EA2%%^obgs1qiU6VKG{(JE$(Y1M zkf=)9@GfQF^LStz@U0z&y?mYk)PMDZ~9Z(M|#8c&u`w|EfcP_J2YkJLh!(t#JRI0sS zwiGAEfI{vI!xgDos{a+T+oWM#LCvc6V`B~!fTIb2w{zt;OWHGIC$*y_WP2}&PxpQk zPiJH#Zq3ivA7{YO%RT)9Lg#+r_f@X3eWf#n7<4veGiy{`v`d z=>h@Me@|9j*1O^O?Xf+Co^I~=CPhE;eC64ftQw?`8wRt!Yx{kZ(bTZ*hI8785@r5>nI5P01`zV+f%|^a%xnxR5K=XtHQGQ3IOYXlwpxPY z4`Fw7(MeYla;}exiklSD&Q-3T`Lz{C8pH>s;Xr~qPeWa=r%4F-0IAcT-mhmq` zThn5i29$dVT&mGeueE%bG-qSin>AcS1;QZyv?aNs9IW(|xi-J93O1c|{L9vu zKLtki4C*o*>KUKuslLt>8{R-SXmiY8X=7^O18NX(B)JQ9Lw?QbOZHY)i!O|kmcEl5 z3N^OD3VSf&+k?61;DKS~$GF=Vo~lJOC~(NgY%D-ib|L!sq8shPwup5~ufJ3mpT@c5 z1haJme8yI^HRv`mH8{E1bqOnbK+>U7L#We7rV1klLk7Vyd==<0{ojLIxwC~)!SXK8 z_FB<;aGN)G$L?JPh-2fE2oci;ZM=ot>Nw*m+)uF{4v#Lu*{kSUQ<9rOKvYFB_$UT6Kkn*jC(eP$K@XERZvtkR)-JV zbbwAe({86&q9nZ<3;pKb`rX^8yiqyA=d&Vb7hd}JR^Vv5l@*t^do}Mm!H4zvg+8DW zqZr`b+&Vv}NT%cJ9X3e-rdCPJN0QI6(@aZmE{=#9Od zq3ZBiriy}$-0gE6egcmMQkvA~r(dame2j*Wg3o?K4!H z-g=P8)m@UGe_swqZ4_`--8_)RvwF}U%{ua5EZ@8N%*?}hK|DVSA&0 zanKfL^rvM)zDLSG$Nr#@wrJb#bQy*=v{BNvsai@&DXx7V&PTs2r7{Lc!o{N^A%An7 z?^Djr;bJRjWN?2o{})Lp5&6|n55E5yw)L27QMvfT{t6JEfPCs z%z5duJ|G+!oZ@xXIP&|V0Xf<0eKBb^6Yqm`Hs3pUAd8qXW{89=h#z-b`!=ix2d$Wq z9g`c@B|-@bjLK;D>`)-)js8XAY(Y63)BU%(zWmG^O$KrJBH>G49&NIk&plaX+1HJdnsXW{-X7E7LrGFnu7|?ufZReUy&+CmLmyqmhs0lXPyE``17=4F% zeF*Zz^O!w@tJ*%(qaGZtnE2w z_t%T}D`lIq3nZffCxzIQs;#K4*pG#r{6iO|S{@4d6Zg0h@MSb9i_hb752k;H(v(1o zp_2K&IZ>0gVkw@nf5LFGV6A3AlI6M*xHWB?L6gL{!=mNHqdv09cJnXQJFaTt_m`RN zIL_=XJL`0ZX`9rqsjtLI|5(ALGit^?-joVh=p8qATmXlKM3?Dv%WDFU4QD&~&*!~| zOsfKMP*I$p4=lDM8jH(a5<>tCq^Y(KRF@??kNd73GnVwYWMWjcPB=El?IdS_djO!* z2G=0@Ts3f$-7@W8z*)g0=GKq zsl5o!&nV(V#wS#VN>V*T8z~O(5jjz^bF7SuLRVcPlYWT48{ftc#+9#(4~M;GX5tRm zdT|Qb1<|mKPa~Tl!>|nVROgBp*ZJ4>w!jTBxz0i}0^URR9}7?4PzcV=h3+|2;6Uiz z9|%B_wv*LtA#~FJEpaUWl{nH+a>t%@0RW-z008XoXI928#tyVbHvcPf^kh#u`x(Jc zT$d0goy%t|JGGqbV=%!Aw8vrLFp6Y7x|<9%PY+BV%R`+{ss~U0`wtaU_jg^>+PX*q zsc2wvyZAR{Y3JqSp4jF(TU$22Q22S4*hd%z7Lhz6shs-M2vlX!BF1VOO7mC5IJCq|x zUJyP36~x8lY~IKmBE(!R#^9ic*qv}AJNc!bF4lcl4_53DtP|4DZjkepZ7*ou7lX|w z28N;Sg5*3;(!JY&O&O8Wt#7TG`JB}>#Q&r-N&!#>S z>Hu0;n-^a34;#jCYFKuy8tx=PSEg#?E=U-;M~llS)&2oL(0^u9y$Gg*{=BP@B#iPP zLI?bA?9eeG?gmH(VmQk(h-2svBJrQ}1bocCNKsKKQ{V4y1qGo^sNp;*;XO8#&{62U zuK=~d)It8*k-tV%ilL6A$04BzH)TCXk%plMt-1^sw(ge0uV!Lm$C8eb{sN4AWN|aG z2Aw>{J~u0n2gj^-&&*0Y99dpw)4j*0^=43=T&;Xnb zE6VQbL7Lvo`J|;f)_DP|8 z?d`()3!MC>KMpCtP}t5Flv95vl)xoSpl6DoWP!hwuY)ny-*7zdfUoSU9@F*I<-3a% z!{FOk)QV*CL&FX3{K=S{$fuS4Pn5qlaa{7ZXB}VGUL4v;kM_N<0rhLAv0W5rroSEk zp*r+P7{(ssrx`2-qOd(-?GAKL)QEd3A>SZ~=;R12^b;ZPH~I+`aO#(9==IG}+|T~3 z_kR*U^axvG092@ZB0YEz*%4ojyO-yf82k*0(^q<9JddA)Rz6EYLo9YBSR!1$!s~}` zfv*t)$-lFrgh+^c;a@jSpK-@C{{nk#us+ciV*l;jwHknj$KY3c#Qi$t?Oi!q;yH8$ zW5Pc_yNGAJcfLEq@Y&$tpdC(&+_#wNiG&$(`mCnt(+2W2D~`DY(gudA&EMr{i(qo% zTf|4wIgAYZwi+QYe;v&8FD8KJr!XTn75bNw!U@xw6Ie)q$V*{`Y5YIEdh-RJdwXqB zP8+fBA2!Iw{QR%*w`l1R+yGbsB+?*$g-d|jPq_OvAOJEjU=slhu&x3~8=TQ`7)Ak< z)2Lln``feObs88u1UODETikZ4wEAarw6 zUFbLL#B*V~7WN2@J*R1h0s>J{7sid}ukQ%WPh4|$EIComBgo}_4C*$xo;!W$Kv7aE zxhYbhjAHQ%o>b*!H2-V2+bf^CnDCw&Scx6el@cbxykSI652H}j5Ka;(Mt z-E-|bxUij~Y`faaHtDQ!#Uhq6F2*A1;&4Q7OSOqbI;;S5Vl|N%e~3E!>Nkba=HQuC zo1wSMXj9q!JuS12lgwIJfrv|qyP#x0?*_^|vM=FP|NIY?aLF&1OR&08FZyPWhF9K= z9cG$G=!w(q%Sk&s#>P1TXu3INn7k*j0#hgrS7cxyS+Uy@a$tnj+BVIP$vJZ6R%r z{>gi#5oX?*?;kHznc-GQW;9*GCLm2^;A9g1(L6@a++$uR`z1D25n#iJGitw%f@*)$ zt>dv?tdV(H8h=NxXyGXSwB@rlxwRtEXudATy&fJ*7lVXzym+5)jj&nA@|fi4Jz1E+#+2(;be$w$7cG`_LyAblEmlylN2hX#ehQrk%4T+BnI_x zlCEX9@Q2Y+s;lAPz6bA6?7@wi@t7|^+XPT@NVT;&rViA)v#vbOpXh(McJ{HFJRstI?Tr69t)67F1Ft zjZLj9N6}Tz=9g`fzYeLD_LF8X;hsnwQ?BI`Nsw!hp<*NF-peh|T{_<<_1($AsX4*@ zc1T7vPnw^bB;kqIgsS}th>SLQw3qy{AlG2pc0RZBXKSb1`z4MpsT;4ruTjfu*fU%1 z?gztgT^7LQ){fsfm=R&SS>kV{alLQG(S2;9j(+0AjIXcc9)ZFLUO!HiYb)~~))nzaR7|B96#>QSh2KFE< z-CrST&lcC;!@SG?S+db3+WWI)KghMER8~n=$9^AEmz5u9DMMU?qVrkE(Rva_#MX`O z5UKuGL3Wv~Sjm}biB4#f)aw26A&EaJkjY3U2W1vz6@0SoWj%4Yif(uo?lt@cE+s8? zr7e<|gI4^X(RDmaSut$tyBiS)-`l%!xFV7shw(~wqfvWg<+bJsJT-AKaF-NLebE}% z*uqaa(8FovXXI-T_c*CU*oe;#W6ITIwyG_(GyR_tF=p4I_HKBp_Eq^dWaq?5@S{C( z_D(2bS>8Vi$fH~eoEKc^!}zJ>H~Zr?tsJNA(HUrb+h_6`b?0KrQwZ*$Vyv7@MEtvb zYzpxs5(0#jt~H^)x$Gn^FH>%~Q7K%Av!o?L`RGkfT|1m~&7}0Y%&E!fKl#jqos*&~ zSGt$(TY^>pj#yCSMv^z@4&=T=HgHE=3^AG^NAa(bVn~~{yVh|JFLJd zda@pQGb>>-A$y^EXr`(%P8K7#{;?E`?h$6C-dtNR@}o(0XwKH`vFJ$9bUp??*xR&3ZopB)n17`;(>g!G7oT-r z@aUd6T9JVg{Ad69bP6mAj!4e8euR*^9A&gD>pV(PimUBS&}hDvKwi{s7E_lLj+g5C ziGAX@rM)1jO!sCuFtxEV3Y`@}t%HJPB_L*5jxO5)I1=UbPjX?IMt!C=5J*F$aw?UAI+g7?O6x<&d zH)47lMmn4OKcS5fCx_7gdaB4fYSvC7+l4s028-$Saw5J1-`>!os%$;D+I_BC4VdS3 zLmX`07#-ckG1r7bZL-S_&(&JRz-LU`H)%VI6`UG%7<2QyJUi&0wkbKPIXSki$P+}Q z4Y!DK@WE-rdIF;s|I(InL{h6x1LidYhuJ8FQ)nt3Z+fDK-~F2YagZ~#+jO)tiPb0r z>3pYD40jt$cHg*aAGO&IU|Na#vq4)^O{`*Y*<|PC{X8*B(Cc2olr!#?K0IYsDF?%ly4Db(EX zJhh88wpCMi3!~tFB7%w}OpDFyM>~p79)8%-o@&;H<;OtrG4Y9U=7!q zOJiac(3LV(dTvL(!}S>>;fkn4d^O|Kk|d02=-Yb^N0dYxGHuVwg`ss$oyshPjb}B? ziXBg@uMZ3AV1_h<*6Q766VD>W4V!G*e;=4l@t~)hwN(97!uCOma+4LU*}im)!NI4} z&(2w{Vh8p!sIOj#B6BxaFsTQQBxTziJmNiZ4UMY)b-5&0T}?$owt6~!L+G_4#t_R!{FE*l-Z9ebUOIJL;5tcPQLlC?g! zp5`v})T&~_3!IcKqnb0`l;Wk9*6sYkM#EfwF55dEi_o&5iaU}dYl!?)8szBFHqyf* zVKTzk^_x!f>o1m!i=MU6mwa>FG?h!AH8{@Ob(iI`XWXa-MMjoUSMSRFr9OLa#$w+- ziGY~qQ55BXXy6EfYM=U~s)IECsgG<&k`Po#PP`sLkUq+Q6&+IRVaWSLX?#>a$3@uXnxB zUi-HKNe%aH%Z5tfd|g}$K{m!>oZ~FVI-Nk33Qj>1+H;!c5q!4ytQjM5ewv}3l?SaXd*>$+d*&I^a>qt0XrZuv-k2 z>wzAcpyXCmeEu_@aiNBBpjT;AX|lRIho2J9WLby69sl#>W4?ArKQEj)>6AcP~BoKPymnU;HaxRzpW^hmye*) zRJ3k&Or+F1vqL8``cT+6$6pg06XPeIS6)+5aR5_AK>`ldJE}*t9FCEkgC9pK&LIEk z7{%4ap!I?GMi~NeSQfa0kI#j#24ZVCh8epB4uTQ^VbT0+b62mEGVLEJb5ladKDL3) z_n_nL;sZ6wz_6e!&B(~uX0fz`gaFt~6|@!CF}f~B5BfUn`&QEJNiVV_lA!rmLP^14 zMkWo;-OwX}dK`(c)zbq2u^{gq0B;!8ne`_qK7LJ6B9iCudY|{80_{VoBQsyx6w4+| z6NJZd&qqy7Pgk2-KubGv4v6Zv;f=IN#nV$y!$xS1CSWhWv$9xZPZA(}5jn@$7p;^B z@*|4OiYJ*r($gh$j+l-qyq~+ulqgBOz8r_7a+l$Avoi;c&&(jOV@^^GBG4%O^SHr| zQ4>dYQwsN^L;BC7i%=r2sy6oKp63g|15C6uxrPZL9wI19paU^E*(y=1CC0T%HE4&r zY>Q~d?l62%`Q)ga=0I*mhkA~V<5xW1f@S26KugoPadRk0wTrQ$N64zVr<$Iahw(k> zuPi5*TT+7%gaJ_NJpt}1TkIdjNR}9(3_-I#-Dr-BClN+t8U%vWMEgUMEJ%ZP0hJkL zY3&WithWfAi@xi=AoH1lL()mA_|F3e`&$Vgo!5uc6PuunLSgJ>AOPT&%N6V(UZHXo zCSM#=xp7#`r_3p&acJ7>0Q94Js!rx4rv(XQ*KX1$K=4@B;hAQLgES}*@U&1IY=%aX zXr4ADPOB2$;0+Hd*wezufCr%?2_%SKbFj`4&bSaerVx^;3PD)DYqo9$)jVln1U6_C z4_VIo@#!SAi(t{XR!mqPiQ1$Wu}4-wSQg8fK7@te)ap?Ap{ew(Vgv9Sq;Z12&A}xB z<_q9D(ndq%gdNTOW;HdKq{w#_m}r}KL)Fj8nlE+UB>udaIPBR}d3Bed1@Taz^XgM8H4?^WW7$Q}@! z2LKr03l)Tw0!ahdzDFQbzeKo}-`^LxApdOvYcfH6%?rovh0<^3j8Y8Lyj!*i!kH8# zZ9CiL7d}Ki=J9@e-L@ZE(#_BKOclIKYJP`7F5Y#xB6`Z{5hy50WUJ#)Yon7;oF@wL zs2t1#htl?^7dw^1EJ%D#j_HDrDg}J%&)2~&0q!fi&vt;DWh@0B zOIr4hu*uk6HC-)l5KaM;qmRQHdv5C=VmeXUB{aTu#D>CTjeL;FNdi%XIlGBdU5I3UQxFclR z70Blv#Xwx*Yadd&O&xwaKW?Oodw73;5hU9UMoFZcnPQG4&GMt=x0o6Nra!MmWKa^d z5XsfPNrhKjPJLH9o3u;q^+{drHTq`l&@GL* z%mi<@4m35rw)_LBK=+4IGzEyLs+lcpXIaq)eKp7bmzidCK!BgozEO$LfI%L?{YN|g zpIbns4s0koOS^rX9!I3yQJ75K#wkLVIGC`^E5hw7+kZDIUgkW?ahyO5&mjQ1xWV)! zaT|Q9g>|2q&C6!h0Tm-U$rlVwgan;<@-Jv)PeWL5xN`IMN)@yg^Eq1^+gN*ZS@zqA z9jC~r(_Xy8blxs|zMTZL&kk}wOVFtZ$V|3`uTn*Axl~-G*=QGuA~^-ze29bq9WfRh zB(?HI(96!RY;cDTUai-{DbdK7*ABKtPDxJnzX@$kq#*%&OJfw_!`ji~-|b ze_v2Aj3L4Ux6;Z|ac#z%t)?#{}I4Xp~w{ZiW&#f52A z6ck}sHW*+)n_)msrewL6C$_?^XB902o~CU zuSS*ZOnRaqiQuJnNYG#y#!$`X zrscwp>0uL8f1w^0t36k|ednJpUT$s%7W2ZzW{2;Jt1BzfAH=r(#97RvfZjPSubbcC zhQ`(~ffkpyZMOJ)J(vt3%1Zr!9M`(<4fP1J)b2n8V)^TRo0|ebCV4l@mh{La_h{>YTgm}1w%ps52nWI6fgNd6RrpXo9qR2io_u2fj!dF&&}&8@lF#EC_!+Eh z&PM^S^IdA-x(;uTTr|MUxiOOme(fPc=f;LeNmTBcE6S_QoRP}>wOwAYo2S|eyOad0 z@dGp>T!eS5>ufjS(`-kJuZ#>$WtIH-`8lYUECqmSAD&|b`Hlm(9a)22hek~vl*Ch6#GE_ypLzn742UMj@lx!P@{6fpYu80;;T;j%xh3*001U~ z#h{b|im+wt+j0$cc0qJ#5O&;k_k&-uW{$Vk1wxkN=g;+RnrK1Z!I^zNVzL|BCw&}{ zqPP$ej?eJ=grTA;hul8>vq32wH?Eb}kf=B-b0TpwB+ha_v?sU)h9^897Q8w&anZ$p z?>=Xaxc>gI5Y1(kfLuKcBr-L!vZl9ISW-*X>ZAA;jd$S0itoKFp~TOhZ_6{xiysvY z4Jv&@Ime>3`f})M_!(Pu8^*JI3;mAD=iCl76!Ty!uSPSN)}x{Vo~YBE4o>z+uepvF z7}M_W>XW=*ny5k|GF~f&qoTkOZ?3AVJMORQ#Xpl#S9fPv@esjn;=|(5fH$JX7e|-i zsM{{WkQ)2upBft*D;&z0>s`fp`Ou_uGPO`kluuHS>xMl6lEBq9N6-43h zO9)o(jYZ?D_B0r$5UF3V-?N?okODxuLY21kAfZF4%zlk?QbhsxR(_9sWR9By+sXZPRyY2>?!!8|;k2TDgUI~n%ibyzLbyc1J$5cwb zcXDFtW(^}+#qn_caZJUZw~Z>C@KE~;BWiIW@tET$%7gfmbmt1 z-A~lh_Ms zy9Y@l5pnEq_HMYj#+VJm3i7KNlq$C|w7;B#WBEoTuvxddWPVKbV!S9p?wyH1j)2&y`oF=wFt_w#%g(ArWT$=l z-02!*FY;DHn05y5N*LooNPGsE4!C~p6knu&mdI|O?avb2vO`l7k$s+8@+2(k#M}Lf z>b4N&dBt*K9XDwQJUV&G9~+p0J`o}xx3x6JRWaQMER#0=al2OBvzi4e9aUMuozq74&|A<9^2i!9e6$(6c!mzhsRrzuIFp;pfHYi4 z4tPY_U9;aZ?NjUYA^C?RYL7pDJdRdMFwUFJ6{q~uey?^kkEK_&)C}_B1NA)yQ?|SY z2~iaFK9myk&?{v%BqXFwk>L>%F*nbZ=aI2)v|u2Q%->G7aKrTl*ap)1JRgwkb1TH5 zCWqwv9@mFKl||BG&86>135w!QjzlEp=;&zJRiIm89jxph3(1cFFab0I5Jb8)wI;v4 z>tXE#$56S|0_b3tjV+pbo_Kb+6@k1Wc*76|nHcQ;(qo?Yg>Uq1>)CDq%ck!91{_{1 zGHQ85uFfqDUH3rBFI8&3ZY~cSK>`IMF)bD!O`8I}|M4?stY{3SSf$Gv1qzE2lfzL%-fDaFb$w`o+Zvb@tc9szSGgx zef!b`_p7kFsM!`H0pd|&`B7SJFl3P|*7GsN{$U(%!-oJL9}%=}MjuS0fY_5)faIfb zbA{fRP`@rFMDgxPO}&AKM?grdxSU7=9Wpq4aav`7zc9=Bvz}E0EWG!cTtu?53zt@S zYYo)f3lvy5A^_|+r}`sRJYbo(J(0f2GegE<#scGiw z_%Jj#I4CTT+_g^nVXwkqAvrr$UPCmqFg5qIRaVi^z*USkks0Aph=;;0;l(5?OQa{L zjbV{1_M@_bAKlYI{s&F|5A?@=KVwr_TRPoQb{x>OUbXMt)aKLEQ$th1fqa`tV(;i@ ztZz$x!}hQyxUKR@V~E3103UGTqJ^L1!?O?2kkCfa?ZiQ)R#BdY5JIB>c*7AVTI-bg0o`!(L-#hE*1`}4&L zpW+ExB5sKx8+nwcUgW4kjt>1rsnGn6W zer=ekE;{@Z?}|sVN|>}12&_pnx#YG3Vs6*`9T8hNR)k8-TqN8C?8*o6-_1f7HNI|O z-pBWrT;EPz2E9iak;zFyu_Px1!TWhi{621#B7(y~kpT0_;)03`pUzK@GQs6^ht4Ps z=Ko~a*Aj;Ifutn3m+S5iW{*wQViIa%V=*zBs;b~>NBvsY!x1`BCinmZOwS;kfE++* zPI#%~KQh}Nspx**&>v`RC@KMW3e- z#6n7yMp=P~RgK1jyYkq*YqYnGq3*Ac=m;}k@3*)FoPc@(%geXSn??zt$Zjj*9ER<- zaWE3Y`QPji7&y-TibHFdh`k{vWm+dB7p#w$o=iUPP-&z8qJkca0OeJkS>NZp7-5cW z_jWW2bZ(HqNS5$;jxPjJ5NS*j@Mo(dc7NrB&_^8uKdFkXo&(WAO;`8OPUt4u9O0`> zE&WT5r>EKXXId1mZEWQ+yKS~3;jAB6FA^l6kw%PEF_Lqfr9$P zObr;oWdNEUr{t^~L`)=TJ^ykCC|By?0^dLmXyyuEyno3Ueg&NMmtYm?cM>n~d}s(h z%a)z|h4Uj-XHJ~YNOpM!#BXOO?`4JiFu3_$0w7*{+D8tIMcZK%7Z2G_=feCT21LdT z8<5?$r%Y{J+oiVOa-s+VkGugJ62nXUj0MMsY#{0TVDPl`_FKq zvlPRA-e{?N_nH!#1q7_S?UG0wI#IByA?uF{tbn#)%!wURahc3e4U$W|_a4+s*#cA;78fe&x=s<$gqEt~KhFiB!Jb4|J}xTP znglUCKEYlR$O?7gDobE4Ee*?Vyjs1)e_=gI^L;6+;aqGR49(kkgK#axK1bYmUm>it zVS3b^)rd1>5YttCG)}j~02eLuQmmI)gPXg( z&9rF-yLTstb}&fu)&-#Vrw7st&H;Z;eH^$oM!yv%7ucIZzS>(xV~X-=?>P(g{^jA$ zUS4JXtYG@)9zD4zz$^lU!JMP2hkZB))P9SlwLL5=82>UDI)lE^BLRZ}S|!w}93lasR1= zhU+_QVU`vu__zgX>l4GvXza{DMn5)-6uPB@T7ci(?TIx#Ta*brurwI|hRv{@h?l$N zV+*xrIAiwCU3E*%Dre28$5>cBlG`DT*}7(uaD)J|@8Bq0tr6h8v7^!l1hvbgOXi3f z=m^1gu=Zv9{s>fWVv^12&Z)8oI0x@@>}2(bx#{=5tjO%Fl!`-zzjLoWLsH~0ScCu# z_4gsz?TfPeXzC;`c#6tX7lj|J_rM|H*Q^Gi02(2dpn(BBsYymV!%IxF_MgFVZc~1~ znVqtvcq*R0)G-tzg6&aJGq*r;jF@+ zU+b}m)h|a zR#*aIu?12tM2L%d>e-efH-|C2osbAG6BP6#0}~eOsl|xI1}6{AqZlqvz%gID75qmt zW2vpAf?9x}t*ijVa8=vD*|YnCR#OE`ypaX6b{s;-iUVJcWa>4f8ur|qD5~i@Az1mc zZn`_o!zVFGDk2=1-5RX_KV@_&q;hM5zk77p-3tA($-Y8~GDu_zJ+us{Bq@O`=mHOK zATS#nA+h=hsK}mR(KrWZ>T21k0Q>Zs+l$lF-Y$0=WgLRFuLwh@a}3!J{ORPw>~ZG) z%BO|C$+CzTIs;OF%mS4vDVYg^{XVG}6fhXggrL&NSmnrpm6h$^KK-23UOdFyHJvf`IH|1Ex{@q4JWkF1On`-UA}_~@$uQD}`BB%^1t#`%@Jeo@k| z;fHWn@za7+Fic*9=BL1Iw3q;a3B7(K)@k5mMyQQixsFa zlpdkqCcbU;YA)2DP|Q27V`cry#-;N<7*6rP6>JXM)ivY6RYjmifHh>Pc>|&*PO&Fe zBJf|7bvJ0|qbr5E?L%*Pz@ud3x} z>hOV-c8Y#dVPcJ@zsO#Ssd`zM1*OFCm z8bDkRp1Kxj*x%9D>bGSnj7mj;aWi`hocNqt(!+?);lWcyAPGOo%v&L7`8v?>V>n>M zrH^c_@%2I2@+I4z4#!T!x{f4BdsN8*Ih7(4Tu;i(WxK^QUr+t1{xy!^TEii+joay= z&cDU88PZ0Q?E{cOq2;9-eK7`n=uU%juF?We*wm(sy@h>gnS>-iZr%i0#f~CcRiT*_py60FRj$ynJ!2hId8sJGk-yk zyr7hQWqKffR2A!f&*rdtS|rsfgHQEtbB##i;a4 zjELg-)NgBQarvz3p#E>zzB{BgR2V7|K9-^fv!j<^KT5z$!i#?n>Ky{;_GianvqrZp zYtiotl;Mje?LGQp-8DBpt$?6{niO0DB`IhC$2cbq|5_$0;?H%WyCC@fV;SxacXuF) z0j&<%*cm34iIsE6cN1JRFPwKbdD7}%XYHGR5mB4lPp4LLya(Ces%OS2s5wi09oL0Uh zT)D*PVqyX*7xV^CJ&m-AQEa6HvHd^anrXV`htQ`jim z#~11EzHLfiTVOiv-&SM_D-5MJq8z}pn%Evzc~_^@E7m70|xPJ@DtUqS6gKSk0i30#ri>c z6K)UBczt+qCmsTNL%!UX|57rUV-{8c<_U~cD7O|(GRG>3kJvlHuV*~BV$f%!06G7Yj*YNUyL*p8bzcTnoNtm>CNe_k$_A06#~5g*D+$?=ugwYFwvr!O~^lj1ns zlQ2;Pv*I!0Q*24w7+C96N1$iV)y_TN~VSbjFkibJWx5bVg6_RH@y>XI7metc}`R0QB>XDn)~B3&qS_J;FjlAFjE0ST}S2JV~0XQWVPNimKogh8a0c74fBgy+#-U z#vjX$u#8tmlc^LR)|!v*Xi&JA22qOnCdTrAIw%U`29f(gZ{LwF=Af}Ak!T{BPD^lQNZKn0xC z`8@qHo;FS1UMkCxf^+=1p~WHZ@BTl{1HaTn-&|t|bE>#P`ce?|cfDKMm}e@k@Z7P) ze}t5ufmZ$s%&A}psWCGj7o)I{^D^g8oPNs?B!IIF%gJ8_qo$HxSRXLzE@`Bl(Y(m(0zcXkQ^{_k%iUy*+8ynyJg>KV2r;tX^yNo@R z>~{HaMsQE$we;3`eLO2Wr&nvlO(mc$(}{Icb1Q9*5Zh{MDIF69%4J0t)=r`qeOPf5 zPr>a66inbxWZAx;bRU;IoW!9U))V-~pzGFcUY;1n1k@ONJiW@8YDLWbC>7wYPM3s` z7ER{xovWPFPjA_xS8jkzSpSG#XKO-|DcDz#J5>PS88o4w2EUd>f5VIOO&M?K>}zsv z3E<@16;bk`8z077@{JN)dan6w&ui#baIa%CRP;XpnLuX0GsKNVvb-3@LbcIndV>Qz z4A3{Oq4z835um<*Ke%_6?->+Rpq_1<++B;OxxR&hDgXLET0ax;d$6FgE3XIPBZ zLNd6d7zlvZH3~DpKUi7kIFhv#pbeWz^BFxE!(qJm&W#>ryYGEb?tk0AlJs2oi(u1SpEh z_TJjqj!_?6>Svn+c^VpOs#GeN9Lb>g)1BWwTv0#DYB5GFD=O$ay1L?(&nP&|^A7zSFmrR^%X7+9 zs_fDvu1&a540D2zgObsV$9MV4MN+6l{MB6wZ~?(uxILoWNt__-ub#feH{%8LDcgE9 z_$LGA%&`w|ky@EOc{V0}K;L?w0D016t3iDq?w|&%yckAm4wo?^h!``<3gGd2Z8kWX zRV>DO%y|Q$Zz)!?y|DqR)WU#Ee*tk)#a+&L1N+?`n19WJ1M?mub4FanSvDu_r?~?s z9Ms699~S02Xzp3Th^ZaUo@Ga!nw45<@9;ZIE=2y=L8RJOe(a9tsH30aq9S#mf6=K6 zZ>!B9olA9WHK;VvIar$SlTJJG6XE(B&@<*Gw4e~Dyi^VHKU(C>3-J=7RK%WkSGr;L zr>tcB-k5F!!oW4@^umBUm4NGyi8{3-D$)&^5vdxqqgELja~4hgz$1dzZ5fU}{COMJ z4QHQiTs%DWPnbV-AMBseIA?o3VYq;>tK5MN4Mh_-Oi^aIQJ?{=5D)j^iVK>gK!auR zk+ry-N2x0Hv#mQ;GseU)MgZa$ZH68xrWef9)n>{%seq&58&FFvwty4l%~LT0qjDK{ zzURR{&k4QFY5ug}#IODbm6i)oKmG{!H0TuULfpmlNDzF9kn+uuL>@SVd|7t+AM z!2d5f;xg?`Jon?cH;em7?~w8yRq=-)-%7u3pfVQbij-TYkJp%%p6=y zjg7i~7W~X?4rZef$5C(yvqc(FF^craWKdM8MHdZ1j1kKG1upM!xW z8F7sx=#PmX;8r0*{Asd=hqieE1IU(zDci%5Y$+F>-mDHv|41~CkfSbG;~Y6OJ!)t_ zDXvJUUH1-f#qdSYj8SC3N!auXyNXVV}dyh z2&?{}|W{cpn^#ZqO`7&m5c z%ZcAGY5QwxRqb-g^?ObBIY?3(9~y#!Z-Mj5MNMViut_6xJF3R6rKKfOy$)8PCu_1y z|1J{6813azJ_`!%OeLVLC{u=W26+G{aUp?liy@JI^3gv3e0kYGiz`R{Q)uZAuANGT zNo9Iu#q|F+S?hG_qO@uOxw8{1G~?lAt965bVju&%hOaeq#KrJnJNB5IPMrI7*M>b1 z(;Qt3f%RcpPpBfszK~#|?!$SH(zeUz!O34eX zrp;a1Jn8ci2f)y}!Jo7%Up*v>zFQb$PtpgDQ_$)xf5UHOb3v+CS1xukM54a#6f){WJ#; z4^P?Q^=36lv7R`wX}bB-vwEvRs{rg7CXj3#;I<<;@1*kBSiucYA&^zw;?67CTb zi_}z976KGX=dnE4vMo#Bsh`iO$Axv4=)-=tYw-*LSa7XV_aiwuS&caBpqN3C&lu_s z1b@LB*R56Gb>JPD#qT&s-2MDm?!7RhA}apvx9(qR8<%-m2~b$@fJdUOCp!p+-8JVR zL=rL;5zTKUT%4Rn#HV>2T9zOeS|zvJSQXdhUlYPG+$_g-^$ zI3|41J+z&0gr-5?M!lbJ$qsIa0w@|#=*8zEr(BO>V`>PB1%BCS>>n2#Iy*Y@NH9@; z+PwOhIFg0$PgsO%AYV?9^uwG74BwzBhHb)YU;vnR-$oTGN@f7ptb{RTUAp4OJK1B@ zHXONB&-s_n9dsWEOyY*=0kOS+huExBr^;>8?Kkeddf9tA9{v_H{-Vw=uDN_M^}s7$ ztvV83r#j9Dd?@Rxlot1nW}9=#bPYWwcd{k$yN;w%Jr45i^M6_8<>k<+V$pl**QyB% zqPOTYm+zuD#uK$_z5JdYZu{6s5>BZoDT~UvI)lU%rNZ4Q#)o!-j4!r+BmhvB@B{(+j+19ZA zwenGp3ofN!c(}N3etxm9Y$r#oZ5z8UFagi^xvMJyPwXEEh@tFW1@0m(Fk6hKf%Nd} zCWSU>Id;rL%^BwfpAN$6_=ow3wtfW@~!omh*MJ#_?|U>o#!#`UHSuXK|hpR zF@G^ORuLfkiViYwP`5CB?9d37fJ6LTHrpu5>o{s55s8#+P5D!c@wI zLP-C!4wA9f353%gb-X$F;qLnA0KQrX@XLvRv350Gh__hDIP&_X2hS{S@Ur%{&;`=H0M1z4!KD*FTg8e{ON#|Qy8;&*@C zelFa1DGc9qKI(gN6vS6nZfZ2{ivD2{4h+V)-8JwgKu!NzT1uN?Z<1rsQ;@eY>B3E= zd$DZMq(_DulLK8`Jh9IwsUhAWO4e~01Z3m6MHBcPTb3-vFp7l@eElit`F=fzz`k!? ze5PNebAO)A9|#PKCKl2dDhdh(^>R%_x~VwP{3)2$ThZ#=AA6U#Htj3H!tozU@~g;d zY(A;~Rfy-eP57~uf7IC?g?|c+`QN`QuG^>2kMO;+h&tWIt+O)?x#BNo_rE(l;l0}3 z_s_N#5E4p%mCC>)=}Hdup0R`Me9$-)*uM^F=8%J|*+C2ryo64F!Y=v3k~^8j!y#xi z*`rTZLPbyAdK@9`TD9FzMW;c-4;kXOL;yKI+?G5GhCCjbmK)T6(5W*QD}kR$0A9|{ zs!aD;N+|zrwVT`8qRGq4E2PU*y_6{>f+~HXcH=m^KiiZx>hO@|N{IU~A|fQTd=b3P zSggBbnM(;$K`*n<&+crv|EyC-`Kht7+R)GturU8F#h*PNE^_+bSJ~U~7o__O3JHB1 z7(g(nU&Qzp#zvcIGJVx_)XAq;HsjUF&6>h6GoVx{Cx4sAOu_Mu_gGxA8EbzO7vB&~*N*GzU!Dz<--`#Siy#<>3K6xKMBF z8ws(g3gW2Fzu77o8e7-upbC7c=^Zy>*+i=m1+*BsA1{-l9}1mUX1i+05>Av3E3hI! zfYw@aQt~Kbqx;@Cd&hVfS{aXh3{y&fZ>?W7^Z4=4xy0B&zD)~;F?4Bfj|pBBSSsa9 z(;7QXm-A2~NE!F#qnij-q!8|YlB6Jg))(x-RC_dUg6UjD=dPD2!#?=P^#MJT-o{hf zm=~i|7;_LHfVAcy_XPz7MN(yM#oa889nzHE40U{YD$@sER;_U4h_*CvRPa_Mm#>bG zabD3Hipnpu@8C~6146>2Z#@*JztPM1l=Vl7`kBH5z+7kM}|6sePoOM1hU4nFcV$2bJV3U@@U`qGd}u|7d6 z*1b&Q7Z))m7P)veJ&(AQnSQoW7op8Q_-M*_<@0eW{E)PkFwT3+%d)%*5^=@ zn4`|0mm+d6Fa!2`Pc0$jqXY=XPy*y|qncHRRvxMpcu5fJrW8AxJz~ON1uc;54VS;2 z*oM1t4r;`AC;o9LTh^ww=@GpMVYK;YkB*;lXq6(|*wRaV1{@?!U0n&QtHwsXLHZ6e zn$G6{wlO_U*t}h90leYgeku&eLwfTL ztxQo;lGz`;jOD@6e9WJ8>fl?!e{XJ@+S{4+i+1Ha0hO7T{i(iwv>pc1_^-}wCzmn} z+y9!=fW0Zm)4pZt(~DvEQJ%!8F-E{QG1_fUOiTn;Y8|u!4SUtMknE@NVFectZ^oq^ zzKU31&uOI}T~tIVXd@4yIL0k|BU`B@S+65JqbFPBHE$thfDHNq2xx0SM{yHluCl~u zD$_AfU5sE|`K|S}x3*qO)@tABq%+vo$VO7}FA%hFNVl&<;UmJPN&xsk{rmT?m3!`v zkbL<}9Kqj*vC3{{EoRCjd=)05`1IDt$46*j&)N~tJOg}WrE1(TwcC|)rvv{-pwW0Q zljIDc*RQVp4+F|6X?D#2ck*RmFb3~@0F8R2XCl)@LnD(R&Pk&xZ*;B>Pq8RHg32OI zsA#fsaBxspxl&6Lp#%8><0SVpAeWu_3s&LB*YFOzXnmr^6k=eTgE9D08$cXsVYLC~ z?~!)yK>Kh;^RslZT50;%#{)0e{{D!lkkH44Bk#AWeB#j`0y8@rR$L+EElQPiP???T zJPc&Q{2LKGLqkIzRidM#|EhB94cpXmh04Q{#k1A zyI#=U4OYaOXTd33TY{*ndlhFid$?REC(6-mCE9F zxzgs_juWF3O#*1dIm=Ae$^a3<760SIw0F_&sHef+5|AiGYH&lHrZj71J6VVTGun&y z?{Hpe+a-J*;F+pHbltD@_Ek^#h@olV@oS^6Zj!GpHrs~}schZr7KEJm3o?3odOV&G z-dX`Euyfacvla-iUx5=H?fd@a<@`U|QwcM3C6|&ovJH?t*(e(atg;bbu@c=`2q)67 z@`boVyGJi9!}`TXo0g8oqX5A^_5?r8L-pgE`)0}8vorj99c3S!uMG)+_YUbxQLCmu zmHk+nI;+#0k*r05*}yR_)ngKKdfy0`nh*d^>U;D!?l4D~Tg;rDkB63*myHK`xUBVU zw9a#qXO$`u=ODXmk{`|9o3nHw0?Z39tTF9Nra|A)&Z)A87kS-Y!p;Hs1pXka+3q3i zL~^`&+KC^S?#4fV{yZGpwA^B$>|`M21r+-NGrG#FdWo08zy{N!hNI zm^dejd7`%wRFp^cRTT!u*fUcG2K>mto8q|<5Ub~Oky4#Me2?z&F?e)QqgR3apn6>I z7WfnB?hw^FypSx9urU;q24^sATfp9gH~r-Ej2*+vkMJ!M{Z$}(ZcbJsk2=44?8d8b zD||23&SKqUUVE*+pedSOBSQE=FJ6%%gTalO|1yFnnS;+_A>tI?=~!T`$;DNyw*Mw_}kJ2HJH2M7Q@52w#hr{noH zjnF~+U3|ib&m0NK>OdmqMQFSiDN?(Q!Xo{5)A#(C)7$@0;m@!ee_vNuhi42mKE4hp zJmK6jsas&f9_$|&Kp5KQ?LAL&?e{hY+!=hC4}B0Heg?5pYhZ1Ss+l9>D2ru-Hux$? z){4JilqQ}en#VVb2;% zJbCSKUR|CR3sR!?@$uPFpz<%U*4HyN9R~0h2y1IxCBk1{I+FVI(Pq6@nV+^Q%}#2JxMGsGM`AwOlgpJ87(wAjk-JuhfQJx7)AGN0178HE zz~u#`m_w`E$#21q&6DyJu?T!b01iBq@hES+zRzYODfxp&WSsypW{Vm*Fx24*Q{yP~ zKM3m%dAxgzAXua}2gGVXG4t@oe+OpMoT;coA9w-fm}X7JW!j59b!pWvBP`0&Uh$1* zwH~yC$vnF;s%}T1uWpHY>|=Q9C1hiAv0I7k5g2%1+dJUB3JC9t@4qxAQnl&qWBBYr zfZ$Q|BE>`jAo+J+sAErJzwM< z>vaM@x_)*R{-n(oQmdUFwYf{cOys|Or-btpz~=SS@j^FWU)|)5G&k3lC7G6`?{{~d z^Tl=AZ0W=_GzV%`+SdN+2}YRTK;2$BmA{)FDs1!@zZh{*2Nb_S()r9Rk6=2wZt)5Ul;kVT)*CNGUkXJlQ$-Drp#iJvrU4!KdndN6^L);yJ^dRIoe#J2}cJB?_T?V|3{~RB~ zmxY#`EG#XNNV$w8S`D(s4Qdc)Pj9Rlqm=Y-De3(ubl80Js_avSx8bTo_=kl%p2Qj7 zUdEm6XqVHF^H-lzVZ!Y(u-+3gi7iwCR#Z=2zhIAa`L2Oe$`u( z`&k4<#eZ{pO?p3dbab{HTH{0dxQ9_=g)0#+iiCa7j$K26RC(Eq?d|3kMuW}}JCDgn zfxD{({;x=V$XZEyUmEI7jEQm;AX*MRQY3t~{`7u7Np8EgZ`8f;^O6%)eSQ5km5AST z=}u8U9gQMkprxgB8^4y7(jB6x8MQY*#-UWY@q*k$_2(y!_i+<(79uSo8F_Ev-k^~UPLD%d3 zTj)RdKJDF6qjGKboI%5UpLCL`_Bz93ID_JjSURJ-1|>FXLBr8WU#8KKZJa?)hm{Ts zG2x+e<>E69x>e--|IVGPh1@&)J4Ktv0t`3Wnyth*f8-6{DleZw&r*^-N&b0Rb7fQZ zqn<)gnq5V&vL=b=l=fXx4Xnk!qyPWgWi-uD}HAsug%zfY3=EGyl?D# zx=XVL(x0A;w}URVQ^4&O2Zxt(vx0wj8~9$M1< z^xjQ0sVu{3oUdB8R$Gc#7U-E5b4HxxLu0%_$+XJcpRDm+=gC_U>_I-tq%RZ6#7!=% zos7_5_q{1VT1l1BMCOm@aF3Iua*Xd_Gf)=E2u#l?wb1MwFwCsFw6~o5J!r*4k4l(f zvk>Q#&XezL#|-OLfDG2)$}!i^{uBgE)V#y%T6W!9?TT)nx&4^ElF;4(?7Hs+xcA40TPMoTaYqjBT(ymqeUi(!=CoRUm^iIqFDyT)8!V0{MUaJlU zi4B|aq;C6FtSAw%SJHp!%puRNWnFG_MwaZKg)G>?cE&T64@+LFm(l_&*Wx& z)+ClikJ$L020iwHpXmb}JkYc+2AoTuWdpOL@a+v+1qf>iPi$3IrT6RZQk#_DqE?gXqTPlnS2|>6=Qlp zWoT?HTc#0qdJn{tI0E)W5+J()U-{lVwzc&&Yp2W$9IYe~Q53mAmN`gk_1po8<)=?a zcN&!S>YG_@&It~!`5Fu1TB#6K>!K#D+6^FTK0Cj>IbF{|_J8_UF04HV@e-m0M3`PS z&XwJ9J`#CXUb<^$NnwL<|cfr0FJu;n~ zcQE@V(~t6#>{(+- zWrt|N1jQU=X`G?rsv~@-@IFh)dc}KHEG$7kn-^0~sgf{%f+>Qge`W@L>mF~x#Lm87 z@k8;14L-b{qkP70@VC%-!)fniaYVLW6T$*EVMDnKsqGR}FI#h|DMj)otBqDM*3K^&PfJkghHxCGuY z`zWi$CR6A+Ib#R;{NJf)>t4lrT6YS-chI9FE@eo&5`Xm8s-{}a@t^QyljGKh?-KVw zRB^gx{&FPifTL*viv0@nPxR9myR@q`E1!`7lo_Di@;xgSn~b89R#%Pv8(&~X5p~Io z9NF!1`!k}beW6`!<_Lz6J5SoQc(1g@a4Yv;s)X$nwk#|xd@^aYjT``hc4p*XkCd0w z1Nw2llj|reQ#{>`JE`z(vORbxj`73o>!=EL31Jotg<oSxfo07svRoPM9=h&MU7KQOrtHkE6KJj|Wm9HF71*+$_< zw$Kp)Dazcz#}5( z`}^oQ+@{&={=?f%J2r~tF(L(+!yvV*Zo-!`vU?C!N#X8TKcGL>V)pqqU0Ssi%Wag& za`b|)6p4)*q41TdZ2=&C(}cXby1G1|J3~XL4z1*e*Fu1HQ={maUzRjc+=?XLCCr6T z2$xK?01{haTSB&8-Nkb1GCE3%mdTkyi0ksD9}vCljolGCby0xDGV1bC9g9+9B2xSa z6F#?_&f@mw-q<^{d%sH7yECC2vO4#~&I&Vb4p-Fl^%oAyM3A~wE=TkEd|p?YmEtNFd}rsuQ? zpsH{9ahFhiSMow3|V(xEF$Cv5S4jYcXU5Z@Y2RpgC zmM=MN%~mP{%qY_b04&0cXTQ5H$i0EMBYp44W4K}%Tt`s$)QWbYUvE$N2c5VRcZ6- zHmG;TrG352>tL1>wB0D|-|+U^6Gs>X+j7~7-?qxW_>6=Qi$StNtCk_B_#N8|o*^Ep z6oO%1fa5hAp}Sie@mBWrqPrzmwwN{h`;{I#?JJ`9XPblTB`Qpz@7S`2OmD*E8+GcY z2uI2TdY<~5KPe~t_*S~9tvWYt2jR(6Im;+{knuqT2+hCGeR9U3Rijp$2aN3oaH2}} z+Z}oGn#?R$qPz(k=1vra?P}w(uYN0yT5y~pC)@s=RW)caP0<7nrVb>wL} zgQRG!_V)JkI@3qYdL1mdn*m3Iabw&l&}=6QC3{SU>kZq_;9E8ScDX}YMN?(|gl{*A zIOw%Gztkiy`c*1#hz_`E9`dB_+n|#T#?MobrUwiOszry^m&Gs~TwGj(TW^K$^O@t; zg`$BZz()Y+0oZ5U&Le2!cFAK)Xf*ZXzC3`<@Y6~8ReV26-=KP9?xeV-^Urx3pVS(8 zG;zyX>xT{ztX7ybiUVqT&{~U&$ZIyGPMeK|Btc6(26-PIF&pboE1?N}{}TFA%~I3( zcB8K(DLCqp{|1{TFKf!w*^>j-ha}ouE^!)4J~A~|8nm2!yYY3&X_Cwm&@TF#5?1D-tGI27jlLK zKqrJ82YC5g%?9sxHe7w{UKDiy+_Ho{xT%4t_~Q?QV&ZL(3GU#T<5b7tln@8hyXXZb z3ZSs9tV=Kl7aX$2RQ}DRguD-ZntB!t`8P;SH_qqe)4g|#8Qk0jazejup&_*BbhMhV zI+U=*Sr||#fKX>(Y{+1ctk;nSNB=ud2~DJa{x=NdRLI+ zy3>2U&IL$Pe(&!Av$MZ;kWQmoZI{&9=8F+#B#&7;NSkuyY_6wCRc81_*TTX(2E_<~ z72s!&t`Ihm9i{sT!)`-~G}R@iE);SM&2R?8VE)q(RdFGqP6!x#(%H$$PLr4sbA%Z( z-i%tWa|B&*xV`~(qe-B0bv9TA2OB37YVfJE>E0IdbL*6}2a!t+a|Yw5GC147Yt>yk z<_wFCOWfp`K9VL$}1LKUg!F{P-K??1<83*%T($=nI3 zVrtxgWC2kUn=)*fnv2`s`E-KjUn!zP&G}7{_P>rEFL;7BGen!*--LpC_nV;e5Py=>uQ#l z%q-;6KCORlT&ni0FbBk_|7wsYwW>Du1IsuOmZ>sLi4D+y#o`89?2{!|i(h5O%>5rlKJOt7d^q&mE^EvF-55qpT9_bg`Tl-mNRvs zr!x<@d->>kOJ;hw0{?3EKlHAj6kPeJYkcoR_)R533!-n>!bs( z&MbyFRq<^{v>j4{QTu!n?Yf1oy1Ke{h-z11RjulaAcN;r*GLXx%-ji^bQ2^uiwvO! zQpFXKK6$>9;#A*^_La6Ix$w5~>oPxcGbikVaQ!XCbbnsf->#0OSopI%!Vg2ubH&r?s~INO*(Nq6 zCYz${%vI9zzQ~Q6W}-2MW`#1*R?K;_q-^P^Q#ak>dXk4Q{=idG&sOe!J=rni#7{lC z-Mjxc$|bwaxd7_$T8@C3RbD6=2@tgJm6EiHgZEO@I+nCHVL%vE8Q*w4OEs-M?`()Dbcx;q&Iro73gC zVAgoLm@D_1hfMV|R@0xlJo_gMoykh3J5je3>AlfkS04h_cMsz|x>iFhg^C&w{^=py zdTATmdV62z+vl&3HvcTUPe9cQUsw3D)066_Z4rDS1L74$rXXvQh7@I;lF*Ph&mDXT z=rPIT9ctzvf+N@IX~33cvHV_* z+6!&A$J$E5Y1v2; zSiMnpJQY9E?@^2GX51DRJ)Gt?`s{>6Gc1lC)#j@5l>)fTU*K*GO%i_?6wmae2f8j| zf-{Jp`7lSRNbY^*AFn-%6sIx;%OhhzkkhbQo<0Y zJwDd_>DTFvDH(2zEysB0U+-nCi>QDdK97m9T@MTWY*4?#0xysalOJf`jlH})PEEPE zc$iThcIq{L|HX)v=Yzkp>Rf!08f?|1@ut&xr9Fe;cKJ&F(DaK!ggMx}d`93xgnQO| zl~BrzzhE>?(871WmyYJrY*$$i*~aAk8$2$M{?Hg2q*4o`QcJNwg()YnXYIvG+jZlM zRMRi=2HCsq2K9AWO1r)SFjBkyOcB05Za(!XQ8v0tZThLvy}1__;R;Tv-LL;U?*qTs zg1_JeKx9j8&c}}4UqaH99>yUS0Gh6G6Jy@YLPRqd;?(3>-*MJZzkW8OUT{N^sABVa z*gMq{%D;4E*;kbi?r3Xo2c+-rzi&{~5$?{UwYKB$m)*iqQs&&Ma}48rMI$cb%^RIu z-*_@j@@|CUl}6Qa+SEuZYg_5XAu?;mEW|8IB;_;cpzl!35nIuuYZmq_r5=wCk!c8L zB|Wd|TX1x^Ln~WO6F%6#Uk#S(?*sGdNnfUC4I5kU^Iyx3cBFoDel3OA5#$?UZj;Ys z)1rUqZ?YwjT$&liM%HS81GnryMC)mP;_d9DOwGyr_8!D1>rQqQGSlK!uhQse^BP01 z`)+QYsH(GiO|fX6C;D#RnC|0^ynF3et1Z>Ho+JH6F}?p%1kq6J-|%Y&82$WQInu2{ z4kA@PV;O~KEqf`mqShPia_g19R|&X(d-;8L(wod1jy#~=OJ+Q&6(Eq{AL*z~5!#S| z*w>+jVjqu^>2wKMuY#XtkpFaYc^N|iwUigq_iWQ+vhGd6d?%zWRh(C|Q4M1K#-k!S zHD05mu#K1`C(S3aW1ixeBr@@5=TsSykC_dAfsCPIIzw3&(Xt&x=nVz#I^r3hX9_$qW!W)k|#I|s@~b(wxWXTm5&PW)GO^Xc(HEx? zGcU2m|&YTD^{AwH}AdVQ0gAZwg?(JA@+0voD2n)aC0_ zIz!cwlxEnImNez1;NJ?6#J{}MW8%t)EuF9?!!43}9q{PyzvI(m(ucIsW74QQ3&CM$ zXXkredPkeIMnD^4@Nw7OZ0}TajJo!cLV%>=Ge^SWyU!+#w$bJzmscBDI944-Pv1h( zEmZ`PTiycdZwhvK>n6a_b9Y$xZ|F^LcmgT6g{>{@y%yhU3i5^hH<3`=VyZW#=viOR z?B1$pTl4i`4C1f4yupf~8Be+FnU?SoD&l^K;ZWA2A8*F3TW|mj)S3FzsQ7^RKeT61 zBJaZvvv}Gt+eFmPQbEw9-}1d$WTyy1#WI@nm-6+<+>&#@LPo`O(T1^$ZwR;0&`0Rh zE*hsHSJnFCi7yOZMf!9u{xn>(;P7j8HEVSnklgoa2CpxObW@aNFIdrEMvRLN{b>{fd?6m4?}2BJjdM7;LIUo?;kYkqabOB@OpG*^5BYSO@w;PW9}$ z)$G%wGI3H&6v22ZWCSCqY&t`FjVT9-_4*Ar!dC>EfSK1*CF7KN+ZstM@r7`0{a>A4 zM_x>J;e^er4)yf@F)TLCym%134m0)c9wG;8fO>*Ci*Kv*%a)~2B4BK;Dtm)DNd4nC z>iTSJQEnPCP}kgn-t)=&qp+6{CH%hN+r5IXLAT9DE^>iV`ymx#?+_F2Jg8pm?=Tl1 z5u|_npZfT_S4DL1^FW+2!+#2?+F?@$~1tvh5d? z?=X^U(#tf{w0z-DR{!>cFwgqWLT&-r>3DbalocP`E8ru;FE|1Qb!FwUbM@p%68}?Y zL*RAP%?P*D!nV6Sdll{rQHc#HEN~!@e`&{gM5AGHJ}LRgLqsOb zY*4P;9qPSmZo(ARxuL*cz|u7*!j3_#mEvg9dITs*du4F62k9%-uo;prlg6A$o0iOw z7~svYcY4NR`xQo9)C)(~Wc~=1xX9SM!GhdkX|HAz8I!W-G=uV4MhFNzdf%^Me{r-5 z4176vpgn&1g_|RF)#aw+@$;@x#kvze(lV~Z<A39g%UdIA+!!3%_rrqJJtM<)#mto@XsLysCR{nK zN|ki&AJpOJ-V-gFSn6m>b|{e{N#r68)Y-8JY?hoPSRIFMg6S?P!`r&d8KZ(zmtuZp z;X%a~U&i-p0Cym};P8%LjG%OfwL0T5XfoFoMR1~Lwt%nCLlJsS#HtX&s?uTPBUCgQ z*kf|~8tUyj7Dp=wN6Z^7R65=CI|8Hz^^rn zG^qDcMnBKTk9doG*xB&gGFsO5VH| zd#0;y?{lN+dw-#N*m?43(e$;>-XI$--OBLdFvWj*KeloN;PNFM#S;3{pLG_REu?Nn z$`h|6bK3Z`Hde0kkpCB#l0&2J@!8;+7y=ZLj8OBJ#*sV--2sxi(V zF8(|;zd{rb{gd9V)h~T7E&%)AouOdd7*H}y+GO5HYkhS!_(Xi(okEi<=j}?{4~wQ$ z5tb${WS3qm*|1$Qim?}$CWW>U7dMAqLO-1NGnAn<ok)?5fJNAozAKu(I4!H*jqesMD{3n_<*s`{y%JAhitq2M-s#u*? zp6W?Py6G62guJW>YbB0>2EAT?w{b7lxyrQ&h3?*AF5igcsqh1wUDtd1ydQ;f;qQ&U zGXa_SvgEYp%3t71X4&X5`8vJMg})$OT=du&S;gdEIEaZa%qMOKYx2sr^JU!Tj5lR5 z%$x`O2{&d?w`$J*HG0GojJx(SjG-fLR(X!Npr8QGHC1!9nX@|Y`{!0OinMCK zl-nCfkRx7g#1V=1gz%hNR}Z6IAl2`L-^y_ec(EGFHW2 zH;Irqap7~3M%#RwFM1qmpR_MTQW%ES!m_yE?s|?t$ne!SOkFl1bM4ka&R-xS#Q&hf zj6#eaq*a;wzT(>VD20i8AR7q9*o}%u7G7)$ddotr!9l{9 zAuT7KVApxz#b(ORO+*x3_L?dM%TH4Ena^<77`l5MP;?z2x)jY@Fj0|8IOB0!bEU~n z&r&(sM|&~LmB>r{-?im4cJHsRz5O!{vt@C{U##Cu0j#HzZuR$r|4xpQ<=2J;o0d5E zhT&=aHW-kRSxPA7GYV@dUnH5Sk!J{$Sy9egZ;!=@MP6W{aFAgA>*dz3U{KVkTY%qF z+tLC*Y~MIx)3U&zc)~_g!sUSjg+gIF!8`s9NAPnKr7wy0Mx#j@#qB-yjc#eg@2jKqjC<{ zV}(g$pHQ9(7h!7VJPhN!yM4E7{Gg#CfXSb#HB7@TGsVZg1)-9@f^GJ{61?NySYf6< zZ5lGm&LYfnPSYDd``gG2HSejb%&kiwv9 zJIV&g46m(c&W^l!1IJwZ(mxy|yKUSUg*>%OupQ0o;A6G`fR z#eJ9BC|~UIbu!_~ARFZ{wzRx;{j_|>uHT*F&&i1cz-G_e;!oS8+$j%qJ{;mn`q_-b zW3?N?R4Kd0@{%eh7<}s|l4h`Hv8jbU=1!Hl%=?y_)$*0&G4!RIU`qiC9ne?M11aVR zw?**dTg1`5OTjsB$}bv$O?m*ld-Ac26_s;iYRWr+k}aGSFw z57^Ao5^4Ng%29x#ftw`Z-LU&fkA{R8-fo>b-%6W4v24D5ey&<|vx@>Ez87p4CUEf~ zA~Sm@VQQW=wf#YlYBv?qAmK_e$b$(m`K%qJb4Os3KaAAIPRrET_)#kqVc30(CElh| zi}l1y$R?cue%VB;!EAvVl#co}azT#pxG%;|Pu@qG+n@~o{%j@2Uv18R?;mvode&Y# zIy#0T&;)8C7IUxCQx4}vnfsM5I2^C{1l|Nu41=*zb5)r5Dn}yo(9%z&2rnn9X>S{Z zW}&Ram=~w9MnIrz8JaC&w*flJ>pbbr+O!~yTSd9Zq;8@2Pq{Y*@&LDvj!sAnZ`%vm zwBj2=a{JOzb|JCLPin<9G%i`mW)~w5I=@)rcZ^k}KLggl4nhvZ2hZJOh$Q;C6vk-~ ztFc%0Mc-F#w$&Qw(VIEQ?zA2!r` zxAWejDHh1!o}L~j5vpPR?6{z@%Ph2uy3f>OkO{>my*~&e7nFN#&gFnig^(AWeV#L% zzFa}RxH2g29lxyCRxOLiL=gkBeq7NZyNb1%WSkUngxjF-Y3?Tv_D`6n`HGK?es(FE z@+-=DPKn@#lmvrIO3zzX8%)28Vp$G66cH~c-MV+b+9rb5-;gFmmD}e(f57fL6u)1Z z>b)}k*37XdfD2gNL{P#91)bBlfzd`x5#yAK+3anB8l5^1!%wI8%-Oy88`_%y)DjYm zk7T9Dm5*8R>DTMjiFTUyT}XtG1=puo_=-%;Ikb`ot><*mC*k0e6`$soo5gfuPOxJSWs9e{VCv ztvlp^c$IMEy=QNGQ(icVuVV3cLHHLuEF<13a@+-W9spKAslV;-Gvud;Wv0MtK0b{hjg7OJ}J`$Hv9#nn!POXiE7m?d-uH)f}yl>$6iqH zzAICyImm$Ex;=jZ^>W)|$}EI)Z$&VcW-5@>f5tuwZ}v<1-{Co78J3$0J`%;MBsqG) zr%6HizV$aG2`KFxM^SoR6`}9`Vjp#ic^mt#w;j`nr+VhM(rR3M!@muu(rO(e`g40q zi&v?T!<1Va3Mid{HfNRUw@d4nvJEytHdC%V;Gh>Gg!cJ1(dPfE?5pNgWM_X7r_F*m zUX#E$PyH*1ByL!;`bG*ak62l7XlVltwvO*Z$YnKE08_RAZ;b2qDyHSgY4 z64g=JQN8!%dhzMPh~0aYphenuT?_yDds;r}E~B>%`IqCHd%h_BwY;ryE;bR~)G7VF zOQLW9%LJ1LFCXl(t%r+wuO- zyjK}@x{W{v!oQaVLQb$vhcNo;jlZ{br|Tty&}zYz+l8#n9E4!F$tkH&ty(MlWf=6p zYprk!=Gbs#lC=GgeU3;)*hOH`jqls zps!kc(9Z5O3pZm5RmyPe2Xr9tvaR8#W`Wq^dOzI^tH|PfA7-6*F>&`@VsE#iPsMP} z@IHsz^eKE>U_J3ejU0PW9QIUu;EtiF8s0ZCrAPX{qA>EZ+L)M&`4ITU-fX)Q5i~VF z+>L%VCyH`Uc#iXhIzrCk!XDzCOV4$6bsP1w7bcnSqs>b-SPH>)<4E~ve0V;^2tuox z61$vA?(gxn+A5cvfN8L3()&z<-Yk$@@|J5f8_O9Y;=G>o^lpnFryP-9b&ljVM%A~> z9L#)YKwZh6dZQGOG3&VVBlF@oOWV3kN0Am8K!lU^zLL9M?rgfADcT(3X$b1ZD`a6) zMw`&vuvaT>yTq?v6J>0e^%fMefm3FEDr;U(4H8<)_`^I@K=%3HAgcOnm=U027;QWq zf1Zld9HbRCH^S*bt$vJbN;%5)0n4$KT&XhsDwhY_e5K7OA@lTyV6ZQN#;pl8h`Fls zf=Z3@_{&&vZ0xS*=JxqlD%rFnfyu2~&@GvIOXJqb_kfMsoJddYqZ&zqkYwMU8q`n zxYU<+#|^%N$fCm!yy98n;TPbIT19NS#n#tz=2ndg7fr4J_PfWT>7P43@>KV?RBOb} zNppQ~yZooT6lmjzs@;c&+so6&#>VIR$HzzITaS0O+Ub|%ncrcC0vAOfFYdj9R<)y* znVMBIp43O-MBYEAr`uy$?4O-q-rwJo0w%W(AjluLL1OA# zPBWFHvCZK!zDptHGV(h*T&R1Q$UA%!{L|(Ygd9gN8|CmwQ1v~`P*P34=~gGLdkf83 zuVf0wNAp4Lrt&w-kx!Rg`^s*KZZ+39->1gLa-GJKY4qmfZ!kQcUWb>2V9Rgbt1GPr z$I15j=J?3Tr}wejdUCndvObp`mLc6Dp{K>DMNg{oka~nF_nX@wT=MIq>j3+{^(is# z)P!63Wx*`eo*n+N;-R=tFOUhdtr?@uzgO8~UJw&%(oIktf=1M>id>HVF{trRVH4B= zqW&i*X#xuNAbgR?j0b)Vpb8UF5DAkCI>IEFf2vs4UcX{Q`iA2J@nap+qe{PCcGhwm zr<$waRGsK7#qNQ^wI=nIxBt|Hx=_lnC4kAdsPIe3Jnw*qMM)t5X!Pnh@8^37Hm&aS zMZ+51I@6KqU0p5*Mw%Rdit@IU0kg1x9xi*K{AQu!q!h&StMuva{`c1UT6Pi0nX?et z_LUzUp0HAT^60@b&&_WrN3Bp3;j-I1s}5TEDqa=RSGm!VSDuVy+_?5!)IMbz8_C-| zop`n_fIH3mEtP6bW|z*fzWcYP{8Cft=dH8Pj=f^~2=w$i;H%dGAuC4-b&{MblE6r_ zQ%JzUel=wsHU(&qRIuhIOT^$c{JXz$=Z~(*VBJzTCd9JMZ(%`# z26?QY6iL0p$&tWR41o>mNdi{a>bknR*1J4*$6~h6|Cy9&NVF_H;57Az2(MWs(yCf~ zHwQ&>V%%`22Hh$VA|~=e$dh6KY3M5mt1|~5&TFV>vL7@Q?`f;wTq@uh&$8V9RlNAd zpvZFr+rPO(pNg)5Ca0VU#Lqai@laqF^q8Esy0jZorwreGTwpU`XYVlmM*wQt#-lA( zr+oX|oII&6oXnOr){~W$g@--pXUUfbv1hM?`8QvRaK~rHVbhJv)^rpojL_ra=SgG- ze$^zVS4}~QN&rq2od4EoL zGIju{=_*qIBdvn>D-(zkJsm&c7up<_LYkCYxJ4!UATJLX@49Q{rWFe|RleUjk}N;h z$0u{`iI)BGf18!+m7mHnAna-;9vM@JAG?qHHAe zP^+Hh+7e&kGJ%FblQnz8X5>OnE6A3Jm$$@oOUU_Uv=bKS+26jX*mXvitG#sXxhCOX zd=pAUz)g8l7q;gqZh-SBp!M7TYh+|3l8B4d01viT*Xn0&HpWcmSqZk+;J373ss1lc z9g||Td1?cxm57Oyuo9uU)Hr1O^a#$k6f3-CuW(`nWCSj0zkwUfX%|UGz9CEPe}*6p zIF&hnYB+*T6-g7zZR9h3pS|zHR1ou}iNZG{AN>31{IFE=ocD({I1@0xnrvAzy$!hx z7;IUXfY9gJ$HV6!F~k1+>)cu9Vb?vTP)|pk(8>UHf+GwAN8znqe)0!Hsg5nlZ6S(B zze`7w3Z4!OE`eE=a2vi%OsWW$t%O?(e;C&~jnMt~t~B1`BP<5}mZk4eSfo2w=jA_} zIb2rwtBul7UEpC=Pr{VJ%O@UXxy0jzV^7HaBh|}l>#M`JY+}7^YXt)vpc2PFP&#E`hZMHZBQV^g2Sv^ZmjW}Qf%-nlci!hiN1 zm`%}7x1RPM0+S+=?ah%v?C{6mN(8N@=vYbgto5&)_Qc#;U5q@N54+%~?Pz0bhF%#W68t++4mg$fE?EiUpu5yY6Wet(Wcp!VPy z=+_UtDbrJd**Uv}H?32&m^uRS$>T+trG&C(Ip6NIvSw&%`m9)M^rV)~;ArmlX;f< z$2DD{u>ma@lVr^>iqVi-dB=Rp%gjz|(FP_`zhYlyXj0FB8+tpK^HPY?r1m{aG6AQQ zQP7dIKwD&=yHgl1wmiL?w0wFMk3i%*meN$44Rd5GvVMdzTZw!r7)n87XF{$J5wR)-@I>_r#V1#lYG>Ju@H7JxH5U&*yx`3LKVI?yzKS4%{q9gYch)ZC?-!~ z37d3wYY4|OBVax&2Ui`Jn$&JSER)3ZY~$~mv2kqd?pSjv7QWG4Sh%KksPe8jy4w;E($g`o@fcJ$t3pUbQpllJw_1Kae!d6| zZon=ALHt#@{MFkYO5(qP_5S+vg}D!z8S;C29XXN6xH6e*P~o8ZeeOx>DJt65L^K}u z5*mCI_C4EJbWTj^j2(Ivdy8mLD3M@M;YmH}gxZu#k3~nLR?3JWLoA6*tCtQ^jDQG= z1-us8Z@KzvkzOg0kEn=RTm?*nLAE3*86<6hkgSj+vWRhdJ8JW$tA4PkNIB*nZylT% zOb)*X41LX%=(UI2n_S14&YT)74r$Cn@e-qoMZGYtu|mIzS!8UN>>zs<0% zDBolnFY1t>UbdvVAf#B*k|KYy6bm5@^D~bu{?O2-*SQ+(B+~bjk~QCb@@;dLlhKe0UwRobDRbsEw`l?fnYO5T< zUTEuI?~YQQhP&RlJg-Vtzs0M<(*8}ic&MuKKz6k|GYk_;tq6N1i;0r}k>mgkx0RAn zBv%dWP#9!~V<04B<0EpYhVNEnn_1-Xq1$0k50r(6^CCoV6N0C};HiEAr19kNd4ZT{ zWOB=CdWn?RJkm(E6e2qcgUAPN(FY-2SKH;s&o0k<_v?2w6 znwjQeB_A|cq~@^C_Yq;~d$tz(x}q2i04`{Xe;cKG?pDo}($1TP{CG&*)<5%#*0uIY}4de`UOTi@R6#_@@yXJYvohGZlj zHvts9eDf!rH{qbvEdgVpp^Hp;8*ABDjL)?+iX$9`8#M>X~D&t1|&pPvE@(gi6P>HndikJFcoIa2fG+XIJB8Qh;P3F8=d-8Q zg6A$_>h%X3TVGRZuVt`z3Qvh@S~QkbcnZVjFrKKgxeaUT_Ypn`XriU-HX=FE$SiTl zX9+fBit+bHBxZSwO{DHPLSV2h{xB{^2K9Qd5VBr&80Wncn35rp5-H=cYHl-kaCaj} z{||C%C9lBj_ML5hcoWzNYF>$$j2p%b{&`a*oN+*njXIds-ghIPHSXGb|GeP+nB32s zlX@g3g&OVU-yQ0IfQE!jG~$O^>>j(_&LJS~GP_$yuRI$Nc)yY25)$;-*YS5?c-?tD z^mA+O#23x#q{rjH+$2;U0keD|%;;!_xU@KIA=_z`utaHC*nogcI*lqaGSVzWGQBcv zD7A_=-3);UJKug_8mtmx6tFMkNCKp#p9!TTDwK6M zC^je%5%UC2B&M5@^_f6c)3eC#-%A~_+bm1%^}rL-i}(KykNR-GJuAv6ZZEh79X(r< zEw;|tqm2g#9r#-fWgk;6xzA4slopUTbFjDG;6B&kh1|V)eoRVf2yXZN)y6zXB{xWQ zC-00rH+s&SQ#q23-Z?bjAC1hbhe-3v?2yEZ37?sF77{_5Oh1pz`gN%6K!`?*!Q79I zfjHmi!EKg!Bzqf)OuYB>`?>xYat1=`5LjSJbUx96io(cl8aX*IWYQkA>j6?(#SzZp6n_HEZS^U<DJr!VkWm-^{Oxc%gDZO6?F_ixw!-@iN*tpsRTdgN$O6)XEN4%}30Y%{W41<=5N zSr~6JMEE3nTP3o}aahnS8zJB452rq6EVex%EhhL21nCVn*a+!6uX7F~wp7J*|G-x{ z=G}9GjzlmcCw=l|fbl-?yA113tjXi{DzM?mIz)VX%mE083QnRUj}`*2Vc1J@r8Zpl zNuJ;{v*XA=Q%~)A=s#YrKdt?AKcbF^+&2%fidrH&N( z9ziicgk;Ykm%hRg*;d#lZi+SMK^@%K06L#NpqtIL?uM<$@3^}jn`cJsCr#t~z*TO@ zm3*qC>SjlVHl8dhgoIy-Apj~uu%|#GC>=xv^Q1_tP`^)F31xgLwiPbIa($lEYyVAo zz7lmHuN73%cdJCP9-d<9kxgCusniqI>f6hc>*vXylJy5_s@~8W-xQy}g^`27e<=T0 zY^9`HBM6AAVWnf^+aq!z3kV2!x$)TLg@L3ai1SAJqr!&5AxIFb4Z6rU#-eNlq3!8B zTv`DwtJpN!MZR2AvjbGf|+~V15qsar2v9!&*f!Wm0#T=Hy z#iIfO(0&@T_nvN(rH(J*w0V(ST|3zcSOUre_VUd>!061|1m_W zSpP`Bok3s#W%$-kimRKBo{J`DGN=3vVd5KU8?Y|u340>~4mw@CZ-44KuJi2;^$T5J zT3s44hk-K8BCs*O;-2jiWO1=S+h>omp%4uddu3M+%Wmy<@e@hJV=E$p$Da*x!)y`B zVH+wLH~IM3wPqt=v^fFDBq&Yl^KN5-^)RWRZC{oe#!`l-%6BV#Wxo{mjNu!Ydq3mX zFuf`sazZ=Sep$?+*LG4!%6y+$!tLG9AktghdiRSH(7gMc=fEC~m-WV-53X<1FnDr@ znFCO*q|oM&^>9aQrAnowIq2|LC&;RQYl0NO$)|+0rAc??z9&XqkLzo_0gre-ZKuM4 z_bUR2e+Em`Q{(VA4tOQ#qK3X-pqIl~!Z`Hrew^F-C7Z+gUaV4zn@xhjeCTN)vuOyb z@%HfOJumsNs`>Cdh741xP2P7N@y-}X#xSRMBhlZH@2+=t=PxB*RVd@_g`rw)NU-(G zpsET#g-#P93}h!xIGIy~Ty3uN{XTrow6}0ta1?hNyJm>8agYcKD!5GCZ64#^NhTf- z%|11>lR`t57Qk)%v->E^P_)%au@8Rn90l~_bYYb378P3pKNj66 zeuwSK9Z8@dA*iDJhg>qoj5RqaWD~ErTX4!?Ht@PNNY4p)6-jS{NQY|)26^=?mO$gb zTyfu`qH-noXauZY*q;B%eP@Zkv2=lxMSWEUolhnsqiweCoeF~>rM%i-x=@Hi5H(k5 zE^E6_D0w*kY4Ic+dU{IjKIF=`;m1wfymLi4+6Sg_|82zt{vv~<3~rYAgiD3{e1rx) zd47ZEvTEr6&+KJUInuvNjC2S{@4X7L!Ys-bha}y1cSlrVE-~BY2KrPf4m@opQBA|_ zfq%_CTmQ)7DegJ4Yg@yHz}QKHdi;<}>l|L9)PDQKBCznr*1xYX#Oe0}xW(TIt@H=< z0~k>xuF|Z{^idfQ6_C^T!$wjWF=QyD69~bYn6Fec(FwJ;!Jh(S(WoD`@Y+s|9>pup zgC-EQ)J_lOk?BoU26AWcanShoLjs@L+r)oAWgI*DPPwl4Mn?7+t2`2X`z4?IGp!jM z!8p$UB!igxST%L_CX#oUV%^=WaK%VgI3r#0D$OJhGk5Dd-fWoVVic_}u~sf~a%9@GxWDT% zgMPMA4CPJWX&^ybnxpk%`fApK^7SOu)lV}XViIzN8T7a+^~^l6ewC7|t}96!J|acM zOig0R)Y90za0#gh9%<~Vz|O9K)5B%{Og94SNzDN3Qb+ zu9M*@!QwQsDdedz%lpEU`{|{J;ydp~2W|GPht{QOs;&#Z*rHG!LM=4U^lrd4bv_BB``B1>dB%s+&|OZ zvCVvmxn_E4`38SfqBt$E!hTfXU`NF+e-Km!Pmv1b2RGlH_dULOw!67Fv1Qlw5kKRi zcxQW`23x#ijlO)j#r5A@AO|+a=&s0=X zYVBfoLj~MozPq!3vl6DL1uqox*-Je;=`lcs2JHNeinKh-{+$mSi{+-z`;RH>|IQ*` zUO#rVH{}*d;g@kCOlrSPPfMwgc*%*rn#M?WF(zzrn}t+5zmN?MKm*YXZ)|Lc_)303 z3;8RH8bjdg+Y-BTnj)ql=$DR6h+`w}E6%ct1drBdx9{ zs5qw~V`LmJ&|~T=W-?;IL=1dx%hTJZ&u0a`y^mc_XIc!4o?(pNn9_g zcB@5%LfkHv1MpTgGr!x{a^i7R5 zY@CQ8e%KKbIkiAT%s4txVUG6ads+JK#K;>2p^Fc0%J632eT0!CF}^thaXPcj&{E^@@*G8(EQ#a3tV^BF$%dt+!)& zjn~XYY;3RBI}t@d5{R@OSn9tQ>XKxXLkguwLUy>c%}ynM<`LznqqX@u@DyFPd*a)8-0MZFn;IY% z{)g)83y*1(#nZL!=ZTl6YkrTLPsYi)^aE8@{G-Y9QrzEZ!X-|s3@-*EBMtA1azl@i z^!W7YCG@uCPdXQnis|?@Ut3A>J zKMW$olI7%wI-jOV9-g?cjKSMA=F{N2J6r1D&b9A?EZ~~O?$Hl}W)tT-R5qHo}6BLWJ#09F2J?-=D9a0$9zYaOpA@n6*I!trdw1__?3A zC`ja64kAmsFH6K9{tWuI|83~wW~KV)Lp4NjG6=l?d)RRiNm znC)s2tS!YS3V93+&X==LbSz)|Zf<<3kMq-KFi^ApSURg(V(f3$hV$^l^Bp*1JFctkpufNeLd6F~r`}^&{>VkIho||ux zD=BibGO-+~e&I6p15OTGFDJs;Z^&@gy2WH;Wx%CEU%Jbq<&Tyq1w}k&BoCHN+rglQ z&Y$WB;_CO=3wiW8Xsc*r^8C@muBce082L^yOsdfcF`)Sug~@z>Y#&u(BgzqZY1yV@ zX=)f9KVs%_fBtu+BhumRTKqwd@kY0gekz25dUEk}JpiIl!GZr(>Ifu@G(!?^mQZp@ zQ1N(TI9po7RjC%!wiI?y)3+kX zY`Ypra3I!b_D93!ZMO9b`~ zEi2;jOym8>PT~A`YX`nvoRe|B)l$>P`v+GZ-rb+JbJIf*C5R@gA0>C-2SB?bSM(xC zT9*46GVXwGRFVuG9?8SqG6?7ZIqi2iQBR!i`jkCF)ZNit^SJ!)(*Nw)JCp<4waofG zp0Qu*elGh;$&Ozaz`>gkCMC2@gOplm4B$}>UyV?41t(->NKJ52!O=s!X;*mBx^#57 z7w4xh0vG0fwtqfzNr(u}yI1djeD^o+-~9BM+y2 zKIgyC43}x%wJ2TxLDuNdBRXDTnQ6CUOJ8zOW1`;dc)1-CaA;`D- z2V0HPr#bti!C1qjT|#7aGr>~;fsNPICa6X*61*b>M}S1otVL=YEUE?=O;E=gRpXHs zK$~i?R`7x0>Ht2z_oD9K{w5YL{)u0IX6;;#RRUqQKbxK&o=lr&4yA}hrR3E5~M854hHN_0NdeG zj!@0*FeqBloX`}uhh$16!)NHwlvKrr+kQqf$1fTbo21vqrju6qrbQAD&o!#i$WEll zSOnns@G*`a?Qc(;X2nmoC+C;wJUqhj@v#wx!FFmH$H63LgPUnd^EcFqlp{0)=uDgo z_5p_4B|5fONM&$44ViR3Q(#yU3}teJo>frzHz1t(Jn70A0>S5n%USRP6?hWcbt-nm zOU7@ZS%ky6Z)*)o_U2wmY$%UFf#3kImfgaDf_YqE78|UL2rk%C6BR64!O??#Z0_%4 zvuVy3G(R~w2?viJ^P*WGi6BwRtWUcioMem50q179eNre7116jr+1O<~(SzX2L)W2t zS2L|+nT(`^#Zq+dPJ3i%nQ5SX=*b$u+}*(gCIT45cE`HZLNs>FIc7p7gqk?-NP;>> zVnQ19NQ-kNGb3qc61WUa#1=yD#7nGRLN*rH|N^yC<)CnuUxRDUk2I$OHc z>G5oQcyQzvi-p;V?DKM5(Zt7r8UvL zy&fb`>+}~&hCZ#{w69Clqe+Y&Jt}fJE>Iv*cGOZh6*xF}I8<4pj>;iAC6Ep>$Vf3b{GaJ_&LOom@r?oNb^%L z7D%2zVT@2!P!Lkvf|AJL84cz9j#kC=?JUh35hAQ+Bq}Y%`mtkQ$b5?Kq{!5LnH=ykGcwoQM#YcC55yJ zGHZ~U7OHYi$PNK$Fm31UO4~Fp#b}xbQY4Kz!ExQaxJ2>SK8Qi7J5G@wtRsdeHL1Aj zplwvN#L~sCqaq{3r&a>!+VD@JRp{x1|JLQ~;w=&Vk8UDw|&`6X$-U^x3db2IU#fo2#T1@p)n8W_S`n z7!YS0*Tohb6%st!;E-~XLY-7i*quD>j(b0jCMq@-fpTU!&b`F#T z%BI$#6hV@ZM6qZ9WVs-TbjK^l2(%F@>70&M1;?1`6s1zNx}yWa)KXO$P*=F%oS7He zwW379q)UpZ;)KOy6#qa*#V8B_f+?>8aaLg2?)5|nWZ-~NECfo(s;pcJNXAZ82lXZa zNs%N%H4VBj<_#o{piEG2iY_k!qY&U%SAf+KsPgda?XIjV)EldqUf#ymg>9^!c-(#e zCgx2<)0`S&<2`E67&(Wum?Mg@D70yj#ME4o8h9QdI1f%K!%S>DI$7QQS3g>_|3Q<) zC#4WVO;zPE*9Mg4r~oi|NTyE!7Oc`7W)s{))Y?p(8^FwLC4vYl1xBiMrL^Gyn6H;ohND+%Rg21Squ?nE(A?u_CYlWH({b|+85$`?Rs6rEfnKocrK#4)# z${NQe-eoX+yEupHg9)JuCslAKDw0x4c}IC9NqO}HUNX?EnjJE7r@c7!GaCvbiWZW! z5P%Tn;b6IQ-mwa7L3Co++-(;H8dXSY5Mz-a0Fy9+x;*t<>~6J2v{4Z$gAv{ZcpF-~hQI<#8*HVzl1(-p> zfr1B|1357TG!#)HC<5Xfh@5eoK=4&f=MqQ&$_y1zh!B)LVq`RJV{I2Oyk<`urrbfu z&;S>t$MlI!rY?dQVoEf$IV0_Bx(uG{kSb|+t2ucvLT%IN95HGT#xS~LOc4?zkWwd7 z>sn)q4s=k>Wa;icwm&xmCVNt2sB@-BmY!q>aWKJgWl&zpm!`f~E*<1X39*o^mI^i==bOb~4SHK|&&mm@Kl6P43NN35|5aPkLmhz-Wcb zBAJQZYU!v0G3z7CL-sgpUSbqV2YWCpRgJaD7?bfB!Fl*5!7o~yIN&@|c9epo4&X~! zA^^#ZKsEj;!y39o&VY_ABLE?5R&tHW#)L=d=;#u1pZ{3YVdi%i$aRfsvpRK|%VV5a zq3jCQNh1Jd%5pO9Oq#s&dJcD_fIx?9>*K@C&9yYDM_6c$@o0=D60iUynjZv}RXfl% z7Y4m8WE}`qx!)$G29^H7FabdsVTsqOsFhGBAT$w<763I!iv*ds*@nzqBWQ`y2XL|- z2WOeBsv$N6WOt78Gf7|iNY5_dJh>H_iC(x_l9!zQTQ3Om%<$azK~-}`Ox*KeWm$Ae z%pgbL;DO+wIhej0hjZyg0(kh`i+ex$mG6G%x8a zFBwuRMiHH90uabq3hxLWiav^_*Pl|F3xq*k8H~SX9|*gvdG? zLl%Ob;VyOSmmN?!pss*P4O9VOh9^EJ(hgyM@#@7N{PKVHo#zkkJ>I!{di&~wdv}py zCN4S7M@}Ika|W!nZzE-pzzbV}Uy>16Fv|mQxs?=%5tL9BOU{fERRFvwoSKViCMQLRnMc@Ho9i}MO3m>qmzCsEye9?>=eN%`op7JO!} zSutIBEspGXbShv4DkVEErRTvEw`ER>AV5Wi(LTq0){@ zP6pcd-ss)o)4Gbqh+Iq6CRma;Q#rKYTrCRdnwIk2U5#->s>`UUl~ zBy$Eil%15Lty7V6MufGqx9Avulpm}y1adc&hHWr(i)N_mW;XetgX=Qb{xl$@K~h6W zp)BZ>ie_zxNQ&ebs~5Mhv9om;>ag%lYR->*MN*y2jz*`a$MDLS`Vkskphdz$TU)Ve zln5ggYX?ZXVwf=KE1F{14#Yr)-gpwzYiQq2PF*Xklmx{h!9a&Zwup2n5vS!*p@zmN zgtVh<6>y-F#+CcBnDn9`Qu(ANOIC;npEqzHag-Ar3uEtJP=YP!77TJ(dO=A)W0Q2Y@RvA`zF_BML0_NXtaCLWhQ}i4pqHWE^jjC z&OE{Z{$9=1(`t2@ra}Y}GL!vMLUf|BGt9qiYanKHg2d)gzyr!=VJiqCgj3EV7+zgw z*bCST$P;8`q_nm3F;$cIQq#6x{JCYV@Pzqzb@FJkwL14JH8^_s=uuNZiY<~PFwAYr zK{~*^@K#Im(`!O#NgFbxatsNvWC8;pqB6#Jpseqi?nNa+ zMgLD{JdCtAqv$A`z3g162StWIPd6Cd<&r}LjVu6m2%bS446k+`ezM}iWHqRQo0F4s zWe6|`GG3ePZ|-g%Pq)_b==1^5G9V1j7G2g+FpydcFQsdHaVKqaU0H$wdrk*grlB58 zMHxlQG!j~-fzZ%FrbrZY8JNA(O-wzHv)3n)CCC$Jx(@eXb}#mdEt^XbO=+yy5V1rrX&RzT7KVPWYF(txp(7^v4(m!qO*9 z5vW&4(*SwuRzcEEPTq-thJxKe^StNJYM0ec352UQ+nbGx~G z{pBBBxV-xl7plnY&ey_BnuJh?ThCtK``&Y}z4X(KogGXjtEjm`4UdYPF|!5Pyw4yf zLshZ`wdk3oMhCAx@cNWNHA?|JYvVF7J)*&6jgE!T`LqmA$1Fh2JJI}cO3kkwU6OcU zgh6E>H~M-u=Q}O|9 z_LJxHQZG=JldUV;e|+ur>wk9fnO$tIZDQgk7*oKAJ*r}`fNZ48XOaiBbouKTXM-VLd9P zi(QaVwb{_90aV`TBvp<1bZzD?UwIp&m7C?=o$t5^2GSzIkHVepy-ROjzIyfE!@IXG z9zT8nZ4c4L77K|+{mb`DCr{I!1wQ1EmaLBOq$Hir>_j}}&jUNT<$H2)i7xrCp8e`N z7!^UqLWsH=k-C&dJ5vnmj0Xxtm$BBqS@Be&h4#1skaB;uazGWpH6e`y(%KZ&l}ii1 zwRwQ-H39&h&*^j(h_if*A~R;|I~#9bd-27$AANr7;>m*tNV9z$$0K+mh;wi-ey!U1*>=!JoSppE_!RzU z?WZri^!$$wKe_cAvj_M5@#9Z%a$2%hZ|YpJE=Wi7Cx*-Vc^c>p8E1FvAUg8p0pwwl z@|5{+LmQYO1*>ya9*k4zIvWFBWvPFM3!&>g~dmc z=Y@v_lNC}sOs_uk>D9Ns{jXLwE`BgvKIauhQYE!X!HD*7IZ1~DhT^{YAeR;R+0!ho_ zRil(FCrW+Us-4JaCE{xz^fO!8rG*FmXYAp>^55FM{^CZuKih0RO1OP` z2SO%-32c+&$^oa6xjY>Vqf3JtI$i%#;PeS}f|hQq?DUtr9i0GA&)l`$@lvD#obTyA za(Z?~)nIJn@R-IxvE190Wowo$bG6k$-9%LLvx5&1A3%W+#uapRgmh^;?tJT;f3Uvy z;_nKo2icJ!cUZp)b9y33n~>TT%$!!&)<1am%I@#Cdk%cmMtD+QaW2-+A!-m3XjrkdB~VG|*-SO3}v4Cu4H6a~;8o zim~n)r4yS+c^q*Mt#K16*(c<@h4!CV&W(sJqwTK0DB z+^h=K1f83R&w=!V-RhY^UJ*tLUST|TfBu zDS8?Jx^%44Q>dRyfgK#rG{A9b*v-k4?i9rYZCP?p1n~|SRlqc$oqC*(Jov&zJpZe| zfh%vkMdU}LvK}*kqPr*jSFst%F_tDZ5rE(xUb=qmdzbFrdF}M{c#D!;K7D+M`SA(n zM+YE^HtmKTGzn6kQKg;qI1d=h{%sgGka2c54!E+C#}9UcVCV@XA zqNM=patn?+d_B(>p{1{_oTrgg44rsjwL-gE;b_cAn;Y2u&Uf#=`kR06Psdw3pD%zP zCF5%2Z13i)yCcv3nSjyS$|qM}e)0b}Jv@3Qp3Z;k*%x1!R^H*xXCLF?gWHI)g?9|~ zE~6iXsAa_FQa9-U1rq$MmV)i5M5gsfi8@`$Qh=Uv-IX$d^QA^-+G0!FTAqBn!#lEv z8w)s&-1^E$4?BCmV-Hy$0h?pYCJx8r8auDQvH$$v`FsClkydKR`U+%YjAjy0?_HZe`)j}PdpmFZ(*J;J@?#q>C7EoIh&u9-F$4cv z2Z2HrVN~z$zWCg~jq`TxlO!vY;x~5pu7Y)jJ2mk5(L z`V`xjo|-kVThe7Kv*q)3*<1<347p>rYj#+sZscI1r-1NSW;zr#GTWG%qF@7g4_8;< zNd=vbfYmYLB%r!{VZQsFU-|b}-};sR$*peusr3A4Wlfxo&1}My;hcZXfwY2O$Ez!! z?7i~h|28{58Xp}#LEQ?L{ls?4Uxw<>XSW`zxF^DF2Q(x z`pNaTUi-&Yjrh^q@BDV7?Hf~O=T|q8CaZ9F?m-?O!5y8#cdUIgDhzB4JTrVKBOJ1= zm`YDYWFsegCQwwgQJ`EQgxq~e0_3EsIR9xrx*hq9wDgwPxhI7(?oX4#C37Gl%JROv z+w5+)*~=sjtq5A*z>OWMx`GcCq^hu3sWD$0W3fGjd+w5KzItu{nQ#C4_t&pn`<|rq z2<*!eOM@IPoy|o4Mgp0KhUs);lUJ4h=Kf83b5vDy$um|~RxrQw0PWp< z=+Oz{;snh?Aksqfn1w=$i%Q6f1k-Pj?~EVJyq!~HF1iwiyKB3vw!LcGwr$(CZQHhO z+qUhmKI>PU+$Fh9GBcTH-a+tpZ0nPMtf1FxFMDyqOSeQt0DtIrNAJn&-(ms=X;a-mEzg_ z;wOchuP9sL@mu0*9B*PNdAQv4n(O(w{GAr2_4wUtv-ABq9T&rk!*OO5(cT*VIuOFS z-5Z-A6fz7Vfa;AfWs%X~8G+BWIkX~}J(X0g#jw)8rosEWF1gfZ1}yJ};F!xZfyp6= z)aJ5u7hOw8(5$hSG2F?Kj2>=!N$hpB6I)41_JV4Fg;-`;R|CDW%SzY%`a$ls2Uzjz zb-J1PU5H!tg)TpS0QD<~>&xJW_jJ097rnY-d)4)N$#c*VsrlyXe1G`t!#OI<)m0xd zHvzl(fF8Xv!olSh%$)0g0{<}%ZBEznIFLTlGhr(qglT+u)ku~EJ}q@R4m39-k0fQU zWvgwIrlM^bpZp&C+ZJEWPeYUqTzMAJp?RtV4spkQIRX7OiK^~m&Wid37kF!H^!<{? z+w-y7_PZA4W%r}Rw&|&sz?l7k{tLi{GnVxQ3S6~XLa6Kgxa52J*Q2fW^!If&=FPWd zhflk#ymnK2=u|RfVFGpL0O@!i)Rz%r1Wa??oeX^7OyWou$OdflSfNuw0B69%UK9DE zw3RWdx`(+vY8!`YemRf=E_OGUUS1Sm;kBgbdP;|EF!FuEpBjR%Rzaq8e?_JF3Z)qv zZ)O&9WhH0iV~XAnFn!hcMNfC_bClQac{IlvHPO`nv&Iw8ktrXtn)EP3J;(jY<#L0k z-P!)MduI3hjL-cAIHhjdsD4}lrCT4iZ}I*1lmeT!pm8*; z)jGzN=Gy0GVDgYyOsE_kA_fqxR#*m+|Eg-6U3NF^~8D&ey9N zK!Z<7TA`+Dcijt^9J+9R+KHJ;`~8V=+xzKiv-A1!%+9HP;12YLK?kPbl)nP9&94m+ zeez<8aD<5oHA{pMb&kYCEs9Z~;+eUw*q!?tFVuoeZ^<&83jr^KowdcI{L73%aN9_- z9XDogMID~RV9J|cVRgQW`jBxG6mv!Y4Y-`@d*a0;Us`@mg$h?n z(=gR)wU#+w4dv@tG_r1UR$>w`BFqZebc|F^6W)EOb z_fQ0Shopz%6)|t|SH@cwWoLOal|<49hhR#&TKB|#%HQv>&aKU!`h&*Bm=pAdMx{4k zQEzcg4Xi_GpX-;xO}xrd-wM66J!ouZ=I3*FiGQQ*b@S$0+x`4G(BURxF)#_c62HT6 zSikja+)@gOObC|XiDe)_lDqX?YC<-eh6A#LxGvpZ*VFkbN-Zufmah0+!oETvg-F|4;072~ zi+~isN<>rGGEVYeVy6X{h`Uy|9ga7|k;SZN2Gpz)+wx(?L(kH=Ik)n!hPI_|sVk#mBge-Af3FQ4{ zH(>}w6f_a}($kw!L+3lLA?B{u#_sp3>faMp^PR=!ce6W_RkzdUbrrI4^qu4W<<3PX zn=MCdZ&_divIaQ_JYO183{FA`vH?YflnffX5}L}8h5 zYT@9@I5WU3PFF3DQ?O!fZs0tfqRtzqZWZgd;9iQ?u$9A0K-%NcxyQeWgGspr|AlVA zi}~ZrZ9C*_!n(1&z1Qu1F&ffi_3Q95+0xcg%cnn<$FyCv@hucF1FVuF>Gw6o+2(f< zr&rFOtCN?AoVjrU+ds3C6Qx&Ot<0x^8~3w68AZ?S*u$NKUH`l%>Tg|t)NmthAb5jF(|jXUuNZj z=mKJKD(L%c-rW0Ao?F{fhTK!>sq%pMlDPp(DHEQ+Nbj^xUGfh%*@&NIfOex&z=}PnD37iHkA{aL zQ(74SHHB~eqz|2+rNSIJBFZpt6^wD@$0UH6ICOZY|9a4)B{Z1HIV|$Px&XXgz=J?; zN`X@`Jf=P0sf)C4HGqV1ThYLFu*lLe^u1WlKDYCf+Cx621T0zlK?*PNKj4%B>4N~4 zY5Agt=fbk#5XeLF9DJJ3l#>bfDPl4y=df6mGglK|8;}a3a#dCN^Pg{7Z0@hJTU}jG z*{L8&%wD{#USrqInBi}ZxCra!yFC9H;SME#m*1RRx+HvGj(3k%(k$YWjiijeTdu_Q z1Bvg4H0~t95JO7qlLK=^qV@B_zq$T6d<_IY-2{nGs$Xvc++4$F7JNzE4cK$RK3+tx}-y*$Xku6n%IVov6&g$XncfDg7J>rsnH+LU=1N^); zX@4?TH)`I{_eiF1&A@cdvlTM?rpJESfG{$B74^L#z<~Y@2@zT0T0#9lc_|Q3)PHkG zpj!C{$xmqx^sO!+pyyX0AlQGa)+Vkdjt)K!Dw5{RUAaaAyX)&b(Jdvi9edf z1(b#N!E9C{U0JSbKX*N?PP)WpXMb+)?waO!y?$rk!)gSmdt6+kU4Ve*UtS)dRdL>d z@*PlN6~7qAr*g{J&7Zsn!GQj**`F4Hqo(lx=g-~`4~G&8299X4?Jh=@gFR!9I`ZU? znV>DgO+}kZ7%akMxQ>GkXnJz7$H=+`){BA>27lznq-m97%tK22hi9kaNDgE1>nEAnmc0!B8`Qc z*#`rMAiQYc$Bm#lg3;Wf$KMU^LbWF(z0}_us zG#D@sP?&qWiaei)IeJ7JGK^;+89vMW<(}>5FQgYED0Vc5)uV4L97vccMahw$9XBV5 zx#aIZsE1dl!MpP(7goYGcc%#oHQiU3UBEy#O!ZNn?nKh9Q^ru{cFglp8 z?FT8`sINwWn@X=geItPGp0Aa_JJn$H$(0$c!H^uV1H84W?Lkwv*oot$`B~M!@7YELd2j zdnzLUm@#QCCQQMjo1Ha=^GJ}y@w`uM{O$8Uvg1MC&C4doFM8c7|4hIgZD*gF&`*rW zn+552pSCkT5c8iDl%f12B$DAg?4R8pVnS0jWaLAslrZKe_S_21NQNFAWn)w*hN_#T z9|NW-0^6ajbSA6{L|~RD8Nq32KTEh@D=UDWI$!Y5fC0>eIr5>?41R~{F6J&zn;>dk z8*C#AeAqw&VjipCC8S{#hJ%5wwaE9M?i?i4)L?-1antNQf&=iMrv@hP)TCg*u}X6F zQ?JTHVU_!sXt&>lFZM^A6qte}Rk)&}Kyo5;LklM5D>-;IXfayBKm*+>cBupOOZ!LKqdtYC4UAtZ9W+%T-%{Bz6i4Ftf>mE<9OA152v3*id;MrJ65XK2y#p*Pagv%KCQQd zSE3u$u8Vmt7Ot&{2=Py|g-7VmRC(ucs}h^xtIw9RBCqw8dQ8wfY;mG<+8K)CvU{K2 z&>La}lp+E&Y->S)k-4Dxxpphswlg$)`se-_${Gj4S}GNT=9C}t%|6y^>_pRN-GIp z4K~{`;CPLN&BpSG?6w`+#*WV2=X(u!8Tw6Rb8(m8a5&@U;i`pVtYHb#$e4s6Ru?Bl zAe|;K5v9M7Mx1HcDFEcexYGx(e$nl1v@sYk6T_C)@bI5V779OHMtOLsm?(8BZ{ysx zjisa40X7<^^PcRHF80Rp^T%z>&@o(}nE)wzurAtgEEvS=y0af8cy>fRwGS&aH3w^VaNCu^iYi*$Lm_7x1?SAnxAPIT`q zyL8|#ebciHy^A)eDwN)niKRvSvFNsRQ>sa(E()1=@KRuhpdI66G*l_Q8+!*^Av;Ac z8TCuFPBJGiX0_+3OT#GrbPsNpkBk-{SUHO=<%z){bEyWtK8sL^x%aykhmS5!v*|7< z%c6(vUNiQgrOdd7KHW&3hw#qTUL5U0Lin0`h?BARd-%Q9Sq?2de%8V&soc#AGWh~9 zw49+j7b$-A&0E5b5H5Dm@UQMFy>ea?U!^CmnN?JO5IV8>E#nL*OHLaVu*yM}U7U8H z4B%UrbK20lWKIk5DjtA2p=~dTdldC+ex#%2ICG;D#^+2^%Zi)p*+$Ylzd*!Rx?Giwr|3PMB;E8eKP1m{ zAvqj-i`8*o!J`=A=~&j#HKFePqY&q=NFsaO;)mI)lM8FgFt!nD;}hYxiF~U4QSUiw zAB4yw21hi08^Y6>Q|2DAdo?3Wz_(r@u_w&eAEBzETDooUED^t#^Eu4RWWa06PN?bY zTS?O>d)(oHG-;|%tONssTSyaLlEH}W*01lf+N2<=3CiY+MrpDHM+s{Fe_a*3U z_`QgF&W3?kd24@98Ufc>4}PkyZoc=}2#hk0S}ScO+Tc%ZgnFi`Ne0yz zeUX$5xFE?7uF3AXlB1xc3iO)q_j z-jQy6m%I)_Ia^hf`ZAnW%B{<(8syMYHPJUiQL%(Eu95qCev6~-uBoSPWnoS}!D_er znm#KSSBahFCXU?|Y|YHfN7bkK*(MC>e=)q@FgkSV*T^kndG=fAvikOslQgORWh2W)a{G~>r*`m zl?yYC7XU|RsnJQ0H3iWELbV$m}9T-6TthU zvu{=RX5^aYE0d8K?BN!dHA}?}OXkqD@dB`}>AlJd+l8T*&OUw4!_`|uc|q2-_8av; zyRKE}f1DjdW$k5bwnh0VCM$-}Xzu{iv6~WlbS+Vbp-m?PLZbpR z@B+6zBs_F}Qy@+<*P_F3tb8M@uK}3aZz{rVPYWJb@A$6(K zYx{E-f#rs0MWtQtWHv;1aL`{URm2Aiy6t14*JM=NQQ@foyzXlF6@MDTHE`+L@E=Oc z_nMVo*OH&DGV6lh)oRVLT@H;WwI-~!beXv2=YZ?TZP@9beI}oU`N?Nied_T&aZo`< zN=yxNWpmzbzG2$cGK=LUyL#{c7Wc!uTUyh~2+=WsNa5tw5kL!d8QlPlqj*jiL5u1$ zv{IWU5NEnjKjeG;v_p(1O2nQw7?K1`%tInURJ=QkljZF+E7F{Py;e9-DkMei|7sf(|UM!1Q5 zCzTuyS%$i9>49hdMn12++6%VokWiU!+q*n@4zIB`9%&Z+C{Da^hVamf8V#tP@r4?B zgtoOxWe0Q9Ag{2=fvz(U8Li3$YUMYYjyYfpBvFH`bv2=%!cEmMh@X0H4W+9*ra9ca zjE!QxHN>`)*Rwcl1L7CG&-f0woErlvM-KFwm3i&5UAvVzo!>O%3U}hny_!pMhN%*L z=cmS&CV$d$9dae8eSwBefw`7}x%2ox&iTd5@^{6s|Eo2FhGw-)1c9sdR9*gX z&5V9Q=hv;Bh}#5M>Ft3GXW4vJHsnz@QYH@!+a~3tinaVII6ro;rv9uA)sZji?npS~ zq(<*0h#<adzOnT zc1&58gG1~`gIaUo6UwHwgMcTjH6+@zJ&kZRNvxVybH9;x%5;*SByT?l_tY{#Oa+my zTFwz;M+PWIA3NKwn+Pcfh*%WpE}~Z3ThDoR^~oYL@gD`dJOR7MRUajV z9`^Zc+&{iPH!f{2tF^>*=XY0D4~l?oWf%;init|-Qtv$CQE-yDu?%Z&jb}7=49M>c z+XJEjX5Qc~K*siy=2G;D>zdZ;kNSB}4U#pU8|ETPM5w?ax0floSK5MTNN&e z8$ENQ8i<)2$Jz_NE*6I75G}S%{5&#m$6hJajV{ihkhgW`9Vex-wxkY|3)i4m4CD3> z!Fdt#Ag7lV5Q0c3*LsvhEuta;Nzk>?cv@R;mX2~%^+GTHeT&J8uw)MPW^0}m_tHnW zs|i&n$-5*tPp>aOD7yhgX!}3SO{p81$PV=v-9DFG-1nP|)oyfm34gyQmrTE4h@92D%}-ARaI}?tRK;njq2(dePOs=UcjZo|&JY{1aQ0`bkS=NrQx zE^^=QAJ)u*bk+2J@sVqRsVYxzmO7ki33mu+cXnuBh;~RxcL>DY+-Put7kA(mcSv;> zUvz%)&vJ_n9o((0f^{W?b`T4;fJVy zW8!zybtC12<0{atf7lmlnhXARX4Wqnz#f{R9XOVy--+XfDV}WU1CtiC1OP{W!acI5 zc&!7oFJL6kH)`ko| z&6VrN#b({3b$nMQ`e;*_3Vy)+Xoks=?h!*15$wCrP(Ebex zcMS}zLY#ZS!GT!ej^RK(dl9wH!W;p&(yLo0masJ13t%q4ra_8jdL^D{FS)MJxVN8) z(*s|aT_c-A^Q?s$u%1T%S(X{^@{&l16QUb?H|y2{0iA&X0rR2w9E|T@p}uxI>n3r> zH@*I}iEg=w(KE^A$l1;tpOAe#MdCIpaqyNrbZVS;eYo94*9N30>KgE1xZZe31s)G& z3I`tB?XYqz*yV}j)XeueR* zQE%zR|8V+3X~MP=#!MRbuqwkRbd`{@X7&D5_qzIMYT~C?PikxG;1({Uh)6(TE0Tmi zh0M@1eZCK-i;H12BOnNkAWzD+9k}ale^hrlGwfu0QPL*n!eDL#*w<$MN$}hl+Zo1_ ztb4`>tDB^-M>e@&O&hQT^JY&3Cf07};7rC8j-9Rx=^{Y8?tR%MJuGpFu1vNJU6tQ> z`46{4VY~l@xb??E9z1@j*tJk(Ii&7V|R^A${*7 zjRWT>zJ0W&xXlg@eCk|q*6iI=VcLV?S|g?5+gOBx2qm#fsDa9u72V`9#Z(LD763)( z+2`J>kp|q*rAib6y^Pgep(|XiD6gHKP@%9X{+;*Gb{#}F`$BQ_zK?O;_v6;o`YUtY zXE(*Re7k(?8slQ;efv5KiO&jG-yHyd??T)Xdr0hk=(&-;z1oXn+aoYNJFDyM`}+FO zMwqAVNBM1E%or@uAA>}uYnrTDcNwv7u4)iZ$u;Ga*85-^w ze=3a5)c}s(d8;?q$DhO-mMYYk&e>5$8*56KU$&Hu4-cZApV zgG2ck+iHE%$LG1QKB@3dHP|5%Lg1mvS1ab86PITG02nzOEJjodxeYC|cyg$^GPn6= z@O*^#X`0GvpNr$iL(V6wg13uJ1GPqOt}j2*a9x!)m8$MJkIHi(Gfp z`bFsKfF#y7nNQ!M=&phQOLAorq5D6CVfCnxOpT+6u#T@8$A6b&J_%R)#>-jZM0h|9E|WM%HbkLgV637kh%EWaf#NLffFSnDUJX6BcxsRYa->+xqu7}@iYduf<&cng;c7gn{ z_940WUL>y>6^=)=RLf@c)7#s_-hZEAMzA`g5Zzm{ch2Rfjxg}<1A+MQCJWV* zXtp8YXww7Ei^JX)c?#)85OmjzEB5wls_yR5wrBU%wC~AgT`;XHy9o7l5Rq|#8acw) zN2KNG&v8r1?UY&;ZHWNU^!6J8jmM!lq1=StvR5(Ip=|8mcwr&ptRL33;L#xWxzwWA z)gjAPHR6ySaqV=UX&5JHCkggMV#Pwft+wEwM{@>j#8)S8&(DWs1ssFtcB2Gt6A}Y2 zW#2!CLonkjgT%4I2S0=kKt4tyWmZz3X;neT^a^(rf#>N-jsT!GvTXv6AD1moJYlhH!cV`xdm-z`6a4L2Q8 zl=MwcMi4!>s@EN}+GgiF8nigcG&_z|HD2eR^Js?ZGaIH?3mZ2b3M@Ga@kN;wDF3J| z#Tt@Ix7id?$JT#RWMR`@MxcbY-)tW_KdJvIUnyMeTs%)QHwYkxq4lWgIT{g8SR`l% zB{hIERP(IWS*+|;Mk3SI<3klq1G+(8?VQelPXU#J^*`$Vi_2}t`;aM~$N<-BBJgYe zE3;BL?C{M7?7BE^CXiakV*_TkY^|kWsNj`7+T*UbbL62ii8%os+_^J1y`7LXj9ai= zzvv){vB$?l8u{ZI5rl$E>>4f8Sp3Gzua5rqdYsZV+JAz>7XwXRaBn}|@>UDO76QQv zpUKqe9NgL-!5(-FpR8Wmj$hCTENG2GLyTE$Q5C`Fr?Z)lbmc{KkUri!-re2H-GOPP zP})l7$^?&|+NZD#Sh7r`by0C__I~rJt!1oSU~{rQ2_Vf|XIh@+crpW}!Td|5Rttk> zg-A5Hb#>f2X1{ABd#AMVWD^p3iIU`Y6_Xg<^H^fd=+k|IQX%%_=B%L9Q;nsm>z|kn z4ll?{$>9VPh7@yY&%0;+)|Q#70dZDt5}&tMPF8J9zka4e2?n*MV9Nw*YGyV~8v(A&y`BUJNxd?;bg>t->-PJau- z*MOLi=ne7Fv3lsn>~iZ0hx85Ntq;8dA$LF^2dgL|;0}nwqBU_O^5V=^6(ps3X-b#- zI=$(n31t;s0vr^<_j(?)uUhy|@lnz1xQK-b&c)is&nNUefy3+#lDJ%Z4&&IvzxIbU zfH`w%kZWwl-YFC3`>XbggP=~>D|K^A2LIC8TcBIIa8uJZR_TQSJHs z#NIHr*{a)in%Y|k1IdeBBG);PX<-)0iNAM5AY14Z0Mv`1uSWBdF%l}|OL+`S4zE20 zUVzwC9wYGNE*o(6SCRr5{`UFwvi*yTa&3%AJ>*!6h2nz$B}Wz%t4+Nz~t@(gXofqIc|K4PSl+Wlg()cn}(6grM&Nklkw#vXjKWExYqRL53j(+_oOYw09MqwV2r6*Dg zoRdgO#b!X*&YhVSn%>wB*7qKSN5yOv?+-g@tW#L7rzLJJ<`$P6iN~C5eTlA)zxKIw z4s?idA&+p1zoyyI@)KDe*!E0Fy+3Y!Zs4*8!jV}M9>|^SFZW4p4wj}wUrmLpq7Te# zEeRT;2ZwMp{y0XX`L4WgW~NPj4}RP<9wAurIJ$znd=RY|_+(sPrk+vHmc%=<_6$Hj+2QnoC_uVvc?YEL(6HH*#>BCA|*{goJ-H~T&QW7j~G$p z7&yKgg(D&|R)aapL@ygO6`0Fx9D_jApFTFfYu0)87It*FrTUpxm%+b4Md%Cp5AMBK zTRCYEk@m!3>q9vBJN;oH`q_WjgJ_P+T>J(LGBj4i^Zp0W4aJC<-rRm)EVp}N&+H&e zuBeruSJo0tA6& ziij$zF#GQ~J1Yd4EK`V+W;RM*sUl@$d9I2QCm3&7C4$DC%zhW(f zc-c~Gwf#0WaWDMd(l*8t;l1mYAj>*7 z%9#Lh*F^;*=@hjN#9>SNZot)K^D|8&gM`7@bR&(SWo<>T623X%qTWmrr70ZDM8trd zGTE%PI4rne4es4l9WFNQ3evUtx`=Rka5$Csr4c6Cp&|0;)Cqo?H&Yj`0S_XbR7E}` zzV9t-Wxn4T^%zKu$mTjEp5k=R3fY6qAWN3?=t7Kv2^Q^52qzu-KGpF$eyMtN<&&sP zp~e>0g}cLjr_%V)B7?ET$>eoFs+$C+>qg^iko86@h7tLC!^KEMA=1OT2rhlyaNK8O zUuq?;=b8ntjDzvwNbHz|m^%wRJ*wi~A|rfg{V8SO^^*sLP`J%0#DrOdxNu36&nRzJ znepJQ@pIxDpYPe>?AL0%%jt#rRqA;TwtxSS8d@Lyc${;`l}nXI-|(sa^npKdsqhkI z0)|pR9_<0Pk#6 z0iqgc$%XLQYJ1v+7Ca@c&pdCel-)Gj80y`>$`fSsbK#gPJhMa%v!J_}Qd!DASu<}5 zNZBwN^z1?c#&o0J2iV6keYR z1GO5X&`6%^IxGfLFh8%xYnA!$f8jB~5uJ=zCfm*aXH$dI3ANk%Fm;~rWPsO;Tvy$| zp^9l%@@f05qX>?H8^2FjFi4C^y ze=2t|sMI+D`FW5ruCi5+boh`B6_+j-2pwZKW6UPQ^|JeaeeW+q*0743h{p{CW>}z$ z)h#d@z;4JZJl`sAlwOX>U$Rq2bt`CnaVulGNLGA`^L^-!9qzlbZ9CPk%=cNN3(fUD z=U9ds12-Op@?S3Va6 za((H?GPh@prfuV)7@v{F5}mPt69K9OOnn6H$PgyRz&->c^;qfwB~ft*=u-UOxRx4{ zdObo1^8%p?rf^O4JxIif)gw)_>l3j8y2)s{glvSV8kW?jSRb_Jw`r+$ww4e9#89Fq zZ9e}dOf&qf>pwH7!A6ygi^3BHCMf7Gv7yM{#AB;&Gcv_Dl-o}X?4F51e2YxHdyKYz z98_2l;abJE+|4>}-PZR?MTR$oLIhIhVZ*z6pJB0RZbjV#vESBbhttg7nFdYY7Q{G( zj<YdecdUKu} zSr6*)`tKf~^&Yb@`rEt+IjPag%4vy0)^Ro!>rf!_j!=lrlJG#Nz&H)gPY#p=M?QPg0!;~-mT**}Yjai%$-(o!Lq#DhJ zHMyB-oM=o^h9RA7m~JA;aI}9^SO&0tXo zPrH!qO4y-HlA~Z0=;0-^>rpb#d!hUk?C+`3 zql>lHxx~S*euqbFYGPtSz#WS1A;ym!NFX|MXB4HB12-5aGLHL`8k9a@kI_yE2bw82 zHCw>QhoI~^MAHK>BCbo8sW@;zJR}F*oN-Cw9wh`IY;Uk*moFeUqc_XdDUd!zZ*rGQ z_qcgrLP~#aC^tC;E5#iQ z76fU9Kz_F}7dxWiq${m?pZHem1`B!+rHLbgmj|5WoW!G$&ZINSyJDUKJ+{Tou5!_w zGEYX0$+VH|F`6AnUYk;#vj$tsD2tQ$+CBS!_x~=5Cb+JPc11E-8+I~7!coA z)d}_{&ZDRyHr^!gigXMnyi9=cn)Yz4eE!gQ1gbrB3kzlY#Rcv?pCa#C95wTIVp?u^ z1SwlE+Ig%|eo!27hYm{<1}b1!Q)Pr+DGbp}K7(@~9V|Hf0BUjVjE)ta0~)-n-Rv=D znTE$_mNInVp#P-8IO##T*)?mW|Bd01#HbLYNbszYJYW!*q$GaYR5)SbvltfqVxcm> zG9N>Ge8iZc6;O>FnUHk+G@~9k&d%`sami}i{;xaRrh^E+=8yA-{BMoB!C2V17Itz8 z3Hi*h_zb+54E)a5sfxi2HEN5@*^0<-%_VRvtgz4VJMQyx(fT=pAxm z;aIgX%DD?eAl^vH91beVerPS>VG%4;sMj8LwtB$@8db2uYCJd z*=GQi4oWHeQL&KR2#5r4p4^b`e^wZ{afIRn_V7dQBh29UI+zSsIIJ$iDm4&C?qB##bg&m(0qHdo6+W_;sl34lzvhFsxZ-z^oi4 z({+!A5S7G4xx-xJF7zhJ3=bDDE9$8GD+R@umS=@M}WVONR1 zR@5<3S+d!9`-r-`P9VU@)L08tQJ?y6dm!AB{Cas41prTh#qoMGPST%iZ;U$OgS$it zJeWu1yl5Cu%;!=KPLGNGKXs>mhT{7B!!P_=J3 z(~-xfO)1+WrmO)jIK$n#RpN__g+-`H10YVui&}3RYQyCR{m`)%Fpb#w&;lAJZ<$Cx zhd(uV_mFT-%TD1kL(nS560MYx;ql#bIfZXXzfhbF#H-Y-m+fJ8mdqSPBHb;WF#=1R zL?p@0T>Z_S)9oep?LjusAsfB%w2b(fzUXQwFQPHF3mN9r6SVu%`L`P2Ivl0x`odo3 zUMFpd8w#4UZNJkMgZ12MMO4p7#ZVL2t!h`Fm)aE(UO^;%S*ZOjb2+|J< z<^App0f{V6xI-8~EUO{T3bzCgv@sajFV!(nEcy&REjg(95CFJDjK zP;{2rIH&2lDPZV*{vAsb#sA2&qo3Grb)|68omN9d@rzkWYLj&=18pw0IC%~i&{lYN zXS?Vh&0`&_%l>m8>I%Ucv99<|Srh@LRc}tI@9v}q0*ns(z+U(v|1z2?!9IZ$QByC) zUlEsyTHpyu zb#vw9nt}#(@SBNPf<*8wb&?*nkHn&A^%vPOFrj`e#VwaRLZ}qUtOXZM$n>^qEe6yE zI_!#bVh~L6O%OV8k^$DRY#%WGN=bm%j1WSJPy@3>kyR$HzWpA|N$W23ch;CM)s1S9 zAwqV4X=NVJW_Ehfj%}2z-^Ryo{KY{;9lyS07QYr)b^#L_%hH=AuC@vhc#Zl!v=~h2 zgZJNQL%P==?c;-D5wqn}X&fq&F_P9q`?P$4JaX|&i*pFFR^_9m2O)C0X^hfkXv$F@ zt=M+vrPces9T9o9KvgkRNQbd}`xfS@u?RkLdx2BYW|SvPK@&Wcy$`B(R(Mn$3rNG3 zztF5yXi9$=52+K%VGb4zI=P;Y{)+qZmE1&1Esh$CQ1)kJ7N-01-W2n@L47cm^wm68 zxYw_`Y_we`HO}zEoP2J38K;uTJ;Z`Ud`E25qVYss48U*03tvR;{0NmqC6Rz>FNok% zUH|pqM{X@FIxpxzJ!+`{r6pX8)-O#2_fh$Jll_V)LnI#wJUK9^g2m^-6d*q-bX1_Tv9 zFi*rlM?bf_%TFNK>7D|>9v$Mi2{&OVg7C_XYCZG(!b&AJHjd%xJ)WM>8RVTW@Y*f< z_rL1n>;=&gwn1i@1I%`ZR(y>$XAGUknfHm|sW;|!#d+m5bpd%pzwt({%spfs$WrfV zIWoJHYcZY<+V=Vo<46__sw3_36aj7Z+n@t^0EB*;;kSf=7-*&8IpDde4{&gS`8O?b zoWgO&`WGxolXb{0DlvQeo9vk|0_sf$t>WV%>06MIulno3z}q~!4)duottbNsU6vu# z7WM4|25rwPG9Bl7qac1XeDrd_rW-woB=20JnY9LZAX!rEEqR)8Y2&0YOWEK{gsh0E zWPUVF<$LYoSVZ+VYX5TvZX_!GOV}Fz(jTYyj?6a8WS|s)_h7N-nV~&Dg)w&X<~*Bo z?x!Oia#g57QJC}tJDJ2bI`fo%+@^0l`B=uKx0iFc-BjZGrxs2{uAm-SUuxf3x=kc4 z3wntT{UzU=)o@`xaStNx4uPHgk*57QY_?^<;h_GX<1%%=B28!A`}~3J?6E^M`?o@V zIwidGn_#n7vN>iy3sbr82D|G0(byRzW1YK~{iVB5xIUOr#yBX#A}Hr85lc|qnM9h3 zY_OjZQ7El;Fh5;Jcv-lG=~>?PutEzFiH74$eoen5wIHbL7|3s))FAWKz&SYGLWBZr zl+%|#q_%bc_Q zp7RPE1`bm7e#gg`p&!8xy=kVBM|iSCv)B(hlk|D*tP65>>;_4zA_f60f4wgRx)plK zH!>)(A3X5u<4C(G&|3%9^m?tcs)9Kr13m=ivYD-3%DAOZ(=Ghe)k&U_ED=V5WGXQg zh%%W)0-1~FyZ$TLsdFWfzd>dxdl*$InDQPsk0nkuYjaZy&8?g0xT?YHn*HKL@Nq@T zqEmpENC^d75MUG)P(}3@W0VCEZ3c#n+%Qv<4G~Z@ZWT-x3Ys`k>bb#<^ zy4yj8n?{7SKBN&&(kHqgMYcZu)BJPm_fn&0^TKZU z-*|MMdFHiSaV2V^lcq#9d>+SdHO(yHz~!|=e6h-^@7lPCH!UWJYI|O#w24~-(ozo0 zxneM=*0;OYge3kgoOAA$H2#W@nj7yJD7-%6|Bu7MyVi{!j$Q&t9GKD!y)Z6t*#0Qg zO2ekXKF#H?c;w^a_H00&Npef3;NKQcOa!zGWExpct}<)Y1AFq|eZ8KN*S1>t)wc^&}W4Kf#j zmP7kH`hk8ZIMpx~N$rJqhXA5(2ZYQlQYCNB1CV>M6FiWfEAEv;m=5Kox5i()Qo)hs z=$XyU9pu^w_-Jp(w*|*dp#^(rF>Pe^5GSACM(MN97|J`w4p5ah$7rNnj*u7UEh6^- zT?uK@siKzDM|AGJsjGvf>GgrUKTXOZioz?i>JQ-s9KB-%YtisEtSIOi{kC2n&T2Zz zwvq|^n`WpM3jAxhj#Yp$o%^k#ob&tL;^D0#Oh+tDp0H0@wc5NA2aFZ9wUr$b`q=NJ zXveT@4M2rf(q{~{tBmXTglY3Rc@Hbyr>B-e5fnLIWeB65=-cqj!kpIE?G;8VGdd)T zh|dqdf@&FGhab%%E;j+q6TAdQ1(`?zc{k|VuBNr?``8V;A)kZUJ~7jAOY^2u^#3ld ziS%RHMW3Z*ombUcdwdIQ8M+CF5Gr2T8jQQ@-;B4^RC|x_3duS~EFSAuJwL>n{s);T zJwU|5X-r(6fzZ`oYG$eH{pWOF7kG#Hsr{I|%3k%K_Z5jQ+dad?3rdR>X?@bgaJVB|@vOIx4$LAEyJkUCgR^b=qZUPrR)a};-}nSJXPR*!7Faw|_&SlUa?LsI;1 zx$)3K1&@OmFI_3FgGoNhmew{8Pk~8fmdj^W{)#PnI_AMIxbSBgHvWGAML@d05Et)B zV@|DX#9kU)N*DE8yPiJvd-(ic4HbL$OLT)k_21gY4;;Z!hkvmUU?YQCbdyZyWxs)l zGqRivPP0nIJFJ;|r+8gfPp+eqa+5j=;R`|t*_)5-5WR4vX+jSBaPIE$P^kLY^lkE7 zk9=MR7rS1Km7d6`6FaY%J_ev7Dhjol9pcWIry0vLIgUItS+2fs&s1n{fXUGO+<8BE zCVE6^PV}Uuj-^|pFEYs=0%W&_(UR*ZHAE!{Lp7I? z$kB>E*z$ZYJEF7?dEn)p7nL0TRg0MnSIQ zCrK^bM}3*U$UPIe`FL(vt?zkT5~!_PI)aprw3Tc-SucXhU?+i?$Bv+XSy`+1K89Lj z(7qt@$M7slU{N}fl%qj3;g3%)J1A`=?%1cPkeeI!K#(lWX>NGe$>}F0d?C0=(U=p; zCDJg@Wd$9&2us}Fmyff0N9-UhhHQ&~6ahE90RBN08_$abSaW-72 z0DVz$7tv+qTr5!e0hPVhR+sbbR&P_+P1oF%!4pqbB(EXIBq|DBtZ85*yHUb~-r=gh z+tHY|;gN~}Q@zI$42LU*d%R@83<(PIjAGv|Zjth23a@ho!w+JR^s zky(T_`D`mwWpX(wct$PN;R2paJi(|{Wz<_KwSf01yl>54;lG=P5`jg!Q@_@1|JL zYAUDjci+{`a%TutU#neTMA_A$vCn(6YE)=MtJdZYO1Qty@3pg93(X+@SIMR8$k!*Y^8jk!d6N2E(mhB0n$3{OA z=R|%BulR?mT=VDCD8YvBEz{r9{Ra(C;JCAc|m2k_>C4;_kc~Y0m4buRNGzrE9#)rXgsx z4uiRxe2QXWedoU83Lm~}%6TBDM*Ro7yrop1k)mJqBc<1>BZM!X))Taf*B&o@Sjms< zLi7N?O`9`C0yZSa0i_S+QwO8_P(x7kYWyA-#=gETyz8@keupy(4@HMc-1e|dG@bN) zdX&w0^#56$9ql$s58Efi{zbUynn3%IwZCJ!S zeNJnF;934A?N$#qoj3EuzIkrYJ-|o~|JhVLqexr~F1k3&ZE-y}yqeRTks=vCyh%-F zkCF@QdxJi>S}Ol<$yaM70aKS{uGhLYU88G=Vdwpy15F%Ds2vfk<}HC{k3X_- zKfK2>vaxzMK<&hYt*^JG^>d;sk7Wtc=&*qDIjpjmr%&`dB*4~9E#>X__0K6vDU_em z;hS$V66)tBMGk&v&|Rm?XG4ZT?m}AV*pVU!ttgApb3r1r1|IwJ?Iyxr=8qBbCD2-2pMddrxn_FwC2~*`F_C6`=3Rxu(KoP>f;EaJ*dMq{s+; zpKv+YOt)&=KZiv1l;Wlf{nt=y>ZQLoCy^aQ^?eIL{ozs&n!#mG*4)!2RpF@hZY2n7 z1x$x2=1b5-uXz~k9jbAV?(KzuHd1D3eX8XO{Xh{F_h?i;4iEcziwfDdC?`P28j@+~ zeS(V|?@W^lUv6(7PQShkVi>$HxWB1+@AhIqwQT7hq6NjWKRxK6rC-oY!tdcaQ^7$l z&-b;f-y{l^MvER+FPChk&5U(edQjz;I@}TEeg&}7_=p5>GnQzwAy5#;u@_mxjPSv1 zhABhme{ASuqld(?Cx)pVNx)IGlZPBW#|esTCaE`aU3M4!`lUT;;AB%qq|8-0) z3F1!Z6VAuAqMb6-8iaxrTUS0Mp-GP|$;*1viP#WzWCNYiRqZSRJTv>a!=My7Bb561 zVsckkXIu)z!|37ZlHGo8Iw9xDo@T^JnzT!Dq42t?ZA6&xA+|jt-`K$HWpMjT)#lTC z=VSK8YnM&coxj;yrXvdq4~Ci`8t*Ko)W-DgwX8)+ESa;*{xD&fagc3w|GG_K>-)my z!^8<|hwJuT?E6dDyZv2^XEbuCUSW(_Q?OVU>;MjuVSrO8vqE>AsF$a1eD|IYVa}MR zGkVhN%i2valmP?W?xS*b)P4f{c(fF!)!v6RRe4z!ltkT-TD@vC5ow>0J*~{{W~Xn1 zHw-4ULTpFDwNUELX{uByL^y+NtlwKbk9O9zyIxn{yKD{pPRNp&=DQYjQ>;|>ou2yD zM-8jKQ>Sk~R7O7rfTuuWn|$Y1u9f*5csv;mhI9W-2-NsIMhB*xzI(kATy*Yy4@@$K z@*vr$%nH-Ci0el!OELd8n*L; zH6Od~Ffwhc$_Sp`Q>#|pJN1Y^nL~7OUJVeRWuDVmEw+r2CIY9ekgCzNh|wO5;T6q| z+QKp~fkJ zi%I}8@&F$;MIHq4BRr+U&r7%kmTVD^Guy650`1Pf^ZwJqH#50G;p@~HJ@*QiFTb(c zl=*{e_c0pAxs)${B@LzxS$FFz?xn3?G()mnG>JYBcgtWtZGm1DlCQf;=WP>L$<|&9 zS9u(KZtf;xS=iy1<)RB;BKdzO0R@SAKSjIetg3k0!*dimG`Jw+s zA##n1a}vu5U85%BxW(ml@Zg{W;&OQI^LVoPV7Rz?@(wMU)#Om8UpJBHzz-Tytz$GP z!zhtgvob$r57SJ+y2CI{wGF;ANP9Lo_Yp?*yV?*qe4jOZ+v;8D5ExGDareLf+Iuh5 ze&2&g&qMUk*Y&!&)ljkc)As})-QA7t{O`}EhUhCh6vB{Ftmz)f|z244@iu=IQ9Wo4kK_0@KT=-L8%ea9#Wnu9` z-{aT@#X?HT*YESk6C)TABb)qVa^L>adECFcJIx)DkKqQ9i;fb~ z%0?mTb`!Z%`NerIWXLmaks6_40@c28BKxP5FnOEY_G>dLu?!1?n|~ z+CV@EM%>xrmV|K@4!Fup@TNi>mx6HOl%e974@mL~MsgWnEvgo~Z9b)O1!|&<+1m2f zd*X|M%jFyH?wD%)uiiWSwr511FP{))>ZfHrX2yz=!qr#KXXY@FGGpHoa+~Oi<$@kP zUb<^isCWqIl>h4VIIKlH^IBPe}bZ)nfgTB0$&`h`5&rPvaB`1zri zXF=?fqzlkEdaBBcoaKi}h@dUmhAo7t~!Ks#oak8lrrNblB2OK%_J`l@mycu`P$u=KcI*2ls1sSAcCzXCNDW2in%V zL*BbN0uHeie#$7X_hUjj`p}~%)1?m>dl>bRc(JDMrX3N#*BHFe)YLQuLV#se(y*%9 zeip`$giqiNl*cPhWcR3wv1vdV1moiRY|3O%57#jpLfc(O!;s!nfb)0}37~Bn7)K%4 z1p_3{-p^^u7DnRY2sF$ypiqT5J^RvEiN9gH=;VHw2$0M&ZhtiUw-#f5HOj+WTl(GP z(NbN{6j$N;KK_H{Pr&*hJ|lYEue-AoMO!KK_-bRqfk6ngF{ZK%+n%J1$tXL#(j-Hd zK~Q2kL5GiVGZGp5uK1f%G7lV8c~L!fSUunvwz#+`s?Pz3-d0-2R$Rns%F>qME>R5>==s1n^rgX&@Z+SuEP~-MQ2*(SeC;8#y;Ql8V3~ExfO*LqF+$tX-f@|DS@OLz3Ae-1_BlF%R** zr%gme#HG#6A<78y=8)-@AGwF9vOffi#Q$@Z7JVYgx$JIERxw7dn+r83)4TV2k;@A3v|l7VK|N9=0-j_cnS zOv&;O^&-!lS6|=Hy71DKLWkob2Ve@XkP=WeiR1&B~=+5rFb5aXA1yfh&xMGi> zQHW*-aO=%NM_i-k%;>chi~{=wqvQU7Zo6R-b8 zzg}vkyvjjP$;1Z6n~_`s^GEzhY#P1>J+z!d3OVdj#U2cpBt~;MW28yG1ZuIAVtn6i zH+1e?c`bP{hHQn<<>^*Q^R$l#Y2yUHjp#qyATi;!A7yGm6RwIAYq0TuCEp$dukzp85Z?X_?8d+v!&P)q9O5(!?>(L= z7xq7IuTElQ^C-x=y15!Q-2Q&foTW&c%AY-%2}}=OEI=L-M2^IkIe{sqwvl`&s11yi zhi@O>S&xsMCrV;>$Bq0m613sdrO*`gt}$j1XUwu$#DEWa51hp;VS!YLb6HZB?xyT4 zbDEL+R~j8~Ofo18G)3br0y&5InvD7L4m~%5r{`xT+?m@m5QRVY0G(K=)hsrxp51w{ zfdwOkdkT5XQp{D=Fi+wNYjaiK z=qGwRV8U57=*8vqn{kL`6dOftU;e?&Ib0X?zB|QOSXj6l+vg}sV#$XgRg|Oj(Dw=~ zRQ7AMELu>>qKIZsQ=~QF&vr%`(v%@3C2hT+Da^U^-~bbrfla>D$TEOUr8+k?Ot1|+FNtK!!7?>PutuO(!Pme1=n|8_TYlQ-sbin*R1 zk!jnybm6op$xt;&Zg!5_f0-3++3a@#@W!&UxRC=e^~)e*aO;dTO89NVH#6N(YPsJI zP0xMXKfQMc(Tc2}ECRlq zGu1DizDrGtexHh`7*|{{Jk(4s;RkO_wpao+u#m%bpxGl_xrAos)F?3?=+`fx60_j~ ztjNv(D&|#LQpH9T8}y`V7A1iBwXIuBSR@L8zCSe&w!dzpG4l|696?e^JzL0`l1FhY zhk0YP4{jdiGm3M*F1{>J9a1wwvaW{5hRFx~3Hpw#3umTgOyRX2zH(=Z*`9IiNf!q0 z@0%~!aTC&f={ip~Cv3)K3qYNYV)sz@IX06OmTSQLR@2zj)YaC|aGM!9P@vC}s#c{1 zT=CS%1@tiMK29WUr*#ib{H_V^`1PNk^fHRs2JjLN2OCE1Ns3D1#S(LHp`{5x*8Z5Rg5X{7dLHfZTE`# zWARaycQ-YBUy^e)uMX&x6usQhG!@MSn`nx*_482=K^8m_mEUW@bt+G!=7G@ial>gz zB-xV&vs_XnL#6XJNI_8R4g~THz#R{^{75n*30U7u?CsA=8uaY{T2BtEz{Uwyky?lL z<)=>_q6c32l38b%uz|@VDDM%d<#yVmIOb+m$zC&$2NBl==WXz^TtHzGR#jM`6xqq; z>kgatTtx1@Y*D1&WrSa74{}+42?vsf8`P8x?Xnjoowu7r84HpM>{>_G;wKVwnAKL& zQ}UP8FPPlPgB>91`PYcn8OJsaE69C65utJ+K$quE#;K@(ko&6HwK?P=2tXkq347m} zFp7QLqTYwT0aIFqI9k|{i-@pxDNid!2y=+Nj=9f@OFYF~=fD4gFP{JEmmAcOA&9Yg z3G!T7m-UzM{<6>w9We_UFxgHZ+Psf9Cp@^}o8f{#T*Im$b+yD9i)oLxF@NI8ZiyV| z^}O{Fo;o7k=NR4RXkBM1N-CbVQiP_Ke0#EEMVq?ut16Q5!$*85Y1!drG1onq%{+g8 zgT=}=(ec%B(*ae?oyDn(Gkm9(BPq;#AWa%GPsIu|9xk6R*JZ}nVaAW$zX$pi3FdJG z?J+eDqK{Dapm?1?_2!8nw7q(vf>pnk5K)i@1$BGD$N;FxClhJAF=F%fJ&yebup9$szXX|N8gWJhM)rF**Yv2R-TzuNpA)P$Zu|f{Zb>tuP zbtGK95ruF)xk0L_uUtf>izfhqfziWs^zvnwGYD=rY5X;TO^ZrY#VjW97jqW2u`&3-t_GLIbpebG)>7`ss zYSj84K726dC24ikt;CAlZtw`j4|FmGC8@JqQAoH{g;kT2a~iyyukkNA;u5>0>;_A4}xp!Z;E*=<<0+baeEeI?TVVxS9_=#kw|S zNQOLSYUqk%xCY@O2TW*UOhv{xQUhcevMG=->2rchh)0u<)Q+4p#AKq)_<6!zKQkti zU;?hd@$OU?Ka`@d^s=A$T8&GAOs$}v9SkxEFDMmv)M3Y=nHsAD0W7L2j}Wh}elqeY zEHYfV76NH-`;yEC0xCXj$4wE^4S+hu+^T7n7Su;4JmM4zSP+#UihWo9j@GWOcP)~k z1|Od_m%;qs+HhkdY?^DiwEy9G$4RLIBs#=Mp1>IhErtoOlPp7RT^&cMR)rimRK=&@ zrr)fp^8(Pp%j=De4Prf8IcZIKpk{znZ={mo=|X90a14^XCyT=MYK#bs*oF^^Jg-zX>9d3ONIe%XhIwgFv$(XrUX_TbhRs2OE|yN^o8_RQrgi)*JgUXk z3l6^WIMp+h!VNoCWuPgbcQ*FoA~NP80({zObxqCtH*lyge_^hNgj?JC)T>m8@sDjs ztJd{uPF(19Kp$N#)OCC?tKtRghC!FUn^?ah*gkx>*}PZrIQ0-5bmgCqmNucRSZNHI+yg#^7QQE_)nUFo^nW`9$btnr zzrc?_yOlo%B)%_GDIFOBkq-!{88A3Mm#sPFB!klBJ0&Oiu zynRmtX;XKV?-a<}4}w!ek3N3JY+(JpECois;s1Wbs1<$6nG_E5H4om)}>@way@*{1Gn7s*|=JmfKylg+!Iv#Wclde z;NVSwP?~L`j5{xYOrEb*(c)E;2AO%3CY2#{VAoV1ru`e*>xwJI;#u$;Fg2K=6ob3$ zz@=BUVD# za-CEg3MP$pNPs|SfV#Q1ePPB&{dRjipUK3;bP-RHOBBnj4CQZNX;w1pv`i&tndKs> zwnyGLJ3BN$eI}NuQ<4rl;2icl1K=otfEbh6(iJg>uG-ff{FfY>zC!(0NtW^3ur$Mj zv*02s<5Kzpg98VhK;7fY|7}CMs$|ECFFR1`8ZSEx*Fwd#PF;Rc7Qy++xJ;AsdsXSO zox|sfdHZt9Tp|h54=BJKte&2}31JfX_))lW;0sF^{z%X=YzvUsR}N5V>gKwBsR_ z8h)gz?p0+Gn?jC9#%BXNf2?Zx26G_GUSHQ`-U50R;X>N+{`P!Ob~7yU5G?YbZ`d78 z%p$su~&zGBFxCAOq_76n&3`Ryx}7}WKt_yrPb#nZ0Y}0 z;{T*ci1qM72s7VfbeZheHCEjY@xfQ>`MztRd?jWE!WG>*wy&Q@#C5Q6zBm>cvadK~uhT@i%o zldx+(fg}#UFI%Ti!E7e4{3nhCIB}jC2bsy(l$4ZKR?s7I&4`)$#`?NFfH@q946am~ zatXQ@)u8^BKC@Rw(#+8%t^ht=66Gwebq0S7x>%rGf)N{76p3BOz`(C<-QjBo+a6te z@hpP?Kfj4&XhDV(M>_BVUMGa0`3SVV0%k(&Jwqh*^E=5+#w@lUpRyGw#d@ z_wxB;78)s)WD1cQf^jggo{Jp@Q>q@+toh7!ItI8nnI~P-o zor1^}V_;!~@UzR*aC>grb%Aw;W>bN+Jr|bn%lR{4#$nBZk1A&zmyig!I)Fif7_?7) zRCzzTJ(Vd_SKe_sijLqkRLh=41O!>sTk{@TeEoV6PKM!8AgFG;P82(2SI%RUS70wr0=@Dv4X&ZOSaDRbROWZW0_Y4$o>S=N#7d7&(@$o^=*Cu&D7Cb!gA+ld}p4?W+Biq%@A#PNbm6 zO}vDSPd#ExmjA71>hGVsqKmqDpIE{UfaxWRHhOP+d)pQf5z%l)@7dMh6A>CcMBhYx zZyonU{JMW<&soi7i;GRg(h?!;pBFDmgB@}llaLqu7>x}jtx9F zwChwjTt=~tcs*?LsLG}6R2+OfWOD7I*BdoC;nsE*5Ny*B!5hP#tqe%`JwSAb^ETfe z=0X>y`l$F0!O_xQ!nqadWz=Q9QiM!s%URsi$!L4#K>JpF213tbm*AHSdI(@2ww{F- z78dlwC5}JrUV$yAa@MVzR>?w)dA(MaTqfgkhqzMM2cx75?Syk}kHzD(@#d={2v7R@ zNtIRD2&Bm9)#PV!qorXdEN0bc6(HDm_xJyXRHfxk96k5}YFUF=FEu5FRG=WSm?5-} z0zdLQCmdP^3w|UHL_+Q0$+bnTUp4YHVAfa{DbTAUMz1QAd2G#*X(Y5!uj{+Wz%wae}8}It*FC*HA}fKpQnH)TO;WZM!dv#)j-GQc zYcT6WCY2eo7-rtO!^yIp#ogWApeE(=&|AwuV3y5IFlt=UZn<)jECF^ zP5r`^-|*=EnUw$vres0PKnK@}J}0~c?LWmI$~U?r-g3w0+?jlNK3qh`9O=LWWGX5u z5^WmFa~Eb{J;n=y?xJh{KEGA~I7`P)*h#-*`!Z*;qhV*Mb{L|w?>gO$UPh@6kW`}# zvUWzXRfAp|pj+OzUP6z*PRMhJMFaW|V`E}$f_u6>389zgf|;)mfa+08bL4wTRB#!LC zc>5*p+5NR|1 zYA36g&fCOHNPpW1UyuFHpWvt!^f!Xkn*6{~=?L5QZP~$(n4h?$q zKx0~`h|KTH6i$0osw^G3u4F5hD1IaFc%A7%CR!EdB^^&vA0C+koS_>0y8MC2%oC|=gGE5IjJvaiE5VeEzVEyoE}c~@hmSmg zTYPfcy4wN6w_Uz^RmM!B^VQ|oQ+7fb-V zR5XHt={TZllp2W$&B-598`sU{^L{{&G)@bl24d}vG^GI=0&G)vrCybC4zdKk#FC{a zGDRAD@h1}WDYYH3DWPm-cG6gtZkGWp{%c8W?gEZ{dL=h6rY{N9I?VVwU%q_PWoIAr z?jVg~pI%v6iB>Oj4YAzvvWqr9VJM%r+7j4&L`o@<@HQ7Y zw%z;w+_Zwicay-|+uOw28u@F-Eq(~*!&WecjWHqt#UjS;wBG=9D^o>Z{{RJ zTUn;S>yqUM!bRhRy(;F3=1*=jp^B#fY=`l72z4zXlKH5idfulLm(Ce(9u|C$-p=L@Cs-Qux^YcKO_ z=c7)JtnFFX^Lg7?)7MRO|LeqDBmV4y)w7+K$D2GMGEw0|v0KXQFk^J#8>wL*p>ZK}^ED=Nk1dD}&Sdf66_{|!&J7h>&3L@4t@ zs1)-pSA+{uj)r_Ty--9{D;sFqq3Qd@^N!Pb$CKjbE?}y7K@2;*ol6(@hIfKB?Tw8G zrQrUI!jSKysG~ZOq;d#MMCW3r?vn6jizmuH;aUXBB^n9lYQ|uqQP*5A31M`2a|TG% z?gK=*#KoyrCj_F7T&0D2IGHWcVc;HI*5Adz9jC&%8=)P4r)GwxYFj;T!&eU2+aJ5& z#1XihLkM8BsW$It5u+&ulS6$-^jsI>2>7!nb!|R>%2aA92n6(8oQXSu%oRTeVK|at z!V9XU9M8O6OBuI*83a^(U2Zn}!WM@$sC4h57LN2d81573u1n z2@3~~7EMMziJ4v-JqIm)p7*@H(9vkh+u+ee-WVW^kr3xS)ckL=+ z?C`qA*Wt~_?9IpVXs}fLAc?kx?SZCCYm|f49aV#4} z@m(QPz_Bl%&%)EQwEC$YU6DI|xgMsE$QmLL5|G30cLG&?s?e%H3JMU?2&INznL;uB zG?*0Hw@rW_IUvOVk&!eR1Ot(KoDXI={7r0-fv8T_#YZ(<99g49UmBv$$9^RU2K_#{ z1)`ajwl*Q*Q#$*e<>S@@j?KEm{ltiw^E9~6Dm(s5j1uw>0fES6o7!DNv!dJuZo1$^ zMbwd`X_^qxrqzMBw|{PB?)caSH#GlE@Gp)qr-Wb1DLb*Sf{cs|D_U3|QMPZATEd3D zntoGhs>U1#s~3HC;(!qO-}(?tEF=}4VMkucuFawSu~c_$Ev?30Hci08v$G1c(IW196V7x&`VkTW?4ijd*o|#JN@6qV! zXj_%m2>=PhkcC+9cw>wDbm%Rjfg&df2*xdHq(mi#tr}iO0)0Xf`En&L0JnLY`DyYp zr;iZ*xs%%uoA=LiSe|NrK8g|+y0icXQ+?l~6qJF2#ycNiu1`C~?YMFclCY#go|;9& z38i36j#wo(qM7CxTzXk|-<%&9zfWf~i$}OBWfj0S$Wf#oN)8#W6wpDEZfoCyi>|c zDLP0`%a+uRi~2l!90%yxPU{a7&gJtSlUuKBA={0I^u>6+6Np38^NK6KePURG{-?9s zJQ~xGTKv@7tb-j~g}B*4D$TItIeAEsa|@{I6Cf|Vhf7OK-M~ttO8Ct%MHDmu5tUU^ z?Uy8}IF1hWjObRkHM}gg8#%_um_a-oQVtXvfoSPIb~LM`wQ7Z4K(}1KefuWHGYI_n zIFJvkPS4LfNrs%FZDb1!R87>gm|2byRqy2Y5#?%e&9(oKF!y=^5oe?!?ojXho`=2t znML6=FN_fo5fcgPIyyRhg=0*$^c7TgTBVR!j?F-Ju zR}bm+b5cGPsw(g(Vl7jw=SUZ_+cm8UK+VjipQB2=*+{hdQBm-UBPo_>SjrZ#;u9E% zlv?{__~;877SfC3N;x2<{6hZGXL>R(iBt=Y9h%DG@mmP}8`@_q6k{qTP4OxE$|GvP z1bT**Jnuz}qQQeZ$6!lbn(oT8Kt~I(mp>)`y8xR;r5*gsz$}nC^`=#!OzLnMY3fiC z8h+Q9c#2^wDY%k9=_MyaCRTXjfRP1URdYxf$a>0>C1h(r@=rR)o@IQ;@<*7HSHE}h zjAGJ;q=*w@B=3(g83f+3B@(u^ZbfWL-z=P$m+fH(4+BncuHI%fF1wNt3w;GXNHS<3JJSKS5U2;C^9)Qnqj0ySY~W&OH%a!Z_bql;zdUkrNG{V~e~(dpVG z;EDvp1rj^edvl-T2vSZ_vNAg?@^xf4ltSutn6rEikB`e&P0;sT$aPbWv?{)tdU`(E zPdp+z2rL+`D85qn z5kz}!xLZ7rB!d_@glX{CGX&AE`un!((Ii{trgyZ76-Z}To$~26+gY>?=(HhQ;z)P8GkU`A62dm}c}W~VBwVzp zU-m?4n5!-M>8S^u5Tyiyk#``amiG7BML#-K=!0zQ2yc%EK`wY0P@qrdvV z60qotwyh6tzCZhuU9{hzyScm9Ha3R3wVfgO0Di#ITCF3PW1+yu4ah4KW-!RShfW;^ zn|R`XbLWMNIQIr33CI}0Y^1RhW*qDT*_v9Iz27I8$1vfb-|jZwR+rY+`b8e;-r?S# z4Bu_n+T1ZZFM>nAmURkd@8Rmg|EdZ|N{g(7qL5T)Ohyp@aq5H&@^=VrcRiY+^6hrt z^yN8quelR#sP=eEWvye@*8fbarMBpt7>2Mj%3j z{Wv1?OSm08)UDTgnZBBwNuVoU==R!8J5F%TR1pQ)yaRLQ9NeqlyJF3vE!&`KmDU$0 zl?cr}Nd59S^q-THlZQ6{`-`31MZ=-ZXK#NDGQWp>PA{i@2drrd4*ZG#)U)-nMp63W zu;d=CHz_Zf&>l<0V;~gOch9f3h0~>kCSCW7GDlCTz4B#F$kIlK84pM9k42gt?h;-rc5V9G zb7y{38&O?D`uXcuNOUw>zf+V!%^`?nh#egRqqem*V)Om=e}3pn<^4!xAlC0M6`h~t z%?BWFE2*-iuETL-;VU;~0=6#3>G)bI@aQjn95OIG#Q9e$!us7=+Nu+a-2Z4j@&lV!v()=zJ}- znd_8ks}Mjxfxx~4_@*8+4yQSPM(v0KEb3eF0N7fX1Zs9;@Eud~C_dB;Gd=aYyo5oE z^S;_boC$w62O~~V5`F4e_3G6qQ_WU|;Va|9;v$w5767iRx91BgkVF=r3qpe)+G6z= ziIUl#=Zmh3Uz0*pR4bvjpX0S>R>V>I;4cMz-(T_YJ?BCePp<>qfB6~<0h)A8FV4OJFGGG#@ToOzlp;|F7D&8q|rw>t2&k^#z z+Zs>joUZ@La#Tw=1Ma)OzhC6fR{j`cIy6wGRe_Gv;d+E^;CuU-z@Tj3tRy_18rjX= zojr5H@o@4()Q~CSFAX%ghy<;e)BYfQDCM-yb%)I_U%tE=d3t)@t%0v+X$2&EczJn| zo?biibccY}l!xqu9M%|gL@1=PB%F|hu9&9-`~v5;m_QNgL}FOYk1v6Z&Heq6n9UxTqfbf;%>bDTj5y{TtuCA`essG!)xfGmA#-F#r+r3&smH_(Oak93vGltdo zNa25bPe7Hl>u@^~p*(wa%S5cnGU3I#fdVeyI1Bq7bIy3lnzMoRiK3;)^lX(s_{_)& z@$x!WRmekj1S|Df+MeR%kqWpI>YUYV!z4YSo1-577B3vR$`f+Z{WxJWdy)8_@{hU0;G)ur8Jy{;!I>Q9e3V8-aS{(f@ zzYk3g>(0!40;Gpga+kSDGtqlkh*sw20{}!mS7}}8d+wE}-Tt)p2eAAlYPVVUZvY#J z9SmXv6zF`754h!|abcAf>b%W-w&z>{<$5+yCRhG!9DbKyLySrqi;67D_R-Q*|4!C* z`gk^JRebo&n0%_6)7d%|muo>Z#_ikZ*X2(eQ4qJGITJ)R$Ws-THg%Y$NXxQI-HExb z2)F*F*%7*;q5{wn0d@;Nz4|OiElT}~!<*7&ySH|On$1d0#*z9W-8Vott@~6+hD_MN zNu^X`Lb99p>qLb|t`W*5yIg-FLUwoRIAInI{T|ILtE!B>y;rj%`%P&=!UBSJA`Gi; zEC02%KFcOUviwsEKb8M_vV8xOFh4(b-*z01dEbqoCL`V4U5(;^@I_Hjww!3VxuWwe0l| zLmsDWh$75!Z!MT!y7|DK%m-N ze7osKN5W!aWg}jWY%uvBdwYAxRKePP^|#j9p0oSz771fZ}6$5uxeG!a|Ct!Bbo=5#~?(LP!4W z1b_GSKK{MV{55$CFSp0ohr=m!HU&1wc8MUm*`>pZhl|ff4Q^S7Fz4@CU|~+ZuWVsV^S!khITY@*!x?ob?kyd@w2^s{N$FOF8Sba zG_K3xv4_txa$rXhu1SqdHREdMcX2e_cQuiQ@3) zG5z)RbrC;ON|fTKdYO^6HM0A~h7`$=1A}EoG0?045dp2x`}QV$zSgqa4ND|dvKQ7% zYhLa|(w4ta043DWC^$8Ha&mGHWWICtwz@4Q{SjpFTUXz4ih*7G+juHKm$Y{0zHCL+hg#ON=z`#y66qn*qakWnQrpm+X)CGP>n ziy{}FlvT_SME<9`s%m{Niw+mrAc>5uk7}3K;R7jY4k3Ej`G-PusixHdz+zR*_debn z{>u%IKIjl!!KuD~|7>fEe0}xh;dflQL1`#AUDWMl>}7Ke5I{Qzo8m*%trfd_Zrnx; z!^{t!J4w*P78{$I4AUnp5|WCKZ(INSoj{HJZy6R1ywLy}3=0dJgyrGksjaIE0y^X5 z_TR}V504+fDlPgm({c?&C6D6B2UscB4cq(XV1BTaUHNf?jFqj|wEDVpw%W7_&{WoM zyv_S*hoOIE@-mlhCbsbzo4LG znWnSj2Pdz=U3Q1f&NI0EqxM2AJbUI6mn@21%TYx*a!t>IhoaSe9XA8u;6%epcFP10|-f& zL|8q389A4QY7!@LwDh0*=Vq_leK`WKzDguLHT}Pb0(nn$6M3W{a5a}I@ znbM_nvX)#am2##)aVg^ac!-#i0F1 zs)5%?c0SNw%2WY=kF3s3U0iU0nLyho7RE!X2QqUfB2U+D3)pZGkXX=gobV-j_Dse9|yEYISE^cIzzN{;er{5aS@(q zZvaGn1TDW&?;|rSYg>KQyiL9)^Awq@KxQYdkcAE7V6%ZoNpS36Pl$_4I-cJsnD%8uSKMR)_$C;?It`$#HIp z`iD+YWy#KOCn=fk)LuyW{Qa{G4zzjW-#F4S$6~Y@@s#ry?tO3cz4jKn-fmTbYX7x& z`|Q!>mB(pby?WU{f&-h9NW1`s8dH4h&mSb95-bdQU%m`9*e=GI6P|B$MCQJpS~`TZ zH=jl&5SD)#As(SBJJA2~Wxk@K;>q*GZOw96WoEFBqKXR)Y6tvqoea_U-K@gZGfE^F z{T65VoWt!yk#|1nLM%XB0ac0u1|A#?3$&9d;45fkXOHHTm~%IHMRR2JV8oGDC?fv`C=o(4Y(c5%YF0e3pnm=^(iM{q4Eg zX%``Zx(ARX0FShZ;fYohyDO4|SLTtnDFEH_9@gL9-sU#wRb@^waUFslod{tX5j~4n z&pJ6s(21#0WXE)WG|4O8Jo>~ik6jKDe>D=${bvJ!91b)jK<(APOMc2#v5tBjowD3f zAUDD~Lolaq_yM8v|6H^9Rq#IarCHHs5KNmmvTRV}ZeOdzRSHMm_qpP;EB}Y0f4k6d zrl9{FtHZBj?!)kZkg%${YU_G#(*c$nppDvwhHoYxus@}iu`9aDP}1PI#4Mn|q;U~N z{|8Yodu|Wav>c9IRU!~K5+wcV#-FWF#3OS<22n@uyb#C_ZD{!STMnnEr$)B6W9E5? zh=>mZtbTzPK8FI$KpsK}hPJNA*($}RmSOt>4y6krD{X|s^v>b&B<173C%oQW8%dgr z8rp^Q_4NTv;Aiq5dPjKQHYRXy(vyV+{D0-+;klZx@ta4cSnu>DR+o>Grjm*OmA?wT zr!LRaA~icX*IFQ1p~+bG`s#ao-gY6J`Zq@9G=9%BaYQm!nu>=;f2~g}l)P*b7%It! z5Bbwpyil)WhHo6`=;)Vst6z7wwzfiajGSI!X_T!qa&%fG%|`%kCK&?a^}pZ1T5of| zYBwZP$oVel%$<33`%+?f{w&I3?JphiO5(*TW-gp{iW0Yxi?=}Scs~dQac-2ImZ#ScmK6!H<4@4F&gy2A#C#PSU-y5T6b<@lV9X8tKf=lRA z#~%I^#^xpc^Ftpda#4Jb<*=#pmTt-O@`g(bvlEi#rOwXItTTi>&(R*)S4C*$uyLf~ z3k`qAp;;G`l9B?qHUjkLYx`9wY{yg!aB*%z}Tp*=?j zT1xsu_!Od8x4WC$k{O3*HM^GOu%Xn4Utbeq3S@N&m3VYCLS{;BoocTlfg_jRO3-0|@#;tRZPgYz+UO{>b?SoTnX3@lWq@2XK zlNkVLSzBA%nwswZGbAtHDXJ*^36-rm2llI~s(28Cd!(^0%%b>21AYwNdVK(#1rQ_t z@#K1lbBZ~TAnArbC%q=bD|exb2O%{<{7TrRbA`O`UgziM?`;}Z{(2@bJVSs%mj3YV zTNMxxsEHoh<^SXsnK+=S0_3CG+CaCqXkfB%-ylh8inPjcIT7yiX;zKSyd?Zp&irKI z`Px-l(^gzRX3GI5QNu$Njlp*~5=k_(a-8~|R^Uo=WpmRod%~g`M9wH8X0dw(7Q-|$ zHHAH#%yzLP@g!mJQ(YFzJfv4Uc5BO%jNlb^4c{$Upap(!B{{qG3C^cqLKLMqF)rO0#oEGl`RSjH>)M=hB3 zGPr!~lJ1k~&WkDhNGWk*KLdS?^w+$V83)EifO4nXskSTjoe6DiZA<5Es@tX=n$&6* z*B=`J2}UJg;f)s?6;4(+io)xIz(QFKz$H^A(bLH7EUc%>)8GuT`(@WYS}w$u-0DSs z@t@>F$G{i>+|6HU0)`h?14amt0Z8nCf(QZj`=18?n{>Bm{c``oLGg(XVE%HJq_x+U zM75TrX49F_f@szejfMD7Ba%aN#BhgceCH-W^M+JQA zVS3ReFHyAP)s7S$f*A2=Q&ZEw<4r%wvs;QdF+(YU0*60h+R$n<;^Bqn7f9bko=^mc zI_+pPd~@R^=@ibLVj8gL?Qh7h)U=J(s`xHl7$^@3aygvbzP$V$z3^|JWZ#+4+uIv3 zdg#uDL`j1erOMR7INLVD{~iy-f=@cwKqcZxuf1_yaJG=i&_hoX?#yfqdaxv|-$_-|&z6>OfEIy)1M?QQjXrXX;8L2txOcig{{k#e>UXV*&n13}mh|yi z)_jpk*t18ttE;O(2VYgxbUqn?L%pNeZz+GhVaHNOU(!eHnQ`zfp4?W`$YHCl%UYp+ z?>}-y83b2*==OWxy$u5vhTTsiXhg_V%QnAzWxO;E*?3D9P*>Q$l1&5>)+r^u31+2*)k`7pSj7MEqyAI zn~V}nNlF;mm0g^?_5+(nbrlh2-5sAqg{Ch-f$DKXC1Z3aoliRgXu@!llgghz9aFCoVHbd}3=Tr!0JFmh0 zjx!p%XL%GCoCS|Swz93izhV3JDAU91=DV-Y$$y)@T`#Hc*Z|DF!R^yWkmzh!agn?y z4URm&cJA)}W<-7>g{m%7^qnr?#YVosPM$%L2itt@XePzhBQ#}J(nvPf<;|SfAc-BS z`S9Vx$c6v=bDa84lmBzmRmX)dhRD-&EXl4nFUihmGSeh%na`0cKR8+%T_bvT$(|#2 z7d&r+C(pnmE#pWA#g(a)#pg1pCT2HiyRfjppDa&Pd~g?8VKi)_Zmcb8#GU!+>Gf^# z;O3E_ju~gM#&D>^`~F`LeVM#?LGOH=_`0)D^HwX zh$8aqkEEF;2R}A2h&!}z8(WEb%7XJ{!0-iLaH@~&ZJTUorNQ=LM8z-YUv>jYa1o*X zdzkxrw+b{UfV_Xtg{G~z^q0jn(HWn@5p*jx!qG$tnX4|)`W(H1_c|2AjEe9&U}dpw z+ac}+7sfGQU|@{xUZtrm=+-Qfw5I?S}nPLOnW zqr=;d4UDu?uAXWjAI=-|@2OQA{5-%{fUQCb`nQ?yan`W7)|kC)_s{nO7K+DQ5gF}D z8@UhS9L%PFt%tgEA`h9V(W>~*IwON%{Mryp5BkqP_5&*Yuq*OrDq&CSHCy%p(lEHa zO#v8EpUt6kPRoBap!?NUTf2=-c&w!Uo*<7*X`;3+o6h+CvtFBRAd&`4Y9SkFXnrOB9#^Hed1 zO%=*#or1F?@eN4tw9-L$f+_^}j9ty72@MC~Op8t=P11#G!R&((!Cd{=fQz4OL$Y08 zUmuvB#sY5oFF&@n9?z9oon{$*vQfnu)FWA;K#C)p<62c?N#z@>Aqe$}qlknv9|Yg~ zcCDY>8W5w0Sw^VOh5V!7BzXwVO&pNt|G2d+ZEU!m1^~PTjIE?a0vU}kvPkC-sF+Uy z8>^`J#-ujj(6d;*%!(hu;4g*0)Bxlv zlKhBqsSfKiemb5^FFP6Jpp!nn?b^v=u7`8?6mus}yuKa1HjaX@+g=fvaeM3#ctTjmQeWWST( zf4aJ!fRQ`0$Oi!*TOA^X#a9EF%)Ne}U(M_Urfe_c2z^?vw`8_&VUu2F%gq6kSYu zm1uF+k6dx*-TodBloZgjmo1(&dt4RZED7=RJD(iO6k_pbqu<@%*VffJ_de`R_p_Bm zrM1#dSj^f}unqPn%R`t#z#W%^h9<)>VrlGy;=1VlDKtLIL>A!6fxIw@V0g@j!^V~RJ&Ujtxb{`j$_F4VdOp9nd+vReC(gbxLNzjgSMF$R`LygFilBm?DmauhCCo#bqrDhre8 z>M;pqCLrTDG)2-!s4^x$_y`}0yli6_>YVI?6I@sls2|;G7M}~L<@C%jiLmHx`qdJ| zLyJEJi6ill%9LV=IdkQIW=YLYa;``WB6sx3wP`rUO-2lcMppg_n8UXqyIXb&eg^Yz zY~UBQuFdzae1{p6;_|nVSy~C&`RINmLzAY~a}I!=5hOMB_9hlbDmjubs=D$xUHbMH zNRF^T)Vvg&5(@#E=IHp?=DIhot2ge~UC;gN_2lH_%=R`#QPRt=4EBZ`tLFI|!C!hG z=WIR!erB!p+gLbK0x!8IT_6%}LCI`c1p}dJb!|IP9Pw*VfZl)qwYl7#E(;wev^SHQ z3_CO_gn|I3e>JE%Y&^y+lCJ!^Gy3~CS~41dMP5NcR~+46&EE$vka!@cX>jh5Hz^Hz zXh2^o6R%V9|8w*1t7mr$s1k1|68H!T%XZwR)DNN$^z*S&l}T*Vz^afp$wPtwET5jA z|2va%IF&2YqVKjwLP?9`r^hTXymjWb8hE0WYWdryp*nSJ|CJ#BRvTQWSA|_}DmcZ7 z`$jL9ALYuQU0_fXjBko4767>Imi~~r7`gTM_Jk1fAMHM^`HI^O(^k!O!4^_Jn`GJ* z^Y&9W2m|Sf1dFgBxo~Or+Web1t9LV11{#2>E}@(>P|ajZHQJ8(sxglW{>|4yq z7Gr<^O{V@vPBY@xcJ|Bgqvses1hn15T5V_|YhxYb>@S+scTWD#JKZl0CMif)G=`E5a283KC>sw545MaOG-8-VtmA)?MO|j3Av_zCR5_|#v~`-8a5}oWVwiA%?3Ud6$8bp%!p=?S@h639 zmEEYAD+2jgq+W;l_mOK}lAdP8d^Q`%l9iv7tS?TA6cp{1XsMbmngP8R4?yCdlsf@3 zNb=#s_GGrezazARgM;DQ#4G%&r{>tMG6o8VRM}0xaHv6j-V+u#XY!C4e=I$bPzvke zq`lIkU=GD&vW1gxO@T2PV^XGe4i4h-;jzL`!)o9Wsw0x32J8WL{z<-!iDK9-y2O7U zssc2H!$(%u_jY|2j0ngW5M)A0KnN_q&=FvPs+&}|U>7!9H!Rx)v4`Goc*m|7IPd`8 zp%2hRK(}ogh_tk{ww{FncKm>qUNlOdNJE5NCOcESBwbkhrDpL0N|jac+7x`fwFM4yIE7RlNMK+lC@!UXp~{rBI0 zK-&lXH=9`y1<^%DvD2kXeRQ(%Sv_qiawYSc{05&F#dJBfB#zSU@t5LVw2<0{=0 zLX(t4MD;SUTQX}9U^=yb%c%W33Iy2pey6CuK8cxVms4k=$#g~9H06@XF(hV;pzisc zBsM&PruJsP?-aHTL{NE}jB+|0_!G{!tSB{riM{n&x1XYzrk;WScUTE9rX*IPbK(j|=<0oHBVB07Ge`T) z=Xrstb=s;Dt~nwFZ=`O_l*WmVKv^mJ+=cVq^t_mHmsmwznFc45FuYhY6Z=Q9B&^ln zPIvz?{hzt+!fv7{Q0Y;EF3QRBxN>pjZ`O#Ps-)$0pcAwL~KH z@SiydMc0xcC>_&Q^sEB2T=Q#~PDtsQYFQ~``}O2V;z8|{!-a)Z4Y%1jIpv|ma?}d0 zbV7m<9p-}neY8?(6C`B2$ZO4s1b*}0*Q{PQD<`L5^{kxur!m+@uOa{r6KJ{%Je2RS zLr%qOdS5ZQQZaOV257cET0(T3LXCeMxt71|Cs32c^jZg!-qFI|NW-r_F}r!ob^t;5-TUIAzyq@Zy1}O5DTB48S!}eC>9EEaT&~hz$2?DEqPyT~ zZGF^#)7}VGQVqqiZba4N?D=yH4KH9+7WmoE)j;I0t*;MOFAJHS)!>aOL`att{1jsf z{NLYa->lqRDxrDNPUHaXb={lrLp|=yGn)+VeC=+u$>CpOc_EW~jSMPivs|A!Cjk^@ z3%Fk{Tjp+GUSh_Q3W?Ju_FP}r$s3P&qO?0Vw>CF-8?mX%*_64=fBSN)!XLxw^d)t+ zrUsScmF#E+wJa-7>mv&thKo2(4kQ@d zNU3j`*_K)sofo-!Df2WLwn0gh#!9m!eQb6ue`SvfDo3g1ws_HjK$auy`|r8G9d|`m zMUl9^o#6gd@^FkIUfifl*;#zaWcvft!Z+XI6aK=zMR*1t#bqsX0Yw2`c@LJ{DW)6I z^!7w*WWaK1s$Bsy-sTTqmiLm!o=CW&PnI9u^7G@4_1P5RQL2~WT7+Xr#q#V{*k9YZ z5rg`77NXhrnVUZwJ&0ViK@T2E(EAQ_=Jxz)>hnmRY=jLLQQ3dBdrV5RlJ(1y0J|82 ztCEwGMLcrc#khFZ^kxlqj$~CJt@eZT%2XV1Pas!_9u1sBLzu(G*1G&mS4FEG-Q z_U5v;knwhaIjlbS>7EMw(CH5Y^)=I0?hB0iS~$%^c6G7Brslr&zr)7P&ILZ-0M|6v z*w)%we(bWh=0bAVfGt->6j#&`(7?=eCHU1YaGe z>+SWKmyb`)r3xV!dgZLqOa8}vLsq=WE~T95KiD&st){DZMhBDsAq>S*7>;X2kY%`) zjScv7>xC2~3J(uxh?e%h$43yYG-Gg02kia=FEOGn2?^61xBU!la2(x!Zn9hM^j0fEQeDItG$Oon~KuU{cH4M017|L0amJLDa@ zs!z&^E9|C@c#0H5q6@6{JPj7PCeo8k)EA*zYHKO-d7AWD1UfG&@);9aGn7jhx#%{W zCM<9OkGX88b!#IVso%=~rSZshEXM~{cHf|B_4}bGE1;V^F}qQ-`9jAL7#!*Ag^wxkO<3@j$2u2*wtcOzl9BBLs27{F zBg(0A#zRBr(F|l^a`Jk(dD@bF77`kb3( z$xO$ijP&#|3iAz(41V&KbqDEeScxVhg)(8Q3FnFmem+f62u*+&z2QgJw!t(JuC5m* z-I;-Sy1TneCyUL>-rH7|-9s7$OJ(W&3}DwPLiWAVY_tB2>D<)8@7&HC!b@a*jW!uG z#8Wf^^~&W43JR(`$k0~Rm?CxzXa#!#>p47WS)E1#;HRBYn^PQ@o3u}SD)Y(}H5#lC z_K(bsA*tq;Nz-AP`7hp{J(`;N#d8fid82GQu#oRVcRDwa}A5TkKh1ijDOW&Yu{O?@nC3jEHvgKG+_`(Q7;0*(EX z^{_;M>h+2Xf+!vc@8^^bZ=wku!%``bOhPR17{T4n=(ryXi8gK zTYu}|_=PL#g82fia$k`uL$f!w_syYt!Hb$2iQwHy=Wmj0w(ky)@@M*mIOgi+n>zeYektE=I#{1{e-?eY~0 zGC&$l<@NzRiup~U{7zjMCLS={#ARd8f7jHN9_6f3dpo8Uyyt`9Ye^&XmBc`C78-`= z7GRZtObra^ruM^`7|*sx^$kTb(wv{jdI{Yetk%`%yE;xIXvp5}W%9-5YC>D30TwRDVM_9);{MeG%)J`SiT1xw#?+*|{W(_>jF@ z3M|Id3~z5Bnw9v^Q*b@Le|c+u+d_K=;@DR?o;%=#otOD5Pxtb(5^s3X3&0+gMkU=n zJV^b3LwSnkyYSZ!{;3PFAO{aFjd0u$%#g(U$gVAVH@3S=6S#VwQ}7ckkWkCR;U8;$ zq-w&`r|(c6KqPi7k*Q7}tVq4wY~3$t)Kk>WT=$bp!+nmXoAj%jYinzX0k$e0Rb#Zu zTADi6DV-|Iow3(?7QIQPdiC7I#Ds}!lpPBx7Yo>8+Ld?HdLgssfBKe}my=9Iu5rxn zbqbYys;%{Lu`r9}oHcgTK(=l&r`{j}uLp<*`~ARI04MikX|5-1mvDRm*f+(^9g=Hv60#`cK2vOSlE8&O9~63Rq08 zVi?96O51Lb!CtbHtauClrwqGraMfwyC^QA(vrgtXHLfClSUuh+6Iep=(AL(hDDEVb z14yyE#(Bt~!VFN}{QL*vDgm}#?*lo7`;DTPZ^tC{IzE7mnw52q?_)SenPyh5gjaL( zPGf6pUqNBOTum4(jv4#cv=!z%cE^vp&EeIeHp4meAjP88`WxR(Ap$8X63& zp75n87a1vwWVC}ogdTMrsxC)kh!Pg>$ATc&)shQbQ8~Sispp~^6#G=4d2MMPt@(T+ z6`SgKwS~(hTl!XQY;C)Ccd=R_x_l`uuBe;sV%$F-&hlusi`7D5l2wAwY_6^OS*1NC zt+i67|M~ML1OydQU#^9P;muwK?=rKpKBz%tt$%J5m|?fNi@Kv?EHv+2El0PSB-+LJ zUhT6hq1)||C&0&&HYr39WMpN(Y;4>iwY}ElozNTvvjYsEpQoT!Jo>qtBdmPzen5;) zvGKqCWiBW*8%BO8#WoR|(Le6pIQ;@cbddht^l5v0T9AMRm}=OqZcKMvQg>YMd0=1+ zc!wxD4sPJn00yYkMXDZb(L||OTU&ovk@L1n6Hi?6K{?h;rs(iJOM+gYs%=VS;=jyZ zjYL8XGjhhqO*7HaV9tPm#@wU;DrUl^%n4PUq%xYxatZ5JAT@KBdFFu$Ya$D|>L0J( zRMskq()pSEyy&eJ2r*zK_EcmeOF3C*^d^nlAXqJ7k?^f<| zoeh3%=uFSZpM#SZ>t>Oj3ytP7%&DjlF0ZVd|NGZK!{`mOmW8!)l0b!sD#yEx2^(G?S_ckbrU>~$Ol z*BpAVm;tbVX_`lsi&oP&s+TWfex+*he#gc)uI+x^JBcLXY#szBa*i^Q+p&D976Ow3 zED9(wApNGRzm60JhlafT{og!z9}XtI6sfsE1*8HnQ^7DbDNVEg_dSYREG$qpciGpS z@Tbak`F=#IX>yByhgUget`sXRX-Qf|g`KM_>^u$h5x;bft9h?&WfT-fT3~SelS)yE zFU9bs6;1maYdpd#T}^Ok?}Cwtz(@zruF%}7VTp;!uvfvbK@FxOQm3h(tV!D3$Sv^C zbYp>tk|ATfQ2*3U$XO%YLIqfr!yCQ9n$T8K81Qb4BlXLX7BbLx-wB@WCKW)A5Ax0$ zQOsiNN9I{!cM_8jMsJk?_K)ezXN|e3W(dIaES2)#cmzQrA~;dd==do#$PUHVw2 z6}KspK|Qd$D;>dUFqvG-Ww$y~Xu0M1x=(@^hWsuT*8;b=Uoutj2h6rX4kh9`Yhh~iDmXMW0f-4q z>Ea?>)vz$w526FeC`;t$vGF6yEP-w@^k_*-b#(*)?ep^v=Ust&Eb*QV-l8Q12=qYo zVqJ$x(N7XqDl&rUvS&su7bf_odUzH8IH&35k=kXpVb~13=Uu}K5RzZpTc6b^9yPpa zI=6rO3VWki1qK5!$A{wn*qJV9P%SD^#*?V2JtSZpx#Q zK>dIInfX*2X&P~XA=tB?@DXu?Kp^xuivQX>D#ed%HF@x*1gzlxya|1_e%%r0q`_)Z zDTr05_e>&aa? zzy_RZO3>|HUNl2noL#T&SY(@RMMcBXn|Lp5-VaYzdd{c@11~W$f~+^*3Beb;ww3kw*b~pR8P)#j>+3V_ z_BxFF({w9|fg&+qlj>dnyh2LvJKM_n$r@*X$_2K#jICah_RDMQ>?D2R>8V0sGdr-b zmwBh##SLL+3SIMez{Dpk59Mhm+1;XPKUoUpCYLu< z)}M%W?VB>Dw2ZR*FxccX>sT}S3PU8VGHH*ZBkd$uHcsjpm_6OCmywYPM-YI2tODTI zk|px_qn6+UW5}Pw!$V^meAb14N9#S4?oMw~=AX)_))UkUHryt@S6J1j(j^}A{P5Wc zyh%kx^(LP>Z0l|qX&*7s)?1gg(*@=Ieswsrr~cHsTs zlO6p2PGwlUyL7Boy~jU8r@x0t4h*=`S9ZT#QM<`#SLIJLKphf;TGs0UPfQv#Ux#>y zgxCyfruM_3u>3$yQs;hCQ+eD1JUolhC?_wky;>;v@8|z?h>{Vo8`~?!AS_BzTUk;@ za3&Sjpj}Z;sHK?=|KHNA@pc8n{>&7gqtUK~{>Dk-(HdWTjEb*Da)C)VxXqaA89-0* z)W)2)K39kDHseLoI!M1y`=45m)N5EPigd%xiH|Y3a)puCqLx)`? zPYpye_GsH1-r)ynmHSf3Z18FPBkt11@3EZJV;9FHX@MU>wA$a!gkEUbpSuKD&D_EQ zMUl~kG_CUha=GcOJBk}F(XV{aV~MO66%h%w6-YbHK)dS7uK%ESls$Kch32W37njOC z@a=IsJH7y}j*c4pI^^i^xzt&*Bz6OA-~JDMjvf^_5{X2h5Qf6!)l9Lo;SIOW(ccoP zoOBNzbC>2Y5lGVrPMD@&D9}iBw9*CE2VxV5l3<$O>#%ohJfy^F60GY9riNJoLQKFj zEegPo;^$fBHy+kq(X^{(8QVKLar-p$qw)EA?i0dps@L}$;qr=#85O1(0*!!ZIMqal z9b|-kj=d)On1ym`O*%azV|<(K&f5$#AO5J+wu4|kDDaFImw9321gxnr9b{#C)2d=( zX4u82-|OwI-xnImdWICwtjQr0KC-4MzCh|Ek;w;aF4Q@{$)xEkyjk^458u$&#=Mf9 zI&m&~rLXn84_mii*?8bL7s*f)k&Nd6rQcZz)=dgK!G{TRlv{{oT(xw=kEI2?Z7%F61a&?Szr<0@Q^)|0l;Vtp?kpF(R6-nSW8H?nt@YmT)e zhljFX#5y)M?gTdHinm=O*60=2jJZg%14_@?>`lt_ta*l&nSGn@PBg4AOS|$a^O9b% zG1HTf&4mj9@QiC+J(KMf?ki38YN?(<=kOG1TeMtR60uOP#P>(qxu9oJV@%3gj2h~c z>>L~_Kho`31kTL_He>o&dHp#9H1C~_T=g$B5l?Uc7RbiIAz10-dKW@UPW<8#~BNNCi~-+p|9K9RZPlE#|Pf#e&k92Zgj|1 zkOBQJ66ynV!UDB(6ymF$dxnzA(z&=Yu4Qw@@lbAdFXVjfxZ8Wenm|n&h^&^*h!v26~Xn{uwh>7N&Uz?lnFV^ssX|SIdv2qJm;EB-= z)zuwX1PR1tF(jz-NV3NF4G#~8;X;mf&%Q2iQ3Tvf5^qz(`!?f=AfjIbCX*L>$d4Z7 zCn?(Ts(I^|r6oRvqu&zp{(qHT6QI-vLd;-p?yz0<^7BIr^xy3M3?fQ|boKygCB1iJ zdGH8tfjHfjB|17f#g)CI8wbIsH|82CNhJ*?`pl?)6D{IPIt8U7qtA+GTZ#^1EN@O& z1kx^^Zi=2Uh}t$Owa%Kin)j)Y^488nxn$v5@aQsc)^}e&r23cJu{hOCPG7$q#jBu< zx!~>TsekfNgx8C0{$Oi){~x-rH^5lf06|IQPy{N`ZvH6b_1YTZ_-~YA2k`TN8>U)S z+p&;(cQ!Z0OUDH)E7EZkY5nkpt$_Ic{~OZ0SXlrgI-hZrx+MJnSNAP>DA+ zP-;2d-e%O#l~3Nz6tPoqQpQjlMNGGqMf)~dUk0cg0LSy+;CvG!BMe}Yq@|_5dDP#@ z9!Sl4%$K4poozb)%lk&!w;Y+rE4YN38VLYW%T{Gqil)DRS8BGsn}55H4`%O%V)hPd z=GKf3inM$4Z%KdqC^_6cyxeZU5wAWu>7K5O?07Su$ys@r z@b>PXUq&wlmUFfbuEnbT!eK-N?X!eKm&kSB2?c&F3KNl9GEmkF+6Kbw6_U<4(zh?l1;w{{aQuXM(&)l1#SB|JPb8$VTv+M!wDGR~+y2EvEP@WuC+f`@ z&dy$enMNT&4TWjRkK0kXl+e~QUC8KJ&S}jkVXaA7deBiEF)I0K<&V?qMNT+ma;^{7 zjy!8|Ule{|K~eubEqF4lm~jd_Bc)q2w6H0q6jPxUs3sDjwWniCxuN?g;}q?mvVb=_ z)6*GcyAgSZx95hn-;dq*v)kvIqZJ`M_wG{guQ#k4hRY61B4{3e<@duwvM#2Cc&2|j zW}BeiJhUoHgZA!y;kO-?BuEZ$Xc%t0GOESPB-|@q7T{cVMivnd_c}Lc$9+!}!I(S@ zsewX|zgb!3Y`vQiXCh%RQ7vS?YFDxjIS4t3vXaz=-(Jdz0V8-6I(B+eg;zbc4_)gyG)! zo^0(DnExa&Hq}GW>u=J9kDI=+&*~Q9e(xQHGO8V{__$qJU{aE1r5)Gh<;YLvyT~>w zX=<0&7CryaqM}e^vVYrr<6H7?tw0tXoSIFb>Ih-8=_c2u$NVweQFRsO5PoKdk+%XI zO|GcY4-aGFd~M7{I8bOi>1-|<6_&{N)=HEwUqp!L-uK4#l`nM$a#r~!a}3#888SA) zkSxKW)?|ecF&dSS?<=gPUeig!Mx&CxxqWYw4jQ22P72ursbS%9DLszjtLsU~{%tdX zKPe+}WrqY-Tz$X_Ttqd2lyHS0YJWQD?X_i z(>}6l^b{bvhad*iYSG$h_x|<`fS~umP2R#ze7KIVW-rP5e%y_}GRN;z{L7c;O1w4b zDSDi001r6{<#_p7DK=jduessIDUn6<*KI2N-|aXaqtI@FYkNlkvXGX>jJkZ0io4=zHnN`x#s%+E7}0;aok5(lLj}XkL0@eIs!L|{*(x> zeWz0{r>Lj_aQwBRUdITnqI`L3QW7dKFb0q>`>K7 z6uPwLcca2goAxHt5wq^7k6z6u?j92sk;&=lj+az)^lDcCt}$LU>>dHeY@|EwbLr(h+03ys^2c9lZZf z6yRTE5IA?{DJ6XrUDl}^K^jQ^PL@v6fRo{EMw4G23U$tC*C`4J&yqRWy)%zJB(w@n z@#?F7da-&X{w0D?nf2!f&R1J^G5JH1KNTtYC&|h$Xt04_*$I@9lT%?-yUlp9&l>oW z{g%q$p=HAYXu!_3&G4qVEtPYRT~SWd@?K@+;eZGH2y9swq)OD`D`>J>Jm73sdDh4V zse&Hwn---cogIQ; ztCSzJ!JB^e+`wOnb)OVK5F*!){?ig+j`!WE6Q@yM@|?upuSR_GWa)~_#6Y}ly?+s~ z2F?4PYNy{WX1Dpy zw7@M8HuwvhG0ugQZM*VAsm~0|a^!g(m#Patjzn(5kenI)CHv)$XS{y|jL(m#V2hAS zxg2x!+-9O%eJ`@?Sa@vk0qV9=su|E|I02iy+tj9E+k%=y$%((ET z)>nH93m>jlBPZY5%NH0yuD%LTb?z$e2GQ$=^?d@i!d<#dfMP+Mo99=jlTN4}#0`b^ zX!Kqxdg9Z;rTq?;^(LJ8X*I+7>0q@Hji05Q!u=yisMoW`w>BjvV(f``*b_~YtnBj= z=D`bp79%x*Nl~c|w%6WGOpTFAIEVMW!y0eW`NF-|n~>&7-Y&+OtGMO$x)<1}Y|dpt z3Jf_=MBxO7;)g=0G%YpWXt+%5!`Ns?xS0S`9m?_WZ4~Kx9HWxXhK#RILi19=EyQSa@xJ|A@;oWMAGWkEVmkIkZ9X{=uv$vmhuV)1TPol6 zHuBGB7B*;`6}p!g(Mh&m(10Pwd~Cv;2!44*N%%|D4Uu*ay**%dCR6+RSc|NeX}fTn z+P&2AbiYf+ zRO;-1NC)e9WNaQSJXw4)qSm$2LjOYK@kXh{SMoM~XMAudCyYTZhFc z_?tV#%i?#mwfmCA?-R|vw4RuZXA(3jwBclJ-)y6Uh^9(<#m2%g22Xi*tIfz%wnck2 z|3LKx_}Z%L!n9xU9Xec%H_Hu#U9Y)?^zW<`6jew(`(WPIr; zo95=o#P?02AtNset%k#BtYAbya0On47iM4NP#hat>M71@ZEfS}W*laGZ{8k{Kc>B& zjlSp2=IoB*EBjh`l^#HkWYb$^%by+qKS030IJkcEw31peZKS?86LaesU%ObG&ggGo zQ%UrkzUPww->yLrQj#XKamY~vWu|u)-Swc3H2fC5F;!W_& zHJ5%qPnZubBL?>9Ej|g4o0kEfg#0t#nf;4k=6DzvJbJKibFFZ@kuB1W=CPy2gv?r% zo(&lkatp@5vqqZ~2`%&5XcgTeSkOSM{Swf5!YiIJ0i5@%gaoB&cwlF;;M-B?$wR@C zuVIH1IOPg5jXq+bVaR(u*&})hbP1)y4Udm2U@}<~gYc z*}7e|8WM1nnxm38ZSe79REM5Fk~3cTkEYBaxSD+?RLz=eFLrpz(?&d|@AiVGJs;aq z3benS+0xjuhVZwzNJRL(^G+8Doa$W^plQb}2ZY^bjtzUO!;ZsWoHE@0w=@O<(Y)lfk934AIU~yO)S(8 zryqEdi_?lVR{%g<;)*&t2tHj29^;%ZyGwRG^8Nkn0h*176sCadJwEX1=bZ+kR=q11 zUj`(}Uu=I`Z!Hp*Jhc2suXt2u%?M_5&XG|~nI#gPc~az%7fUZ1bW3E=*!ERsOY=n? zR|eL2^?0L_ZPFHiX9l+!2S@JOuO24feBL5{Hn7OsOpDf55Gm_zbXP-%A*%8pOJ~#C z;6rNb>UN0ZNBP0tD}+yd7$GxEAO_OXbzXOSphY!SQBDIMqiaJga0HE7<@ z+5FVhR2X4$@*rn9z((P8_6p!F7zCj!m_03`#$TjwsCZ~ljAs6JOcw;bWnc15EUrf^ zF3S~V-0c@>mKICroVK)yJDvLwyd{qhn%(f&g3Ep!@*jO#}YM&Ao1*huHxciV+=0LISE55dj3t!U53fh>^&9`!c>;E~XkK>ozqu|#8tRd9SHNuTER~+HgQJnZ=op-mo6%@|Jph(c=QzejG(e~+Y- z(ErX*4CjUa&Jefee`n}_J>~y4^#8Ajj?Zk*f*>;`O79m0f{r2J2UF8i#XNW%@jp;Y z0|XQR000O8yioB<0Sk6MQ#}Cyu0#O<6#xJLb8K&PaCK~KVQy({VRUJ4ZZ2nOW_ss=!k$pdNuS80hBHVEL1fV0Rb@-=_ObI z0X3i^VhdtHMf3A}-_QL#&-=UH>)n5{JLk-q**P=2XFk{LiH)7Lp^+OE7zBO@08f|W z?WLE7oUPhCkBzi61pE1n4t6))zCCj5dUjS;?X@e-O}En%V(ta|)ZM(%dMPU@Ik`3~ zr6fPQH7V*^MftsJWo=nW<%I=K_BOjU)FNYIhAZ-2j~(f7u@4Fjt*EN%?`ZC9y475N zy(T}aue-zCK+lhM>a4&2^|H&Caxx?60h1acSt*G_`*%OQUfvoVG~U_d?&*;f8&z0Z z8XbD!cHQ;*q!@oM_xttN3o??glwPj2-kp_^To)Z&ry=zu+-o8sXjK)Lb98@Be*QpC z!bGh9*v&ErEAxr`q$jCi6PeK^QK63ulG@Il86E8FJ?rws=SX5?XrJ4miPG%xs>}V6 z=L+1M$LlKkgWM-V-6sNE9QK*IP#wn&NxhddYeUX8RFw85gbW_qbM10oY(fGNgT7gJ zbKL82eQ9A*kbg{MSn^rVl#Gnlj@DOpJFnzqC`yWropC5gj_=EeeR9~OKR=}`Be^e@ z{`h)PR%~SBjjOjWGbaku5<`RfQX)%&&jp#G}oMV(3{x`dsxSsu~6$TWhSL$ zl%8|%xms9z_Vm5m)lbgYXGVrRrJs5j>Z3;5I)3)}L`v9X(3!5AS0^KVuO!92^gh(r zdZ#zw%vfK?WOGeU$oW@BTe%f^9Is=Ox34`vVg5A!{A5DF;Mt?2qkWT;gM)+J-Q69N zqkUC3Zw~f#_x+ojj@H)JrtXf`zJDW(4&JP*Yi(+}{m&I{->$n|_pkAGU0qXa)6J@X z95)9C`#SzLH#OD$J8s|3FDxvr_&3{Ck0%E^x?BHo1O^3l_jQz(mgeW@Ra8`XojqGv zSXh*wf3>vqpQL}>v9a+L6{Y_~c6T%t7Up+!cbq-eS1l!5ylY#^Z>6AH&R4^e_*h2#2!UA&-3nH#{bU$ zL)KO#{a2Teb9)rc{?kDEk4%g67raQjcj{|-= z^t8x2#$+R7vJUBg9g6>?UGVfaK5S|IzhwQp+N0sGtU1T|3B03)-$j++r7)kLPy8Sz|4BL zrP*$C16@mfU42V)^8fJK1qO$>1$ub>5AWIk!)x^a$!lzJ!OJb=`~|1;=l%c33#h*5 zL(T{Lo~M&6EdDd=1|(HSH;=P{{~@aVXQKX>zFrs3hIx5fUpOB?`Y%fxpZ$N)LeI^} zOV>kBSIf&o&r3^B-#}l>h-|2*rK9Jqw@XKt?5XeNq4>Y}J^wEY{FlA|L-{ub{eKiP z_Vn;J(k1UQ)H2#l_SVwTF>uo|GV<81<*vWm&5-P=N8V-Np{V^&MeYATXZjz~KM(!S z>HiLmy`=vWTwa0yBI?4w(18j5{@MKf>*vOg@87w|!u;H`*_r95PaZ#-;!aMCkByED4-F1H?Cl;>2kvP__3o-M-CsN9z5Xau;1R! z*2db((!$(~vTyGmQxjt&Lj(QYdb@OW$l5!#G&R)KRClOsS5{I~AZ^9X-}R~Q!XhlQu^Iu`EbDwlRDSh#v7xBfFbpD{y49qGkI+&;)|Y6L1y~p*OKlW&O-&(Wm~HpA$6z3nLD%|Z~4qi@0^4T z%ri1a;?>8cmzepQkvYE3gvVc2pVv#>c=>?gsQX6u+rYxz!}Z?q{_`64oo+w#OC0W9 zc+*+D>*9U02*3Estq1yttY;OBfH zyT{q_<8*!BNc4tA=v!l^?)vcJF)B5*=&x_W&cvnJg~0duJ?Tpb#>*J? zr^tn^ET)oDFz$)p%~)o>*oX8vBV7uUkwz9)7|YU|_I;IYxa_QyewMlVbph2{?Tye#Lr}k@^G&mq^Nh4tH;ObnR>m%Q7GmF!eQ(w-m-^o< z8M?gPzY(?NSLpEM6?LbfKHZU)cWN{}PWM05TbuKD`AmghO&$^dCrMy2R?{-=_x@IUeuoumyC>Uv z&r+7PT>ZBXY8o~DW2Nt##$J@#-r2HInrn!M(Jih=eW`7z9us=}p^X>kXNAr4gob4v z=MTi+UE)$d>@xP>?_e?!1AV$b>f#otoad}VxGO=>fD`$FCS$sDOZDViT`Ty(zGJ|C znWI24l_8^PdM&GIn_&S3{1Va0A7Z(P4ENEU%}|_OC-%ePla%IB^?udnv2%Z1?VGB* zzJ6Grq@bTS!_7H|2ByrP^byY*!bmwnMnhxxU0;-`lY0Kj4ozEJ!#{qTp@pCNI^~6d z^*nMsio_5!UDH?+g4ADI4W^xobo*9rI^3|jtEwK<_y^*gYAd2vIl|d;IufM;%|8@p5!KlLQ9j%^#ly0^q~dVd}B&;FtrkjG+P{ zPipSVD>Q|hB7=KZ-EzICB!;vQPfLHOM>vX~C~KP1M;b_2U$ZgQb0!h8Jnm0jQjs0! zrJ`2z0C@&K#c-@r_=ityN4a`ep!krorG|m}&AjTA!xVes|9Oi^R+YF}dz$a% za|BIR5249TN5--;UYGqC?v*e5uzY#zH`^X@GwCe-jRpDaA3@s;}r%rXEiDKo~nCX_+ zwXE$%4wrtpbbT|i_P|rDAUu@Mwd1q52MU(n1S0R z-fD-9Jg)flwc0eB0z);WBI$|XM>?8VSa+znl$NPmskQ?abcE&dtBVl}x%xebX!Q`rdwFsJhN2``ocmvzdhO8zVW?{L%2=9h)aFcza-wrte@cNeoMBW!|~wKWl0T7lARk5cX}fXyvMSk_6QhrzEm7obX7Y{ltlOMRl zd`~m9N94Rk*et=(Tlr?;-}x9#kT(Qoh6+Q~3&%froBV#p_14$F=@{VmJK=%U zO$JD1Kf_Zg@=`ZbjD=}gejZA5D+k&-X8!m)KVisr76%c;StrB|IWYdRH6fOe9|9qt9 zM$ac60O{qCi@WJS4?Zx6&N}spLG0q8wKoDnHl-17Q^2swoKvb4Sk(D;ZCYbk@5#Sk ziVeEr*6!nR5nGWJg0L?9Uz{`T@7J1K6KqU;L?FZDE1MYm>Sy4uC-dDBHS8Eo=Y603 z2lsxLI)*mLS;L7gy!cpS+x?|za&y^a-%mF8jxnne&aJnYue`YV?GOttPo-_}Xb%PJ zg9rb9DLeDCF~W-Qq!NB6@$VWxRq#!X8z)aql*N;Je*Tyge7WihGv*6*FGsE&XUxpR ziShz=(+GcN7{bLd-5dg!FVwpnyGmuOwZ)dc5jJK4cv2iuI^oSAZjb`IspLPM8vn(| z&6s^cltS3ex~Q0jyH8Ejk4Q8uPBfOr3$spWGT~Cp1oe#w&0^ zBqI#C$^}RkE5?d)06!LJM2!u`TntrJ>q>;j&8FoDHd2kCeMoAWDm~3| zHd&pbph?B%&Zbvv2n$i*fC~DB)Ws-rk~jlAPd;gN3|6s`k(~zDg){*s`ZM}s^+rS# zJ>zn5#s$VpFIRz zAi-!rWT$O5jf^V042m-0dL&ytD)zTwo_I;tBN|~4f;j|jS7D;n$f&t6W@ioHK|%|W z&_)~p$woSe=Slp`7ds0~4HAj~0CN-s1YC5jWD*j4k;X?w(o;1dqyZ;ij+aj^xx|~z z?WV%TN$9Dk8gf)mBNEJm0XnB&-u?`&&P5+V0eG)m(b`K7SBTz`g}x<)yokI(fRV#+ zoa#j)DZWM=<}o9b2XIN93fLe#x3H0NT(pN>;n@?#Dd~kMeh5$uo@J{pC%{ygs7TI% zP&HU#2|R~>I%arFmuPWfdRFR|(yA?`Hz}Y3?~*77evYfLqZtWMfr6ijVb7SsVOq;+ zFx*3Af>CMLv$E8ZVnvp4=~1EqWhe0n=t_qlqLxT;%cb}zA$E~E3k29mIuq7$0^5D> zO7~eD*j8+T1(pTwdPBA4+tM%7_>o4`v$0&X3Kg6wxw2q%wdyS3h|N83du2zk-WG=B zAwKG|YW}`0mm+~9)9F__?XKcV3;EnaDgItPD&PuXJrl2t7@?x5a7A{dA`7ib%fCQE zt24?lbyx6FReu3cn46F=L^NQ)5|5xHS5G4bE9EmlBMx|;3C41eU5Zy#J6H-7m?$-Q zn>RRpqH=f(Qi*y^Zne_L@3Jnbf>FXUv%i|fXMH1O6e6zLXBayAT{DomvF%rd4GlaN zbz>nN?v!S%L*2ifX7cA}shi(5YN?-LNB-ZlRel{e)o7N$vHe@9sKm!tkDRDJm~qXN z1Tz%Wfeuc95Ca}-eAORUQ>a&&WMAQM9Zc(}q;}L~XTXd~;Q7Y2^CxQ60h+#DrK(sV zl3VM6t21JOa&)*Z3HF&*SN*HH_LtE~PTgh`HMOoXtga@@xc<&CsLI54td`Z_XmWJK zj^Hb}P(+A*L%N^qpkIz26K+4-aQ|n++X&q^y&7e>`l}tcM$}-t*;w94+0qCM`%q&! z>Xv)y?QC4FDhGq&-@dlxPG_%1eaP+E)!KoKYxzsJrdhbZ>ZNNP$Cfj;Pyebz%GM9A zT8WZCK9?;#TF>n`)|Twh7j-iCWn1Z z1{EPNi{p9m9H3s__cJ2Tu?V}R8pr~`{Lvs~9>Ulmudg_S&FJ9M?&2Wu5d~y3y84_S z_6>DB;@}Q&`(^5yoMRpwlN&fHMD&mXyMY1s@_{}KkDW$h#pESAIcDP4W*6Y0u}~(M~CuFhcCGf7n%+~q7G0^ zhimA=6){7*4C9n(*Z9!L&6ts4G;s|L)+{i3evh!_Mw?7W*+SrnbdW?D?dTfqS{Usf z8zu3|rI^?Uu44l+WB1Fk@5;LSv&JSi#|Fx=AHNE7UB{;#MnAJDc+2sbtg#}WvCn{y z9~IL%7WQ0ow5U3)kuUt%=t?qcf-g7uMKdIstjwTd*UKj z+)3hMu5fYpxk9(N$p8Qm00}Nv{M3}>eePwFoE!@y^?Yh;z|>B!0+o?w?^4tvS zHXAx-$MdPZKm0Rj>NiD!_k!sG?byfMo0#eg>ZjR(r)Dl_%M;A^Jh43WWQspzd*w-P z3?}pvjL3Ro9}6h*@YVrOsIgC-uRL{mJ^-UxZQ&tZCI!qVbD_Ygp%=h3VMm zvsa#Xf2?%I62=ACd1Bu}58;_AU+8>I+T|)n3+wrZ=P&whp}Ek@zxWq#z5qSr!UrN@ zYU#$7m;8*`_#+=*jPJRJIL$+S!bh>-U;aF&bF{ZW03r_P31A2|k~ z^=OHL{=FWow^=V%aw?WRcES!$7kSi8!m4#8ck60Z&T`&gp&XX% zfkUv+Pu{L`P$^>1%$KXz_P)>AyDZ+0m=A$Ru~)-GD6Y)?To0Y51Mhu>LkHqM4CQ!} zOqaxq(HVz;C?K>!7^7n*JyqrS-d)F!j~dv!I{f$JkT7bJR#I33MsoJ6Lm$uHM29ve~hUnpmiHJN}E z^{Yzm`ZkF-CJ(+kKKOftOz$ec5C0WT{w^ zzc9_-`_8)~LF(jDNB>-YD|h|8wnLEik5FxfI1?X{yS_`|l*Hna9u1wCYwvjMXW_-4 zMQ1ifvpz3UV4X~S;ng2zou_w*|13O@FTVQg9{X3r%U`zzzZwK<6Ob^M_mh1GZT;0q z}5PxiLW-hG?>cYsCu=Gv*>ojia|MCsC2M1pENov29bv@HmsABBJBE}rif zy!>;I$6@;{2t$+=-X@X(nd!Q_>^&)630`3Td8Vyr_UcdlRWo7Q!V*z1p9>xWAO-^b zx1~J6>_tW)B%STJJ?gIssJ**DBr$5n6*o zgbBaq?)vm3BqJ{v`_0DR2$(AWKm(8o$5U+mEQR0piguJ}99a7{SkhwM~SmdB}3>Ec>ku zDc&-#=gn46oxL2>-~Q!3L+`6AVy?e}^@~P-o!Tl1y*s~u=kNU=_LCpD>X>_-Mg)`t zM`oM0O4@gcifDCa9WXY2CxrPw*ta+U0IL5B`xam~rLM7h;xPiRlM&>~zEnY}owCi8 z!oy4{1wXlns%wKuTP?yC+C@r+3or-kEbT;>jEH16#VosB-uu&Jz;{oK=+y_W8f-ft zYwyHLxn^4+Oju=RJ+2m1*oV4YI%{s}-28X6R02$jvP_*$q(>!B|9V+3E`-5!h%e15^g+kcbNwUN4|NhEK} z`@8qn@6?PMdE5-T{O$eN>&q7X^BQr{8g0LBflEThs-Pml>Q)*HRnoE0QYdIs>S)04dIRf(r-VHEw> z{Ph6~ruE1{AvtW@TSOm|z5keg?RwUc1q4rY0pV&Z(;}Yoe(VTAB*doX;4or}|Cr3Dv&NfZ|UYh$g z`}XO+mQTj1#0a9`fZ$T>ciA2iBFoswg0b>6Z%8W;W@0Vrb`}Y6V1NppZmE3Y+NpNR zApKfjs%|-)g39i5(+BqNmpk!7&nfO6*44k~r--1-EtAp;Sd8x?u0}>F(>ZxPB68xi z@I69gZTQRL$EOq4rgGT7_YFdi4}hdEaEw%c(V>C0VVfRGM1VC6V?@886Z=-_i6WJ- zt(o}>t3!kSZVXA0;4I;jTS!ho^N%Y5LSKHT!f%Uo?eX%!)1fn46sPu~uJg7?_tS9B z6u1PJ;oh2f1`N+j_yk+pCdXhQhK~a%8efLom4YY^$?1Ad3qJ814I&f3t*@^P z;GvC~FrY}BOj8i@sX@um_aozXorDeW@$p$^K}%^cAmb>A{c_ON)~QOUL{CxJH~>F< ztxCd+7cc9nbkuXbYGFfS0PotDQgOuAQ*4}sm;_B$|@CAJ$D_K>0@d? zvY6LC7O%F219$QZI7*8^65VR;60O(~<;`#8Lpcueu7Ep#$xM9U`_8SZlwtt|rulrM zK{TW(C{HzBOPlN9y|-Df>r&54K&M)UcBD+5r-JfFqbJ+~@UG+@tB{3xh$!3M{EGQq-q+eYK5lYR|o z1i1q_10C^lBYwx^Z8`EY5!UlDGGJTa-TK((^6qv37(I0x2#Z+VH};DtPkAcubd;f; z)$^=xVmB)G$o6H)d;;r!Jotp7m5(qdgnlrW7ufb7{djnP!K|b#{jx?mj$#r7bFVTW zKa+0n$)2gRkY8O)f%{S6I9EWX#W6V~b;K-)pSVq3mE&=gLkwzhK+z0Q!6haSJmfrJ zXufoQjKXs#Y7y!!UH&Cwx__fC9vKz!5d7W=#B1^-?$DF9&EGOSd_6jzXgR*{y?y|(GM4{&j@h08zC!1nZOcvIJvry9! z%`EhvtuW?1ynVskBjI!;HcTGxoD~jJ<_ELV8bIR|MyUb`d z(g~Co8xw8aKjc40z708DGTX*M9uVCjEr)nDoYW&V!A~*i;-MxH=OZkD)RPNKP&f!v zu1?7~v-t`&X$ZsEa>5yMuN4Ic=gy1JzvP}zT11fJ#~e9d3O(c$Zw^IHV7apclICy! zgMA0*th1D8$C`ir1YBi!uf93wE!^2c=Bm`t zbH_$H+%^#*N&fRj><(_gKnf{LLud+7!@2X%ffFh{`Y~>a7bCuWE%tf1EJ3pg^R9pIC;V}f9UDiy9kj%o4E@M_!~BTn`@YLgVq z;8~i|;&(H#&d%X3X-UfKL{}gstPLyRBxBT`jKN4-^pyS}Kw^|VA;=)#Dk6lqvpKg@sv zWX)Q{_=4O=&MM3lT_(K7IjL?a`8-Wig$1%BQaw0FyONEL?J}W=Av=mQPS&8$Q#8(E z;91UDjRnqI8kCA;4@Dl>ix1g>V>gdgx^3!^>_; zMIma1o?9-XSw)XXg|TO|Id3$jDFz0R>yP9N%G;#nP@yc!xoHT0fEAprc3exzM1>02 zdFXC@BT{x;Y+1(7(FpS-!c}Z3I8`YB)$AMp@D-NFbavq=8Hbk65{B^a)5Dxl0xlIqJA446MtDlQB#es zr_Mw_%U4umWGtsws1{WiJ|&CtQIRav1rkh@b@girL_~}58DN;@0e2O&E+4hr;&6Ed zLjHpIETHDH3l2cZ>Y>D0!UwEi@f(oXD)fjHAJgg@MMlZhqJ=p=7nf7a%ox}noC4`| zh9qc6x%6QWQyzX=84|AnKok=y-EpqvCLxRN9mOJ8%YbtnoS7Mjfbhz{!r5vUV~)W| z6!0P%zb{G*1%MdRb>$4NnJwU)cXT6(U=bzONCA$MZ^$YTzP6n?<0oO}f^j0>3@-Jn z4Xbt#!I#hwvNS{qa0BYWEn0)R0zV1&4p@H4r#;ulmx#mG_+6beF?Q(N01!deAmcxWp!HilMLV_Xlyzy^CnI2GXr)F%UA z_bPOE6Pt+k!bLxjPAU4!Mp(4YnND2ed=;HDC7x8Ws#-55eO1*8xLX_1J?%UTs zt;2-UZ#{FlT|h-=@P%KLHq8A~hJtwQa{JA%x_8F6*nHtn#@N46>~+67+vWP79e1n% zERzd};2VKV_#6P10N{^b#QH+)md-{@BjGa-Jk3KFGLX(JtXgJMArF0;3j55&>Xc#U zNDy1VYy3=ZCTT!~{RlTE@&*;hBDI*6As^OZl9?^Z%;uh2!e>^?{(1rlk5`~H1yhkO zB&18{T^|gDN60?&BUZ!GNQs8zbt#+C4ZYI>tfM@WUnI!DVlWq9`){Sx}gWZA0qWG|xol?nm_R zM}(5^HJ7BoE2q+VoVbXDsefI_#@F8`%(I2?+(6uJr8)Xmd87NTUoCLi+oYC}2ql3l5UN?Dg zn2$h5qut2pUrMf{5%6(nGAC^w_=JBzfF8`ubDSAO2#-C=eDEx)cY}4`m+B$o z3L|oRwrL_usYu)cOlT8PO2MLpuoE~eDyxafLr0UK7Ix3}lSq^hP9DG!_#lDTFC>IJ zNWz+(#5q%MJF}2x^X*nK{Q_pcuI7DbE>H^K^fy5x4vP!~x#EHZ>>(dcpAUN|h|7uoa7OmSphMQcu?0Yk1`F6k z(ET4~XaXRFJ|>5*(ggD5Q0`f$y|VgzU2&!4AtD);?25aFAGxWCs?kJNXN^?XkNmxi z*ENORZfGj?hruXAzF9-Z#zsLBDugr=LPB+vkJM|9HD~oXGLRxBFd_sz6T+q~a3(ZS zTCCA0uHz44#(557rCh`t;~^M%GRYMQ=l8Gu9$Su?c-t^hut`Ky;WY9nlZznm8p=#3 zhfQJOT!c&gz^?^R^!a3W7SfFjf+AcRXV|x4Sd2H0+cO%l$?fWz6muMxh@IM^#g&sE z6(ggE8o0xz=raQ70Tl3P$Em4s#uRW0j{n$`=ns3T`Itz9?O_fW?3pt9Gk_j{jOGEp zoT;O{aUvV7D-T5Tfjtalh3g}Gt*NI%xZcsnOA=4}HAjzYJ=SLopZ@dI?PI$q;c0mc z8hd3LCl5PZJ`g~dt|{j@YC-o%Ghz_xg%B!=KAV<3s|2AUKlV>{JuxlsHI<+BzCY~C zLLag_J+>Q+>LJ zqWOMk?tFJFU~%+G%h>c}*5uuQXAHvAqkjNj9`NAfJiHR$vhgsBMX9Z1oxhMU8}G|Ti;x%Y%EOcxC~+QOE=<-F7FuBl z%Ps<46j(GF)ThC<`A9JuT!f8QW#eg0`0f$>3yP3085E(x_i*7(dqKGld?!UnZ>iR| z8!t{q9XPP;v=_x?Ex)9{?e=^75+Kn2zTO)L8-rF7KGlc+C5&+iQglA5h>kr^MvYJi z`bYv^w?5$o;W{qZV006@T9qRMhQ8u1>JtP4eC?GFKU^)_{mYKkS7c!U_kDl2&>t@GWd`)HTW0t#G#K~c$ae?^`#&I@ zC;$TLz{CFq!pYe(N%s<8mrA$}u`By7ELbPi1|-jgPIl)txaVwEy= zd@s5FJZRlo^z4a{vPFT=XzEV45lVk^^<)`-3ukPAkv(ifJ?L^9~6uKl_Vt;q_ z$xWk_5s`tr^)q)UAL-Jg3WHhAzK`p!1g#TJ2#2K%U)kSw+qF>XMfXom+ntvWV)x&c z>A68JGN>2TI6W2-G}wQhOfyV?1-%;0+D6>l`_mRN#u7WX^^p7icaxQ7XPo3JlirJl z9jFr3Y6}=Tefjp9D&9rOQd%l<3W?87Vd+dm#1==oa#e5&mPJkSOg-MJE zmRb4?wQs+L>UEwk4$Ihb1|{-!cnA4Sc6+WNDLq&?_miQ85E=j6+zcnsECA!qWo@y; zUUm`usy6WlzdW-1;UHG6n<*(Sgsk29O8EMf%~!5iCB!v_HgSc3hrQ{R3~ysKRF2M!={+?g!K^5+_j}&#LcJEx63uA-v2($ z&dS+3JJRDR=eaBI(sx%fRSTL)_^dmLDWmMT{U;G7BQmqZN&8_riu7?+b~teNn=PN- zPcwaW;h~!0;Zlm6O#>R?$F~sfR64J4qBps2ZD0gy+ia@Kp{KwATF3{=o<#3HGq;;| z16KMvz=a7e7}~(uP3x4~<@HHlK8PSxLlFjCX`F`v$Ka0e89@XgZ1&UZLtk2=LIhc@ zbAZF2Fx1}9grNoapQ;V*GcW%*yuc2!61L)g(yl6y8_y@(?x zX>UJCC4vy(KLbfc-)vObbMn=_S}Tl z0!w9g7~GeXqe}j_!1s#Z3%8%jIM#B-bV!wWn3<@`Wx#em@dZ`b zESW;Mz~sC-7D_-0^~9V+hLxgfEKbf1LmC*%a)&9pXQ|)*ORsQ;9KR!+gt!yo zz0-m@fLCRR;JNR?R@m_lnQ1oSS&H_?Tl~2+1}IJijDNqyCA2Ix6_5LC2%ltL3`|5Q z8&Xc*G6N?EdYeie1N`KhvN?OjB!v$JczZO?r3iR;FR}yD{B=4B<9n4QEB^TVhs$O< za3z}^6)@_Bqpr)nOY-x+ffr*(_YvJ@hDmZCtR zy!aw{U4pkK39s9e@unkOL7BoqZLre9nJlUM?RPHhI)u@N7NPf6Rt%&j)0xpGY+qv$ z;jxH739d=4JO@M=lq3QPKuCC#HFOujy&IL7I9^}OA-BcNz<*15RdeYy3KGF&^wbRX zOWb57nTRh6+s|?&C>)+M#6j8u3AvxiSP3zT%#TnI^R+%{n?M?~&L^im&%}Y!@x+4m zrrgUMw327S!#ByPaRr*oiU3T2bs_<#Bj*6MzBPi-%<1BD|hSh?ttTZJLZyM-xf+^VCa!5oV{Vc#Byvhl`gxr9D}_7 zemvbs`#Luj1$I0g|8%%rRR$1vPr;_* zRirWDXHZp>H81wE7hOQ(S^_6Od#l9w+L#oVc)~XTwf89((#h z^ot({zK84ww^4=?lqowSw3yGw3rL`7K8aqM3u2f*Qdb2!Keg9mc@@N6JhiFF{hK^= zA=^>}(x%V9+WIX|5cR&tHIfN8!%}PwK5nl})}$`|Ji)eH)LM+OH%;Kzp83N+vn}B6 zsEg?6`MrW$XC1MnK5m=i=uHW+tl zCd9-BNn4J&@;1hYi^*nPyaXVHHZIOe#Wc*s_1gsRWBJI^5aq`Z`x3&ggxWR6G%u*ZU+-!=&M#>pXa&*`Q-gLrM9(o@;)!G&SLqNR0?Z1+8 zKp>r_w&Cr>KpzJJ%jw7nGTMrX{862h)t(eWNz6@4h;H){P6Z0nfa6p&g%W#WC@oGE zFz^k(zTp+n2K(-vJ|BiTs(;Rhm!2)1(TquN)F*m8rmkVa8v|^p zO%`eh5p&Fcu05Mf#b(T8l+IwPxM@K^+@os5Q`-!417uJu_R~fVKMj7Bff(|^zPp*^ z&Q0ntz}k|L^qLD!T%TSQUxXd=GXs5uftbKVfF$5o5wg=KD}pavN6j;eK#EJ@_%xiv zv%IZmeXg=1@LSMI(y@bsXi5=Qz9g}dn~$IYTWfK0XY=?F&YGP2O)wjDiJtSv7a{3` zqm(2r4g?$kE?Gxj60pK6Ng-ctam~{)BEvbCRSDK7;^%EI+oWG=K*NhvL&n?FAtUSn zCS<`IIC>U%1mt>`TsAX;9szLuE&1cc(SxZ7iWKg`u}fxZzHl{v|1G|J3ZP%Y9IE#D zBh9?fS{N`a`op$sy z2CnN_S-gsGd|257m9oiN*9PX5M;zQ#I&Qx9%I(7N5&;EJ=9ed;Tu96cgOngnNd*ZY ze%K9#4xBE02eHW&55j`JoCO*I@PU5CS1YIi!sj1jy=sN#_`(=AYmO4wz`Kgi06s&k zWiJ-m1yW$Zk5e(nArQI7LU1Z&jVl)-#j>a{Cm!g;fR9*#B@94)6-?#}&rz#16+jpt zE6c}Trb5~sXOFNjyXIJwN;Hv!KFvW#0muKIz?g?)GWbNjC>H}5ipW4zp;3hC>pR)7 zP~e75HNj~_ltzP@79*lb5Q$%PY6N{o{rVA{xGxz-0T9=iH+NPa zgAZP#BCe6aow(BiGBQ-at-0ueHH5(T=~CK!_y!*?0)U^Hr?cj2;_5Ivp;~3~&FyQb zGknan54>#dX2q}CO7+_7_M$~>43&Fv4;8bMjtQKryZEb)6)M)8f%Rcv&v0*`tPvF% z4XHq_0u%S3Lv%kG$fo3T*D62sNs-3{O@a!R;%xy#?LY{;JNw`cp#+Hnx zK&WROw@%YB&t*V1`S$CKJFnHD95(!wE&BcHZ7V90Z;!Af-+4ZQVFUP=8F&6%zXPAb zn($CsJk&8drZkPnq_E>?uuuq)pkftS1m#io9|T_cWRv)Ih)rq?Bw-{o8;?R4Wbt>l z3GhwNe+hqvz&Q?ExxU$We-mssbdC+LAYm%#jbJ5Gz(DRk2RjV`sSt3PiZNus^?tc( zx?qlF-ep4s+Wr>nd1M6%0VAV*H;6ZQE#W*gkq;cg*X`sqbTi>d zi`sF6g*{4!#gWm}_sI1+46_cCO2^zb>C9ljV@)7)-aVE^M;sM-gW7QzzzMj3HXZFo zhE=R~NKj!dzlo#!@7!kJ6EN@q?_LswFoA#vCvk`Q#FqjMWGNp!N=Jv2(JPq^FbJ5p zN4$$>OYm(vGVjlIqMvIZ7xB1KE|5Om8prMk=5>7fO%!x?SVBPNSK=H8IlCWY!UrDw zMr`1_&y7BKbFO=6zEP5gc7ssM^F8(qR6DtMT^8}I6RrgHY-k|QokYIw^p)!B*t$u~ zm~M?G_qLOuZupfMP-iRhmPtQOkEsK^+HM8D1l+oaHkDMNk>`#>|i zRsE0`zDK}EoGkBWr&AbNiizKA(SOUhNN!BH5U164Hl{j$%!r9LMzepf2H&{y5iAYl6iU}M@^5rZtW1fK{C;L`Ry-u?WE z7XjxJ3&h--K0_b4M8~3;`2BuQY;QercYN#^`*@?_fywv`nhb^UkxVYIL7GKVosQYh zr0toGcs^UopN-Xm&U4}LSacZh%-d^L5|}P!&W6W69&30Iy=P9qN9i-W-1sPFtWf=) z8M|9gL>FLwz^xa6Qre6@VQ%0(T1miO0Ci9z zlray04C*|W+4ExN&m2h$CC?|eXpKp-(Y!xIRWkTGKpUa+Jeu)RjQxT|S@?8ngg}NQ z8K`9~NSuv6{~J){J0RVT(b(u{>X`lgC-S6;hZ<1dCO~5yhnvBCAwWr3Q)m&0VxWWq z7YSU1`<|}f8ZU_ufMeqCQJ_u$Wh{*9Xd*k;4euj&1HjIy&_?M&U2&?f{jrhcefgc21q7eyQv-AO;2OmA~5iX)8B?A55h#UZ@ z{qM3kIa?~NH4!PM?m9%L2?07X_T|pZ^7M;4bSqdxhZYH92F!HJ>Bj36&utb_&S#sH zAM7^A)nF`}x7!fZahMa=%o7imiSNGN*t9DfrR&MCPa=8LKpJN~DU|Ci3RR|8(p=uX z#)y>F;YSVa4ZD|Cj#0B420~xZz9Lah16e;avoXedA#eQw>s*yWEp0!pQm^#W zh{|l1rb(FCW2KtKKV+2<`0RD9$F13&>dnvZNNKy6(kR}t9>pTpC|S}ypTygv1wNS4 z3*Xk?UYw6eOaL>!ziR6|KN+jgIK4+kXoYj}qTr1O!VncBXy3t;_NB78>f#^1n~QB) zNmqt)vT2JLtZ3rER;e5YFXE*{(bbEh2R5t%M6OHsU_J)bEM-Ki+A_BgI;Iin+rwyA zyhX|j-5E;PeG_vvC0lT~JzEVJ;zr-AUob6hJIh_7x{$5S`ag*DB(itcUd!3hO97i{eMTijM z8E2krVI0`+i$19L3vuO-R_)ogU}4ItY|j(C(4B-|xQ0@qy^epV1CG1%B8c(-DF1aj zdi1K~>-mpj1P3l1esJ^sZE1ImDW%7qAI_I;O^U&5`#N;3ij~$Ffu*IUjmjK(+CtEn zG@f@J9-aj?X|)+roBB#=B0&h3l#GXQBlZdmX{{En&SUwP<-uA`FWphnDm!rLrP2Or zD$3f4y~>Xd6kKV1qC`EF`PBLCJVheBi`KIh_Q9Oi z!AgH2GJqf=0BayMwX$ti=l4eg9w903J1=?L>4)=T8#>{@_4$uB@EeRTh?lWN0qbH+ z-@l_D?uP8`c^mFbGkbNt;4kNSX^k*$uy95b`Jw6Y>BPmh<2~(CL?_Z7X^9VuRzzph zLqT%;rHBz9lvWhuvBRuOX z2*sOF6eGT9Q~*mdKylE)OHz%d@CmzoSOOo%SjC>FPmPgdV>Bi^xH zL~J9c8f_j#kh3a&(zstsLF>OXHa&pJ)OSoW_lC+}Z4zqPwf(f$$GSov1 zujwVcDbhi?!$iaXEl|14-s3Av!29(CDUh0u3|Y%kdy*(s;mc8z%!)7NR3YyJDf+W( znIBCok;1gWy}ud>yA6}1{Cp{n3ug5kV_N zc$v4J9ZN{!m6et!ZmVMtS*wFrcvK&=tRBH+oQ#D+cSN<~(v}peeSt_f|Ls1p{0t}C ze(7%8Wy*VAs_z$3bT=KTuitU#MtiT6A$3_MG;%6L|Lb+(Z!7!gJkaV%W!_FowFWin zFuQ$8UUN^sg7~4da7NpWhHfK9^JD>JM^E?u5eU}47QL|>zp*!W*-Ygm78xlr(x9DFe`rwqV2i03U2D~^S zK0QrsC7z@_Wa(6r=@jsKS|ut1*w)2KeT!3;Y}{QZ9a;M1eXAu*vKTG03`51YfQY`( z9@Hv(w8BM7)%i%T+$9Do-ckzo<%U=6C|+F80l>IPKiv9PB-4S!f@EiJ?}_#!+{ju) zTDAA7T61s^#DbiP6QsxOPM>3es!9<(ME+VLhRN%LZCyK{7UN#lwTRE<^eXxDXg|NW zbEE+NTPgsDVtSA<)Lvy3vn1oRh_NtK{9(C9 zA7ieY$WBVHat0M)zP`9EtvmSg{-z{(p(^M;{L_F3atpsF=GUlz0o6${|a$2G)f_8@Xixvwxpz zP|$WL9&==)e@6}558QBFJzV|E1m_N37OQ%r{o}533pq@yn9dE}(Aicsu?E%0evDAH zG)v-rBYoh!a2e{9RCP-ym%CusDG9uv{LgB9Gk)ULgax!at^>XJe&^f7JKtV>RNROa zwI4F&<*|a4$1K(vKIYp~PXFlKUoju~)&$xluh;>LPl^R=Z%+xrr^Ncj31^IE4_=Mh z5A?hX-ay|_bHt5_DPSqmf7=4~K^OHF#Hr+q;z}nC5!*}lpmHZ$`(*!C>e|f~G`sa@^(2v_L z3i#169M`YaNGdbxk~Q|y+l#;o@gnnF3gq|50Q>w0(Vi3O#P^=BMxOZ2*kBMn(MTU| z09J%?Wf_&oijQF;u92X1GSZ+8W=X~hC<)nIjD{_i%1_iNMry4P_j6%^6tu1(F;Vj3 z5gX*XK|<=+M4carl$AJ}8lNf(I?fw$goCgrL4OMqzy2VmzD^FJqp~SzN;?Eg^RD7z z;=+&$DiH!G`EW#vfU_rrP05+Y2#GMl$bfSSb`K|5K{7N-HK90g;A851;bhW<2u7%ZR6>k2T0lWxR~3P!W$a^T zim0SSbC~Y!sWCJ+B%Pa@7PVC5>-vI?t(%mWP?JGnY53N^2`^(KD z^NHMuV3w~KEN!2r@%ohiC_3}BL@ND?Cty_f5gtFCLZTt@jIY87VZ%< za7cwvP*PF{G3t0Z52W2`KhIs3yy(O)CX)m5pOuucOCR0D;Sc3aI2WC{7u#Kph~Z-? zHb5B-2iGY%z%S!GgV>S9p;#XZtAHepLvRDT)S#REa_-Oa-V=GBeN#_;Ps%BwqexdK zwp>{lhPY~ktAd}GThq(1ZP)|+D=&Ut;hn|tY>TdvBHC-q$7(Cy8;Nk=<@6gNbMBST z4_8oN<-j{nSw8mWu>S))X^vV&IX5_LIuMK7!ugqlp%?O@b0T%D2entRgSZ~-7O;`E zn!@^os#5q>Hj+}QVh?fBaa&6(HGUB}KPw43*T^GP`Yu(w>_v<^Afvi#dUFtpeBH7R zvW&W3qXt=wh}f21Z=SyXcmNmj5ZAyFsiEI+c7dEbZtS!Nl>v~315dl$5be29HgMxG zjz}xT`p?}Y*?>crAt&Q%Pjx6n{l=M6?E5e}+6MSc_i-PA!d^Fi=t}feEh>zs>4@nop7gvpI!FQ zuPf>Z8YslhQ=!DDYBuSl!bTl?&ZT>|=dI-$xZCltZ)fbDozLLb7aCJNrjNw#Zs@l^ zeoy_3@zax|QBK3^M{SPYvXBIOe-Tg1++MN=j}5zerrla8z1_Xt_KVb!N!;yM>bJ9a z;JTEzfOUJr_>d)=ae6njCUbk90q?g)d@sGTDs#}1row9Vu|45;P?@)k ztq%2uVeUL+3s&(N3)g^DgHL~7Fxm{>I>IH3uAcsS=w1QPEs-{PrhXa6$j_ofEfL}4;PW8XKk|^ z%Agpxd<7E3QHN;>!M}+PvY?@riy>cFkqp~w2uNPvf9;7$ce5Sh94wqxkPl!p%Z_J3 zhijAIQDoRQOEjEi7)-S+-ES;OI#~4z&E)z7kvhOB`}!LWvo2T(K6tCvsr|T36>fz!TuRE6#O=^ATDU^ppnF&cH{J zY?V~3iChH81ye|?lhtGh`&OhTQaVdMeqHchCTfszQ>`&JC4 z&4s0Kks4g&mSEHkl7S`5q+=Zvu&`!ING&#)Kmwe}4+mS&>t7!TejCa29-fgKQ1gI= z@&WE+@?iv)0N?@^kaW|BYJwKDeiAZg!NG+0Fo_NNz_D4^?mZB*idaXu^B<<0LU%Yr zcEZ?QLAzj+WxZE5p%&6ekJ7*mGEiMUa!C_e$~3vXK+aTB zjocgvT5!zj>Is6-bBdVSh7lIS>e{t?{hB)3oF0&cy%00%#_l=)1hy9%-%A461tuXL zH zWKR4wg#mkDj$9DrB92nIvX(mE#`J1ThZ9(no8=ST>yx5Nqwaua=`IK*kCGYJx!(l_ ze$f8CFnM3FZUUWpR7%-F;GvHzLTKhxy@e^6@OT>mw@d30GuS}n%HwzLuv5Q@`(n{r z**aRRLA4Ls!j_MfvJGY(CSw;)@7)82^ND7TPt7&^wYV@AQ&*pjUMzd!N-&-7HN=sj zeSe6_W5!xgzgqe9xj$fld^eG15R^SI?GA_WfH1A;NXK2#S{UYYopXPP@mjM{<|@9M zPw%m34{PZ^f2_y+sONVJOQ1gEb)tRqA83l{M6-ZaGStd+mpNtR*bG15vFl<0T!}PG zq^o#-*)6h8%plAQNKbnTER2($Uay*8d_PS%@<@zN^xY(u?STf_x|O1)^4vYr7CRup zI_Sn(82@A9oux8$ACJt#&&sPySnN8~r+NLbO6Q*0>iZ8S@1y(nK=;Tf!Y-{#yLRz! zsff`O67Qo?r+KIsWD!1b#Syy4K&2+C*f%{lcGp@9_!nI~neIhj21-Fb|r7 z2SC8VP%al#Ob#fRE-4@nzqa~Ic*&LLl1TOykl~Bh+SD!TTem9#gy&Q8$KsZKCS>fo zp)Lw+>t5xS3yRf?3NQcN_Jq)XJ_)}qG{S{C$*=Y($~;(8+t>6)zhy#!e#vz2^ZyVWPo4wX_DN^c*-F-!J)yIj&c_hR{IWlDf~^RXpG86mTQ=WVARTjs%f zw9O>aZq?8%wwQ0Vxgv@@{aEeb-oe~knxePdZH=~G_!9D~peA&OO(f|OT#K3Fs{xU7u9falt{^8POQZ`#WY^T=GFV!9V{YHl|7BA307{X`E?+emjyvqEk zy=UjM$aSHg4?Z0>wtW}kW{Hs96SX<|vTvYFXR&?e3LuYR4oUx58@x*Rn_bz59=f4` zhzFhXSP8#%Hn!?Mlh|( z1J`|5-o3pp$chJ%*b=t{Vv3^rt16H{^}HxlW!Sqf+TUJCCOS*NUd2SS@@`U^0XR^j zfyh&>y)javVAd2Ua}EK%Ye!eZ$8|?tN9)0rBqocZD)f#4S<1OgQ&8 zW$4b+zs==^dQ};(_BFjIQcsl3nrdiv-GC4ZW*_M3RV<+=@f3?fRW4rO0K7v85&QYF zKQfq~yWd*#&Ebe)1CFB0-$eGH*lWWcyz(|vSib+v-BF%D5&U7 zFj3in5d>Gh7BkA_I5=PwOq>@0)h~aJH23Vqdn&g|d2Ht9X=C<$)zY$gU!S#qaL2>D z+LvrR^Nzz~gYsP5Z++vw`Q_L67{2dR*cglm(bKI^0wMeH6L|44UQf*GFfPrSY&ILV zzQ6$vXWeScb7Y9#6TgZ2OI&Pgk@jO|3T|P!3W?)i#}0qp6NVn$O-GNk_6KIZO~twO zEFCm8`;L$--g=c%eDOyvfJgxKM(!$abI1(DETu>g9jHi2=k*uAA2RX$Txoep`@eESaMtNWabZ{Gh0JU|&MFTt?*KE&Tf3hH!L9LPTNm(;#*4g30H z4m&{=!A-M7Fp}cZu7a0S%q4LD6lC^_31py@wLeQ~4~F^x8HHr)%}Nj!!2#{sE#6Jt zf$xo(LL?gYE8-C84`>`k7JyULG$TrEq>4+}T0J~knW~;dLS6;1+J7yiBAz76Nv@^s zFm=Z&a{Kmyykt>bYE&r`Tw5~iF`5pFiF}eQ-%Y`4QkO*WkeQ6&(2%I2sCba=BC&1g zq46g(QeKP&QS%UT|E!r*iJY>6gzCeCDfxK|8eY-|e&!zE_##oK*(;yHPdUyxjA+vI z)T(EtA6~d{X(7`>P47_hDctL#JJN{+6_FIXEM5_Q11*j{vH!>J^+FfrivI>C9w6wl0Bh43NKvJ!kzo>BkZjI z8-g?!`SuhQhp##l(A9_B8Ih`gI4IBAaH9tw$xcFxW;%IRLCHh?`s7C$!qJAkqG4n+ z_r~n-F1TbPkDY4Lz?8VNu}#98uiw(hD`;<*z}{<2J<>=xw=pX-$A74QI3`c_?Z$xe zEDEEWhZQR;9%f7HT4XseWd{=w`vWh~gE((?_<#syXN>xQgLeY6WUSG-DP4r&hUf$Y zecxgSi|iP$63QdT;P-Z^KPpeZ$i4>!3V$sV;d>g-|C|7)c3u6gv0|+x-FHE_xkTg- zaZdpQz-*+7$c?}I<()8;ZrxI~tH)c)pYb^17(yb8iUAo6(*6JJ%P4=&iNTXU&gw-S z$o4b%{Oie9kG<;ck=h#QxzDP#fI&bOTg`% z)oV83C9C=KaGz<&yN%P6w=k~KI#Umc&-lMvQPjpWDUKtbU~f4w|j zif@K3;2I9@%UR4xUBD>)un^^sr-j}zm6W<_DYDECQkq?OrT5?`>Lxw)kZL^9?oX=P z%>&=+$`mC}Q$Z+>ms%CxwQSR7G(nuQCyjX&96K1TxynTBrz#2&4LZinc7~}(!0`K2 z6GXXzp*y5Gz=8HCdF#An8>hwj3&iNbQ&hV86Em?~HUiq%8~Wh<(w8zaXYL{ksj9~k z{&`??YK!(~!dRs^m1QZSdLDO{14pq_VWt#ns%CkmNGS>2_C*WI)sB1Dd8T9A5*MS@ zaGK;4-uoWQi2*qzvEU6GIZIfEU2zO<=gP*uxJk4!PZk@_S`=)_5fCpHpOHcEELEqs z;SP{!V7@Ox{yKozUc9+*?Ij>`iG@&xVB6eDxL0j<%WsK%R-BC#E}0MdP|*LfIV%7$ z{T7L=KD(0{DvAkqh8S>F2)PnyXoFO2KdTL)6KNQC22sQiyVe>cV4VvE5E{;id@fi; z!VVs1{N)Qr@Ud6P$Rm8L(hLytU-_I16Pa&wl(IoQ!VInXUI>C z;S*!n(Wm+UN&YIh;0+4aUK-WW77ZF;Hz-*3Vq_2(naGVdPJtV=b?4gjK%4?jVIm|Sq# z9HRkcoFHRU8NdfA+~<@a!f`~fbmo|EdI2xYg@V1Tj9J5E7t2i|VQv7IO^q(^O+UZ)1Ofz*g=FGodfs@%C30l6ns}}T36oDLJY1XWQ*z#x zmrJE09H7wV*~@URo%d(K$a@9Rk@;~a5Qq7g0y6S5Py`wkoj#F$e-@chTcq-==TC#IX(W-R8X*+al#TS#vFRgf1&~pM&$Yqw(fWn`|p?jrTwCy1zAoCeBJ2EI;uz|gJ0?~?v zAD~}(rUsDm_v&3LvVzJWwTc)@#WgZEh5-yjmIq2*{9r^4;bMGfY1dhZ45;FabdrFH zu;*hDv@7kki0eQBm2^=}nPumUup?c4-xjdf7I~F}j>QDsBtuAN%n>rtya-umXPV6{ z%J;c|F3pWeN3Sm@AE6_EpDj@^Ch8U=|87Co?uh*J18dDLIueO|FGUwtCm;?nOjYSF zZ^POQSW|{r-*?%19dYH{8`{1I1n)Y$66c8nDWdBhAm`-517uEZ@O9s#x1yy`y&$i$4=X7vWAA4Eo~$n}nZ!^Xt=j9L`w*3m)9 zTzjC?xS~O(Ztu+boVOJdYy|MBSdYmPL{8DEzodW(8i$ z2>8^4BeUu;wA+Ince;|}f-~+2^{_up-MOtFAW~K_`w+(`)xis)1`bY{L;&X-5pIAo zIhs%MS2lqhtbsGFP2S&yU!(zQ22i5_S3i3c(>)U$dDF)$MXrGg<5?r^-ZWch%4Pgl z!J-7e@xbpE>id?KHQ>w;+EMnd^Y0ec8t``z;mf>B)3|#=1TV=#U2sXL~?Ay&wuE(k_q3@3cb>R6sW3qExOq}{IxgWWd`js+hwEk z!SDJ9hD=wa+XFTOp9QFY+uyCgFNCk1dGQeQ_S+fp51^?Dben-c@djUYLpx2W`*o(n z`rX6pR?gf|jPmBOh;KwT@5IhA7YSZZxBG)AMlbOjRpSPxCA2S;dbCU#x=lUgI^dP~ zS~qRUC5n8+l8g?fAS|h97{&I$SpR_!NQ0!FD6ivT5AC+b^t&KY`!!EJdf0!O54dR# zIL15#HeydkB4YH^ic+pNgrWS9UYQKvV9%l zi+CJw_>i1c0uMV;fVsoz=_Zd{-hNc!#vt>*zJhjP9J{Rvu}w!UykI7LVgebH&Km7> z7#VlMO>YuwH;L1(xP11J!G--e*4Uv zniHXX;))V(Wpn@Pn8RTR4aTAl(hq=pCSUqbF3AC7LWt=%np2f z{Ko>qlb>!2fWgU*Og;+Fp2jmkH}bv=aYdJ}PY*JXZhIg+1?Hq><;XxT^-bf+sPoS) zf(e!a>P)y66nTF}k_*(zp*(=u1j3A()9lHR*`0b2ngSz|C$>DDJ<12;$S5>*4o!ZR zbZS-{fh%Rsia&g|MPgo(4~BD0RB3b7f2IqMJgbwpZ1^}=CO_Zw2Nd#v(HQdu_vhVd z&+4Dgy;6eE46yglvxk2GVa9^gHSEa!D->m*L2%_6SL^xX`;;rO&u?nY9tCEQx--9& zEU$^7UWmSUeBb&C0d^!02q;thVg(VF%w_9$+KGv zAOAe>4}ie}@m%JiXlOo~!HZ(z@qu{4Lo)F+=@%SlVQDN$I}8sJLR2hbgi%pE;2vE_ z@4zb@b^o4VE7#Y%#Qp;NwnO(=GcX3qLKsEf`RX3?wf!eR+8(n`uFLiw9~(z#s#s}yl&?=Hu^EBr+0q_0*B6EMA`WrZC%TX{%@mFpAu7qr!yZhYGp0+;pfjm{1c zK1vE8;B{7u0^irfsd$@1b$?Ms-1qMqx59d%8*%U3<5XVKKVn6MUrl{@7li!~B-)nq zVJ7b57#o`8eAv%MtgZ=7(8Qhws=S&I`f~acZc&IEgk8-8KL&~O4}4mGL6BM#Qe%8J zVhj0;d=~8dAl)N-feGfU5wLfJZ1UhnTp~;1GZ!F?kk<6`04)9gf&7UBFhBzs_;2Lz z&pB%*i<5{MR&z~b|7Taa1GeRuAVsS*X<5bjp*4lU+$|P3Q=3PLcBv{yqGmU8-`M40 zb`J?zHY<#m#ZQzt^%T6mM(!$VgOoPHcq`hF-+2n9jOnuA5zFB9WLbcPD5KRvjYCT5~I zmS8ocz*G`sy5=O8o9@@$@nS(Oc&m|-sHeDf$JYmsuos4gyIya5Kf^9^1@|CcWzDw- z;rF|}6@9;7uoJuOfN3+`WRfg=a-#favO$smS7>W_d+6exoAZ&o;7h5Wc@KyJS+Sm! z?2F4vHD@MI-~YK)U$N^R5On#^@9&k_s=0gjMw_g{+FwNTt;hpt;$rGc$4tcohoygUchVT~AdW@_9Eo81T5j6AqjN9Qmd^^*t{ zOZYQFTyuQOTn2=kZEAa|DBnUF5_UBGX-*`5=X=0=g-Mu>NBT(#ND*h+)*ca4jiIh& z+CdU)RLb}!zzl1efppzA!^$jTKEBM@(fH!&1^>_|TXqpx6iDHA1GoS&c%fiES=flsejn3ZH!pFbN5z#|?JCS+^Ip-%pJ+_It$3osUae1M+cw&9? z&Hun&0;2EvO4psH&DsC+Y=sl%R( zm1h)Ab<8CHO4q))F%K7v8N{m~gvF0Wq`~H;)O_zUqU#@TQDxIpe=i<9E`x_7cPpeA z`Ys83IB!#iQ~{mx>9t^(Fk z+DySu2rsYt5WmborG8KlI_kW1vplVJXA33OGz*Z4OWUVm{CS&p3n1Nv8Q4BhnWDvz znV8r>h`P|S{T&wN^iWtT#T_Ja6D_#BRC2;nj{A_(#NQhhwhN27{z44oCX~|a2;dLa zBp^X*qLuz(vE2SwV_9+Tr2|{tl9xPULFAGGIy(HL7dm^qE((-*HMw%LS-pe7z z75Bka0IcnXLS6@VyQDpA*!J&!q4Gxvoo$QvhajVJL)^Whf16*K>V zN^$2|Z$P{LWVBc;v;N{uavsSGvg>fy)Xg-(^0&VI2Lf@r|y!x0tP1R%1gM|)hkV0Lkfc?&Q}V*UJo@)!qXw}jOF(h1#XHqXAy7B z<8Av)d28XSa6(F887fTcx1m~e9=B%nN$@a%^s|0hPS<;-K5wMzbK*tlU2t?pyOwn0 zD)L@;pA@KbJFKk?=iv)i86vz_NF$?3oVy*@o}#>)N1uP}aKFFhS&F_&nN#jW<&A5E z_%qMuPrpJTCD%iHPzYHUDe)!wX=Om7BXXto|KJk z!|Z{iYn?EuE~P%{^yG}=n~NX3-Fvt1v{Y#o5tV3L8qks)($_Uxg!h4p2ErGZ!7-4t zCkXotm}zcRe67-!Fa*NPRCF6(rx^YmIT#qE8Rnm@jz^5r0vmTzScG$2XHt!AbLq^O zx4wn5K=#N)f4E?3*?4}7gjpmyUjzb;U;do*6UGVS4y9>mN^;W%nr+o7NGYlrBHg;h zmMX#^`18b~R+4WTjK4b&-SJqVQtv+{iMW_wPikI-SX0*k+PQNbOV@}52s&rW&CqopRCeNdM_X&f{y+D zoA)gY(-l1hJA|Q#U!=76zx)G5m{cyhLsp6^JA;x3qtSuVNwWGo&+m|?iIoY+4A@e@ zg-fF@FND`p$NnrLm~9-wG1Z?cyq@5Q>zmJae7-k%{O{+Kv4w3YAX17R7jncOM3G4V zj3u0VdEcJZBdI+q<>d9^NmI%HRT+3q7C@ETM$c96%x)H=d@L{SfOQ0hl$gM_?uAUA z=#$CA72f+4XKm}FpbqCjYoYO|qhguo}0dX*mMSphGFjB+yPRk^xqMu;t$xjZR z##9&oG~x5p)%fwmBgMV@viQH2_wD-?p=$Zcj2v29eFZn*b6>FU#Ts@m8HQa+-TU#% z#W-bhJn<^GdyME#XoqjzG%Jo#%=s(4cg$m}J;Ye&AdawM4*ZMY+C>K{HoFLW@dx8h zQTYD0iz9;wJ0_xl8DGFcOrjam#qoA*24RD7@kf-04 zHsQw(R0suK%ug|wPW1thR2FiBL3ANusRHh?D8mF(TO?ryQw+iA?MJe?m~>k#m7UJq zNXoZOCWNDM8R^M2=`2-j*(|2gH^p})_0A4tF@W61MwdjOvibBNR%Qq@SvHPeZK%;m#}+q2?r(IAi=a2eSHM-#A;v=DG^KwY!+@y@`zQoEpYKTDM|v9Uuv7T zX`5d)3(ZlokMOb90tlzfPOzgQ!dEiitKx!4*ihSCA=?5|=h!DUK(Ik@7Vjd-4x105 ztJpafcGxq9Oq+CQ_s?(v6j5dq;aVMYm4UE_E_YzGriznn$;f0D&UOn91L4k;L?rDX z++^XRYH_0m$aOMy@6Y^~#YyWN^fPpk>(6iu14uWBKu|-YYl}#9}U4ykJ zX3ld`f!bkoeaYp36VbWv5Q=62dkY!ZJwZlGOiCU8W7?G>X_h2jG<*n6M#iGs;+<>*8SLN(j4S?6yIf!Eu zQ+O_J5qFvq`UwOX~i!@Ge+z%f8Y z+KuBl5r1niivdcp&}Ut$rF(D;zw1$Sm>LC^MX8RPgW}Z*3IYJ7#sQ_M@YAI=FR?Ww zDqNKV>M}tb1p1fO#LM6nSb!))LX%WoU|$Q0)OcrrMi5eu1Bh~Kueww-Wbkt=v?vFN zrN9p{;TJM$((BwKR_hKiQR-ZD(@1sQKaC6Pr8uB#C3qG>CP&qb+k+AIFf|hV$%t4i zP&-yvr%bP%nnS-F5i7HY#aiFK=2B-G-(Xsas&;|zJLbt|-l3|1x9d=ABjW0$`YTaT zofW=?>hc5U_IU(Qrvk#i*+_oOCZ z0lRqsjs-0607dR?GVGQR1#Tb!02LYtu$xt&Ml}YQ`3C5uz@AVD;%xi^2^6s06nZcV z>To0g$Z=o*2YDC|7*OC#>R=~8kmBE!V!_3^wNns5p^~s0x}^u*b>+4Oj>1$}U>Ob- z#ez?gU~0^^Njfa0?#`CQmgjTqqv!4hW;P>PcdvgDQscn0dq7hrD8<3VWkNqo@Azhd zrYw}ONqgWZl76m9myhyb!ZkU-Hxm3C2he1KhU9x2b$70hu*>G}1Ak_V15Jnc?DDcMrFxK+hxTKOo0`FOneZq!fT!SRLm@pcm&VRk#Zg#* zptJdWSu>J}7J`uKBw+@-TOC3QF;Kgy@OyON*>7Sy1Aj}Rlc3R*nAseV39A@|8F0}# zERaEmg{qV`C|z+g+hAqzSQ@wm!lt=`Kny~z3wbjJ!E^;WHQ<``;X8a>3kf`^(Nvyw zHQPC{eP9L7FtjyVZUEIHg!B|)g@#>uQvBuV(e zue+jL?4hjj+J=!l%H+$<$yYITzZ~$Ja!m&Gc0DF~eeG@z2f1DjL!Sck0CZp%_s0jW zfOcObwrfv)=LMiuijI{4K|sF0qa(JCPZ?-F+$NBJbo2vzlZ6suSgK^#ifXle`{!@5 zSb)ma&FB{=cbRh-hXnE`-DLS4&HyP z77eJMYhaZD%+W_-R3KPr%R2t%pr#>P$zD$V~(6 z?j`1ofH58Yr|zT16D|vW$?;hjr%#SI-jFqNV__)B6=1Muy`RsbnRsE&jIkC>oITgz z2orG8hdQ5yj3LQdk5Bl68RN6QSMX8f4tH3sFb@zw3q9GW7k+)sAMYI!8iZxdd)%78 zv8P58fYtAZ-DBbf^yf1K)NVY+S>SM2)_;U|i!-SOxAnxg(&nU?a8nLkln1Olhj1M5 zoW@v8Eke_=L{o>t6AgQ#CONFmxLo~|EC8$@~v`JrXa8GA9PIF>e3mT*g ztrA+NV;ALa@Gz!LzA^JE__^0wZMN5+3p0DwJ^-@;M|RhDXWRn6X>oLg=iYa6Br2ZY z)N08(Y)|ZYzQ2dKI7WO+fuAMaMKV!uNv{_*Cl0YqRCg{Y#G{1xU2j>Sa!+Ta5Rh7r zIzB<%B)#%un{cSh-djaWN{OBIsNW>`PY7A=dP|onu51SHDg!O8VWt4=Cz&8afd zb91!fJUWs|lxbow-!FTci-Ub*5`R*L3*9(545^FP!H$N5h}nq={BjJGpe!d#}k{ zHH-a3T${N!0sr(D`ojdiPr$2mJ`<*he*m%n8^#j@KtSvN>}zMpE-||>j#2;beeK2p zJBJN+)x%^4&KJ?oO|;1sOkC;oJ>(I;TTTMyGJH63KS5dE&+wkNBP>Dt)Peco0w0Hz z-RE9x+T5&}x@M!G`lptjeR+4f)24;x-MXXo{!M;f>fGAPH7>JZo|ty>-IV z>riR4SL)D}{cWG1n-+7ej!F%8UOr&Je|Y(MajIZvy;V<-wKsY^Od=?4wZ7N%X0%vC z;DGQ0Y7T5O&)n+R(Xvv!t-*E+$!olBhV3z0Az!AfqX8QC2RU}OozLHv^jeZL-?la< z6^<2AN;$ChYB2sY>v2Mk#LBG4C*LV|CiH=OS5_eEx$@iJePwF!Kv9LW@$93)A_I%7 zaUG|`zr5Y?z0^5QT=l~b7preKnk}SGMSM9GTTf+xGEkKWFIw1IRRLLFyvWs*yRZ>Y ztWZ|9jP<_0&fBVVy&Wwh4ke;8)N7$d#^QX@3k%^UwXQYv#v`pL@@2lU$BF9 zo2m9$HyN}(YX{li6Y^U50{@}}dhI3KU!QK|L3p-dU$HK7`B0XHhiC#ByNlUxt?j_H zyAbb58>~P|AO@?MT`QET1HN%7sMwz(+Y8&@Y6o5jgDqf`?B^CoBx}T+K)d8Z>m@YQ zHy%e`uFqXWh5_P!c*}*yi<(vV=QSVoCAm-d*Gb%Fw_&7kv^n#Z0iob~NzzD6Kios{V(n&!H; zjFaY<2geC+B6j~p6HU764(ZVENRpNEc8sspR{oUlaMicQ4&-i5 za?mcO7skk+{T3ScM!#79p47R{Zh^tYgq{`POhD@C^>OySkWbhgg%siER0jYOQP-T@hOKal$uVsG8xNO(P4CAVtWaG z-gL#svuN6wGSOOZ`)ZF|mL{`0EppaQQT`>c9m$1~kk6C{wf=*rEd?iI{ggI44eVip zk`nfIc7Mzq40U`tGW-+;$`#BeI3qVJG&r8ithogn4u=y%HHm{c7vQIZDU7f zr=5sDE1@hxZ4Um8SMoM0Vj*jcca*zq-{%XG4g#ug?`OxP@2z^(tggD2A|Bmczn8%I zZl@!5!yPnvEz{!^VB5QZ_cQxm4gWyd{KdH>+QS7hD~?$2Nlv(estgsSZQ|gvCxj)9 zVK?_{HnASqwb5&pPC7XqcX?PDB#kjJLt6CHFd;fBr9DpDw+FdQSFH8ReW6|6^^eNf za^U59n{Fq!JRLZ+t5)(~$YlbHTTs69Q9U%5X~N3g5pv>Wt+jKe=gi1~+mc9GW&Q_c z@7%N)k2Kwu;ikiWlLsWV1{A(%rK?E0VLS09+6k^9hn)dJ#wCbn!0NSZ4fnX#`tnBE zvyawHWw)VY|Ccnb%@!W3yxoYAziNBCC?{r1X=|NvsP38s!9i>$yhZ>)tS{)5Q5AiY z%y7iUHgP;wZrwo?U8N^h1M9Qtw}ww*b?PmjC3EOV3l1Af?9F}eQr6M1l4Yz!O;O^q zB?f+cw&myLdZe=-5lA@7fl%q(&Y$YogbH17oq&xR-+F>Ap3Fm= zw%yhmwvi6t1D}Fay9m*&O+)~~c(cJ%TpQ^KI_Ti!*DGeF=AP&0!dg_6krRUShx$UH z%Y?5RZJTsZkOf~(xr-NMg0fw{hyXiKvcd6mAk}XJmyX0A_>x=Kn~iN!CMkao&-lSO zqTM8qG+tqCH0Q< z|Kr!vKqY0Gv=a5KUVHE%B|K`#WHnJ@ui3(|B$JKb*%zo_b`Uv5V;diCVf!h)0tg}$ zu1a)V$Llv*Bl}jfD;Gk0(q`oz5>nE|pH+fQ2 zxP!)O94N*~s9?dsV4WfY)i!elqxHYqYWWD-`vpkb37}|P0B~HUP_Ei2@w(L))@e%; zQ68bNhmSx{*KQz+nJIBLLL}XKKzaym*mv%{C_Y#XA0}@{mZu_&SG>{Y^8J=ybMXf@ z+siz=u(?L+M5?0MU-YZ-UPXCsrfm}&9mJ&L?U|(D5LHj(GI!N1}H-fi(k~(a0bH5?<^zYqLQBEcvDL6;2p*%}riN)oMO9r|~|Gi07y1Glk0lKLXszApu8K6*aWz z8wdIIN3w*^d^P{R?`8biqSXV$aqJWT1~juV1rZ-(fvKnbQf%Opr@3gSbuL48uHw2xdUYa_~RMbbScr$U{-G zL4fY3$46*0PW*O{Rw$3v0kDBoOaK=M`wzF!Qq}qF(|1rdv8g&#gb{;cMNN};O1pGC zUio%R7&}Z$fO7=WZL>j@Sfr*0;0B{yhSO`@(>yXyM$phId@PfP^mJm|w57_^+1Gx> z9>!+wh)wZZN%tsCH)o>*8!%;p_!C;`*77)vQ`Qmr%-EGv@xw8CVk#I<+pPkF01K(I zl1cLTAM{bn&W_f~%$HBHc1YRnuseYXd5hA@%Tv$I=6Ex*j96Kl+mhYrem^ki?*rHX ze!P2IZlyf#8aD67Y9?{G`~w?VE}I?Tdys4s)2J8oAf>F*c2Z> z#Wo4nT%u{0Fo>Yk%B8};}y+Kr0X;GBQ_GN2`R&!??0fdAsiibXXbB1kl zIl;*J>>IQAkQzYaEd^;9ErNZTFel^h1X7%WGh|WD2hYY~LyWnkT|fy!xkMtGwaN@Q z#f)Ea2Lh=DhuVve|B6utphkM>bJG%Y24#QNNh82_v=m*)kMuS_Yy9EtF}WgcOqtsU zO8h~JQ+9gfufi+tNt`Qar`Yms?YMY#(pG2K%DhBv2)gt;Rhx=2EytL{M~H&TOU}g}k0)Nuw9An$u=!6)l*Q%h$MwAJPzMU)39I)9)#alInRrTC zt~ZrSiW299J6klU@f!+8j!l-}@~KdHZn#jUrY!f$$t#B|xER;DQ)2p|X26}y*HB@U zx#GRP0B9f;`a*@H@b1Q(jZ6mO;^HAQHY6u%GGkwkYz&_M*(5EDDa`dQ5uv5ap%QAd znvgIg@a~Cg&gV3D?+2q9l_j+1CoJIIV3-{9>a2_BRW3FHu8`s5TbQKV+rf?sNLDWA zjf*G9KEF*4xU5qr4TNiR5Z~gjet6_X5#VxUfsVHq*Zy1wcQj7^_%G-r*dm~Z9y)ic zl9&grl;V6xWMp~h8?vA<7niztWow`Nw}-mWOMl?{5)(+?%EGG$Rj4#IcG?T$)3kKfP=L#;vr57?tN z3D^g)a~Mq1hL|Yb+g+ENs!jr32M{VOKpAdRTSi$su@A6FFCIsssJ@;vZOWpn-H#I# zJ=@h+tI`yP1)YMC&QL(UyiJIWWYltX624j`WnpW|o zyPnBEvyx>O@CXjbqIKIcm>)Gyps0v2PE)?XdqU9sRUA(euu^1Ou;-k*dlS0#J|rKP z&(UI3)#1`+cn3`%!=VDOh=Km&)!j4{GH{N4>vs44L4+Pq;anc!HMDd68~gzP^T!Kq z3;2EfMUgugruy?}+T+M=?;<@fV{rR-5K{;}0+8HwSF-Dj-2I+ACTJqfC&vL{M8z;! z07i7DjZGkg_uDf1;GIPlfA7B1ID)78=upX$oiRjCAwL>eV)x@y2#@G}6s2A_R`4xz*XcDquF!7zjq5v6&s zWij^dN+%8;ZI21K{NR^HB*iIJ`&LOYWJDo#~|a zY!t88NJQD&1h>)&<(8?z!00MGDE$`uA|#R^e;OT&MEV455yGuJ;0Qlo9iBi(pWG5S zp*@zjtd)gSCL;~egvoJ4K~gXW+K1`T6H)LUr~U)P8MBE9a1x?Q~hE`Q_C3tRO#5ww4lurfA^oof65wz!J6`tW9+`iF^`z#D+A+wY837do#ZBMYdTLDk zp8e3YOH7j{_8Ki+k%phk*qDT!p)sL|z@&oz;Dx4EIDn4eMJJTcL_1U@+&T5sP8lS97Rm{UYTFj@ zDQGtU%aB8?+m=9yEoNlJQHlt7Iv7VJU1^53M4^)4NjCSPOvM0ddV*_>y z;1`)OlFH=3_N1cYF_M2@Z{Z-ijnU|6@~Ys?DvKP%4H3kgjLC|za79FL-dNqCs3=R8 z&&AHMP6qMc9J&TEdnS1(k{*Ymup0TBT5KpPHR8WjStyI$oQd!SG5vt$cJWN^Wf&bqu9RTS6KgMi%TsqOwO#c63>6GAz`#*U#{ZjIVYpO#F z!$mo=b_(_mXI|e`Tz`i-tg-9TXz~W%LHohwY?sna+tE+j&mPGyR6hV&l-+#UTB~s8 z>*(McCkC1QQ|78uy-r2oj&s}ATl`S2xt_fx+i%fOxjho@Fge=)_(EliJnSoE-M;W7 z!|p5Dr}{0D-4<>>Aavi<`z*Cja+6;R1;!X~lqm*@ZNmI@6I20ftUB^t$ZGw%YgVjT z-q^bnfX9Q%x=Q2-Ugw-d=X=bt(Z%zs7=C(~RQJ6r3li79FO80rcYEK$dqT}~2N1_k zAwF&P6_-DNZ--RSj*o0>6MJtTTjxgyEH3}DG6y&Nek%R3gK=#h_8H-2dEaY3vi0KW z?Xv3tc0+F}d0KBTS@9>e?|}LE`{R>379!CB6SlvZ`=JT5vw#ZBaigq*d6TCjlqJ$C zgA|~_lwj?n(fju(?A)ueMaAtbo45+h_%eZcI)Y$6U28*qHy^o+YVtC`&EoBql;=mR zBLs@pL>{--TwVE9ulWzNgA#`ASLkGx_dc8w)rdw_x< z2E7)*8F)6wZWr-2P?M@4N&D7|>7oq~3}@&Z&#;~M?rpa>*mbGznBh^?AQMArx*dMx z(#XzB=;a%un@>C!b2Tp>sQ=)`L^ZI|8ZP)pBCPfFR4GYK_${L?H&?#}HQ)TX?x?+2 z$by8NsWk8KQKfPKi}+r0GvBCFKCiinH$`m<3*3{p0j*vP>!W+NmM+wr4zshjhN$s~ zsFxcEV@-PHe-)1cuY;h@Po=DZpxdR!a=@19y%c1&8aIv3KU%eHFoR6IhT~L-w5i@l zIX0bMA-NpKsSSo@cxTtm%P8oX?>BuuE7FF~E~f?`H*HW(!>gZ5jJRkrcZt{PEzKH# zs4%T+^T707*UjQ>=a~Lr=oCOl7nL{D&|X^kH#+6#sfA|4RjU2d;`#iW2=`xl!5q7{ z)HIyBz4&DedaCr3wD7aR{LamqB2~l#G4fR`jW2j0M>UL^P)w+iuC05mH zf@nTLynE&448uoy^p)ct4}tP=GdnWfaPG&S19$rZ3Ghom>eWh2z5-np14vH|OdsbX zHZ&vgYF?cxlk~u?oP;0p{lEI$dkG_4;3X$zYb+I9Kg+;Gx7qC7`SwPDp&&`rcVs}k zukEgAJr}JdIA^wx&z9DE1({CwDmG{EHu!D|@k^jut7Jkct1t8JdH|ApX{`(1wd>uA zYw&c9wvyiKESr!E3i5*Ov?RCuX=<&)B?rA2Qn` zM=(R9_E1|8;jhk=zeeM0sD)|m&AS7k1xE|N)LYATB>4SH>kT+(=XwBwoj_C&E8p{p zB(Vk0iGTj9_)&vvp&mnBSJnJJQcb8Z@4>g0W*bHuQrRrS#K~%QU0jMjJT_KG(&dnp=kz{ycb|g9doC@{T zR=iB7w+z))W4Hv*yMH=T{{4j&D>gK3GpWEjO9j+bN$=;Z6a>^trMBLhZMm*lH`qtS z0ckEzMY)Lbg}P%NY!_V36nlh?-ff8?r9Z|*H&XGY{sF%{0CY-oaor0m_MRh#4^yU# z&-`Gd?W-LG9KSbHh_o~N9&y2SB5s5BR-J7XPcl=d_d!-{_JGD9v|%`fQOE=dk3H`r z*^gvmA2c0a_Jq4~>6p(>00ljoChbJU1PQa0_Ha^rZ|KU^13pYZh2v$ zaNOXP!k*$31(TQpf0_yEGjJ85YH?fPj32LJXCTAERNdxjT! zg2I3D*aUffNQmC9O$Sf1`a$L}NEqY-Z=f?!C$E8?-}~%y#EkO%sqHAkz)S@tIz`e6 zzy~qXc1F~q39JnI9-9|`4j>h0*%_vxarvl~8uVl>9jkJ%*V6z{3ab8M!cW=l&aXiy z?{ma@FSs7-fqG-Ed@(WEdBh`|E#D~|q%&<^hH~nAw4M(d8XZ6!;S5r>9|MVJC;L`<&>hq_8w3Qu_wIa_M!bbi2&e_ai3F z3wZ|TVyPbEMrEB#gy8gp`j6#lo3DazX<>Ha2f^DS-CLERpO5K^p(jwdwcz6pY+y7d zE^C7{{XN`jE-N%cSIYQGN8CCcyY&2pIq+alt0JTL5z*{P&7xEptDTb>E#E`a|bsQM}xJ* zo@Ar!XjE=D$uRS5i(EjoKg7wpdVnjJa4iLjDhNeQb7vaNb^=P(snHm=OwL<$`>1{@ zZ1&fH;$$ZRmf1m;^tsFXFG7o_!fshHNq2Mj$&Zw`4(|E{A@0QZ>+#T!?Wr?h8JoYI zON!m;9eln$9TCMokQJ=-QbjDv7@}+jb$pmO;yVx_tD92!kttliFc#CP~F1kNz!|do>C^InDqi^dIlK%`3#Pu?`ivvK>EYUdZ2zvDCP`~AGGn;Rpd*n z#M#U}DLJXI`sy-qwra|JjiNc=+k5mj8aKY-%m$$WB4_q$d&G|}rLjYbQ#7FL?%Waa z8SXpTKmhA18+%&4H6cR2ze!?uD!h+}CNsZ)i9T#jVs%*3%~avUe&BzcTE1XVqjmCm z&YtOcOhCu>N)Gs^w-+zX>zddnz?gHXKSj)R=vYGk{A0RW-utcp*qc@t-q}F$oNjDG zc*^nVs%Q&Fme>gm=NOeA!Ac8L_(^BmmDtM2b8xRQw8NwS@Yu$cm~3lV5c91J{I{s7 zD;6p0aN<+|gbMqB9%ui-GmsVsw~LAYeFt8d0sqA$eK>A_c(15(52!4|F-2%1)zfw_ z#he9xp^|dmA=l_Be`8X_Whw8B*eC{Y^Xw@tAauhUx5#3I3X{ZR`s)S2GT1brElIOT z_a-7il7mr1+3k=j|Bq>}DBP;FK-t&yKE&Tu0Ydp9PcB4hWTd_4j=3ved zQA`dOh;Gnw;{$O#tGv|Q$pMrYmV=7)<5-^DH>p7}M(nJ-AbR4V7#xbLf49L7@{#IW zp#TC*#C{KAO7bQ)O3NAUro9O;Dx#*y81 zg*`U0pI0dAw0x8@;>T=+e+%-}V~@o&Xl=OAO<1^$HCr}=(R2S@9+LpAE8_*paUef7 zL~bu^pV}Mv)xnVt%l$4`V}kt2btW)mOb6xIkOl3GSUg);Jpdaq<@DlMwZ7nEK9)=e zRX%VOJ z?l9-DnDDOqXL5z<8|tuYOu#>`^kBQz=QdQ*H;Nbc%%O^mTp)Dv0B%K-#G{_Ya|^qx zi~D1ppex!4H;NViObHwku^+o~8SkojcJFj~(A+wy3ZwIG0JLz{zyo`8(4(@wLd**B zgI)V)FpVvm{@-XQDHJ6o8Ow$){UooHB~LL)Ou=3aQS>QhWn)UgHq|{H2Ty+i(CqJI z)B;kCi!q{`tNh3}e($_|RA=Hhg(dFKLDB-!OL1r)z)W=DYpYg}h_ZzNNGKa^ltC@r zKSSeVqu&Ojig4LK-11ZqKXH3d9Q4nF@T-GxBS29WaFuxxC=ek@!Oxe<@1lAL~KO8lV| zsE34>KudEcr|wlBw6!zyJa6TA5)DE<_dRezmK+n4rh*CMhX1&{ZO0!;Dywu!6`TM( zwP@&P$NtAX&WKKNw}T}nG9qTFG(a*b_QJE#n=K$Fmpsj~6VO32EpK}Z&gcV>HyEJ8 z#S~xKN0La({UB;R?~sMM)WD02s--O1!fH4mqzdp7bRWsafHcB zXg+?5e^hPo=oEZax#)ksupgfsZCfOe776Wtj;{WJ*Zy2XN$~Et@bamUr0#zQYkUF_ z1fCLQw_83OfXfE)UM5UQLVS8X=JAswp=QmL-j=erE#+uJou^G^d_$gW{6Fy<0*}K( zPhR`v2`^QaJKEp0Z2~&k3CeswQt!E#C^L$; zyt*AR>Ye6wM~({4$u=AtZ4G#OO^pg|ser`Pwsf!d^x!);OG8zd*-+8Z3yOpa+6gfq z5k_w>^=gkk2RU9wkVRL||7~|FJt)azlYZa2oX~#doVuS@19G{!=WnwL3$zkw+)C&y zYeH-^Pqku!VV>~azn!_BQEuFArh#3Ve~a8`j@n!dVY#b^fKC+KBrfhfs}fl3c<@g2 z-=b4IEj@lWdZBwF7kvW41~NTfCls&fo)NIx9wM-pu?NOKcJsI-Re+AWWzHzR`#Y~I z%ebH~1x=9f`@Wq=5TQG!6yKNg@p@;n6WSsGC6!wk2_?TLEa0R@!3PkCV{};X1Akkh z6)tacE$>57`_MMNW<-MH013~*Xc@|#V)OA<=rHP`yb{DIj)oGWpHS3~SOPj}mkW8C z24~T(QFk4k2UN`>iCjpscfho&UzrR1{Ywl4^c^|oj+&ry#l0{=XeX9FiycHR3bbOCyD}f=4xWpHxQ5-Vm0AJH?EsFF4yG z2E@hf3r)S$I;VIe6?EJSs50R;Aps+b6IyDmGK`Y@Q3cvsojb=G7dEF$o5*v=&$eyTE<8>w<{(U?z;k+9KsxB-H-!e#ql1WuTc+Stg5fjGB_~7#uzk46 z)b`=M?XMo9Ks1iW{y{~Y;%SB#fopdr5A4y`;b1=QovbNQKg9rWmVp!Yi z*(02fI!^tu-=}F4{D?YTUsE3rS&uTS)1_yDG_8l67UO8w#}0Q)CvOa#`bSA7aV-Xn z{>cfF_W(Hs4^3rqj93UA5YQ2!(Jfv<)HyolA^6Yv$oaYW&HK(j)3o_E8*=E04wZcN zpSj_u2lNO;bN5{6Rl6N}2zz_@(xIop>2TY6f%I=$*R$R%)NIvNJMIGj_J;3un_T#A zK5}THQc`V3Y`SaW(-W;hi()T<&&4k1YZsAPMp0BOLxK3eI|A1 zmaHPE(_*S2%!hC+(BQ>answlnJ>LlnpC^EK`Hv_QqQMhq5jGt)+rBJbKK%W_b>af& z$2cF3TqHu<$O|lRd)YSUu$_Yg-`!9D@O)u2&LWWwFCRSp;hBi|n@0N0-8Mnpcy)~! zKJjzC+OD`4>t(8!A>}VY>g@}>AE?*ALd8U}U_IvrWmC$K@opHsh5Smi!r8PE|Ki~G zW#Tbw1wza3uWsvJUHVmc7ry$Oa$fxp;s0sgArAn6*8eZ_4$;Q;EQ+E_)ykLjdwJ5E zb?gUQRE-L#;y8Kdh@(ygDSI0C#Tiv+mMNh7s+>0;8x0JKXsmFkzdUh4A*!)x^6Qap z#(&SewHs*Fu8DU#`+3y8IHfZ3-Dg8)|E;F2Mt?u&JOWZ&cQkoS7|QRt7V2gHaH{eC zP;G;ff|?ljw9^z!Z`%+s%;xkNkdm_BjCol3RU9F`+t+Yq=v9T!z-k2XX>-WBbMXo* zlMO>EDVtNzWx2IJbgT-t+~_+Y-|yJW0?80XaDOW&RPfIn#Y{ID=uXZ8E^_%{s4#D9bQk zUtXQrMEj1Bb8KyMfEYO%#X0z(1{Ji|>ozn}A(mQ*-y%QUZ!`|~6LJX^%NVr!mUf4& z@3QU4)H5X>2h9e`tJODsxO5Z0$uslH8~V+$GsCj$iaEW7tDLhBNGPQFL4S*-8g;{s zwAy!=uHp~JE1;6NW9am4_jePO09Klr&7Pk-&mV*P^Nl{W*5(_HegCb=^*5-|sJ5lC z-X{YLbA|Jrteb_Kzv{heq?K2STR!NCivzdgieBp=kviofikwn8y^e^p>d3Pg*W0@b z8Y{h-Z&bNs-GI%#M@uJHEYWnzs=Wi zK_Dd46AF&}_`YxV)^RsrjE@vYj_R$qhaA`WV|!EauUUXHPeYn&hhL}{$+`ZZruOMm zvqD7rwt8ctYg_EC4CQ{_V5LCX!t@f%!9WHDrJR?@!f2R|*^Wrstz5+E&^VC1w)dOL z;MJTX(Z@ffTBhv2{7m9Np*cTf5?7j69jFjB8I^5&CFy8yc%)4fZAo3K^D zzaujMKqa?W(8P2E^@+b!e@&1RSJQC5?cZtr+a9MP9(#$)0-h&WYubS)dgKr#=H9v5 zrbDZHchGQ0T<<(P^X}@el%O`v-vSg(xM*AssmALc(DFtr+0NFYsQ@PkdK39mXE{q= zEgsQ=YrDDAvNJnrOhxo{y#GtDu0`UN0$C9it)C+v2pXfK0;m z2D6u;q@+B3s0rE)XmZou6GZ#a5&jv-RRcwty(#$AG7>#|&~8PySK>AsG>HAE4s`OZ zla}*rWJcKRHn5~dkcB~wrYNlp$!ciX$gI6WtC|m4FIM*+(GwE97<+M#Ia`t#IMYI! zG9We?s?lGqMMC!{CDxS5Dftd*9fEsu<*zSE(@{>Zb5h|PvtHGs^b8k08S0v0rQxb- z?h$5D-h3~jfs=)?X)fdCX4g9v({uV1URldiIa)v2gkK-i$$R+Fln5x)Sk2;@@%y~} zfz#}Omm5%DbKPf!Hn1mzy0$=;Rgx@RbDmaF#AR){DsVsZT2(z1b|HJGDo(dK;I~y| zF(BbaHuET1=9mkyoNuh7HLR<`%lu_8l;_RQCV0ZMs=>G4!bWuQgh7I81dc=c7~oRW<~>Fum!JwU!w(AzT{D25_8fbK<3 zmp4gBsmXdvol9U1mUAe~ z`*pHCQcI9>csmC^!nQ#xOP4|f!2#KmdDl+zTJeEcftk<*;AQx<$U#2tm_UL_tY}+r6b{oO^D<|#e1p;&-$}vt`GS#C)74=|8?`8v0rj~$CmW)NSD@q{T zdv5c(NwnUNxPoABI!0O^fjBD4B)EG(GJ~`u#!#LD%WnO&lc8~RH9&jKM)`38vmcHB z$D;YNjFWD3*DDXLbfoG@z;w^O0tF>Iilh)!_|Ei|)#VNkm0v52>w1;J_XWGJrWDBu z2@>A)yZQVZr3Hz=5e}2O?^=Ydrv$-+J|n(x9l+?>bKOw^2&L;D>xyP$ZH0MG zo6;Xc)yBHF!9qBD4&41V^YR@fh!v71gG>2o9neiWl6~-L*DllI-&LH$ZGWGMWAAjj zxqbGVraoI4yi;_lrNEP7{~Sn;(Mt>`Vph|j#o?HaM>Zg8NpV)pN*&PL6|TwcQ^2r* zT#0L}!%Ya3$=gA&dEra8d)G_4_*#m^_a~yln97Ct{f;DCVCk&;yn>E+Bi{4#*TEX0 zf(56&*!4uDraW`Tg2P5eKmWFCFMx8H0Sie~PR$Ob4aV7IiUI$7z4g}nl3WMUCAX7J zX>@QVVAG7$^T4fbp5TdhKW4VZkx*soAi7Wlx@cZ+rd z@|E4iUw9rfI#qw+*NHH5F+TPQU18^ojqe@rY7=<{?|PKWMQ0Iso#fxs#}A9Nv;ui! zn>gQVU*Oc3Con7=zuzduF}d+_oR}Bo$H7n_K!=sIb{s%Ddd7(;viDGh9K^S>cw-Jb zjDs+zg4zO%ULUyni?a5PGR0uwxnvvUHhB&jYm&UPlx+^gZmNfbX{nOsNg^R2&2+DTs~-&XzKEl~U`@w}>ka5?QYMhOnvHWwLL!gSTuK zUsw6ByD)VHiU810xcI!2pcT7P_MTd_+CIHHt7Yw?m)ccZuVB>J7vHyEoU4Ok(lpdr zWzXXfTbP)y6%grd%za~YKK6#S?{;qwsjVlY^%c<2qYdY2Sm{W85Qh{8#{ci zzd6tTg(J6`tB68|4YBSCob#S*d=4YtyTb4Sbxxdt}-v63|CnE;Tr;@hE zgL(2O&&7j;eW$Y@9boOL-feL#pYLJ8hLo9gP|Aga_zcfVw2Si=PlfFCI>?QNRuOm& z!NHJayUO;Sqb#iGk~_ti0H zw{MB#UzvMz+8jW?-yfhxB@JPq_uwbDDNLz2J?AT5qtiz#*W)CF-4v1X|bxfskK4 zX=n&P#cJI?BWcrloUsG`^+b{iTtS9sGZk+S$w^Xa0Y&H&zIk|G#oOz8@&1+p#~nf< zbVHFl~c3Rf_I0T4^!cTIbBpQ(o{Scv`p(8J*F z=XqV@;?AuA6MW&-LtG}851?Lq^*m4LVSiVa;^4np-u>=%_venggd+SGmbD`j@oUH3 zw0ct7&%0Nc{$?E2m}$hZPX4ivgjQx~OcQC6)+=q*i#H7TB2aU!;S)n{EAv|XqKV2> z{`$mT9vgA-45&2U`-Btz{^wC+9r4e?_7aBBV_ zr_SH@Hld7jHpObVbC|5mhKe+$+lmnJyu9@M!NfYClSi;KyRUZeejA^hkVsSk@@~oO zOm(}M&;=|BhPzfM)~7+8@dtvq8WEwug?|pdr7l zq=y?Sm=jctP83p!{ixd`UWZS4$#>G1+-F|nhEj(Kzzy70K?KJdfI))b@fIpMy>7?h z?@lNG?XZ5i>sawj!uhMqC(Gt&P|5=c?J#@J%tpRs7R8$-3TETGXO{PGV)HO1|2)eN z*#jA~jts*Kp$-`MNg@eIRV62|fOu9y@pg~K2RmY>pQQib@bsVJH86Ha>=rhIkasr%UtgSJ66RpnH5PT~JVxuC6d0`mARCk@K#I-vAoJ z1;$9&@q%4vG(|hS@Hwd) z8n;D6IZnDN1^7AK7Vw0*)kTg96AZ*{0ByZlX<)f0K!x%8)C(i-g3|MaJdX`>9D?fM zmjmGlsoFi#1Ns9Jn)+*$A<;|uKfZ64iP9Xx^n2418QWezH=9Ssaj##6i74&V*V>FD z5SsM5itxy6)(?q&x>+b;VeYnOy!Y^%^%nqb0R`azdKIFR_5zzObssRc(c5fwLftkx z{;lo!+t3~YG7T*F`?R^!iq753YZ_oFnGaoaRc zA`H0)d@2!QA;9F1%JD{x-U3~`#V#7!h)TY2ZT()!Gwf-7T>F9V=8I33JdAD=nm&_W zTA|%|ulGtir|TQaNZG!oe%zP(xK4e%j<_V)MI4}^-NBh1stV8hLHk>;Pslj0@*SHE zKE2%e>FpXxl9Bt4z0UR3vo#y{Ybgt^{f@5>kG$PQe8Kthf=`?Pz(oT&BTnWVtoi)G z=a;<@B`!#j7ijPV=lfXA+kaHVDx0{4p`gb)vUm571tBpYSphLg3E2eW zsEA)I5j1)Dv+@5+Ot}sK0L}lGn6fw7P;zj^@iVtS3w_^tUpdEnbGAIi=C;n*-R1u4 z8a61Vgg}JMrh3h1QZHAu509-FaF4xg{0f_0y5Zlp^V~D1u`gBcCb(NgQkeJY7*clW zKdHeE<6i$C+!p!jr&VR00`}|L1NmKD%#f+`zXAo+TJy+t&c+SqLzJ)W z@e^yLr{kxDyyFk8-ix|Jxd#3j&585t!^A+uemm1s;vpKYvAmW ztq&WP<&7R5y)%+ZTn6qM^Q0FFe*}>lRkaF#tzExW5xW3+H^JaqPpP zGDlW*Dp9{rTaEBzi|J*&H!@eVqDf120)ErL2hmI4i?@2O&+GsdkwMHp3H7542w($V6oi3;8=v$H>a%In$oKlJ zCp}>N%-ZWHlXv=gsU`wJ+$V_m|dRGJ0`Lv8p;jR?e-cZSAlZ6h_Au-+hhO$vp<5B-b;IGv)OQrcC!#E z0ZFEf7O}fD08?ph>WR7yht%b~*j?Ml#BgN&=JD5byQH~d5=NQo}#{ayj=&X&!>k0T1*G-kc zuM(!S;VEB`yX+9$9ddW$KT70DWxO1vSs#k4H#*g?D0ivJfr`>PmHxdkIXT9KoqyMg zfCwAS=#=+3GH%u1lJnqn(%{YcX9r|6j_bWzCn?+*XOFrj$+BS&1?J**l~{gh`HYSJ z=7zXvV~bluJA0Wy7+^Wma3FKz(K+F&3&U!pjuora){EUCkNPV5g03(Et;NsTkVP*q zQog);`F&|0J=_&N(Kcv&p*MBIOBaXey_52}4VkJVJZ4j^;sQPPPVz84ckkiDzjUBnm>&&S#ia-1z1s;IXDt~pTryLw<*WH`gWwXJ6 zem@v_!%B|>Qrl!Rq_qGP%t*t3mejX2kvzJfutA{ae4pU4hZ8h^6qIKbC~(=yxe{3* zL1S>=iGq@=U6+W{D-@~KG?c(>Q2%mm`Jq4g2TWJrsHHhK#>0EFv}f-@r5~)4b`tlV zQB=i-58twSFRYStvN6ulCZoN%XfYQMcl>q@><)=tY2E{l<%q|nX>4n&2F(3fdJ1YF z^1=gqg*ogU4f3jLIxzdrd_p@#`P8D*`F(udH86AMpWKZOmI|Hwux8T>1)$U;8;fTP ze0IlPq#`O!;r!*)gbF_LXg@HM`an zXpeg?JCBs)qfJFc_!>Imi25;J7z;3MTL3msbI}+xv}uD4skkd^TYf~rpKqCQy|%0 z{+G<@{Z~Ww^3%-Qb1>$@`Qzu#ZIF$fYMXs!e^j_Grv%1`Z{G}+^`LP zK=+cgw;ec`eLeAAu=nq^TJ$taJ+8JP&2ZR;6v5%6F4!FYD*Ff=3QbpP6kuPyDd`&daIt@z(l{l7wLPtA~%XGwK~(7hNqcJv{pJ zp2?cq;(>F2rmwi_W05a|-2K#KPoHWw!AArhI9>U;d)!G+njV5$>Yz3_-M&$FRVrlw zLKW8yT4HZ31-W}^wy^4?FYCj>30`wFWt%16thD6Bzw^RDtW^Z7+NE6a*}HM9RqWF$ zm+vp1uZ-X6`E@ERo3Dy*zXIIFY-1%~wz-=7K0``&T$E|KxL_;W1dedn@2#`idx<}x#CM^)=p;+mH2Ie)soSr)Od}BRqlX+b^<+0rU^;EM{ zAH+UD;OsV8HJ$@twF1qR9hOlM>Ll!?g3<$re~M?*jc~CQqvbi;S z0p%wP!tnd6);5Z;z2YD{7F)rdA6rz;{$Ra{H1BS9HnrK2Y#<^(rJVXnZAih|i#)d4 zb2C5uO7K2TLatCExSK2M&_vGvQ9$xYQ$pmLi1K?V`QNW(-=koiCh4#oq|C>PIhgS@ zxiobQlbX~62Q|`D{v1!i!(iNZib4baF*~MR_RudC**I0ic8&k-8hgwH^xBgDnL^uC z)7F@PGB@U)1}5p11i&E;PGdIJ0||1F8ZF(v0pqY@bXZ6cQK7Oj9}DIt=hQ9xYrLZA z2N$`qPlOaIFZsXB|L}}91<1s6j_gqbPjS?|MOlP>Km>KWQazw7q|ii^2oHp}yn(lv zg=NP2e}*l^T)PiVg3YeC0wo*T8W{Hx(TU(C6fST|WjajTxkp?gw zy@lo-sDd^X@PbEa`&%HMPvX>(TynBgoprSK0w}7TcWuQMYH7?|d3$}#pPA_7gYhYI zXM$kVDGquIRac$~-8J%PYA?^{;(wO~yP(s3j>l7}<$(K!Zvi=B#prKXR`mVyMmTAM zJk-M_F^>a{wDWDas-AnaQ&>Pph@J2_r$+_NxcCvVBYV^lnxdYcK6qY#PO0q-B92#a zii(-jbjr&?(1!x1_;@?_sJn5wa(xJGVLF?0*skW36>y0sA-c7VQ7;pmp<1yt^})FQ~Sb%PcF43(fvN6V_~Kk+x6j zUYRl@a*CHeP*3h;W~gv6V`=|eYOhtl-vJL9mqnYD2U~mKLPY6EqpEV0%@F<|wy8y@NezG+m`(CNp;S5$GuT9N3vCgRv4SgoL2xs# zc@z(2Fp(9UW^!-y=pTv!9rcCLH01(McLXW&zzq26(~+xVmADKR)`JilkTDFD#E$Djx38*ku4mCO+ZiY$OWgXuEw99Q z!Wa6Dv(%eL1Y{%&Tf)0>fANMrfV8r_xqcK&J=e@*wH)T%bo4@@6R>8~*4v8&GZuEc z;w__(7%9RH^V_Ye3$2k1lm{C{V%_EdIP}Ms9+<>ZBvC&SXeqaHMZ6U*F23`Q2Ll-? zM14jRQV9f)zZ74Bgfatnn1+erqUsoUF3^5DkK)6)d5zlE#>bYh5m9*(*Jw9R!e|Zy zzlYILuZ!|vVXVDy!H-*2M?2cs5;=cw#LznGo`RS2P#oc{Tt4<1`<4s~yFn3xi`sMP zykk2$_OLtan@}7U=G#a|WkMHyv>lytXo-RI^y>8Bc8z&;REh!Ie&H<{K34T3%3g@d zW#IA!?T8eDXcQ~M?g~smwFtwNdefU8)9tYo01VDx@2u8w~%Mu=JS!eMxBZl#1YZxl;! zKynq5f`|6dhw`j?HJ^5e1Nivn4v>qfSf#Y`fOZ(5(7+<^dwT#pi3UoshwGY$^XGwE z=lUQRW8d6C0Y*)&MsFpKa%jDk06uEz-X;Ms-8^hF4-|RhAu1Z8_U>nbqlv%+@1)yS z;H3AxIstMMeY|!RS>N@bNC^W8AYb-aq4)SZZv@B$7w3_#TwH+V{~R-9*~1=G!S`m| zi+M<&3hd@hjIA=?69xO{ksZ1t6wyTOJl~b~AUkm)6`thMCmZ}H*YYP_`49Gs#z7cJ z5RG0CD@{px-}^O>N~Hptp#okAW6xV)!_{Gu2#R3}3=0GfhfuCG!1R+qpZn0tb+Vnw zC{mx6-`d*~0*c{>8~%;D{+l-Mez>)JtepjjS&!_l;%Y)b3E?B7P*8p=pkMIN&GqrV zg2(O!X!&QO5#1Q0ZcM8F%-x+c7p)#!JsYI}=;P-fw+n&9QxEdfi&bDKiJ)I)Pd=bzm1zQF9K~(EJ7kYNmiGILq z69M7~4Tye@JR*7{L4yQz;?W)*_6hjJ+S>sUDg4@-s3$#G1P>ec93dgF74V5-;C+{n zL=NAau|}#Sll(;J$Td_Rycl-^5zXIbQzunag^7qGtdABg zi(~(NVR+vN3k+l7b^wb#`lkTi7jlg6{(PIA^=H>;&gpjzmcs&jL zG`WE+{7hu4Ej>=cEpFeI`!Ga!Z7Jm8=W&?3gZU|fgUEeI`T3dL{N(d18kuar&76wa z!NIiK9`1meRtrDBzW_vVFmWPor%Ll{RrpuZK1fWd^P?an;Q#-0-)qS;e`l7s{i%j3 zgS6RZ-+NN>hT9TnclzdMAT}SfcetT;qX2#H-teHLfPR*?b@)5$vp1Kng;MdG+augr zVVw57>q>P)W|eq+dF%l5J)@RUutCV&zq60M}2;sxOg`Lp?i3&ZJwh{iJR|!`l02`X!&Np z=yG2pjAP&b*>LzhAZx;mweU4A^W*7 z*!}zY!kXrFIYfT*@0snaU33hi&u z24vdY6n#Z2G5Qu>o$j(q!y*q|EdjRNjQa4#dQ;Ev4vVo_&~cr=(}y>e$1X7@wgk;z z%0xe;^WRk7TPwxULz$Q>^0EG` z#$T*pt$xGM#w2fEG_s&^A?l8zy#PtO`Q~_X7Z6Fne@+h$fzH#{-M2n64-pMNw!RuO zp0EeAaeCqWDQlhAe5U0`_?3Q}_9ezri}o>IddIZcO=1g9z_Rmc4rfACqLplo(R`vJ zi+|7J%u8$a@2ot;II)Pm^(T*OYof#y8lk-bRvIxvT`*z1h_ti8kLszipg4K#SM@tu zJYvxgwL|Qnr=eLX-KTi>GA%9M&qq#Z1EEZu*DRb5;g|=D6*O3rQ4e>E?e=f|>CGg_ zyZ^1S-SDx5HK2Z53rIl+&5I)^%z=QI0omxVaHJfnDss2m4<`m;-o114ulOuSMjk|L zSOBf7B55lU#iz4+NosMd-CO0Xdd48Jn?_J)AV zQ26)LEXy0azo3Ut|2hPu%(SsrFDPTA=GhyAfc{My9+rd}N*YTbl-SAd{Z(Ki7vIJv zZ(qq*0&JCPrx0XuoS^Sr963{A03h8c;wP}!<$n=+%% zEnKc#8BjXRUuUtjP(|gWDiGaBUeZHTG`0<)w=i>MPny(`YRvi-x2zeb6yjoUTCfr` z+bFx%%+sWe*!-n%r@b zNaf&Ij+W8O_}y=*#TRslXe~KIDOMpmsQjp+XW)H;lW^T9E}e9E5-l-*2CXBk!U0UV zJ|A|a(O-X>8*QiiB0b%L%SOlwGLPXS@~S#hEI^u>LAd~l64cZFVhiH`6e%nU2Mx;u z#pCvk!izdubZ{qkeFaXM+v^9Syp^FKvtkA5;p3#AA98bZ`L00>uqS{&S=W9O5WjZZ zk~Wlj`Q8Kf2z^QD=QS7{j)~15g-I~de;{ivyr0ajI zU`W!J(d%ejis^7BzJ`i0i)g)kO@wl@{Ee^OaH}TYsn=so89^eRLB(nDNq_k4OUteZ z=U1S7{_=jm*&o+p{0BB8r(`!=qLXFD5QJDD<(DQTL@#J16Q_f-q({=kYA|SuIF}jVf+yAEUxY(PmV61iZ zgxtqGg@!bR()0$1!B36P2T{@@4OCk=``Kc&BB7zzdfMjMAyzG#=>$?3T+E53)Q;)y zYn#><=BI*wY}6$+BDD!<38h-}F&2BBMh80-tF~_C!S$pc=W>@%+&cRh?lqNxQ~x*A zK4eDM^s(W1n3>7mUl~gJwgd8D_scmvbI?(6A)!`$73BtLW=ow#7|U6z8a0LPM1_hi z=!&|JdAV-BFFiuikyzPAlaPGrl-8F+^b_~&oEW2?p0z^=+}G1Px(YN**WKTCz^M3g z^XmfxsRMh*aXPoh-h>{t9X{xQD{F5qh!L5MQPyqN@m(&orOAsQ1aA0df?r78$%Dqp zZjl<^yp)(R`3cmA3~oa2vF#yTm`X=+5&8l9*jzYEm_``u3P?3um};JlT%XMYksSJD z$=Xoec{+p)VPjoHw&!gQeb`Z}B9&2|x{=LB>M$&(%L-ATH#?m+Z-YCJwrSY@2?>{b z;$pP=)YM$rmUk3nkThtcM$r;&Om()+;0Kxmq+3RL;r7yOH9SIdBgzs+&_J(DJvUt? z_UY4G8tg4=KA+>yK_gRCK&I`}=MxBU-W^DhS~~P)gWS{UZ-DJxnVt~UE$4)&i5#$I zYiP{fPAt961QObaQZ8C*ifG1nn&@B8xP$X#u_?X#JP%j$LQ#DeySJl+iAy{R5>|%I zw*|POb~)8PN3(k;jvR)Q<)6L({oEA3LB;6@*b*3*?Ii#*LR0=3PDBNWMB(W)rDq%K z**03+3{R^BED(=tWvID?qn$l!7LdXYZ4>2aD5MW}*!s^v-B#Sq+V#=_VF|KEYdH*- z)!V8zTP-FJS1b4IeLZ_<_V=lun}H3VPF##{d)0%3yi@QFLZnsO=hzgbt#3DPN`0Y! z@#k$X=+$y2hG^!KuFX)EjyAnF>3TY9m)4;lCGM6_)t3>E(mG+9XjO9sKCz2-_*Y?8 z*X;dke;$?D68e+7Z&a+u>+JN|kjU*5%h>P!b1m)EmqaJqAG+63^>?~g8fR8ywxuA| z$NccI{D1Fj!*Ub9o%$D0hAO4vuDK)ki=q>m$bEc_3xFK`iF-8^d*By^`7T)olNg#6 zUMxyNw?*2EaC_OvvrODNxg-g*6d9-RQ&}m+LiP$3H!zb@ImF&hWuIjuSMJ1W%_i%# zC7m$E*)yXJJy0v$5GM|+RFEVd#K0aW-wvgTF^QfGq&*+A!!&)nJlaKYqF4|W7L)8Q zOqa%H$ax@(X|X5yC!9SJ?LCm5Sfn)P}ydgxef8P0v6U0UrS9p6N|2)W1?8- zax;`qY}VH7aAzO{OHX)MiloCiTVl{rG;A7-xzd)KGn@O*><9HoU`q38VLe2jpf7YFuaU$T1 zsQiqq`2HE^A~k)etVf<@ z6}OpTqZmaye^VL-XD*6xzs0 zj33X6LE5mWOyp=*x?%%L&8hIbbC{SDW`m=kZCF!m;Ff!`aRX{kOq%TPh?iJIU;D{h zfnmwN<6g|foI9BM^3F;Aef&B2e2jb5e}~GslSo>L-{f4HcR9kzB&hZna8R6e?)ywk z>#+nZ9jJAzbOJ9dRGb`+t9ac8Zqtq`L;HWu3A`DDdiwK>B9HSk?&3EnHwVI*^kosRlp}cqlo#6fL3@MqhGrfsH(C z$snNuE)LUx1D&D$_~Hsy9V9`pT!j5IfundoM2o+e8FDli_#&)xl7&iGs0U+uhmiCdwkI~R(qBak0~cA?y;LY&;Zj>Ws3?ST7wfmy zV<@8HL@s7)V;xpRQRHK?*jMr_{FzMf8y)!#XcSW$GlZv3vKn*aj~>iK%knau0W{>( zkii4@3Q@Om8`~`W1886^fTXk0flrPl4q^u4vAL`!9}{R3KPN!wujbi!Qgn5?vEi77 zf0zKUW>c(bP=(-XqUfry5nCc6zry=R3y}Y_@rA+AdhA}|H8BHo7`Xn0cKBd4&J{qN z0Z=9kteA!U{O77Y%qw9dke2>sG=RZEGXw|&(RF(|a!sd2TJhKp0hm6E-O2+GvnrB+ z8!vQj$PoMs1z-&os1b`$kRgr^qxCxj4~r;LiZ`7e<1DFoUpgk4g^dJ|Q18u+x;IX` zz&w~_Zqs@~0G;4qUA)pbB8m?UBMb9n*a$aWm`A%#DMDKc(W#tUSwhTyF3JPI#qe() zh5;E7rIil%&~I0I!oj@ThnUy{LKG|SRHWA(S@s<>-W_OpuT7q0un=)UfV#kF%hH8C z7^oN;CSMT>lZDKH>&ikr#fNnEBTkpqp6P|E1Mpl1K2i~Vl6IT>mvYJrH|=s;(Fe5+ zM(V;yTV@+a)WP$@SF$j9UN{0k=;32axY)xiY*7Nt1Ax1VUHu<1_XwT5zsUV!A%?;L zG0cwI&Kr`WSX)cjR@9kJ?HcgH?-5aWe<>c^E|3bx`9&8= z;dk$*-F=a8_d*jUO{Y7Oc_)k6iB2KR2J`#Q@$XsQ-2>n&>31%8;U;%9Co%3w5UzJw z!fkW{Dv?it(f9sRzWqg>Q$*)^figl~BnuPu5d#pe=L_4~J`zyP-G)RQK@YW?i>tEy zFCGC92E?@9{jC1~@q55^0u7cw2F-Q$8WHh(sHjQ-5F`BWf7}CkH#EJwJQDAq+;;SM zwU;UOljwsc-Y6+1coM!xVPG`9QI#z8Zc)EI6TU9y60QWdAAtKk0K9Ad;HlLiw-C^W zb*~P_-0(sjX&Sx`x0UQ@i?zBRBN&q94VJA^T=Y;Gf&F9~LMz-BvSY+3aWJuJH#zfrLraMjc*$30?9D&wd+B5 z$arT6_&^Un#G9Z@PW;bMSb*I@6`(=|9eNYE0%`jaOx}N0kcHmC#YkTr{h2r+D}tP& z0SpzBN5$=?;vyIb8QPSLI8>nZ%unaR)UL~@XcjS^bLVT-2;}qd$r9XS0h|9rt%xWq zObmuYhzHQBTcoo?x+Qe}p|`Ryn^>45 zq{qIY0tqH~;QYj2Jv60yN|K52p^f`-r*?k=dMqCAKlNxmXF}13aGQoUp<(`uL_hv) z{&|9!`pD)VS$Us;2DvHe z*_J#V5>cA;C(iw&R08;%XW&k&X;cxRoen05D9x@QW&vpG{x3Sf1J3}09cX<}04_-!zb5B(JWzXWg!00?OP-`2f2B`r>sO$73P z!?(1BoGkd9a)?vQOY5WZn@u`>T3*>wsCH0C%2=&)O3I%4?+h+G_pFBTaBvY&T)dO@AyNcF}aqt}@XZx}}tsykGpwMLzDw^8(YwL@x>6mKv8&FAKELHrS~+lHxg$By}h zd=IGc3PUJL?20^mFHx%%Yho*>nN;!9`t9twb6wBu;{9K`I-M4?OV67dep;{1OPV|i z`2NcBo7i^od|%w@58Gm5CN7FUOGqDeB;vtqQ!J`tm zoWgaoS5s|~Qf+U!X$TLK7kbBtW_|LY(U#G?oA9?e0!hzIB~3loF(qShI}O4Qw5`;v zTb$!xC@?M6x|rF?1rH$;S{vZ}uEg2(;ifO0stUF80hO?Tr5kX5=aP?F?4F|seWfI7 zgqMnj3xGj`O_E3=%|3N_LwKOk>~Rd2t@(7r;awsqkdfN^K#xz18r7R$k^l<=Ot3C# z!I?wnE|9utU~zyJe^mbt_Pdtpu011{OG_m&)gcZhVt)N)t`5`Tinyw>vAHRlK3~V~ z=r~v16(3|%a|bU?q&4gs36=_U>3u6jL_gVZuEj(m;Ifnl4-R7+Vaf2_Q5Scjih>9NX&@S79!5bzG~+`AX2R?-J&Oc*@CH`}IVSZ&7l#yV}O z%g)1_>_xz!a`0$<^ZM+`RC$P=&4cc|U)`;LyBy3!N!-jq$;y6d$?EY|ym|tokDao8 zsFEgO+Esvf(Bl?Mqcb9OGkH)~jW1o3tT|p)1YMk&w^xALhj%k%Y zFJo2=vrvsqYd@5Hwuq2RNfTrjnY52Sc?Qsj8+^lBcM!KIYXx^L%1-;($P6`|vl8y! zSJb`X7X9?!?=r$ujz1408NI9Dtc4kjvG;(J;rTy*SI1De7qK7ibm*}3llO3iQqSc8VvuO#b-_LG zi7Cb!xDJ&JSCdc9_E^$u_Ii|a=fpb0wsQDOB%_dx5^seW_-wWWBi~nAcbWazSV;EZ zq)xr3+Y57;V5r$k-D4|ki)ouA0yafqrp-YD$&M``s5}^evt;5W@_oJODDnbola?*= zdVrn0Sb5lXaT1Em_S1ez1;8qh5L0dk0On5aFb~QdKB_J&#JdwOo#iHGU^mdyDYmv! z$6>mX3z%aG`<%HhdTp)O&UR^ICYfcc+t6_%2&6D+<3OLvjuh0x^M++NqP8o_veS;e zq#|#us%_G5ciaR|r0aG*S6bv^kK!+#6~|(vUo7_>+I5pu!Wd9qq+2-!fM=4ZsT)D< z9e%6*a!*7V+iK0lu;0qJi`SU;7Tt^yOJOa3`Fkxvei@&DACSMca@kHQwIJ7XT1J`Q zOV5Ebb?k4Dvl{rDds7O|UV3>+%N6AiE=)ZsIYFU*I)+V5DcD!OrA`aw==7WNamZEI-DkPbR?GLwW2f!zZzS_Pu$Qh~;WX|)=jq;g;_b$(*bp5fa5~iE^`(Q) z9E{}8#Mq(dxAk>EL zu|0&3qGx36oj1#{+i8PD*la%`AxtGH^)-$@%Gt1ikJ%&wyJEJUP&N@}eAAiX*-fUQ z-rA(cy|LQXPRc)(q|IJSM~gCiXw6$)0zR|#KX3-xip;mv=8F!b7LD15D^O`U@pMv%Cg}hRE8~K^u$l) zYjhxxFo4^d*?V1g3b!$~hH$|toxl->Ix|uqpB1J_JO>ehM0*7!76l5cgL0dDpNVd# zO1%FUn&8z}qDW`AlK{jnd7GDOC$hE48`5QvHVed=RQe4jPJL&}z?4{&C1qm6mQzfT z5_y=~H4D=UlM@%7KTaLjE<#bMDflm(Ol=b|jUlSQLoe)mWqk3<(^aqy42|FIj?|a7 z!3i|Ld*bT82&o)!-d2(8f;)0YDqtA+OAS&OK{`UA?^KS8m6_zUa1S$M8UqTI1OH^5MamT*i zN{*ne{@Ym0jDB{7na&tKh5uHbuFmHD(PcsC9pWtO)o|ACX1-M21hjZO`6EewVI^yK zqJ+~noZ3$CL!0LC=coTZ$NoM4$vtM<$J2M?s2N_e0a;4N9cLf+6d^S3z@1rvl^S@lW6Xp4QwrIM7iqynCrkl=I><#5 zTN0u*@D^>y_wtds?riM_%I9;Ms4s>PXJlQz!V^J4HIKKe4ff*bnKm{~puCb0f z|HM)l;ni$Rq(@ea85}>0O>D!M{X|%cc^Lbllj#B3wodRNrbK5JTI&E(sUBYxi%MVd zi}uLTY)N3kXlG7typV#XM~Q)4zxSyoE0j1h_@;bHJPqT_jg{dgpap){olrGec?cgY zp(vsAGUg;7Ii>}54&~Bd)+UqOteCt59ul3J5OWZ-laHM+i+XcBYC4;ZFvLc2GM(R3 z@_At73hs+2e+?)U)3QI`0Zp)|aQ^n={48Z56e~LY1URkpD<_tn_;ZEg$#E&5Mto=> zWw20iAPF+($YdoC9X~xf#6Hf6CspGcS>9Ff87i%4O++aQh}tciu-++oUMU$9Gz_OJRCb7dxRFAv_JO%gFe-weU^th4$UKPMV)^f>M;FFrn|_#Ca| z95s^Q157cBB26jJV@|%DiQjn~UoS)+tw9RU~gO%?(7pc7V9+Dvz31NR|a1o0C8Kn^{E%T3D5yJ^-4JZ_B~obtt9b zpjLC~JKDt}T9t?nHM8-%*mx1`+|@uy5A!N2Tu@(%dxWM;F}#NZB`RlfJ#43DB@zD_##CY#B*G-g7>goHI*5NOF5^8KfCJ~ z+dy~FA^N|T?{aj|p^wuciT|Bf%!g0OK)IY) zI^X^%o}0^PsEE3p?SiavKxQ$$2sTj72o~hWZ5LuxN}U^XuQWC`X3>%RY3#!^?`oaK z+JWMOH1Nlx#o75Nx zS>72Eymvz3YSMsX3>Ei74n5Nd4>n#UU{S6#OcuYXdBpJ~tDuG}u{tp>&PD28hr>{{zzfl_f=rKaK zduMIEFX7_(yAf_TO`A{<9kZT`tKW=CK7jFmy>-2@smC;!$}Hr>d#?@x6uWb$gd3cD)FBH3}2*^!ChmBWnac>M1Hy z0Ln6O`9R|fq)R*#aY`4>-qD(FiMdpZs{`=6IkvjoHi!x43fnlAJI?RBUB|ke{M1GM z>DFWE)_q7kmkOlvplV&Tl<1n7s0~UX@bd_G8ramirIOlqck}ga3D%V9_C3tbbhtxb z&|H^?Akg66CcuQ(k@OS@2?m$NQdVN_jX}gFL0)I72>QCOW9BcVSGViw-&XZtyM?EX zP5suby699ocJe8T#B&81xOa`ad$`?AJ1_{*wkJ|nGKzqh+F8ly{5yL0kO1jJb%v~9 zWC%Zh3vl}8)|bHs9$egRpnJ6w!sYkA`-9hO?)Cui;R0kDqEC4hQr)S4h<|s|>xPaM zU2hftgn--4Lc4Od5{P|}PrusOEsHM5O3zw%72iq+FRAW4!W`JL#253e)$~wOUHxwn z_YgLOqg{j*1kMAXJ9ce#Ufn$X_1-RTR3zQ(oy%Y=7x3`g8q_t|cy>U{F!%0+G`(*; z*gJG|2}oeMCWv?TCn@!&?Cee7Y1U2~JnD^j^VR0rSDbO zY5^Lm2w{F;l0e^KY{=Q$yzDFG5WA;#-l~3;($EE9xR|EecBuM3FGTCYJlLAwQ&o#; z?;6E05HV@Sy?SFIR$y|o{!vxzA#T?Fs!@#K!Ly}NonY{l?wF(176`->_L$7+p{o#R zV;cN?{(&)%zOZwg(1m&1W$66Pbg9bZiypk32($}FCss#(<{PhW1_EpDrV1v~UX6>C z1jbwplV$oUWa8Bhy~5@##~+T9;mPGyiqxUWNxiX^RpS9jKT_H(@Y^J?ULfWWR6p@! z#C{VL8l+9yv{MzO@J(Rwk8&HHw$+D?w%!!8(OdGTwn+AFMBtTQJwzx^+qq5~izcN> zXpi%ciXsgS`Zp=;wPcDO4zY;sw8w-Uu+b+Vp7%J!b<*XTq0B4ov^2E!c|!E58AA9B znKu*tOigEpUa6lRg+7A_pNTy`lX;%N7pR4GtIHvDd{y8Wqq%}UIN{VBnMYu<(HS>1 zvyGqtI#~3N@}5mDe+HBJgvRbCoowigiV{hLDqB#c*T9!uB|14zJ6u6O4)qB2>9#(V z2pi(Sp?QI5-PL8(upwF?kbfbXpLjr&6QRolh}>ngoXCBQ_iT(#vhb#Yj~>W{!Q^BV zNx&t(ze=2-%a<`R`OEHN&hrJBJkEj2SU7DKNu&>t3ts%|CPq*(f49QpEYbvzh`oTY zq6rZxLhN%2jsp<4!T$u5&$I=+#DetyQ-Y-kK!E1|*JRd-A-RR>4r6#DN2|i`71sO&S%zdZ#;PAZ7to1=5u48YQO(Tpj(7Pg$7)-`{IwI zuZxw_cDkhet}*kh+)X`qIRrNJ=-5I@uN5zvd)~NpfgkZEv)E7h_=huA#98K}j!U2R z`>?XqhQqIXk~BA$Wcp8D89K8`?-=$%i(bb0j?iU;r+c$6Wo%Tw(61Q>9LeosYCHD-`#Ql{+_y&;sl`$Mz+ZmH07}{9it3D2B z7c$;Qe|Z*{*nEC^CIvXZ^zKly#H#9Ho2H$`nJ`3L8Nxp6790ul<5FMHo3_ZiDOhGJ z`>Hf_Q=bMsGcQ}fAWy#cu?tS0wIv*wW!8irX@2|^tCh&iq#r}BJ8Ex8Hma48_|BMD zA#od2@B?FCC-nAR>m!uVJ~OkanbhC5QV5~|86a=#tX|T!bOT>X0R2)+z2kB9<*ptp zM~jb3BG4E17_??m4k2~k0pjdAK4JWmk4B}mR=oN-RQrcC%|o#&_Q)fWo(l&~gNylpNj&end*(0AyZMJvYm{AD{*7q#@>f^X}QesV(h_ z;{Gd<0o-N&@V)gGDfgN0Z5aAP*?G;Q>t0|+toJwyuM89A+}}-8xNZ#nTOM7Fb(>U4 zxf8eMiKH@^EJl1l>bOnOR06PVPPx^PKC{@{1t0;zjEx?^(Prl%jtf zkgB9!GkZRl`Ye5Lx6+@94fvJywTj`A7AYznt~@fif}oCVyE}X6<@u2MmGR`=>AG zS^XcNJRk{)TFnKY6Go(*I?zzAj@E0L>%;v3mx|KTtA@m)KFpWP^wonxvKVIDsyV{a zBR&!gtqfVQfpTgxl214pTPeA&fv+TsjKJAcua{lM>RI)XF)NO!!WFiKnqf{+!jtvy zf1Wm=i#BTPbW(gG%0zoWlGd?l25W9P`tj9ylr}$k8K*n4(ReL%YXnje_o%vRkP=eU}&urWNKw-ib1(U2UF zxkm3r77MeSxpZnMce|G3l_6kSndsqEr|iied8Ljl)#3pXr8u-rCc7wCULA7^H)dA6 zn;0$_Sf4FAtwKhY;$wl0UF8x0Pk5U3kd^34wvTl^0PeD=D$I&9?Gy zIeS^s19Hl-S^G})a!QRLjDeZ`dUCm&(|pR6ECy25+YNSS_bUXb>)JIh5FDgcDo+k? z*mlANxk;-J<#%ty^wu&tS@uW6j$2Ix7MFBu@yABqF!F%RLWVg2Ue1zVvSfyPr1D>` z&lnC`UrbNu$-Z3w*lD{z<_s~IS=wTc{czmQ(lhl^U#r0^TTaC*d#5=2fb!Mht0&}Y zo<6Hrk*avcRtf4PWqvog)3x;){WdsHY6DtH<|lMny3bPB!u19Xp?Wn<^Qlg9?NH8k z4Om2$v`5OkcMY?ddYbFeHq$NiH^A0E<$Q09p}r6OVsaZyU0d^0Y$-pXOJ_d+_C!tw zX|r9=N$_H)*-9@`!zMv9f{CQ0_mWF>;_m+?V}8YSN?u{bia`j10T8QYue?_M(w52} zr~trh#i=}nrz;y<*p3>zs(j_zgd4a0Y{@&a6IkaJt88-HP*=EoI)*C5+pL8bpGrhY z%f$`i!&6Id<>MtqvsjyPJ9ln%%|l8fO>YrRMT`uy^k4~HLv_7{&a_2k^pPr1Y$p|eXH}i@FERmy2 z{Mm}qSzRY!X_(zDfzgasHo1Tgsa7%L@9*7kVTIi`uX;65M=2Fc*MeXTHoDv0Or?yuG%45ODtQw!fq9eO4TP)}L?S z?}J?AHc>UokedweVPTN~rR!JJ7fj-^WAd}IkOfEF4tKmh4|=Z&9OmO_JRHjDR8I^V zn|-2x=HzfaQui{-lj9;ei}Ix--I*!!@^Oi#aY|Z1Df`4;!AZ6TtVl=h7qZp0u<6tk zeHvyTjF+8FQdmi~=BJF=hF+uv9+bn2(8z=I)No;%^(^EgNUsJE4gt}$m6+R))7?2I zs~DNBCKxe2<3Jmf%0MNGaPIsJ1Fe&RrrY*1k-MGJk9h=d=eX@(*_19oaX2T!XES@_Ayk&i@arr&DF@*K)K8;ch6@_XLrGJc&{E=Afi^5e=+4wn~*c~EIv?t}NK z^FMJrffLDZkG+X4s4vg^5Rg+RC>YlwA=#L{d}Ln0F)`!xyX@14cu+{&=})ogXjIuNaL$RqO+v-m^B`bCd!T#roYjG z?ct>M0M`$4m|ef~8sSn)&0?e|`{&PeR2=GmqC7^DLS1o`uta}dY19=w8bJ78IeE^# zD2vY8&OsrzW7>Y5O@y6Y-9tY6? z1<5T9smOV3!p2y5HZw0~nsTRcl-YXsT|$2>5EkRX{Z}CweA^#U#3lTHx;hW9rk?2A z-;!Q0O{x+Qk){TugBps8A`+}9sG$jhN#g<5{0Fnv+%xC1?>>8)KxMJ}F3r5v=6SdJ2sGjCZJgsWZa@V)zk)+p*OY(s zfLDg#G)c`*EcUJD=daW8+prCinm{V}9w_m#ImN;~;knfeAcLK*FztyGQ%7ipCG^6# z+I~5~N2|HMxN0Jq{y}n}Bsem~nK5O;P16p{h5W1R65l_*P9N zS7|U|@#=JYQB^O2SSqe0S?$r-505;7PIIwK=6n>9IKjEIG=ac=7y)dV!{8%XgjNo$ zhLG_O5k9w?F9KX+&gbx|m6XZqx_9{qbe#jY((jVNyRuB}>tCyB$~9|J;AAFVO#<9i z$f|DTV6L|7&~#i>J;q}tZ47@KD@Db1B+-MsM{b{xSv&sleK7o)gZ0?_`d}> z|8j1w5PwFu;nbUhSVL^h*}H1I1_=)CMWA$D zgsXfn83BxW+_|^7^oV;Yad2Mk{t(fAQ?L3|2JxnSlaw4#oYGVgb3RPi)W{&JGx6Jl z7@aWQem~Z2Kc2{Kmhgc4&zp@At)ZLP9VxY)DTnp<@7=loASe;F*y$n!fC+fPuIjiT z8g~3Wkw}ADuWj1T!+VQSwf3m#2;i0S{n_%}a~8Yar&vQvtso0@e7D}}yvK&ohlOM@ojehJWFA=Dd4~$uxzj$J6+3jm1+t86%XTH~=L0lgfgJRs-H*j8&Qf(5d(%NJC^)f%_hMB8oE%_u|=g* zw*o(6xVmB=`d3Y7Ee&A_AH>031WU}8UBm;CHfEh$I)gf8c%4Q|T@s{w_epq91)fXC zJYaTNSKuMh_85Mbe+BlQpff17!yc&9z;hB|ii9x|KaxcTS8ue45Dz{*`DpIRebb}2D+eQ(!*P<-Ve6~J%Ns#5$6_T7^KOqh@DZ?nG9Z!x3ap>pW0Q8?f7%0( zn)Vnw3N7Ewn9)uVduT{AZ?_L~cz-^2aUXJz^ThGo>a^A9Yy%@75#W~g%;e0*a2`Mr zKO;;7rhAQl=>y#|U}2yxBsEF^Mgvw#<=v&5NNXm#!z+N5vdEZ3Fea}*ChNYMWuR#h zgOTMEuWtnxtCf%OaSlQi>_&`GOs=e3mF+P8Hvm*NI4mz%xk;oT5h@J<9E&G_0P8@(Fo?x(w(E;JF;+r||!a=z;+4|4T69v)Yb7Lgmu`d+#)Q?QS3w zXP4a=)w{~qGl`_QB>-)mywB?Ec z9)HH(%y3X)(|^7u`&Q4^@1L){ALYxHw|aVycephsn$?^sP4rc+IM$G`+|+YrRn@Ic zOM=L;c${(gcfQr8m>=)QD)-*pe5Ac&|34y?B>i=7N{bqM?47v#{9=|HrR~n1pPJ#Z z8=gJ6Nieoq;bpO{<+7f^Yce;(t@8GJr)G@cVcrl-fR&Hq9LyaTI?p$KYH6} z*Vu1l?~3b}SKh|W3tnkH7Q0dXDBo5FwyRDezpuni$*&Au*lMAEWuX&*CeuBFO+SrA z%fgXTZZ<8p+N-rz;^++O_M_WZUNqJlwz{<2+_O71L}osu{$pE@@{On_V&5@x+Eu!9L%^`%Epz+x8JJ!YyK_{UUA;d4I3ld)N4f6 zZt}@r_d&!e7%BC>6-y4yC{=*%_&bY(=OwJ7e2b+gw!EjyHHBo1@pSpkBc2n{E1RE| zmQXfjE0$IMoo@1qf;ltq0SlC_9rh-tjcg+bN~yT(PJjMk%Z6R_HliVgcN%L^f#}uy zXbJ4C8lFZxY=GkC-QY*N#h30aJB_a{`V?GkLyhS4!`%Nd<1z;<-SDd-%P@bn1INy5 z_YywUi?^a8e46=;pD!SXyT6n5%kHgUkHyIzOIE|FsSv-$qw%r&pBZi6BfrZ04raec zt=mp-Uu9>r-DBVgVqHT^*#+DkwEU$)GTH<<^yJRQq<$Y=y-OV5wC4kTG9U&iZb5L&?XWi8l$BU$@lB9<`rzv~znyTrrtuGVJ!*;p4cW zjb$6m0&KX`vSXaB+5v_Ezo#z7p8Hh0a=~HaC{>I1o00t-xS)AOZ+HQ2T)k4Ts`+Y) z`5RsK%CGOCuA}G`hbL1bJ~e-CO=LKbP?qmA{EsfImx>FBq&954wC&#&Hi5csVR}Ct zzIkwqaKnc)-#DrvjP`}EqEXe>%6+Fl1c~Ri@Osvv++J=_;bVz$(-hnMTgwogOWYLA zit@-=bE_h) z{OHV37O{z01Ma&WAXC9ZOXQicfF%bfVTvGZ3|e}pTjEN%i+a$Gd(hcQ9$UhZde5`{ zgYUF9i_D`n3FB8-PNUD@7zozAOE;O3a#S#deZReG{Dd{(BH@NYuGq$CA}{$=WEZFd zZdV?;10{Kiz^oF}47@eq*l45lgAc^iPG7khiC&E>O^VWEN`b%|nB-0@~*&b8k+L_J_6_N`DA|KIxpOV@g38uL5Pit`uI*M!5-S(me*UX1vnL)t(4GK zL;Z|d|JIn@0Aw1gsi6pXNO#JKNN=}H2zGf(@5!7qoWWc=NB}!;%Pw#W)YA%EJbz0Ut?@~e zXg=^w?&Zl6t4OP1B>j6qDsIlaj?LVHv=LR;BQ0CTqc|}l~X2#mF-LWk{q(nT583QjxA-v$2J4sR_>I;?d{1-PT-!c zs1jl*Rb_2a8nQ*#Llcc%t++Keo>c@p=u%w8d$-8`P_=uOpigigO&l|ls|wxjNc}=p zr?0@Csk>l9@gtY(fXxJ9$<>lH(2@Zvjlcs+o9OnnZ{m+Z6{y4r8x%~%Y9DzWFdHryjGWQ z%4n=~*b^OV9dz*4v%1r|4Cdt91MTQJa+^)3J@huuST1>t5vf>x^nG41?Kw`MMyUp+ zmS8!6Lg%2>MSlpM%11>uF@7`=CV%DuY%JbV?*^(PZmYuC{Dd`ni1UIK{tPn)GW@`z zJl{xSF!UAdT;1`_GnB1K`byzeuaurIbl-3E-{AU~qbhoZ)e=;5{ZbFFH3d~NLs4s1 z>0?$~{O)502YRQGF0S>llD?#1b**8^v(H>ng~w@E}s`-K8~@f6_9T-YYWzXM1}IK zhm#J}u18H{c5iSS<{8HuvHw5OCO{xS_+T3Psxm;cumf zc3s-dEg1UO9SiEzCRvF&9r>^JrMFvZy5VVBZg18lf}_|g_`(gFK9sNMQXcs9?LRea zYj4b&s@*~NlslDzAH>L;Zo)aGay}z>n%2~E(R*5!We(CKt&lrGT_%~7v@!Vg+skq4 zOo(vU=Z|pXmXK)n-}gs-qP3Kw@rI0}_=4UT4W)ntJy|RK-p2MVB+;cuYhMuE)0bBZ z*b(;38Pchdb}C0gy|*@-cBk0PLm!OaK6m?fGj@|i_AU@Pax98Aer!=~M!2jR88v;K z(zW&)>%vB%8xoWR|Bm%vp2^?xC6VK`g-%cxM*j51#qy%wj7E*!3{_^}x3KU#1UQTx zHbDpxdZRkuMpeD#9HJBQ=~Oj#goG94buD_fC%WhjXDgksQ-GRa#Aqf(|G61M9t%?j zP&?>BBed8cc8pOkM=~0=kB8Fvg{O&Py`JK%8lz1X&hDdAcX7{Z@Zt;`IlJvbE+hu- zcbVdqLeE1^A+`(nP+_2Q3Hysl)Eb{?d^+0GC-$&ioSy=LE<$ZiidsCF zXdRkx!5eiDA!Gy8)o-c(B`67iPLnXOB%SLgQ87BZF&L&iwR{61j9Y`CiGMh z?c#jn#WLoJy*C3HEc}BW?4h@TGj>RAaKMMgOCQJ1Y!iiWwuf$G2F)2?q_+7b9|%OT z1AR^K{yl-!2^ZxnJzR1LI!KhY;6UuY;vh+b>9u9KW`#dBg33G=@eVW?wW8xLDaB zg#jR%=!Wm1i@&-E69`m+xM@w_%vl4eGa%0Rbr^)gdBB8#P{B$^tC7_hpq2oqAxys* zmafhQ<#|{dE90gjQH=*^b0Go(X|OXOD@dIK=?Ne$+P^ZAS0D$12W)ZbP%*Q1N`ol&S%0ErI@GVSUrA5 zwFI3*U}YIHa&&0$XhzOnJh40jcH%)#GcdkLt`YO7RVn#RA8<|}tx=s__#4p>XDflk zR{SlE=-g*!+3K8IXS?yh5&DVE5a8X@{E^m)y`R`Cao@o?&!;fKqm=8 z)=?rW-zFPzvJKg=COzLU95zI9ADJQF*?_u;sN8g0St_%>6w(BMZQ%u)Okn;(4lD&x zcmS5+x@8ghF32(CVK@Mw!Y_2?7pk!Ge=54DF=1H-NZ|up2nA%d0um205rD2paUcOO z;Xx!urW%i|&I2;<5seV@nOqJCDqWdZpDzpmxdcOsohH(m-t<+)RVi*p8$& zN;r^@78hMmDn51?2=34J3@2L(pnr76oF}FqMpSj+b zKNqt^6Qwi#6*HLy8-0uQSS2O`sxJ+;0;et>tG9 zYfEqXQ|N@C(VUXSWDsCTCo0|52XN4zDp_HzM4W3NEH&r{)yw5=58u^fqqd6+Ib3p5 zGUyut&mi?43}U1%LS)tFWY(y#ARPe|D8%}k=ezLH3iN!JWH8_%xX!Pd#BVtFhiaJ& zi7(V|O}=XeWFNH1U&Dm9vkF|oQ7*#5*ofL2_C)CNy{rh>U}s|(4U`ua)mSu@zAtoP zLc!(rJCx9sf0_>X*4?#`5|w6{39%enep7jqD-%*=qmB@OHVcTzz28YBSEn>AG4e7c zzcG9ril(@QoeU~+!Bk?4)*s9`(H_f$C;eK`Y>FYXIrBFuP$*+UyWji}?ZO2wi<)04 zwR|eS4>`deNOP(V++3C+&xM~J24;x@XqTY89OKUhR4kDVO3j8`DoKn%BEkAY)Dwt6 zqAY+@!6TVuG_Or15?H0u=8H&w>WAw8kSr^z`byi6__nQ^EZnBsu~HAAusYU96l?!G z7fYS_?{IU??eZVmuMq2%BRlW$OJ#H@KYn+zmO8^Y;2M6jf}mYt@~$Db%W#Q$kK3uo z!$20LLS|3!$(~>V=rvjBo!xpOwQHju;-8vr7+vNS-kY=w^p^lY%EO-fS)c+5;8b+6 zv#GziuuueKw)ACNVl;t!k-NIRPId(~b^CwYewx%%nE|o5#HywK(;xbMn1HLOJ#eD= zsmp!iMNE(IA$++Lj||9*fIFmzFo;2m3Xdi?J&0&9WMR8qVS=DzSy0~fp&t!mPVfp{ zd<%Fdn}W)qVBxwuuYhJYI4B~?bIo24AS@wvdnWmiMPrafqYf9&O6?@Ddz7OgC&Aru z2IWL~oe2Vu(}vJAY%^a7R}(w=L|LYu()19AL3s_}a+2$0tSI{I$AJtI?GZxZOL;Kh z8M@SrQ2KCY!P;}M+-0m+zuTH+shL~>Rl}*^?4p!h8#Ro3Ri1}=%X;!wlw$&P7$Q%X z1k|?zV6#Kzrhw`L_LNk@Q%$E^X1_@Yovg$I4QOx}4`Mxk=F6wbKa|%@$o|3V`yqgi zBJn5@)TeS(f_FMs;MasA#M8YbdSd~~mh z@4nFX&a_L9xEEBkzurnr)4F_a3D+BIPkrm&O|q3Kw4s`e%%N;IauaSbVkbOHx;vHB z{5l<6`mbqc6gwvBJY{wDE9oxreB%Xmy6U!ju&lYv_()YBdRTvIEb3(Mjl#$E z*;CD-9~0_Qdi&KM7$)FW?P}zUZnsOl4U?Gr4665a$JFefP>U3cFO@wPly z*%od$3$A?1J^HB0$nTn}dlWKqyIxlD?wR*5(gLr4-v7}z1VP?3e0kM-@RZ?h7lC-D zFJE%>uge%kf9#Ll%iU8AKURpIoRr*raqii#6|tR{j{TSp{q1Lg!W$Hvw?w;lKXmzQ z5cMeBU5m-Rwe7g9Pd9QzV{QkC$&^}&j^J@_`70Zx$506dW1@s|WMenZ1LrK-R+HXl zZ*Eq>n<4m}^y${44?-fGR4NCfPdD~dF==Mf5~)@tjoVUf+ZzdJA6u3UDgtL}Z`1if zy%1vYsyhi*cbzpZH}kAsp^V2Gi5nc(+maM~@}j#}*(27ygj~|SH+qwt>clG>^t6v> z5S(gyG9yqE_#5mZ{k0qRUu1QlHoWfBP?!|&;8LP7J6~Pb3BQ7&X9xQxKz`cls+dTC(}=Q0HZvb*8T(iJeV5Q;%R}9mRlxpv96oaJ~Oz ztb)p+L`+T+QxfG zM;Eq0wSrrK)yDJoQ_$9nAupsB$bBod^k~f=>gS@jO=s3_3V#=_^6lXUlr}&7#R}G! za0S_=s>pS@w<;oLc-Q(HKmRKaOY>A`Aw$k>pgLu}D0awldT(NDgxrc<)brwUiOs@F zw*@!QWIE-g*gdfPKGEgty{lJSiwOrCzh18j zMX&zrgxxY}#SK`%u4u&WG;O*!okpx#op#p(oP!S#c#C+h6ktprUe> zM%0?su|c3?15z1%uV>We>4_E$YoeqvRy9e4-s=4ACL9*OVb;tso>N0kEs0ZaVMtIe z?%>rA`)t=J1USUB+*Rwg^Ra%8Kq_-rGX|G>ROZ=91QF*t{v6RN6}*^mfR+7d2`fdJ z9t>G%mn*f4-$opEQqh`0mY23$VCPe=6$KTdzjRrw+8Gz6)s8k5$LpU=-W%@&W7jLZ z-NI3VuDz%&K?iKLIktGox}~F3r><|W5tNd1^y|tA+B~x!Bwj19{vVa4Ju|hQvS!7E zc&pxQ+2xuQGphV_KfMC!6hwuC3VJhd@mDJ4fWiTt=OxiFE5JFevt3C-KdIZEM@E;} zR9&4)+Nu0!1kJR;s?)5FJGCFm669gzxg5Ac|8U9rIJs6PgAmAwMkF7e)sfVqaZCZU zf)lLV=#^xo!Ui$D42U4!%9a~GNGPBY40}O>LcsGk1ltC4mX)fHfJ1x=pho0yI_|ol z;>m*;Z6*WfEcL>f4x!DMHmbus%*zDh78-3myvU#0Ob6~w&;@~H1RC$Bk(WN&$QC@r zozRnSo^YU(7X{Gg8*&Ypk_yzk{xs?rc%OiypDz6JLd6zrTXg`YGTFys6c_?G5cE}K zz;a^?-8u_*R?+N{6I=#uHygx@RX7Ak_ zH5D<0MC0DwG%MT+J{e{nTD@CHhxY*-yp~2c2>KZ!TQsx&^jN}KL??3AUfSod!UA4WE|BK%aaOPS9$;wK5%7Zv%i8f8w1v^oMK|(^^mf(10;3CUtQo_njT0t~KO_Ip zj-XvRSOYFd)nJevW0j^*PFPh9M|I)dS%BsKlcd+maAi;fpnoKIeE4~O?0EAGIZ!Zo@gM0wM zMG*CmJ#-gh73PAN-X~vdb&NE1oB%K;Y?Q@Z)LGMbtMo)|`jO}Sq|~vb>k=kV^efJl zACb2g|-ok_2@Cx}%Ufg{1~EJ<&9Z4&o!% z8_1!DT5^-K1c}46w5eazEHTEYn`+3z1RQMV9CG z;!D%N(!76BF#-ankMLM46$Yt;2dQ6spfGNllhB27h-${emT@l=E?-vZyG&@~{=;lc zIur~X3FE@unpd=$;HpE2QYnD~Qnk2{p*ASbiJFnD1*I8Rwb|fxk&iB#D$9d2OJFTJ zCXgPL9Rgt-GEkMf|>&K`79VNaOk1mP!oD?-3qk|9a;hCGY@#m!)5?pQz+l6E`kO?)B*x*ky=gt$}oe2;D zxn&v;`wOlv{HC4{BXt@F)3@g;?Z*eRIF{^#5*m4e4aAjRT~a)=rGAeb_Zmq6guKZi ziU3(QSzC;eFC#0KIe}d4bTNk8nfoaWG(3@q&&>0e0&>_M>-i^sc3-`KJ0qXCm&(UX zIRhY%tj^|bHpei0^WEIQ#G77J#_bog`J2WIOufK0SU^gYJ4!<~hl8pL1xj+n6#$Ue z3mWr@28&d!zN_v#{dVif$*{tcL-5qKFiBjr=|sR}snZ4l`gRD)o(<~pE;;dw&A70< zgaL;9F7|&6J2awQm?cB; zF^Uc9t_>?T4;F{Hg}yo1SSFPsE>jd^CG>LhV(1(fs~KJnPZN{npymlAg%*7o!Czn= zP5c$n*uc^PZcUoqCh&>sOh4sn++_g!+Prep!BdUDjxCpxL(c*fcI>Mn*B0}t*S_ed zi^pRcSgIxD588RsV$wgB#tN#)(d3l?){D#k8D6!Z6y(9f23#*N2tO%H<3Bo#9N_Q? zE=MI|KLbY8$xxo2AUbWQpS%UKlFL_q$e(LsRm=fT#iWIVpo2U8$PzV_k_*O~1~zO* zI_B@Hhl6Ge54Q$?A#moa(td3D-2-A*f_J5acTJX-?@|oS@Gvr1{v;dt&PNm<)()X@ zKE9PY^vl{e4=2utZY#z_91dvpafBIn*uq*TT7ABAeMEBE!Zvt@>&4n$lV)!3w5IAc z0ebGo_=>$n=S4e`hy}jUT&M8BSSVA;$NU3r-6Y{0i#~iHJ5lncULU;X;W`&G)@Hc@YnMCZZH+;UUi-e7R=5 ziB@v^UGM#K%St_G|`3ATB?lxpxkzc-d5Cuz6p?rxPanhd)I;#cWsGu`uTh< zin=RO%ODzait-wZbX2aaBVAVgLe+0UZ%hUAO+#1fA!ZdFxSQm0Vc}kTft73ODmCP4 zXy@q7JN^vB;Ut_W4{P$VpUmsh-nW~uyCmGM%iQy>tV&;D7yP(W3Tfp4xCjRE9-k-_ zQ}<1}gmJyT)OSnRo&I{E0jUmmB{JX%0dEP zmZ;q%%;qxe%aa55cz})`_ONk%-$I*;nEE8*5!!9w=T8#waqu%~FftoHvDDeB8xC;E z#79G2ABKd;W6(m_{o#%dw_ECRcgY_q?6h$FJr>gP4Ksit(NsS|nFjXHFTWTRO#mOCfB*R6{i7H69bSGvM+WYb9s>J+SH5h0 z^z!c!(L*7%>J8}?oifA{VO~&||8ohsQjUs{PZT_NdU_2ae{mYmlls5CLcqVp{NKV; zBJO|ky<>5S*IfSd3MCT9?XvBv-M6|aZ1kP%mGWp;Tkby>XZQ7X*VU8eWv+bzENGRg zhmPKkt7;F^W>24X?S|U#rW(YK1exZSJkGaE%XH~CT-)P?%r8I18uPRAyZ-bxrMni2n&sZu!e!zsQ)Z z17G%dlkIa|oex1|4p4f+K8)^JlVhVCjInx@rtmg0`RJp?*#F7*&Rvc^^dNl6-SbHn zL-GB~YbS`RpC;~-0yF`iS*eSS-`)!IdxE>&RcSJsy@lsB?^}G_FX~8pATnX6pV6ttH}ol{zC&HW7QblS|jZv}k0Tv+72? zs6IDlrk4vCN(axmg--K%-De3ui!rEC%Z2G=NILd~8Ge25v54OV3^42+zhrfoP=oDi z44||N0)552j?m7|29MAd!*{Q*GPnKK&>y`P39 zN@p`qR_(BIzZW3r$_@&w&PsSHcE@ZOaIM*udkUj7$BP|wpSzv-H81us2jH~jb2s-# zA3ybON2gF)u-9z9dm8N#5+@Hi9-_QbLo{Z(&MmQa5eZmeDM2oGmL? ze7cb2T2|%`aPTuFmjR)0i)&=@ztFEI`ShY~ z*F-pgy;A-ncXLMSR~5m+%NWf|_;Tr2QybdK~j7IDL?7*P56 z+Oo%tm=&qFNx!^PNM(h9i9pS4p8&vH#)7z=OuWQ^+gd}GI;z4|A#2b(G>rp5<9+Z9 z0Z4K``%uv=DaN#FW2gFHY08(0l#RX=zhE6;MFeN}C7M+-bP4BiPGlE2<)94K5L()W_6v|7c;pL^4ElwV^1O-oCLSbT`n+1D>Q7Tg&$g6WYH4 z->*fhtYM@jAO4;fECS4?yao?hKjF8n^*ai(U8EbAD8I z;Lc()y2J*u6tx+t@Huxge^juv7z)(|?XdOrqkE^yT;J{-H4Zu}Kg3S7CxR~}svsM7>io~TMl&9`Wx)zoDwxKs`tT|Ew(eAq(yNv^hdbe;?+M3Rp2)r5 z?~mJq#Mh;5AeaVal17R!7@k@yfMM%kc8MV61;KMWehe`+4P(*R_HFALokKt;_or>U z9;4&mCn2IlEOgK)0ns+VffaE^=tBios{+N+GQ|K%{bF^h_lIf3m6xT>A5~W1Vayho zcRn>HKt8)(t0y`u|LH8Il;|g@&_(3SookJJS+8|m!UQ8CjGs$6K8 zn$g{7SCct9Fl$^MCQ*KwZ)r0p7QCC zAA8YV?h*a*wBH}$r&Qy*9*5HhVri)3av|kz0V4?AVg=!7@V&RozWW4+mDPD?$PCf^ zsW`?T||h7J_Ol)d7Ks)6m!?Ha$=A2 zVx}~sFpt;iLZ|FreFzFM3sHUZp-y|om$Nswz1i-#IGmOHo$73J9Jq~hR$<+h?yW{`z5{F_Y#()by3pqz)0iZ&(v}v^L*m)U*Iah=?T6HoMXc6{|GmV zA8p84Y4#KwMg!Fs;)lg2B32N0GZQ`*C&ZX0#f+g80c?^&qE3furMf;#!i&Rj&bS4W z#!aH*LNBDJU---a4~D$}>;+n){#}}-Ax51MV|Nh#V|!qC$%U$g;VyGe9HJ>D@p|cW7#sX-b_|G9eH?CyY-8s8@Q=2E8R#^9a4^X&GZ+ ztzAleqrtxtB+pLXu^p6Vo^{xMVVIZp!89pFnC8Vo57;HH?1hTvi0V9Gm&xWXTe9a5 z&PN5Vw^qtjI!>0ILfiucr^BH)E>&o#7hi+qMTd10)1bbKDZEt71+IQ?d~GpywikMB zWAe)W6wCRk-YQK;9Qv)OYp}f4wP_JLqRRB z$F8;NOF}CSKfWu@dqQw^d<;0PfIlX@a<^240IYXEv&c<}u;P(xGF2<0DIo7w&YFO1J9S)~u@I#|fKJaWWZ0MYx zkb%)*z$%7%uL{-_Xz3SU$gJ`KzlPv*Zo+oBtQ@nfIy|7Mp?B{@X3Kb1atB(91`V$T zvks+q?Z_f-wC%6SZXVB0AB%K`0Du%e|=pl-*QZPa{vz0-myRM-OF1zTUp99V@}}VoPx8H^bt21iPD; z2$^AH@3hWc+x$`cwhSTEZ!hjI3s5WrIxpms7H?C_veeC!*3+=k34pi41xZm}c1GB{ zcek(0=ILi9#B*V{F8DJ$p^Tp>DWbg12qR5w-Jo>aDm)>c9%Q>6@JTQDeke4dFTZa5 zz{WSXrpyZeiYZ!b&?mX@P*Y;62>3mouOeWmt|{_NPWTL9Zf^tWyoB8d5nBd$hzj+t zTJAshaaS0F4HPG2ll(GEQ(+4$qbU?1U=K%X>2` z`kL?>3_m^#C}R=$I^@qZ?2kf@fe5Ff5&NgkxO*|GKeLqML%;|Kv*G8#IaCJUqofm% zEplDe3n>&~Umd<9i=*~=x?6JG3!B_+=iR^i-hqf5vEb~s-2GF?Wc}o9r@@PWcgfMP`=@(btIM)-kTR?aeeo9S%Qy1S$ z<<;fZlTS4_hD9`$WHptQHw^>C%V&XGE-;1OOhFowXNh(7O-;?sEzg^q?V%9_;_Eh( z54I4P&B;aNGw+*QiNP!6iEV!@x-IT+)P;z`GlN<8@g{+0WfaeC_sJ4@U(X0&j2Qej zymcvbECOa5S{Je&EH*!QtCV07QM3{N;AzAyIeV~UE3}j) zAXGfyi?|E2f+Hhd|295tFX+}to!|?UTH0oH4r$RsY!wBvoZ{QYZDHX>X2%buas(=q z?ThvhPZM-iY!BPn9v0rdYxLTm+4k9;r``hsn~7U2AVj^MDLNM+M_l z`VIV6?JFeb+-;Fvip`f)OJFsQ@6n~MnByMmr5KW3$HB<Gv72Zk_iy9(l_@tW%H<=icLl(|ckpd*dv7OgY!koSq0t>aC3zIt?c6+z)~AmVMVw z_P#!|GDM+0m6RpW!g_U3odC>r%l-ma(22bg5aFbGeOZy92arkdliK%Yr_eaok1rW$3)SvY8-p2aajJ@z}{e_nPR#KLS7_+a36DY*G6+k}x zfrpc=MhJNPs-=ktx1U6w9rq;BVAWm#P1~y?c%;GhddwX989B6|LLO`ys!g~=VB;^g zGc-lfBeu{=z50Tx`Erw$k;@y5uL@ z&OH_Fx~k2^yh6n(2u%qes{(0QJ^HhA9Gj#wuq$)N*0iTbPd)y-#PwtBP$d9_LvbHI zRFQzEebuy8zI%@>KdU`(G;J$&4VFAayJAAO&B5j6Dn9dlH1fP1bV2Zn91zXN2HhXa z*h>8Qo0NV6Iv1Ce@zn5x%CJQaJkoFFmG8u6k6m~)mKskiI5JUmZlXBtlKoA{vIqj$ zNx7k84p*@*8IV5>93egBa7=T_6A_#V!OF?@O_PP|4he{1jt3>{8Xd1_Hk zYFH})a1oCuEkEzPKQ);)!IRt=HK3cm=79ZL&xg{AdV)ah6=>3tvDT@n_Nh}}H@*Cx zb}D$*GdXO{=v3OHDZ@a{i}HdOf4YEAsbE6R)Q=nyp;bhnV2#n>G0}!|TA2%xNc1whL=ykj~9{_#-lu;kh$5M)ZtIQO8WVb9)L+( zH6QkOZgB6|t%U^J?@z;2XAX%^{0fD zulNP?W+NX1*J8h|GM=gF1h;&VJ@#dV{Y)`UUbKEAw2Dh)-iZr)X()>zPsjGf9hD1 z5FeE!|4Z#NiTklCG~p+3Y|Dtp4~Dh1KH7m{kcp;u%G16MF9#gSfP}1{vi`&^cYZzl zh8dNHYu{-3Jh3WRz{rXNdJAAxELoOM+*!Fm`FFK@94WcASa$4)KkY?Ev`yoVt=Dw+ zG}9JMT>t!d4}|78QuvF{yojw27VpuQI*%=N`!7{)p!5$>OETkicuO;k4L)3At;@0z zW2spj@FQYrQu1>7g=D$cvEr@pNYN9W*Pl&&>B}PjTNukF)s6ILs*)Pw-xm_hR2j!f zh_!7z_6I-=pY|%iBn5LUUT*zlo!@jvVvEL=opn^yT^H|XD3R_iLAtw30qF*57`nS# zKvF=EknZm8P>}9!5b5rYJL>bkS0CO#?u7+=G0ghxeZG7D&N*vl|IQphDBX{i6oiUN zmSKn5ODrtI)z0xbK@{hAmaF;_Yg);~s}j+HZ^)`26s@XCLwKDvN|l;=YC%bxbdX_t z{+e%Tp-G_681oG?_d99_LwF3C=Q;yCDx} zI9g`h3@t5kue>+6&$(r5>x;GbeR}s3)Q27>%a0{1!^M=@%M5F<6Qebq9{4!y8<$$r zxfbC%t@(GX3YV_UrJL-c#-Nkn^7Gw=GN*8x#P@YB3ld>W*Vk9ycQaNEkROtH8*c;7 zZ)?K4Q@u7@9_5D_JjAWFJ?|fe;!tu(>@+Lf!RIQ<)n>ZvZzFpgEClrke>RS}lPGPi zZpjb`UiKI(wQT0+5k@_u6-<$dneA>PU*AdyWq&wYmx|nZ5Z6tCdp*sYlb@SI>{lSxBfPv6Boqb! z0DuK}DjZ8CkFuBGywoO@S_g4AVXacgRQm6UXqKll6q4YGURKU%-~S27wM$Y z$!8yNUOiV4%6>j0M}zw6qX=~bj&dRoY35kK7cmuOc?@A_k#;d9%k&Qrq+IQs>8tte z@mp%bW$G@2f|ncWyK5g?E>9mSmroA{kt|T#T%-I0cMwzn0JdZTEB?;QZ>vSB*ObRa z$s97Wo=VT1&(HzBbB4X-&$9Q^U;u^IT6k8+`aZ268ILxfbtIdzsoBD&4I&x>g=X#% zejomG$0~ z9YxZ1VLi7hbcy9bL_S!sr?Q@(Be0V zX6JL+4Dskzu|+5piM+I7xd2sEUaLwVtp~S)SRa8Li4;)HD_r;xfJNpz>A=a~@I07B zC&&6DWZXXUL~Oq#l-?(GyIS8zh!xY0Xe(!5M!3&kol7ZzE~tRM-k^QhWG+bM35z03 zVBZd)k01OIGU??&HEk0^3>Zrp=-e6P8~KMs-TXx>njvL#)SQXWhS)XIxD~3s-OsrD zvzH`n9xx!z&|{3>7sJV=M1*`byJvPJ1XQ9qeXAnGdtNk6S6oK9M>neVeyb&)3np)z zSF8yS&aVWp62(+$Hi1Bw`a&a}YBiiFd9iGzO_APW@yOXZDsIw@q-e8sSibxvr}H!C z*rlfF$yqlSP|YCAR^f1$g6w1=Tv}9n8yU4tknWw`_X;}D@uSJ4|rGhTpELEVo zK2`VmPf$U1CKFvtcnbk$i1uTTQdu%#r}wMTdEJ)~OR=s%12^T=_vuB)t)2auRjU|p z?73o=F0LvM&6Xu+pms>oDw2zACvPTyt=pGoLPQw)SKg%G80rM$>(i0iExqxT4t$r; zRo1NSr0&^D*y6biitdGL#Bxzm;+WWJTbS1-5W)xpAQ!`-A2cq}^Q$$Kzm1zo&g=+b zRBl8MN;t5_zU->`bdwv zrY*>w!nZeBJZ`y6um+kih>MSKNCw3?t_!fHi-%NqBXG1aG_q!$DpJ-ewT;`_CYZx4 zn(u#qn;I#@S6Zsh)gsjdKb_Mf`9;lxSn|~Mqer_1ngFO^umX~tsC&`Cf%3;xPL#D} z!p@rK+RT?0PLr$MYh;H=LCn;oGrhxN(cW-@!D)AbR0_dZAELri)U2i)jtB!5ey_wa zwxP2Tvu-7=%Dm+TftD$F@Fy5ZZOcwdu6x`j#(jP$OmbCmI{ez=aIur*r{i`#dyRZL z*&Nhd=0?6&a<-smdKiAb*Q3->Q`XKaXmHFb=Orh*XFRN900EK>PJc@Dd(mccv)$qJd9D#P8H~|9{mCiPN7I@2YH9kB z8T^(~IT0~6Wf$<+1&&E;FOfy9J-CeYmVUV1%yPvmvRSwZJ+!WQwL(WgA3!4w523@| z+Ot#+&&OW3gp5^}YIC_Fbw7-|n0m=ayq3Qq?Nme3MkTWGj9^qy-WcDVnJQ0^ z{Pe4&LN2`ECg|$=V49WFk4%TGd77J%V8RPCY%&~Eb86`Qx`ID@YkQ|wq*Yp={vlja+Q*?(+;J(fybEH9qWCO15*_!DZ!NHCiHV>T(hPB}KmLfRxtW7bj2Kv z(i{cMel&!)g{x7SbuNw5F{zoOP;+6jyl)P;V=D3XXIC0K^p4{Vx=i0+-< zP;p@88@J)HJ>$ypqknBT|09J{_ceu5)bp$?7nu!g=N0^JA6Tn;bU zd~onavRbnP@0Nu3(@}`^iEc_7WsA9#Ts9Kt$-OrUx18rFvY0p2I@QoWk|ol2M@2?f zMrd4&C%r{&!_!$Xldv{wp=+ErX(20`(3s`{omLEL$95y!?>;Oz4cON6<_J`z7U8yV zoow%mk#9Y(zE{k?S=gE}O~dI=`C`|~nmE#XHImDbn7(*XvoA0ov`tWrzs;rpVkssu zQtNet9A6NxiMqext+vha;E@xYW2(ffL@YEv2*&ERef&_bAHjPb-Rd|cWD-RIBniGga!8dJKAqdRG%{ub@_P`wHUdqmez1w2bM~ZC+iHM zU))%{Q6Ck}iubQg1DfosG@{8j?`{oy!%m_l?d9o6$sBy9!L(Bo*bC!aEsMUuG#qLh zb!oXW-(^^Rc(>er<5=iOw9mke_G8bV>B!6eVGBRldV#BQUN zycl)nYW#XRr8W9%V@4#AwX>7yP1dyv+A7+|cFU(7%BFP!9yXrkW$>2yCElEK#4(9sdh7dnOK(X<< z-yJdnSl>lq#WX0e$htqsa#QJGJzXGE=Rqvi>|}Z`Y9Sc0irs44vkQ0WJ-m@5k^Ci) z5Z8m1LyYv%T6598-0(GLR;yPymd{FZ?U6#&;>^VX^g8@bJaQ@~5>}0~%mw%EC+Fnm z&}rJeoDUR>jz#qIx^b#%jeP0Vf~$AihPYLuuXk=-5lf{fqB!4z>IkUPOW>)D$!%pDnMGTj=!CZ*+= zF-Hxi+re!=%GRg8Gex4o4rV zJb;NOtOK#q7db{dprc+Iz8-lAa~)6G;M#$Z?3G$7YFIN4Di8q;-C9B=Cm`w@(3S25 z6#NfpnCCqptRok@-qkenK@x%s>tLpK2y6On-|I$(z|pH0bT~v3LQErS4meTZZfuDS zoMc=C|5xZj7|%t1pir^lijroHl>0#C6^80kzmVpb?U;HXPQFTkUeKjNpzzl-HKk&~ z2wMxX6=Dk!fl$Cf@fQw$Ljv_(_!Sib>Psef;P}Uf_{Ebk885YqD%;IFr(raSBRgAb}y~?mI7qojaauF-O9du>&gUwruY16 z_Z1FZ(|IvT#;8b!pP=Wb&s+=L2R1`~y;oZZI@oAe3}2*Sdf*I?JEh;v1f`Bpu2s&W zvy$^KcUF9@UoMw$Uz*QP^Te==?yW|_dbt+ldVKwE;!@>e`xZT%qJV~Upc7Ny*8gSr zDb>n!Zpdndl(8&deG_ zMc@I-h*XJN!on-G+g;dYSY3Z`ik3vVY|*`u7I;nYU;v7mb%gK_$f`np$p;rHlof*F zC!)WC>Igx^@`l-tiY`hR*bR;U%pU%Gs0#(vQ5AD^1JgGqip69J6N3s^Ivti54irET z5-0%{)<0-Q1O`dJ5*Fhq3DlKA&;Vg)7N8{P~_4)-woS~UU zyI`@*6_Gk5+nHPrg ztYyN01F1W7COlNsa7Wo`b$z*{e#9nv572mQ^FR@-Eq#dO3zh=}3SxAEmy6F{CEKXXN8(f*(_``ah zjI_Gmo^V$NpC0Mnuz8aRirnqK6aA*x9+F7u$USNrw*2@#iss0+{2lk~D6A=(u$I3# z8+5Ymf{EQ{1ePS?ul@nb49KhH?JFcm(03D8v*NvWLY1^(o4^)L>(#9vbFD;&wCZE; zc9+gknW-v-s@Gy6B6c6javyyZ{y(1oKfNryelWTh ze3$Qi6REC>G7domSC{?JP|gSo0N`|tc3=WXjUjza;Q@F26s?zlb{-7CSt$&_9uBZ| z>{8Zfi417OlC7Q60bTOaf9=SfX(4bu_B1X~THKo{Hd6`Y7FB1$f4}Z5(`NX^n4g}G z>cc`UZYnfyKDr8OluEu9hZMKswrEmK~La)r_BH_8I zS;!cT($AgB9Gum^G?>uCyT7fz<2ccfdKnt`Y1sRIr2rQ)A0T4-tq9wIBmAtp`&@VL z-e^KrbN*g1YxgWr4r#1jo%OVCnAt~bKjx*zwp5aHQB+eyNg^7Iy*9S7wrxvlojIf& zo4UzKv$ic!ivo2;<&KrJsHwMSB#j~M+Z8$IAW`l#Txak{I9L8F0BUJCkW3^dAV6YjC{Lka8a2{WDVO=syoVx2IPL4J4{XgE=$623Io z*!b?YwWSLo-Y}T+i@7G(89oZZX~5SGadeb5U_qQj7tDNmBqj~HsY#&Y##o{?Mf*~e|iU0{e*kofEJ7r{v)MCK_k1fjX%=*i;z`-m=s z0@$JPPYm?&knu+y6ht!z_3PQEK&?3$A1$Ow=s7t;v?xd~xi9#?$aQ7`Gl&tQt)KU4 z&{S6kuo3eQ%~V2_^Z{-tV`>z9?^8wDjr_lMDr+~277}y388du@UJS@mmzrUDmnmgx zR~J`KPJ$wVl+-|sr%@0rK;O}&!(6I#Uo3X zU}|U%76BNhvll&}V5SP(&wUAR^G+(^$A^810yV+gPXw2(B7z}Qz!1-hA*AmMK!cp6 zD=c#_dPFIDytOvLU%0xzxw&z-LNNt6&?7Rd#-ycLzB7k04v@qRxH$GkpZh#?X}QeN zQoAKh|DjIuR+VmA2m%pAf-+AQ&3h$Tx5r2ZUCtWJ{Kf2fj2>=&@?0j#w3c76AU7kj89SWCZ4vL#Fdj4DWxIT_9_s!5MZ-?4D z^Z{6Gtr5|Hh@!Zj%DwJSFFDYm1wy-1_e!ojqHxeDRdge$ZuU1=y8~xdK0uu#G=h&{ zK#KZA{M<8WQL}b{c95UeLtGoG$E7_huF+&kn`3nr`@?)k&l|UIx=8c_ZHLkDDD8pr zX73;<>v0^>UTFDVK8uu+*da>4eGiX)FjxIm|9u!k8p{?0Rou$@xJTUn0=MgxZ59Jj zb|KOYkBDeI#;Y0xXBZY=1U*sl%64+x+)Dzle*eMr%adrg4lCPj5+s$>0xkPeUSJEzq;T8p3o`TA;Ds7iC!iHWKAw-MsF<~1-|%T-udm@M0CUL*GA z&2IB`?b#VQcN)N-k5Vnk`y)IFT1F8fk(Hn=_};AisAqU8Tg?rV`c<`c3b>X>^jSKz zd;*VWsZ>C7^-rw`!1N;AB`mZupRGfP$(Vtjxz6z~dY#DEoZ1&S1#0KrHHFOCw9))625bj_o2efBEG%eI#f$Ks zY_uYXtYRYysL%+{pEq#b*YG`aWcDw5QB%zdB=z*%ozQ9VAZ4-1QLCpv8DcBS`&1N! z5$$oNW;fo+6u_in8VYn|?yz9yw@F}97~fhE9@8O{9d=Y4^sFoSE;>_!ERc*hR*(d( zHSl_%*LX%55>n^${1$fr_%$1xYKoAJ&x&Q9-Vc#ZBZCNN{-)^4{pE-6HZwCxx08z~ z%oH7%*j&k0k$}t<9hkdsmTiP#U)PTzgsplY60%E<_qPxK0MaLDLplw_P#=EQFMIxe zzh>mHVK(u@YX<<1j$OU-;K|Gfb4pK-@kMZ7Rt>#-H2((}g8LH9n~TFsEycc`rUzty zRQt|7tL2e1NlQ$tu=&N12v>vcwSjh;VX^@T0E`x2U<^itQr|RC4?%4WhMs@w6>{zi z-9W?k_<;I6qA`eK7_Cqdgy41+;~KUloI6rd7hgon`4u=O9|T(@A=U_-4Max&xEvg) zWz=P3Wr{3Zt^O7E;UE% z25W*D%0$L@+l};Q8i1bq#M7=Rgs#Z!-Wh$E?-cCh8d6#=P!7wz5*)~yvx&?qF_~*I ztGsvWd~_pTV}@_b8)HmNFiY>*P)d71y!LwmXs%3!o>We+hf3qe>qflBd05__t7J0B zEJLPmNFMKPGe)Kq#|S@MKLhm~rQ5P_lgLVji|SR2Ls+2TPz@|;Q9}auhI$Z2$hnR~ za}A^dG?o0hrQd@bXWm-Q?L6G84h`p?zL#P6HgQCR+9C2>cwiEe1#NBX;lKL`ToKp`&t-b zThsuo1OwA`J>$UfB2O)1>x#1`ozS*bo0dizL>3O?+5y*eikgoc+Nfr8%BqQR4cfrX zG#^6X6be-H<^^+K?MhgY!LRPw^d_wS=OkNQxg zrkO14oJ!PD07B90^+zKtO=lJ=DQLji+b?JYY|7wI;_~`5E{Cx{c&8}2ha=2(!HzQP&2fkVItgO@m4(+f*v4_;A~<{!*Y2U8Rz5OoFDNe?{tI1 zh7j#N);n2YUC}(Rb(l)fk@tmcMllrNJ=yKSwQb4mS~MiI$>Y7VLoON+YOcskUN^Xv zVRL?9RjTiMEU6kmO9Mg)hAO&U2JRY3^`s+W=J*pfop^~##ZY}@E8j>}o>^zfm*+J{ zu(?K7R~pxg{36nimN`YQP4XM}mWRyQCC2W2_-YRvD{eavQkqI>`C1MJpxXkKjOo?d zT7xDk!s6tGOZ%fExVfVqmzK2Fj|yV&vx^#8EnvfBj>=H?v$tjn4BpU&kNfakMY7|D zAF8kD5f7%|W5_ul0f&YcToo<|k(#_LS1z=>7nVe!09)2D@L!1;!0$^C3nau}h{=;8 z3!hU?s4@=Usd6_T?ud*dc0dj{6e-2OvBrY}givtp!8)E&TT~Lvv&^HkZ$%H8Sk5?A zsB)i<)X$$e5;$zm>=xT#$dg9Nz0Pc)EW>VzRw0>5d6 zGwafhX-pUAcoe3+bhYsn3$%VD9GZ)X1Bu=L1=Rgf{-co|f(!+BWeU;kL-&qK9ld6b z4@Q%c$@@i~Qp6)$M-TC>cGCF@XJ)#_mS=Mtlu`E{gjOA!8-ueYqGK>A@xbqcyp8u- z)Mgk#aKkl1$1AszM;nJaZa0QC()h2`ol3r^kac#lRSt#@?!2m*WDl1^3JD9X2wp#r zKtj#H$D`IkRSjc2PTPfF&qq?;2tj>T$e|hBb;4S|y!Pc@n_|5Fofn?&{vx#k;a75q z0h|mxw>LhlGIK6+5$0_B{x$@Pq+cGQ`+69(gF3}-v|FxkfadcbvdD;VNeluC-%OnE z@Oqg(!f343WAulUsUFNA0x+jW8ix6-RR`w=M_)*wQx?#xwy4qqAes1&ua+BN%FaHD z41+puV^ZkbY(ciK&Y}x0FA^@AfAl;|oY4d1b#$2Bri$}CTuKB_ll01b%5^WX<8ynT zcYX3b8hKb8F%FG3y7*DV$lpNy3~-~iGFaBS2d)>C1=&C?KF^{zL$O$l3&}r-bSvN^ z_5@LaB_*H+g#a4Q#0t&T^Qs{H`-q*Hd^3&}I##n@K?U~lt`(Vp)GI?b{ z4dEUue+x-%4eyl08ok6J2?=`a4i#56z`Zt-wZySc2Px9`XO3q5==|r1x8)cY=dq&{6Pk3!9R+M%4rliqz4;D>ySPbB;aP64L`b=2>7VR>T|U^Sf=4J-qwwo zWiXM!(2k-;id`kUrA0NJg|p{*;(O@J9DR*ud$XH}OsdWEaT-xQ4*0p6f48^zaB{OP z@wAxi0qzmse(LTjKm%`yrBD-XZvQg3HA~?7fspe@@Vtg@Mb2$CjvELKUe35gTd5Ro zU}>Jcb-Jpm#`=BWLgrl@xtO)Fn5*}7-+kfX$Ic`@jUCcA<$G3@)6uM=ytw%pGUcHb zn|vmbG690U(&*~DVy_Q&qT8*duh9`D-^B!p^a+k>^$74@d#t}r+uG^PlRvFKYYS|* zzyvPfV;2%k^;&)nW$fhV^S&_c%z`*IKXv2y6nkD4lP&gE zjE<$CMkqxdf}M7Q*}wkwfrGs_o>BcphZ3uCVi8SEthEh0;Viu7n18<+1bdP^V^xvl zB5@mQ0)KR)qiqZ$_MLe6X-C3%!T_E!rnmv-o#vcEPJb!4il^S_T`n3A?bHKhUU8#F;G~1eGx(O00ML8cT^_9l3McPiN!#JR z*|!hZp%lIrTt4GcoqN{DQyKqK zmL$$YaLW@s(GBUi=Sp`vojwF>B3f};_Pyv~&;0blvYzhjV%Tz3N{>;hM?Z8wwwLZf z+vNK9Yxu#~92tZV(wvalF&O9?-H?Qnt;$hOsvvfRhwD|TxITLT6Y>1x04E;qpb5F! z^~qkG12excAM6nX;LP3mV%)2dI>_z3G;(7YQBe1)FEdBRN!_8a{-~o)Lwpj#4LcI( znp8he2#*yWdTKSQ?y7&=yW*Lx`hrDkMkTLo1$!R$ zO;Id*MtWJPTG#9gA=##VDUjt0`@(^=ygpCv2V0}|-p z%}EW-oeg)DQG9rL`Yq3Hi|X~1V%WqQMYFSN5-r~tCeb!Rq+{Tl#sOnoHD8*L)uwsp z=&qI*to^XhSdH65uKUizTO`of z%F=M|wwO#^6Cu0Nb{JII1QH00CCY=(Gjm$Loef^ww-tems~FG3p0_DXgI2-2x%Uw8 zFbBTMT!+`X-Zp*v#x~+~ZlNK*&@1M%Zg@(oE)uyEE{wiY@1}~LU5oUUk>*mv<2XMvy)n@g! z+`RIbf&Awgvptc+&xT_kr9V;1tZrdU(odE(g09Zl$wAQ$wn6m?E)m;j?LSs~n=h*> zfh!_*z4dR1eO3$WgA)spIF3`7B$P~=w}L|~$lKWR7~L9+r>rCSJ=jmxN1k!yH2G)_ zr%}_>8~7`VA)Rnl?|xxa2;0adA9MV8eh?U#8oxUjyIyuEutv06COgw~x#>H~@ap>= z5wd-HPnOKY;c_g7c}TfBKqyYV?35CMT0Glw2yu7n%cCNyromgJ$HV1lWvQXjWYrlZ zS;)^WXQ4HOdfPY~58=H2xLYyOd_#6-Sa&Y7)s_(&Cd2;TIG-zqV@@lB5cfL`3`@V$ zRf}gauKNGA&3FLd$D}My;yBh z$71g(0DxqzpS@Twe?Arb<@@XRKb=|TKRdJF03^R20|IaW09%r_g@-YqtRP(v-|iI9 z0q3{{4D5~mhfHZ7iK@U(KzAg+oY+tPwtqS~cdVApeNa(k0}q7{ z1^~eO%L$<$IMb~3`c4KGMvlJ+LT_ttV`b*>Bqd}P?x@IN zJOfV_6Inyg0DwX8&;PyDe!@jU0RR^>YilF>f0wLud)-Ep^dt~c{&&g#$NtI2|H!Dg zGKvPX0?q^woC%!20_TbTZ@!J4tPLE^Y^?uh&W9o^bWFh)^M5S*{L{*!27BV)q?$O< zhXp({gash}In4X#$Szv9<{LHKvI{!1f(oWmFG>oK6*=igNdvioiS(n$VTaw;5Ps|}t(ZJx}l z9nZl-uyoS@-A((~#L+{EbW!S+Add&9q(|FM6v)xd1lBxKVjaNMI$ z;-)1*{H@7Tz4!2)f3m-ckp0qRgz&fhlkE&!QgQ?d4u%GI!i<0z{{rTC;UvdA({u#F?n2jSg z3(G|V0Lbe7TW_rRf7nm;-pES*$qvc-&Gz#AZU1Dy1GDM<-q$sO;|AZH^~d7z^SX5Y z@(=r|-d3EMKiQ%>{|_&41=AL$=Dcn9+DJ?5R;2G?Q z-qRJk8B7PlI}0fB0|BKXz<=%4Yz&eAyJCZ^&8$E_mp%p)GvmLeMSGf!pKe-IXn&=) z3M? F{T~^R)!P67 diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/.gitignore b/javascriptv3/example_code/cross-services/photo_analyzer/.gitignore new file mode 100644 index 00000000000..1ef4aee3147 --- /dev/null +++ b/javascriptv3/example_code/cross-services/photo_analyzer/.gitignore @@ -0,0 +1,2 @@ +dist/* +!dist/index.html \ No newline at end of file diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/README.md b/javascriptv3/example_code/cross-services/photo_analyzer/README.md index e6ae2d472e8..5900f7f082a 100644 --- a/javascriptv3/example_code/cross-services/photo_analyzer/README.md +++ b/javascriptv3/example_code/cross-services/photo_analyzer/README.md @@ -1,26 +1,9 @@ -# Creating an example AWS photo analyzer application using the AWS SDK for JavaScript (v3) +# Create a photo analyzer application using the AWS SDK for JavaScript (v3) ## Purpose +Demonstrate the use of AWS Rekognition to analyze images located in an Amazon Simple Storage Service (Amazon S3) bucket. -The cross-service example demonstrates how to build an app that analyzes nature images located in an Amazon Simple Storage Service (Amazon S3) bucket -by using the AWS Rekognition service. For example, the following image shows a lake. - -![AWS Photo Analyzer](images/Lake1.png) - -After the application analyzes this image, it creates this data: - -- Panoramic - 99.99971 -- Outdoors - 99.99971 -- Nature - 99.99971 -- Landscape - 99.99971 -- Scenery - 99.99971 -- Wilderness - 96.90007 -- Water - 93.501465 -- Lake - 87.28128 - -The application can analyze many images and generate reports for each image in a -separate Amazon S3 bucket, breaking the image down into a series of labels. In addition, this application uses Amazon Simple Email Service (Amazon SES) -to send emails with a link to each reports to the recipient. The app uses the following AWS services: +Analyze many images and generate reports for each image in an Amazon S3 bucket, breaking the image down into a series of labels. Then, use Amazon Simple Email Service (Amazon SES) to send emails with a link to each report. The following AWS services are used: - [AWS Rekognition](https://aws.amazon.com/rekognition/) - [Amazon Simple Storage Services (S3)](https://aws.amazon.com/s3/) @@ -28,18 +11,11 @@ to send emails with a link to each reports to the recipient. The app uses the fo ## Prerequisites -To build this cross-service example, you need the following: - -- An AWS account. For more information see [AWS SDKs and Tools Reference Guide](https://docs.aws.amazon.com/sdkref/latest/guide/overview.html). -- A project environment to run this Node JavaScript example, and install the required AWS SDK for JavaScript and third-party modules. For instructions, see [Create a Node.js project environment](#create-a-nodejs-project-environment) on this page. -- At least one email address verified on Amazon SES. For instructions, see [Verifying an email address on Amazon SES](#verifying-an-email-address-on-amazon-ses). -- The following AWS resources: - - An unauthenticated AWS Identity and Access Management (IAM) user role with the following permissions: - - sns:\* - -**Note**: An unauthenticated role enables you to provide permissions to unauthenticated users to use the AWS Services. To create an authenticated role, see [Amazon Cognito Identity Pools (Federated Identities)](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html). +To build this example, complete the following steps: -For instructions on creating the minimum resources required for this tutorial, see [Create the resources](#create-the-resources) on this page. +- Create an AWS account. For more information, see [AWS SDKs and Tools Reference Guide](https://docs.aws.amazon.com/sdkref/latest/guide/overview.html). +- Follow the [prerequisites](../../../README.md#prerequisites) in the top level `javascriptv3` folder. +- Install the AWS CLI. For more information, see [Install or update to the latest version of the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html). ## ⚠ Important @@ -47,517 +23,72 @@ For instructions on creating the minimum resources required for this tutorial, s - This code has not been tested in all AWS Regions. Some AWS services are available only in specific [Regions](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). - Running this code might result in charges to your AWS account. We recommend you destroy the resources when you are finished. For instructions, see [Destroying the resources](#destroying-the-resources). - Running the unit tests might result in charges to your AWS account. -- This tutorial is written to work with the specific versions defined in the _package.json_. If you change these versions, the tutorial may not work correctly. - -## Create the resources - -You can create the AWS resources required for this cross-service example using either of the following: - -- [The Amazon CloudFormation](#create-the-resources-using-amazon-cloudformation) -- [The AWS Management Console](#create-the-resources-using-the-aws-management-console) - -### Create the resources using Amazon CloudFormation - -To run the stack using the AWS CLI: - -1. Install and configure the AWS CLI following the instructions in the AWS CLI User Guide. - -2. Open the AWS Command Console from the _./photo-analyzer_ folder. - -3. Run the following command, replacing _STACK_NAME_ with a unique name for the stack. - -``` -aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM -``` - -**Important**: The stack name must be unique within an AWS Region and AWS account. You can specify up to 128 characters, and numbers and hyphens are allowed. - -4. Open [AWS CloudFormation in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the **Stacks** page. - -![ ](images/cloud_formation_stacks.png) - -5. Choose the **Resources** tab. The **Physical ID** of the **IDENTITY_POOL_ID** you require for this cross-service example is displayed. - -![ ](images/cloud_formation_resources_tab.png) - -For more information on the create-stack command parameters, see the [AWS CLI Command Reference guide](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html), and the [AWS CloudFormation User Guide](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html). - -### Create the resources using the AWS Management Console -#### Create an unauthenticated user role +## Create the resources using Amazon CloudFormation -1. Open [AWS Cognito in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the _Stacks_ page. -2. Choose **Manage Identity Pools**. -3. Choose **Create new identity pool**. -4. In the **Identity pool name** field, give your identity pool a name. -5. Select the **Enable access to unauthenticated identities** checkbox. -6. Choose **Create Pool**. -7. Choose **Allow**. -8. Take note of the **Identity pool ID**, which is highlighted in red in the **Get AWS Credentials** section. - -![ ](images/identity_pool_ids.png) - -9. Choose **Edit identity pool**. -10. Take note of the name of the role in the **Unauthenticated role** field. - -#### Adding permissions to an unauthenticated user role - -11. Open [IAM in the AWS Management Console](https://aws.amazon.com/iam/), and open the _Roles_ page. -12. Search for the unauthenticated role you just created. -13. Open the role. -14. Click the down arrow beside the policy name. -15. Choose **Edit Policy**. -16. Choose the **JSON** tab. -17. Delete the existing content, and paste the code below into it. - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Action": ["mobileanalytics:PutEvents", "cognito-sync:*"], - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "rekognition:DetectLabels", - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": [ - "s3:PutObject", - "s3:DeleteObject", - "s3:ListBucket", - "s3:GetObject" - ], - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "ses:SendEmail", - "Resource": "*", - "Effect": "Allow" - } - ] -} -``` - -18. Choose **Review Policy**. -19. Choose **Save Changes**. +1. Run `npm run deploy`. This will use the AWS CLI to deploy the resources you need. ### Verifying an email address on Amazon SES -1. Open [AWS SES in the AWS Management Console](https://aws.amazon.com/SES/), and open the **Email Addresses** page. -2. Choose **Verify a New Email Address**. -3. Enter a working email address, and choose **Verify This Email Address**. -4. Open the email in your email application, and verify it. - -## Create a Node.js project environment - -1. Clone the [AWS Code Samples repo](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. - See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for - instructions. - -2. Run the following commands in sequence in the AWS CLI command line to install the AWS service client modules and third-party modules listed in the _package.json_: - -``` -npm install node -g -cd javascriptv3/example_code/cross-services/photo-analyzer -npm install -``` - -## Building the code - -This app runs from the browser, so we create the interface using HTML and CSS. -The app uses JavaScript to provide basic interactive features, and Node.js to invoke the AWS Services. - -### Creating the HTML and CSS - -In **index.html**, the **head** section loads [JQuery](https://jquery.com/), [DataTables CDN](https://cdn.datatables.net/), and [BootStrap](https://getbootstrap.com/) libraries. -It also loads **stlyes.css**, which applies styles to the HTML, -and the **main.js**, which contains the following JavaScript and Node.js functions used in the app. - -**Note**: **main.js** is a bundled file containing all the required JavaScript. You'll create this later in the tutorial. - -The remaining code defines the interface features, including a table and buttons. - -```html - - - - - - - - - - - - - - - - - AWS Photo Analyzer - - - - - - -

- -

AWS Photo Analyzer Application

-

Upload images to an S3 Bucket. Each image will be analysed!

- -

- -
- -
-
- -

Select the following button to determine the number of images in the bucket.

- - - - - - - - - - - - - - - - - - - - - -
-
NameOwnerDateSize
NameOwnerDateSize
- -
-
-

You can generate a report that analyzes the images in the S3 bucket. You can send the report to the following email address.

-
-
- -
-
- -

Click the followi ng button to obtain a report

- -
-
- - -``` - -### Creating the JavaScript and Node.js - -The **./js/libs/** folders contains a file for each of the AWS Service clients required. You must -replace "REGION" with your AWS Region, and replace "IDENTITY_POOL_ID" with the Amazon Cognito identity pool id -you created in [Create the resources](#create-the-resources) on this page. Here's an example of one of these client configuration files: - -```javascript -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { RekognitionClient } from "@aws-sdk/client-rekognition"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an AWS Rekognition service client object. -const rekognitionClient = new RekognitionClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { rekognitionClient }; -``` - -In **./js/index.js**, you first import all the required AWS Service and third party modules, and set global parameters. - -```javascript -import { DetectLabelsCommand } from "@aws-sdk/client-rekognition"; -import { rekognitionClient } from "../libs/rekognitionClient.js"; -import { ListObjectsCommand, PutObjectCommand } from "@aws-sdk/client-s3"; -import { REGION, s3Client } from "../libs/s3Client.js"; -import { sesClient } from "../libs/sesClient.js"; -import { SendEmailCommand } from "@aws-sdk/client-ses"; - -// Set global parameters. -const BUCKET_IMAGES = "BUCKET_IMAGES"; -const BUCKET_REPORTS = "BUCKET_REPORTS"; -const EMAIL_SENDER_ADDRESS = "EMAIL_SENDER_ADDRESS"; // A verified Amazon SES email. -``` - -Next, you define functions for working with the table. - -```javascript -// Load table parameters. -$(function () { - $("#myTable").DataTable({ - scrollY: "500px", - scrollX: true, - scrollCollapse: true, - paging: true, - columnDefs: [{ width: 200, targets: 0 }], - fixedColumns: true, - }); -}); - -// Load images from Amazon S3 bucket to the table. -const loadTable = async () => { - window.alert = function () {}; - try { - const listVideoParams = { - Bucket: BUCKET_IMAGES, - }; - const data = await s3Client.send(new ListObjectsCommand(listVideoParams)); - console.log("Success", data); - for (let i = 0; i < data.Contents.length; i++) { - console.log("checking"); - var t = $("#myTable").DataTable(); - t.row - .add([ - data.Contents[i].Key, - data.Contents[i].Owner, - data.Contents[i].LastModified, - data.Contents[i].Size, - ]) - .draw(false); - } - } catch (err) { - console.log("Error", err); - } -}; -loadTable(); - -// Refresh page to populate table with latest images. -const getImages = async () => { - window.location.reload(); -}; -window.getImages = getImages; -``` - -Next you define the functions for adding an image to the Amazon S3 bucket (_addToBucket_), analyzing the image (_ProcessImages_), creating the CSV report (_create_csv_file_), -uploading the report to the Amazon S3 bucket (_uploadFile_), and sending the specified recepient email notification about each image (_sendEmail_). - -```javascript -const addToBucket = async () => { - try { - // Create the parameters for uploading the video. - const files = document.getElementById("imageupload").files; - const file = files[0]; - const key = document.getElementById("imageupload").files[0].name; - const uploadParams = { - Bucket: BUCKET_IMAGES, - Body: file, - Key: key, - }; - - const data = await s3Client.send(new PutObjectCommand(uploadParams)); - console.log("Success - image uploaded"); - } catch (err) { - console.log("Error", err); - } -}; -// Expose function to browser. -window.addToBucket = addToBucket; - -const ProcessImages = async () => { - try { - const listPhotosParams = { - Bucket: BUCKET_IMAGES, - }; - // Retrieve list of objects in the Amazon S3 bucket. - const data = await s3Client.send(new ListObjectsCommand(listPhotosParams)); - console.log("Success, list of objects in bucket retrieved.", data); - - // Loop through images. For each image, retreive the image name, - // then analyze image by detecting it's labels, then parse results - // into CSV format. - for (let i = 0; i < data.Contents.length; i++) { - const key = data.Contents[i].Key; - const imageParams = { - Image: { - S3Object: { - Bucket: BUCKET_IMAGES, - Name: key, - }, - }, - }; - - const lastdata = await rekognitionClient.send( - new DetectLabelsCommand(imageParams), - ); - console.log("Success, labels detected.", lastdata); - var objectsArray = []; - // Parse results into CVS format. - const noOfLabels = lastdata.Labels.length; - var j; - for (j = 0; j < data.Contents.length; j++) { - var name = JSON.stringify(lastdata.Labels[j].Name); - var confidence = JSON.stringify(lastdata.Labels[j].Confidence); - var arrayfirst = []; - var arraysecond = []; - arrayfirst.push(name); - arraysecond.push(confidence); - arrayfirst.push(arraysecond); - objectsArray.push(arrayfirst); - } - // Create a CSV file report for each images. - create_csv_file(objectsArray, key); - } - } catch (err) { - console.log("Error", err); - } -}; -// Expose function to browser. -window.ProcessImages = ProcessImages; - -// Helper function to create the CSV report. -function create_csv_file(objectsArray, key) { - // Define the heading for each row of the data. - var csv = "Object, Confidance \n"; - - // Merge the data with CSV. - objectsArray.forEach(function (row) { - csv += row.join(","); - csv += "\n"; - }); - // Upload the CSV file to Amazon S3 bucket for reports. - uploadFile(csv, key); -} - -// Helper function to upload reports to Amazon S3 bucket for reports. -const uploadFile = async (csv, key) => { - const uploadParams = { - Bucket: BUCKET_REPORTS, - Body: csv, - Key: key + ".csv", - }; - try { - const data = await s3Client.send(new PutObjectCommand(uploadParams)); - const linkToCSV = - "https://s3.console.aws.amazon.com/s3/object/" + - uploadParams.Bucket + - "?region=" + - REGION + - "&prefix=" + - uploadParams.Key; - console.log("Success. Report uploaded to " + linkToCSV + "."); - - // Send an email to notify user when report is available. - sendEmail(uploadParams.Bucket, uploadParams.Key, linkToCSV); - } catch (err) { - console.log("Error", err); - } -}; -// Helper function to send an email to user. -const sendEmail = async (bucket, key, linkToCSV) => { - const toEmail = document.getElementById("email").value; - const fromEmail = EMAIL_SENDER_ADDRESS; // - try { - // Set the parameters - const params = { - Destination: { - /* required */ - CcAddresses: [ - /* more items */ - ], - ToAddresses: [ - toEmail, //RECEIVER_ADDRESS - /* more To-email addresses */ - ], - }, - Message: { - /* required */ - Body: { - /* required */ - Html: { - Charset: "UTF-8", - Data: - "

Hello!

Please see the the analyzed video report for " + - key + - " here

", - }, - Text: { - Charset: "UTF-8", - Data: - "Hello,\\r\\n" + - "Please see the attached file for the analyzed video report at" + - linkToCSV + - "\n\n", - }, - }, - Subject: { - Charset: "UTF-8", - Data: key + " analyzed video report ready", - }, - }, - Source: fromEmail, // SENDER_ADDRESS - ReplyToAddresses: [ - /* more items */ - ], - }; - const data = await sesClient.send(new SendEmailCommand(params)); - console.log("Success. Email sent.", data); - } catch (err) { - console.log("Error", err); - } -}; -``` - -**Important**: You must bundle all the JavaScript and Node.js code required for the app into a single -file (**main.js**) to run the app. For instructions, see [Bundling the scripts](#bundling-the-scripts). - -### Bundling the scripts - -This is a static site consisting only of HTML, CSS, and client-side JavaScript. -However, a build step is required to enable the modules to work natively in the browser. - -To bundle the JavaScript and Node.js for this example in a single file named main.js, -enter the following commands in sequence in the AWS CLI command line: - -``` -cd javascriptv3/example_code/cross-services/photo-analyzer/src -webpack index.js --mode development --target web --devtool false -o main.js -``` - -## Run the app - -Open the index.html in your favorite browser, and follow the onscreen instructions. +1. Follow the instructions for [creating an email address identity](https://docs.aws.amazon.com/ses/latest/dg/creating-identities.html#verify-email-addresses-procedure) + +## Bundling and running the app + +This is a static site consisting only of HTML, CSS, and client-side JavaScript. However, a build step is required to enable the modules to work natively in the browser. The build step also uses your local credentials to fetch the CloudFormation outputs and supplies them as environment variables to Webpack. + +A helper script has been provided to bundle the code and start an HTTP server. You'll need to provide the email address you verified in SES, and an AWS region as environment variables. Replace `` and `` with your verified email and preferred AWS region (defaults to 'us-east-1'). + +1. Run `VERIFIED_EMAIL_ADDRESS="" REGION="" npm run dev` + There will be terminal output that looks something like the below: + ``` + > @aws-doc-sdk-examples/aws-sdk-v3-cross-service-examples-photo-analyzer@1.0.0 dev + > npm run build && npx http-server ./dist/ + + + > @aws-doc-sdk-examples/aws-sdk-v3-cross-service-examples-photo-analyzer@1.0.0 build + > webpack --mode development + + asset main.js 2.07 MiB [compared for emit] (name: main) + asset vendors-node_modules_aws-sdk_credential-provider-cognito-identity_dist-es_loadCognitoIdentity_js.main.js 55.5 KiB [compared for emit] (id hint: vendors) + orphan modules 351 KiB [orphan] 347 modules + runtime modules 7.25 KiB 10 modules + javascript modules 1.15 MiB 544 modules + json modules 17.3 KiB + ../../../node_modules/@aws-sdk/client-cognito-identity/package.json 3.21 KiB [built] [code generated] + ../../../node_modules/@aws-sdk/client-s3/package.json 3.99 KiB [built] [code generated] + ../../../node_modules/@aws-sdk/client-rekognition/package.json 3.1 KiB [built] [code generated] + ../../../node_modules/@aws-sdk/client-ses/package.json 3.02 KiB [built] [code generated] + ../../../node_modules/@aws-sdk/util-endpoints/dist-es/lib/aws/partitions.json 4 KiB [built] [code generated] + webpack 5.94.0 compiled successfully in 848 ms + Starting up http-server, serving ./dist/ + + http-server version: 14.1.1 + + http-server settings: + CORS: disabled + Cache: 3600 seconds + Connection Timeout: 120 seconds + Directory Listings: visible + AutoIndex: visible + Serve GZIP Files: false + Serve Brotli Files: false + Default File Extension: none + + Available on: + http://127.0.0.1:8080 + http://192.168.254.17:8080 + http://11.129.21.155:8080 + Hit CTRL-C to stop the server + ``` +2. Open a web browser to the described address. +3. Select a file to upload. +4. Click 'Upload image'. +5. Provide the email address you previously verified. +6. Click 'Analyze photos'. +7. You should receive one or more email with links to the generated CSV. ## Destroying the resources -4. Open [AWS CloudFormation in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the _Stacks_ page. - -![ ](images/cloud_formation_stacks.png) - -5. Select the stack you created in [Create the resources](#create-the-resources) on this page. - -6. Choose **Delete**. - -### Next steps - -Congratulations! You have created and deployed the AWS Photo Analyzer application. -For more AWS multiservice examples, see -[usecases](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/usecases). +1. Empty the created S3 buckets. + a. `aws s3 rm s3://bucket-name --recursive` +2. Run `npm run destroy`. \ No newline at end of file diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/css/col.css b/javascriptv3/example_code/cross-services/photo_analyzer/css/col.css deleted file mode 100644 index 2d172226c15..00000000000 --- a/javascriptv3/example_code/cross-services/photo_analyzer/css/col.css +++ /dev/null @@ -1,43 +0,0 @@ -#container { - width: 1300px; - margin: 0 auto; -} - -#primary { - float: left; - width: 500px; - height: 1100px; - background-color: #d3d3d3; -} - -#proside { - float: left; - width: 700px; - height: 800px; - background-color: #f8f8f8; -} - -#procontent { - float: left; - width: 800px; - height: 800px; - background-color: #ff0000; -} - -#content { - float: left; - width: 800px; - height: 800px; - background-color: #d3d3d3; -} - -#secondary { - float: left; - width: 300px; - height: 450px; - background-color: #d3d3d3; -} - -#footer { - clear: both; -} diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/css/common.css b/javascriptv3/example_code/cross-services/photo_analyzer/css/common.css deleted file mode 100644 index 6a894201df9..00000000000 --- a/javascriptv3/example_code/cross-services/photo_analyzer/css/common.css +++ /dev/null @@ -1,48 +0,0 @@ -body { - padding-top: 40px; - padding-bottom: 40px; - background-color: #eee; -} - -.form-signin { - max-width: 330px; - padding: 15px; - margin: 0 auto; -} - -.form-signin .form-signin-heading, -.form-signin .checkbox { - margin-bottom: 10px; -} - -.form-signin .checkbox { - font-weight: normal; -} - -.form-signin .form-control { - position: relative; - height: auto; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 10px; - font-size: 16px; -} - -.form-signin .form-control:focus { - z-index: 2; -} - -.form-signin input { - margin-top: 10px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.form-signin button { - margin-top: 10px; -} - -.has-error { - color: red; -} diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/css/styles.css b/javascriptv3/example_code/cross-services/photo_analyzer/css/styles.css deleted file mode 100644 index ffd74ad014d..00000000000 --- a/javascriptv3/example_code/cross-services/photo_analyzer/css/styles.css +++ /dev/null @@ -1,29 +0,0 @@ -body > header { - background: #000; - padding: 5px; -} - -body > header > a > img, -body > header a { - display: inline-block; - vertical-align: middle; - padding: 0px 5px; - font-size: 1.2em; -} - -body > footer { - background: #eee; - padding: 5px; - margin: 10px 0; - text-align: center; -} - -#logged-in-info { - float: right; - margin-top: 18px; -} - -#logged-in-info form { - display: inline-block; - margin-right: 10px; -} diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/dist/index.html b/javascriptv3/example_code/cross-services/photo_analyzer/dist/index.html new file mode 100644 index 00000000000..57470d52706 --- /dev/null +++ b/javascriptv3/example_code/cross-services/photo_analyzer/dist/index.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + AWS Photo Analyzer + + + +
+ +

AWS Photo Analyzer Application

+ +
+

Images

+
    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/Lake1.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/Lake1.png deleted file mode 100644 index 06df8fd8576f2f56d7a4bc5c70a8166ed8d37b95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378510 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 !CzY22q5ik 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⪼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 z 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 diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/Photo1.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/Photo1.png deleted file mode 100644 index 114cca67308240b4870c7d6eb959f30c02b666d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76309 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

    xn8k#k(kI_ug#GGS(J;*8#Age@>*>`pMe$T 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 S{V5viqadRyT_$Pz<^KQ?{$#}f diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/identity_pool_ids.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/identity_pool_ids.png deleted file mode 100644 index c29f2fe43036c5f05e0bfb84276598cfeb087759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68165 zcmaHT1yCH@7A+Rs-3JNo?vMn61PcUrcZVRsT>~KmhXI1SySux)yF*~Gfj@cozI*e2 z{rX)+rRJRO(|vYtU3+!HKPpI}Arm7*K|!I(NJ}U~LBWebK|voP!b3(@A6SVY{~$R? zYdS+gq4)g$gN|oHCxHwixX8%AN7#jjMS}H|%XXw3#%iGT`7WPh1g=HhskRenT z$dH7ov$2zH%Kch~jhQCjxaIv&C zh2jBWAVFr3e$RZeH*;|_bTWm~b$I!GI?8_*w{$kPF@&7z1XbTr69XAW{5`C0=wxSU zXAadtvKI;&L-_0Z&rZgsP&Y4u$NxP|+}_sK)XoL!b|j%4G6w(qG!;u18&jx)vne_# zC<-VUiMJ~5X(y|mIy0ZwUS1GTxw<G3`(;c!i&a$k02a+{FY0n_*Y*Ys10asF7G!tMFWa6;5qLegBF*=8n|>{E^91@@#A(+__v z?UdYLAS3?%{i}W-p`quMRvX>w@PG{8+`BMX&to-G&If1ab13N2cb2oouyb|1a%#iD zDJg&4Tt_m6`>CLyAamzVCYoHhtBuTK#}*t876Lh*Oem$%eSo4zb5wTy8B~Qs!yiMI zzoWrnYur3p6`HPW&d>(0j|#7UacMbJ81e6#1ExP^x?{TZeYf{V#bV_IZ6s5#RKY5Pd$b6$EQP;PQKl9@g z9@alc?65>!2*6rYuXk=l{)fOYuN6vO2g|42vp!0*0=$Py@SF<-@# z_w7wI0baFbrY;!3(yY5o)jhZ zR6!7QIhN2E{uqrehvUKUMxS6{Exc5R*+a8>0r^x;FQQ;K?>e!Jl_Bcazi zS`bN*m`a7KC=<~LENoY*x!u1nD>1H0`GeQjByW<2(cq+hnzBJppCCB+DUK>M%3HOX z<8?CYVaySHE;C;)+G-;GKsJ`;8d}bw=;7Ti3vQ<;i%JmvMy+!#H1$L=Rw{OZcw9Vv(+Bo=8o(*VG6>I13%%f8V5z8m~R2lY-LCV_9W2Xw!A} zOz^J!Jo%malpTuUFx~pK<{-?_@ol4x3&kEv(R$z=qC&Y=g%1o45I$C>i}&FM0j6nd~M7tQq` z0Z+V=<#(UZiR;yxh*hnh`RG)XQ-*^jc6 zL8kMDdTZZl9N`yzSfqTvsCIed+Z1oi=~M-CN0(PGz`>e&t_3OkFK+zT9A{rVU$fZ| z4{Y!r4=#K}RWf$pomD7ld3+^`;7*rpE^SK1CF6te-E3tXgfDQ)Ew-X;qZ%X8#+VDn^f(#h;u-k+_t^hhyUx{z z0o|(jobnI+M%>Q&`^W_?dCkvY`@4rGk_N|azNi(rZ{paKvoM(ByxZj=-&cj)Sxdk9 z{&=`*2AV~C%pC~Cjz3m|F8a!M??U0P@^kchq;M+_;?qw~Y>b9My(N7y`+y^PWp{F! z@~1vdzi@30?rMUT7c_l+^H2egC!&q`^UcMvG`Zzh#*j5#JN8&slJG_njZc$A;+9*2 zbIvJu`l+6kV8rcDB!&tQM}Abhjp75fl}C=8^dV^7SotOPAyQmWt9;3L% z4W=*g@d=Jyj%i!j=xKE64IhRb1cvEF^xhpJ(e0X+U6XnsSjtcn2{^r`mJ;pWN7%SX zNq(}#ib_iuIuSz+Q3RU%@SZ%XBcs&Sn)eiQdF=H$kOC=ngp#heYmiMyh6aHcIWAG4LkyI*`kQva^_%#)h4(&0uh<^2an&U9n{JPsO@z24kj^MN1 z6uyora7jW%=QI8jwu4QKi)FaSn(fxOyC&L2L{073(wn@^A5A<8l?+?A_-gydJJEDs zxW@y++qSh(y5%32)KIx4UC-(M%kWce zBEJsdBHf_)7xnfz@FxI%tiQr76(3>Gj8|@Cq4SbHmiSF#OJ|0E>WnE5@7Q<~<;O#h z8Q1A(^+H#F4Th&v*t?cfp4D4$v*2F!Oul=n<~Ad5P9`Du3SV4h9qVoT=gmqG>yi!Y zk?E)gdAuQbfV+p`h1aolDerSG^AQ@+(kFRwPH$$D+WAbWlY!>oho&uie?4cD=TTSt zMsK%VU8>eqU8klVQ&Xp}aR;^3sM|v1k-{@nKr@3x;z_)3iKMm?`w#)H)_BKHKl%1r z>5S7I;7kF#B`zbwwzFW{YqNkqKy7RTl|(Ic?a+@_vJUJ0&KhGiiPinikedVv6^$xK zl^&8X$>IAx!Hf__`6R)BFK?~`tCnOIG^6AU94P!%<(nfJSm2k0J5K5)o3~L24ERU( zll^)l3imMSNcsKz<3tU&{D!1-JF>*-ka01JZbHFd zjfl}Y1-6^NTyzWhwO6Vcx#n$i&80Y4iu5CjwRkH8W&o>y7*RYuFXpUmqX!5-8V->P z+TTT#bEcVeLfg`WTxoAHFlcBmB?VWOQlkTnET%z>Pt0dbPokotXe*y6 z)G-dw+F2=fX)B@P4X- zC_ck0MlkVti8#TP6oBkl>TS{CAoc1kRP;qh03-%oeul*h&qV#iQ&K(gRjQ#wqD*u zuH2j1-HfW-jz8u1&1TX z?^ioYgx>Q4-zP^Xx6uS~M89;<;ec9NMQz3<`UDRcDEk*vmLpG14G-ch4-U>z;ea)t zgjZs!LUE|TJM8RcGJ{U8K{>B{zvpaw3SoB&#TIrL(ewe4cF%CV6^$xG^w)lV zIK9E=TA?iUj-`H#VKe&WZ@xm)z_Le8S7Q_Sby8{KwYYP?u*vQC|jIbD0(Meq_@ z4xbB}QZ4G)OlM44fz@#)?+qOMzvzpH(z`bl9FG#re^Q?5ZenUDtecK zdNQ;&IA_nh&B)S?Z`h4*N6pP029=GaUKz(Jg|thPtMWtrqmmLd9v;NU5yG;*L4Eyi zb>Z|%`{lVlY8~g@P>x_gjI3Oonhz-}ea_v6(v!SoN$I=$v&he0^F8S zla;n`u~?-Ys&C&n3SC_A+-(sU&=%OrYW)i9S(*#+O{)F9DY1C zG&dKEC(XYXeJ!+P5<6Nh9F$IFJ++wL-8x5P`*)Tq5r2IT==YEN2@8`pR=%VB^8~!$ zKSV<1q^b1(pT1nIv(n~_Wc75nUvy*WH-48B@^xp|o+YKNj{VCbBmuV0ccWB$_n{vVO#ycJd@-`(9! zf5&JA6+D4E!E*Z8e z_jvs7_sgoAiO=5;)$#Zf29gepPfSz~2GA)2dzShJKD&Kxpm>aK5`lx#*Vlh~db+s2 z?lxdoL3x84priRe7iM4l0$&7COu7Z(Os%!cfEGEIQYS4+@O}R8cTB7Z zrL3kVX{pID|HMkF-=2p=;RW_O;HF2cUW{sQ7khqwP8v0flBD+W@zHuXLe9Go|3``v z#3Rk?A)u;HZ?R|vSFjgeKSmuKD{5#n;YYrT>miC3{k*qv?t4cdK;)TXmoJLR!;S0f z`(o7@nvy0fZ{^PFM0`A7Zhyw`k8{#du?itKH8u6BcOjV$8Mj{AfVG%imOyE))w(d` zP30i|swzLGdPA8x^oJ)AkmU)CF%FHmzlbSbs4-HHJ6|>kDF|X`#+OZ31svT_uCZ1P z#hiL2++tZ{@PdR{VG!o8V#k92z3b~1afpWZ_Th?0cSI^_gJp>i=(kudntYc?=9xv(TWI1&z$60zWLlZtk3Nq6oiyR zz`a)xZ1Vh>6hovv>S@|8QU1d_7^Lbd66bv`y&pL; z`Ei7Es*f%AZeZ}5eBPjt!pngO`j$(-f+zHD%F;kubvBgl>Ei4r%LlM^TBUbu^|)_o z!u~BssHyp!zbfv0&NkQdBi)wJ2D&k)fx(nR6W_7iZp8i&-EknUa-vC`+YAyd6V@c3 zEMPrF3o~1Co;QAWv-oQS!WJhqS7|WUe(?@-Z?0Oys%u-h z&WLFU#E6XyrcV74N^Uen=OKZrV0Kk=DCf(G^_ZnP;^oE6a7?x@y7z#Kjg2i`I9V>@ zsRo0D#Gq1)a}Yby&y>Jf*e{YVq`h*i1A*`bIZ_`uB$(b2Ma8)aMCa=o4{p z1zak`*favVsy-PnOCG1IZxPAUru4H4c)J6fQXp?D364Cfcf!s;rYfE z=y}%n@dRvVEbU@poMGBnATa3VjC_cYE#q^JCi(u$SqzQq#mA`(a@ipi2AyUHPRE4l zuhdRJ9f6YjuD3m>;^B8j0>g7OI9wZB$X%>S0WM}ELwzofE_-0NlS0Or=gS^Ya%bzb zvdlea^kJawsG$5`2}Eq33dEz`RJXLGLEKDT`EobHCpG1U_JX&@+CuM40+6a_%Zn5d z-gtNjoQd|nRgsMdX@@2GhRm?!Kxo80i^ zr7^WFWc_aR*l~Ysm-*p={dO5Zc_;=jl;D24=;f?aF9j({tg)FrtcfI4VxVW`ulvlI z+95P?2{VNIpZedz$`l!E7N5Djj^(aknMm-LkwHC2UoAfh+Uz(hx=deo{j{+j59A5J zh}mv`mb_yDak!3nzm|A=rapXk7WP=V-ljWp1<2YTsC*6Hr$#-0C8W-5w%U2rkMDTw z{hH?MZd)of|I-as!ugC5t@@AbWM=Kd9+!Q>@{R28lmR`D@czy`nyJNNKiXO2WkBfE zl$8F4*?pYGO04JwMd;G*ykvgA%vWb|iV5T?AagRZP*ce}t8_oj;=}gOOWswj0ef1* zkzT(>-7b4kpgA`9Dj?`2w1v=314=zv#|B=s{ZZ~7Uj}5YO74mAo zYg40|sN15x$n^(Tmp%33fr5E9CWH+-?RB?IsT+VZ< zh1Sxt^92;t(F?P&32)7A9^zXt$f+m|;gi?ANutZlKFp@Iw2$h02xH`ZgWYMl|46n! zFJqVh@-%w))md3=zo|C|P|LNoCKYzRZE~}pJX6AR^@~R{DgFIXj%RDMFOdhU!&A~& zRR5XNdWJh&+}haB3dvxJ=OzKUOPg(va+TA9D|eiuHq~MS!KB`_{nm9MF6oy^&%XRI zUAtNj4{wE|*f`NpQX}av+;wwTYID%k(x{H#Z%pgv3DKR}lQciCiS+9g3-+i=&n@E= zwbxe>aBd2Vx~<_UnR_W_T* z=-Ao6WoBj;rOsN>P*C_O)FT+ws9|v0tjY)J666WXE$eC6j%caVKe%9uyEoz?`hu4MuN@Kj%b}f*=ju1+jIn{>$QwKn`zpJ zrdyf?AZ_`I9A&4;ea=A^GQaA&>`75rmwkP0k27$@5wIf` z74js9-%|aJVS0((UX2P1s?2LDBje3b4DS|s>c~f-9dlNLu49ikBH@$`u>OuX8q%bL zigd>H`~%v+4@W;j2fWS5r_Ynd@^40GW95e$WSBu;jYoVHL0``J)5=GUy`t26y9j&@ zztcoC2w_*cR%3B(d=mBM&-i8D#}UfWa$`k>l|Z}=k3n;PXhOvtdgpp(lPCPWf5&4w zynfcV#rK|qpkV)oOTyXKS0gE2d~KT}URGl_Ep{h?nL3r3iVz0}dKRBO zg3@C%KZ-%xd}`ZyW3t};G#as})$91VE2zXm^6B}#WSrt&e<5=kXFM;U<*m`(p`Iz7 zW^yvW=W84S%WhXGVXk}@V|hbiacexj9nSq=TqA(oUT^biKk%Vfj&>*4cnJkePBI>e z6%TrGM*c*-ciA_92*P4Z=~&=%u3QJhu|?ZLOSPMhmEh8n2D!bYNW<|O0n*2QS$UgZ z4W`9+Rb@}QSm=AGzZJwGm#5@oj^_9+O;V#{vHkB?cN(`XSFGEQ?&&|k*U481B$qMr zd%c(-S3sKplJ!o1)cGfMQ(4i*RI-U&!2F!*f?=51$cmx|6wcg`b0T<8gOTIS}g9>xt!ri^kvKA7b+}xD1=4(XyYMl1SK~`6FE5)^iz!v{k)v*%v-wMs0<-C zj+pd45pUN04}azLK}W43kQ!%Dw><^}sNd_q8cM=#XMhk!YC=0<*0;Xieq_d*dU<_a ztfh9`6ONN4M=OZoPlmFpzjl3doppSgH5(9<;w_5%McO-sWt8!*$sL8M_~+l@r`z)5=9@y zdbJh%RO|?3e;896uj{{`>y*IO_IF+-Rjz;YbZyV!VX$if-VP5Z99{q^a-Hp|<^Y1S zru9u!N*>D=+FT>Z$@)WOxfn>(!b*XS_+{FX2^(HzrzfH10g`2RR&7 z(g(j$$|;g4M$P+cv8a{Mf*R(E9MetO`QlynKjyWI#x4w<8hgIlY;a>_cp0I5uCyQ} zD*Q}t?@}B}2zm<+B_YE>(f5+Q?R>1Phe776GD}6%E`FC#K5FKbK?vosF5V<8LNhSQXqAm9;E%UijgUpS?*j7|LfBd>h47q==a^#*dvMV-xVZiWa>YWWp zZojnOh_OF{CPMhk+Z(#rS7GNlnwHAQs91MpT%Xfl6+vD?OrVjo!|}TSUp(nBWQ(Ua zf;X)R_=+(!rhQ)U-f40*`9|9ka2PGu@Zs?L=_?k)C!F!#DEuoo=j|fya}{Uwyj^|g+HMXrL(lU?bIVO;>(R>U zj3qosL0i|8&irmg)wpu*5h$AP{5JrkE_}YRy>p2@wSJf4JH9N@SbU4EVm{oDK?VOX zRh5YKyWRo|3eS=NFS2WDY8WRhmX|}j$Q01+T&MENUuidITK%WOF)t=cY~?iOCEvg3 zd`R%%H0FHwvHXRCfuV58)_s(xgji{rJRMQ6BK@5AERUiBXVN^?`(sBIq=rv+1ZZQm zpMper>Duwg%fGCc1g#_AsslDB4B1oI`NpyaXfi7H1xKSZu-IojYVyON))jRxUD zg)9mFwzxcG=a&_^wF&M#OoKvul-_2OsR`Eb#B+SVLAde3DeaY-NvyiHwU827Q96YU zuU~3dvD$kBx+aVb7|>dF<4d~7h-b;eW7pgi`i}F#M>3q{jIpSC=Z(2Rx%TR-Rv)TJ z9;WnKeL8VC@w14)>|xF8?0K**Jk~Mzyq+eaOt)iE8g2NxO-oLXEaSa(23C{>$|BL( zZspZ{Ib{reNS``JT*>N}IZeRlyzx~{f%$)w;xz<1-gQ!fpdx2|-Yri6K-HJCKKNGv zXj|`t2fx_5`B&Jaq;k^Ih*?=#LBYX>)r*KIC=hh^$Hc_PckkXIA|X-o^CxX=7z6|a z90+ixW!BL)t6 zVJX6Zy4{Nn9D%i1NWacW;rd;xZ`Xw^9FH--0N-0mIAkIrD}LN@F}meaI(}@KGmv}g z3#Xz}s78uIvY3r4m?*VbLCtEl7d^eweBaDh)v7MMTFQ#-qtQQxll3bK8782CS1{~l zwIS;3X{fVpQe*%ip>ngH;tTo#TnEqm!s5fMx`_+nSVuH8F1RM4+%*8aXRUJM_^NV| zD)Z{fEk3}7R^`_1BFtx{HRz)c@NtbO8#~Fd(@b;F;MW6nMvG3S6z;7v_||;~lUD4O z1!s+@UpGUeQr`_Ha0`cslO1_^F-rAYZ`z`>MjJ!oyK^9s$e1HJdHZhcFN*iUqLLW1WQq6(p6Wj3Z6R59;&PbOt!*p3P)=O=FChSmdzh{@i&6K$CdhXk& zjg6YvD5i|y@|=cZd|;Fi9vmstYd}SP5gBiC)6MIY*&Xl}|LJ4LOqln|YNsi4-M5q& zl@Ku^p+RbLb3OEL(leR}hdhL1Pao!-=Jr3x>i?Cp>KqDhN@-dW$*$}46IibEH7sR+ z_62C^n|Imps;hds!$fs-bQI<70z-CL6C;MVZ;YD(OlDZEL6u*itTB)`!Z5g=uHf(F5-BL` zAx7~qw`K(z50V2`hY$E8(l^5Q1B{8dY?~fo9M53#S~7IEH94Y^d7H-Uzb*^% z?Ank-#us?%86T#5?3kET2|MGV=;`;RwM%mB&GI$8a1WzjUcc*uU^|BECcuZ|NQwFy z7$6V<4ac!xqHlfT=Pm5>?X+5UT5@_4Ka(@3^ML0}XG*PFNDDFACNKPrwBcJbau8@q znzmB-^XRLmr}I&x#qo_N55{h_IUo0Xb%EC)izxQKw|mDRPM&Ust+;8T_4X?-wcFf6 zhVyKO9J}h+yAR4YMZwdK0*Ziww0K0pUr=c`F*`2&4n|#8BH&|}6v`C+>@=poO6kTQ zvnQvO=CY#KK<&$ho*0RpCoa(@eZlPZl8qBKRLS9~8^lWV9TF*oM z{Rn}bev=2!oS88(inSZ!t)e?RItv%sj}G5k5=*Yoa`#U`lhdB5?&o5tH77hlo?m7K z2)pBo%6(_A`W~g5CXb`%z>Vf5ZaW-)kKf_lPsP%nv-{?d-;bDa)tvS4m?LVU)>#vA z2xkGMU@O-70}$*>_6;exzaWBU-E1pWzcvo-7B1KJBu@>FjC65STxp*rAR0ZWv*sE< z;q&A9G%&rVI4ROFB5{4+=1*1O#?`s+IpF4KH~YIgo<>_j>H5>YJ>y{c+s@1%7KL-5HpSZut>OuFU)!lnh3m*RyABYt%Ao$7K!s;Kpmg|)#FQz;tOWjbVM&1^y z{bB99D)uoD>$buJ07U_`afOUM7eN3BDhmaHiSvebNg#Sq1cP%(R>QRBCP!a!iF>5998cq~HH672zc(SsVf9^eJnWc~#BLo=r{s z_-VYwE|6GlV|(MVZ(FQcsH{7NfZ;e_z`%TMH-UvMe)8GrzLOFY_O%(vnLSClGmH;$Kcx zs^=x2$9afn_^V`+>%MiVWxHR3IBH+OwLMPL1~}1d37<}B9CoXprsWWcy5!Y)Y>Fns zjl*bDYd}?2@9Cp!BW1*_sBYEV6wx0?sVm}ox8i3XZ~5og%r1Sxhz{1q@SSm7oitj0 zK0NkR8Z&)e_?h2?;!yTi{jxKqR6UhlQWDj=eC+}DSJX(UDtp@*>dP+y9*eol)`_)a)(T&?4Nq2!zV@3G^Xxc(JCM8CT ziCDjCq_CEICB2k6Bim&S_kv`0#Dr6TlnxgCFnd1V#Cy)yw`!YD^P}C4_#?<~Mc1kk z5t$+RVDPLa`qs9QV)}J7M^EsG;ieu__QQfAU%=z?6Yap06;Uzu7o&E@go5jmXU8&U z{Q&@HCUEZ;**4*lE4p(+36)33#PxExlshWl=b#x7El01T81+f6jZUNAFXr=!4w>6W zE@?3fn%hYrf7>wCuxFIo**wEptjSL<<)nv4s=g?)h*hVs(wDU1Q03gnX1e+hx;*uHbttZo0@w=IPUIUC}LvmMQ!B3i!L0KySqCTRUdc8w|+(Y z9s$^|08VwdKJG}TZU7nZnB6i2>zo9Sq=u&@L-5B#08T6C*BK9#ByessWz8V|`w=o6 zkK?v1300P2W177|H;-a%;==P>&TSMr4V#{o2RM6?qgve^OyCy>v`?Zkh94wRarXPz zXJBrHfLqV@c@-C<3?{e911(8e`|IOfm~Xdg_zdPymDiKs<_$)8cMz_*f5F(+6CHJ1 z>c;Ufwu5sv%jJBzVc<_QsOn`uIINd$0;@oM+}A;nGh1^Z`Sg;e009Ts7mcL7?8uEd zA-x5H#+`IWBvu?p43YOw(d`$T!=Kn!!SJ%p3z?^d0=eTUU7-p%bI}~H6+9C;fHVVR zAb02r>{UMEs*+#DbMw?Gsdn{M4obq{v0w6DvZTh(LckSG0Oz&`PWE%tFX3(s1WkR@ zEpD{Uyf0N46*!5QooOKTYun9_Wg;1??q7M1%IytPcmiiI%)ajm*xL)<4{sOlJf&fH zQ`m<#D0e9Gze>ElGE<0uQIQ$=iMU0%^{ zfz|CTA|hhJ(J7=mcZ|yRJ2E_Y-8}%cG6!({++Ru~Fa!Xikai&6s0dPQR`-LRzW86PKxqzpgYV!@UEUwQ$qk6zf)6CWLhONou{_9H*YpV8q-IU zO4Uo*wC9h)vlKVB*&E_x!H}+~fS8o?ViRxh%xL55_2aXz-|CIfo##@+e4OAWM@7V9 zBmJ2&R&EYQ?l}`5MZhLi`|OVy=r+_+I0R06lz+FW$9kH-bXAY2_KERcw)>9RIMjxo z5(Ac2EPAjH(0L(k&eAn<;G;b4r`nLcHCe56h6euCZDf%hFN;N{*y)KXb#n*qL{o^# zfrf366;*Br-A@?$dVp?p5ROI+Q$`7fvb64Z`8B2d=Kj&_!Pl$g!AwfJ=8sa zBqm-jvq{}q99cPW-f~;$7}HCj-%|ISmEB$hkwembcl{ zm+-6PZ;HUpO=*+=I}A%bt=qqmJ%~Vdu$8Op`zytJM|^!~QrlNnGabLaov^F$pNQTo zg5<9^w~%BNvf#Y-Y1V`|EBv1X2v%sw^xgCIsh9BSIxaw9F|)F}>^93b4J)$NwN`2r zB1Y3PRCriO8M8mLEWY#ZPbQ30Z1Ljq_Cl7C=+ibMZ|TBprXv_8>y!evj@5jAxf@az zY43fQC3mX)lU?H!TU5McJYA$C>g9;{K2(9*;^dp%#2JK!)wx$>71Q(%<2OLlDuN0h z7=Y1u0O{IW(*AExeBk}ar$gwEdU|6rQVi=)-gJ%02qfHPG3_YBJpJr7Zc6SW5{`p~ z!n*F+&pYX){!s%Q6Dv?=~gmqn(GNqT7Y1 zS;d_8iim842oi4Bj|6}vj4Dh*Y&AUhnUmAa!rO~qw;yXmbt1gjcE+mAX}*2iXhS36 zNg#@Ja^yBB`O(zI-!2*)q`8QeytfF!t-In5clf}-zqJ?ptUBV z-X~)%bEA6$Uu)J2Q)MS373AzxEE(pd7X-a93Z7})&ue4M$_<9Xc}nf$Q9j*T6{aRyE+I{N+; zAHR&z9EoIau5{qEetyT1P85Ugtezt*7&kJcYd%igKf*`H!Au!!({Z`|E-#8$va6yw ziPN4bSl%n*UtwMCug+&f8k#u0boU3jsw2eLmJprL|Mbch;eO&?!MDWlY_~KZFtE5t zq^qmzH(vAlbx>v|g{tR(Y3_X&29!3*$s>jmB7bDM#0pP(E|Xe?(HbmntMED*zgO}* zs~(etGL6ouM0=|JX`cLdp$gd^+tYYn4?2noz7!LvEch(S5nh!fWwxEfWwjEG&VCR9$2RqNm1g6KB@Zx{sSih-d{|%m zP0x$hNJMVN_Z0^HKL{mheB;>akT?M8jSmeC-CZ^do2`JctVNerGAm()-pnJ&)ilm& z)waabom`-cl&D#&#$cR3lNa57lU;p3eX%k#6|%j`uyW%Ub?1|XM&RMuU{46tLKq28 z%8Z+nLsS$URZnNy{+ZF#I68>XExI5@U4@|eF)?tlgd@t#sRR$obA{q(o7Kbhzht?@ zjFe%WbYZ=B4&aw zR(y6cpUCqGXwxZR(}e{0`|}cMNlfeTltyZ^;lmO@WL;oHn$Nr9YtM;OsN{;g$^#5KjRS-M~s?LGc!j)5Xs+4&+<8U zjohiRX(JvWU@t1sm1=+-ZZ=_T&knvtgrc$oD6VipP&cTPdUPtP9Jqd@utw_Sf_*yn z6M2Ln39h4<>2UZe#p)RP$MT#tp{SB<%$p7CmN{4h+-X31=Z{eAq^&A!?|l=!mg&}W zO2rtEH>|LiD{-H`4RKQisZ#8oFR-=XbOI~ z`2|Ue8uS0*WF{6sa+;wJ!*^Th%n4&-Rv+y#0I)SDC|H$yf}Wo4K3@_VIf=hQ+EzEW z-9iP(?l0hpU{z})t-JL*#9%8%SjW0EO3`Oy4KR+lrTDNUyF)=Yn zm{mEYR7d@jr}lM3=#Kt#LY37Syr`_ERPyxaHRA`uOw|&M&G}SFdQxbdy8RhxiNoE*ogtJe|Ca72@S^YKbe}#XXf@K*0CuFLAE!aTgS2X^ zh#W0WTU(pf-iI>j|GE0@sA-wni#P0{?<4$v_|!FE20`ogGHVpAwpav0u+d<~hnN`z znJB6c&B)NN?GWz_)sgv=Maca|cb5FGybZ)>p`%zU<iQ)!>CM{I# zF|hu;CapeYmfZTKG5FPVyVajLmcDsyDBZ6MkQ-azF4FH%{lzmZ^A8f?P8uY+;jek2 z2gvKnEA#>3zgnXP4|MtjEhwsbrj^HG;s=)Phsh6$&DPa20=B!Z1 zfi^B2GBTMfo45!3@0V!YS&(Nr#3L*+|IIa zy}}@j)7ZXh>v`6Qh=_ybdNv5#5mK)~Xw{CrPr@EouZ3Js4Cc#pk>C8SBdp>)#UjyU zjCtVL`iF`%Ch?(=OFCvus zh+_4k9Aq`kcAwV&CU>#Ja-&u;=VI$){nO9#m$7kZ#C$abHO+%Tz6Ri|-$|8ZHkQ8r zdQs{-jMycJz@@Vt1=Ard*1fVGi|7oq>iY3Imt#KiSu<8IC{YnH9R?#OC4Y=KX5(Qup+7_oq|nqf<&J!J^;$ zR@KwfyJ^m+`nmWl+7?K2?TUS~;n0MjcL)CaJC}jn!ZNFvV6JC*wTEc{Fz#NIp2@RPk?8b)$<%C^-a-XR&tW^6o)ELl+GwzuGK97_EtRRd<6!K)@j; z{-B|uG0OsJ^!&z$iZJ2^RZ6!Y#xt<^X*X2b*;?pF`1Y2?ThU^(T=tv8myFitn8>2B zN3rLvGly-82)Ces{Z#cP(`Kr}4)k}Hm zhpXgmRUeX@=u0DPr@pHQmWALM@UCtCr03-4Y8TrJfu3wZI0SnM?>P#akKF^$)3|ih zJ=dG&AWjz1%uAm{-B10TKd3(|#=)G=P+zilG0Xa@o?nX2WUw{tF z@z-I7G%lv~>YFtkl-|&z5Wwy$l%(4a=n2Rql5(6l`YBP36oDMhEPlZ<4D23W9GXnF zZ^$)cl9G~B6?Rxj1#ADy1?YsqZ%KPUcKacWoog$YDCdT=v8_0G5VesugJ+T}Y4A0z zW(fPwZC)o{O-jo2LU8@}8#Cy5=*yh(3>m9mjozf=<c=|0_XAVjm~8P6=3_gcGcY`o{L|h`Wm8%>uGd09J^hQ$+CT~t`3>w`wX2K zKRs#S8}np~Z0Rcu7PASk^Nto1^F%QeQ~vee;8n)jHm$RG>iT?RiF9sKmhZJ*8EM7W zQVdA{9*7v}fX4$0B89kog>(!>+Ze8|zb3BXW3Sy_<+m2SKA)9gULxu(SZ6iaj4Vv5 zGl}Ei11!fM2T4zxmgm$o;IbPcUwUW%_{nC|6O%C-vCBndI8J>$elM}c73dMu13f6G zCmOxuX~yn>Il=SQW4IqHCO+*jnYkXrtWO&y*}XcRW_*;YyleHO&8y9hBT21U)}6)y)0qX~+4 zCk?BQ!x8o;t9P?ZY+OHwedbd4Lc!J3@z34w5MxlU6@Gto z{O46&=b8wmwPsI)IMzoIb!BNoN^m6VT)vZh_&f#~c0er&vNeKYf(%3f6X z1v&1fyqfmAN?N7{M?3*U)6?vLaY|zs-dK=W&`mZC?sB%YH!Yg+C38aJ+Zk`JBtB8{ zPlmh<;{;e47TwAQ!FCuN*KU?c$1(H_+TwFFV&Bx&9*^&L4w}4cTGD0qlu_c7*u~fb zi7-+*W{>qxI>JZXS(6K(D$2&GoE6A(dvJV96+hv5PSo!|Y$jn@i=}H?0l4O(OkG9ao<{E6-TBr&B1- znvQt|B_AjAQFczs(z}Y5TNN*QL{1l5?+l}zg$CU|=TWCOidiDD`Bvf_qn%v~4c%W= zw>orZqc*ltmr^xNhmZ1;jdA_r`=J+Oa(Uo}a|g*>C<;ho+V1E@#L4*6(=M+qkN!q} zV~a!WZ81W--#TvUttD6a!>*Gz7PxA=geVNYO4qH==`RFFlb9zw&+jKQhuw# z_I_WRF0q^1&v|9>TcpAMNJ5vh>BGr^7pS;L>)OxKWfLeyU%8nWKRV6z8DeG%^IT^; zAoV@r<36bQHk6j2IuBCsgTP*(kGzP9Gr=FeAgK&aN8~c2`0wu2O6&W1l{@xZkIBBG z%rfZfu%Rq(5r6;aof*GTS8hFF*QFaX@n%#<6=!4=C?cCL>rv^Z_99e_cr%(UdbVY) zIlkXbRqQb1-B2Avl3Z;#+vQ!OJCyPv1qCp(p7eLceFnorZ;tbAiw10zHrxhKsTxjz z0|>sSDG5tNm2&>V`mS)iGgQnAC1^q)T}MJ!w05s4z)yMATp9*l>eM`?@EMVLO3!1# zD(@r>zc#jxH@1QoCgNrnTv1fBK@SS3HsAJ2{xF?&K_9kSyEF=sVBn^QKsBZ!EOqLi z;+@>>LKfe2Iql&CxZ@g{40rq`hz#1_dSl%U;+U>_*{_f%aoX^Ynp;+)rIA^pr0d1UtZM(0| zjWdbhb~FbS1Ht8r*_r0&fsV;53=%YPqP}sp#Cc(NTRN@k%G^8;znzWVO&h-dNJm$C zvf_o;F2S!TeZD*oEooO{_MK|`d{eT%5yMB?9pnSa0y)!<%`F+r*2kbEWLo&HU-hnD zOcyvzzf{IF_Uu0nD!PM-`_e6NI(H50D$?&4u%jp=Cn#02^Q852wS!6R`@rn)JQp;- zsD(i&cs+^vUsHBJ zK2gxYrVBIFtln}ckx}K0m9x5^;4Eo0C)EF#gn+%ypVo-1D2LgkZ)LQ+dh=!-^=3j= zdbs5nx5Lu=v(%_dskl=*f&u<={POo83fwD+8LCB2FHhfQf}F=0V!*Q}X zvf&yW(pN^BgL=>0r5JC~;42;&Fwfb-2te>BkYX@+2>$?kLbFqI%to^3j_VBrZ(X|z zANq=;?^7qP@M&0jP3dflnnf}*uFNQwp$RTFXcI4%aha>z2}&MKf*Ef+EnJaDM*{%; zYKi&wsyE@%Hc#uIEPDQH3Rs8kL19bYe~faC80S50i=yQmMJKBT23*%0(8X!H%@XZ( z1O_w8$_k_#Ey-ku6@0BPDD%1e^cz?PYLbL<_-XxBR32)R64$&OGxxpYcY0^X^>e}v zoe8p+R}yvC^+8TKr$L&}2ckR7R~o6y3a_)Vh)}Hyy(M{2i%$}*KXPzZxi!W4;p+zj zOWoXZ7l<5^Cq&Af?b=!K*{KPePx2GtO)6Z+O|BD-o~nB>_gQYSR;c5n{CAyN!5mLi zNqwY!NJJl1OpNb`d&g5QRimxTIo^mpnS5lqab&r%^UVh9*?MvHQJf5S@=tefVY_LP zS0wgkwOcQ(H%_ZWSd)$5=s8X?;t2`kQ8DzDoCI8wGV1h7H+=9UyvF zH7<1|9z2d=L?Re4Ut)LKh*Z7Nh`5>%&bI-b_?OHU)~&sovN4-dQ)dsiFDmzkE@r&p znM+$|BI-$UBvLM8so+e%1hAa5mJ}E&Z2fo3gHbqZG!vryRI+||&hzxkENSFPj?UA& z%ZP{9NlCc`1a_-NnKOT|OG(jnid-il;Sdpdo+GbP62LEo&=p`e$#{>LaKP>jicX7! zN3pa=nQ~g#CHMWr5cj2vCzXr7PbnqjGj4TI1aTD`R(P)*ztC$x#H@Zj#GK%XubMzV z9niwfCfR++6Nc(GSDV_20$dGc#MNx#&wlA2h`eEzPdJ(*AsI`NZiz2G(-Nr}xa+lK zX&nIP>sw#n zY?|iwbgsiaW^wK!@_#pzD`)!bT(1c`WFKbZso6Q*M|@Xu02 z_S+Jbl4AbX0A%w?@x#TBzJKc2;(FF@D5Pt07uac*`)jin;mQ&}{nDYG&o{-ZQa{S+ zgwkCNOE+{R>lC5(4ZrtggTkL9Hz5tP+W5Y29VBgMYvic@#|x~0;A-o~x4WEb-9H~) zkA!9nW_I||PI$Q(hBwQ`?tOJHMJ%Uo3`ib5-(z*Nx*r1o8K16pihM08=@E(I61|cm znk12St5d}P!u+35SRd!Q?6B@4uHFtjU1%rNq@-w@w$yvSmX5AHRB~xA>PRYimO1k` z2-BAc+Fw?)m^>$sjb@bdj;(Q=qok((xy3G0ax`XL>ALlURmN-AyCnJ9A4DR^ zCKte0q?$^D6crnh@lhw?^wcWeRmhS>-Rv+-VQ*u z;+WHhC;OV~4@f#c14AwD-2F$+B**;6&S_5~t2vy4JAU~!{YWlhFSyTJ@ryGt8^^tn z*w|Q^KmZCo2xY!Caq`2KEG}OefU1pN7&m%NbVC1Zqyt2mtZ`vv+3$9fq#)T~ete|e zlr2K7*An{L6T3gl43LtiD)>~>J@1Ed?%RJCiR!&OA2)Km{LwMC4Q)LgWtKd19saHq z5<&-&$8nSkrV!)T5q&9#bJW*S|- zAp;@)gqyY{0}gHM=fA3qa6(=`@V^$)391TPaI(3~A~x86ihWc~KYis3 zisWuZn*B|F_}dbQJs3z;r2v)zWWD?@cO@kB+422a6V^BJ?}l^tZX5@b0nNNjJoYF? znZBSzuG`Za6@0FDb_6I%#F+=6#kE`VkYE6iXVd$4q4U_*FD*}99UWyXW=^=SIeG9(}17PUT(83xZhBkiDLDqPS;hO3L3(#NGRb?d1=4bCWor1C%hmVkIT+r+d z)GxJywYwc`K|9Y}*D-(;ISge6%xXHi#}6I^sDi`qQDOBCEGHA`EsLup_A~(uVTRf` z$entaMRPJ~;84*8N=i@VX8RTN4^gwRxt;l_`lZWwM*R9^m#(?#!^A>yA z=bT2{Ob5+BgAy`=zB*b8OO{8sXdR)RLJ$Z+)?3(=tuA}%{Om&9s!$DZf7Mf?3af+UnogO$@$ zz+lIC`5gf2Xf-ti2*5-SBfrjPDXR`}xb?k>m&N1#lAx3D{jdJDnstAqTQH?~i2DyvzR**1bhp60!Kq;(7A z2<3=u@+%pB|HBsGyAUyt0xC+Hv`oyj-B#&gA#E6NR@04Qn{$v~MI~VCQAn#C=B*HDDG}4~$`@xrCI@-5N&69_iz|E3CgDYLr)?asIUzhl{5=tf+Z83xo_et(#l~wscW&-B zNoG@Dz(R2?kAr}GsyfjB4=^8oPv=-UwgjZILi<{|pZj*Y0BFfWM)b9kB?^zNu|6U( zEHuAL~E@$mSAa(_O1!A;-tWjkBK<%Ht5KCV#m!S_z^PGAlamUQM4Kc1?t&sKf zn)v=uV0mQohMblec^2K1Nxd@_CN1-q4{cif8^bTWXjYt=H)r!Y$*oK3h<89VHQzJ3 zQ;yjUb)!hYU!{n^yHHXz_M zG;aNV|LRq8An*$SpfuCMM-kCerrybhPZhwmOL z^J^Qg(jOeYqy+hWNR;wj+-RVYkbSQGOiBAJ#?S1J#EP@-mAtrq^Ja$#$v;I40s_S& zThV)aE~tBYw=_Jh#8QDcxelPJvc9U`R3wRKPJ6aFp%oi1_AyE@aq*lXKaeVwzBM&! znKw5#niZTJNa0dbW4`S(cTJ2a%Y<645Gm!MExaCx&1zGANiT9imb*xrHOLAZE0%#Y3S!0?Gm(1*LbNTH36m3&W7Pix#zYT z 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 diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/photo11.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/photo11.png deleted file mode 100644 index f7cf0572df152ee0318af7bd593f2895de2cbfed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47225 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 diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/photo12.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/photo12.png deleted file mode 100644 index d299a0e79f0a98c63e5fb11bf9d0b3a869b37f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99451 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 OFF9%D_vMnG0{#bbS5E2x diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/photo2.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/photo2.png deleted file mode 100644 index e0e2ccdc9637651f0e32d2414ccbda7568092fed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38952 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 q 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 diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/photo3.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/photo3.png deleted file mode 100644 index 9ba90e847a1fa4d986de9d9c74675117e6902c45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40267 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 mWYCuXMx4zs6rj$(JPJ?BP959IG+5kDb=>s7 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 KOI1snhW-yueoNy3 diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/photo4.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/photo4.png deleted file mode 100644 index b4e2cae6ca9c1b44fe4abc13478fc4aeb7f27e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17145 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 hPr~D~Y{u#z4Fq?0*Wm61m*5V;9nK=} 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 LH`S}raftdaOV0WD diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/photo6.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/photo6.png deleted file mode 100644 index 1ea9b8099caf6f6b0073b43fe18a173d245bb76b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19402 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 diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/photo7.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/photo7.png deleted file mode 100644 index c28de219bc51826f7953c2627c6a8c95ea991563..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25580 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 diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/photo9.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/photo9.png deleted file mode 100644 index 97407acdfefc7084727fcac24989c97d21559624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22969 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 B*bM*x diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/test.txt b/javascriptv3/example_code/cross-services/photo_analyzer/images/test.txt deleted file mode 100644 index 9daeafb9864..00000000000 --- a/javascriptv3/example_code/cross-services/photo_analyzer/images/test.txt +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/index.html b/javascriptv3/example_code/cross-services/photo_analyzer/index.html deleted file mode 100644 index d648279aa22..00000000000 --- a/javascriptv3/example_code/cross-services/photo_analyzer/index.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - AWS Photo Analyzer - - - - - -

    -
    -
    - -

    - Select the following button to determine the number of images in the - bucket. -

    - - - - - - - - - - - - - - - - - - - - -
    -
    NameOwnerDateSize
    NameOwnerDateSize
    -
    -
    -

    - You can generate a report that analyzes the images in the S3 bucket. You - can send the report to the following email address. -

    -
    -
    - -
    -
    - -

    Select the following button to obtain a report.

    - -
    -
    - - - diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/js/index.js b/javascriptv3/example_code/cross-services/photo_analyzer/js/index.js deleted file mode 100644 index 2531719b452..00000000000 --- a/javascriptv3/example_code/cross-services/photo_analyzer/js/index.js +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -index.js contains the JavaScript for a tutorial demonstrating how to build a web app that analyzes photos using AWS Rekognition through the -JavaScript SDK for JavaScript v3. -To run the full tutorial, see https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/cross-services/photo-analyzer. - -Inputs: -- BUCKET_IMAGES -- BUCKET_REPORTS -- EMAIL_SENDER_ADDRESS - -Running the code: -To run the full tutorial, see -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/photo-analyzer.html. - */ -import { DetectLabelsCommand } from "@aws-sdk/client-rekognition"; -import { rekognitionClient } from "../libs/rekognitionClient.js"; -import { ListObjectsCommand, PutObjectCommand } from "@aws-sdk/client-s3"; -import { REGION, s3Client } from "../libs/s3Client.js"; -import { sesClient } from "../libs/sesClient.js"; -import { SendEmailCommand } from "@aws-sdk/client-ses"; - -// Set global parameters. -const BUCKET_IMAGES = "BUCKET_IMAGES"; -const BUCKET_REPORTS = "BUCKET_REPORTs"; -const EMAIL_SENDER_ADDRESS = "EMAIL_SENDER_ADDRESS"; // A verified Amazon SES email address. - -// Load table parameters. -$(function () { - $("#myTable").DataTable({ - scrollY: "500px", - scrollX: true, - scrollCollapse: true, - paging: true, - columnDefs: [{ width: 200, targets: 0 }], - fixedColumns: true, - }); -}); - -// Load images from Amazon S3 bucket to the table. -const loadTable = async () => { - window.alert = function () {}; - try { - const listVideoParams = { - Bucket: BUCKET_IMAGES, - }; - const data = await s3Client.send(new ListObjectsCommand(listVideoParams)); - console.log("Success", data); - for (let i = 0; i < data.Contents.length; i++) { - console.log("checking"); - var t = $("#myTable").DataTable(); - t.row - .add([ - data.Contents[i].Key, - data.Contents[i].Owner, - data.Contents[i].LastModified, - data.Contents[i].Size, - ]) - .draw(false); - } - } catch (err) { - console.log("Error", err); - } -}; -loadTable(); - -// Refresh page to populate the table with the latest images. -const getImages = async () => { - window.location.reload(); -}; -window.getImages = getImages; - -// Add images to the Amazon S3 bucket. -const addToBucket = async () => { - try { - // Create the parameters for uploading the video. - const files = document.getElementById("imageupload").files; - const file = files[0]; - const key = document.getElementById("imageupload").files[0].name; - const uploadParams = { - Bucket: BUCKET_IMAGES, - Body: file, - Key: key, - }; - - await s3Client.send(new PutObjectCommand(uploadParams)); - console.log("Success - image uploaded"); - } catch (err) { - console.log("Error", err); - } -}; -// Expose function to browser. -window.addToBucket = addToBucket; - -const ProcessImages = async () => { - try { - const listPhotosParams = { - Bucket: BUCKET_IMAGES, - }; - // Retrieve list of objects in the Amazon S3 bucket. - const data = await s3Client.send(new ListObjectsCommand(listPhotosParams)); - console.log("Success, list of objects in bucket retrieved.", data); - - // Loop through images. For each image, retreive the image name, - // then analyze image by detecting it's labels, then parse results - // into CSV format. - for (let i = 0; i < data.Contents.length; i++) { - const key = data.Contents[i].Key; - const imageParams = { - Image: { - S3Object: { - Bucket: BUCKET_IMAGES, - Name: key, - }, - }, - }; - - const lastdata = await rekognitionClient.send( - new DetectLabelsCommand(imageParams) - ); - console.log("Success, labels detected.", lastdata); - var objectsArray = []; - // Parse results into CVS format. - var j; - for (j = 0; j < lastdata.Labels.length; j++) { - var name = JSON.stringify(lastdata.Labels[j].Name); - var confidence = JSON.stringify(lastdata.Labels[j].Confidence); - var arrayfirst = []; - var arraysecond = []; - arrayfirst.push(name); - arraysecond.push(confidence); - arrayfirst.push(arraysecond); - objectsArray.push(arrayfirst); - } - // Create a CSV file report for each images. - create_csv_file(objectsArray, key); - } - } catch (err) { - console.log("Error", err); - } -}; -// Expose function to browser. -window.ProcessImages = ProcessImages; - -// Helper function to create the CSV report. -function create_csv_file(objectsArray, key) { - // Define the heading for each row of the data. - var csv = "Object, Confidance \n"; - - // Merge the data with CSV. - objectsArray.forEach(function (row) { - csv += row.join(","); - csv += "\n"; - }); - // Upload the CSV file to Amazon S3 bucket for reports. - uploadFile(csv, key); -} - -// Helper function to upload reports to Amazon S3 bucket for reports. -const uploadFile = async (csv, key) => { - const uploadParams = { - Bucket: BUCKET_REPORTS, - Body: csv, - Key: key + ".csv", - }; - try { - await s3Client.send(new PutObjectCommand(uploadParams)); - const linkToCSV = - "https://s3.console.aws.amazon.com/s3/object/" + - uploadParams.Bucket + - "?region=" + - REGION + - "&prefix=" + - uploadParams.Key; - console.log("Success. Report uploaded to " + linkToCSV + "."); - - // Send an email to notify the user when report is available. - sendEmail(uploadParams.Bucket, uploadParams.Key, linkToCSV); - } catch (err) { - console.log("Error", err); - } -}; -// Helper function to send an email to the user. -const sendEmail = async (bucket, key, linkToCSV) => { - const toEmail = document.getElementById("email").value; - const fromEmail = EMAIL_SENDER_ADDRESS; // - try { - // Set the parameters. - const params = { - Destination: { - /* required */ - CcAddresses: [ - /* Insert Cc email addresses here. */ - ], - ToAddresses: [ - toEmail, //RECEIVER_ADDRESS - /* Insert additional email addresses here.. */ - ], - }, - Message: { - /* required */ - Body: { - /* required */ - Html: { - Charset: "UTF-8", - Data: - "

    Hello!

    Please see the the analyzed video report for " + - key + - " here

    ", - }, - Text: { - Charset: "UTF-8", - Data: - "Hello,\\r\\n" + - "Please see the attached file for the analyzed video report at" + - linkToCSV + - "\n\n", - }, - }, - Subject: { - Charset: "UTF-8", - Data: key + " analyzed video report ready", - }, - }, - Source: fromEmail, // SENDER_ADDRESS - ReplyToAddresses: [ - /* more items */ - ], - }; - const data = await sesClient.send(new SendEmailCommand(params)); - console.log("Success. Email sent.", data); - } catch (err) { - console.log("Error", err); - } -}; diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/libs/rekognitionClient.js b/javascriptv3/example_code/cross-services/photo_analyzer/libs/rekognitionClient.js deleted file mode 100644 index 821d164602e..00000000000 --- a/javascriptv3/example_code/cross-services/photo_analyzer/libs/rekognitionClient.js +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -rekognitionClient.js is a helper function that creates the AWS Rekognition service clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[photo-analyzer.JavaScript.rekongitionClient] -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { RekognitionClient } from "@aws-sdk/client-rekognition"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an AWS Rekognition service client object. -const rekognitionClient = new RekognitionClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { rekognitionClient }; -// snippet-end:[photo-analyzer.JavaScript.rekongitionClient] diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/libs/s3Client.js b/javascriptv3/example_code/cross-services/photo_analyzer/libs/s3Client.js deleted file mode 100644 index bd41fce0a34..00000000000 --- a/javascriptv3/example_code/cross-services/photo_analyzer/libs/s3Client.js +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -s3Client.js is a helper function that creates the Amazon Simple Storage Solution (Amazon S3) service clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[photo-analyzer.JavaScript.s3Client] -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { S3Client } from "@aws-sdk/client-s3"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon S3 service client object. -const s3Client = new S3Client({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { REGION, s3Client }; -// snippet-end:[photo-analyzer.JavaScript.s3Client] diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/libs/sesClient.js b/javascriptv3/example_code/cross-services/photo_analyzer/libs/sesClient.js deleted file mode 100644 index 94d7fe06b9f..00000000000 --- a/javascriptv3/example_code/cross-services/photo_analyzer/libs/sesClient.js +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -sesClient.js is a helper function that creates the Amazon Simple Email Solution (Amazon SES) service clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[photo-analyzer.JavaScript.sesClient] -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { SESClient } from "@aws-sdk/client-ses"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon SES service client object. -const sesClient = new SESClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { sesClient }; -// snippet-end:[photo-analyzer.JavaScript.sesClient] diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/package.json b/javascriptv3/example_code/cross-services/photo_analyzer/package.json index 3dd70a837f9..acee72a1b32 100644 --- a/javascriptv3/example_code/cross-services/photo_analyzer/package.json +++ b/javascriptv3/example_code/cross-services/photo_analyzer/package.json @@ -1,27 +1,29 @@ { "name": "@aws-doc-sdk-examples/aws-sdk-v3-cross-service-examples-photo-analyzer", - "version": "1.0.0", + "version": "1.1.0", "main": "index.js", - "repository": "git@github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/cross-services/photo-analyzer.git", - "author": "Brian Murray , Alex Forsyth ", - "license": "Apache 2.0", + "author": "Brian Murray , Alex Forsyth , Corey Pyle ", + "license": "Apache-2.0", "scripts": { - "build": "webpack ./js/index.js --mode development --target web --devtool false -o ./js/main.js", - "build-cdk": "aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM", - "test": "exit 0" + "dev": "npm run build && npx http-server ./dist/", + "build": "webpack --mode development", + "deploy": "./scripts/deploy.sh", + "destroy": "./scripts/destroy.sh" }, "dependencies": { - "@aws-sdk/client-cognito-identity": "^3.32.0", - "@aws-sdk/credential-provider-cognito-identity": "^3.32.0", - "@aws-sdk/client-iam": "^3.32.0", - "@aws-sdk/client-rekognition": "^3.32.0", - "@aws-sdk/client-s3": "^3.32.0", - "@aws-sdk/client-ses": "^3.32.0", - "jest": "^26.6.3" + "@aws-sdk/client-cognito-identity": "^3.637.0", + "@aws-sdk/client-iam": "^3.637.0", + "@aws-sdk/client-rekognition": "^3.637.0", + "@aws-sdk/client-s3": "^3.637.0", + "@aws-sdk/client-ses": "^3.637.0", + "@aws-sdk/credential-provider-cognito-identity": "^3.637.0" }, "devDependencies": { - "webpack": "^4.42.0", - "webpack-cli": "^3.3.11" + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4" }, - "type": "module" + "type": "module", + "engines": { + "node": ">=20" + } } diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/scripts/deploy.sh b/javascriptv3/example_code/cross-services/photo_analyzer/scripts/deploy.sh new file mode 100755 index 00000000000..db0bba4c0a1 --- /dev/null +++ b/javascriptv3/example_code/cross-services/photo_analyzer/scripts/deploy.sh @@ -0,0 +1,14 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +STACK_NAME="sdk-examples-photo-analyzer" + +echo "Creating stack..." +aws cloudformation create-stack --stack-name "$STACK_NAME" \ + --template-body file://stack.yaml \ + --capabilities CAPABILITY_IAM + +aws cloudformation wait stack-create-complete --stack-name "$STACK_NAME" + +echo "$(aws cloudformation describe-stacks --stack-name $STACK_NAME \ + --query 'Stacks[*].Outputs[*].{OutputKey: OutputKey, OutputValue: OutputValue}')" \ No newline at end of file diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/scripts/destroy.sh b/javascriptv3/example_code/cross-services/photo_analyzer/scripts/destroy.sh new file mode 100755 index 00000000000..23ed80fcadc --- /dev/null +++ b/javascriptv3/example_code/cross-services/photo_analyzer/scripts/destroy.sh @@ -0,0 +1,10 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +STACK_NAME="sdk-examples-photo-analyzer" + +echo "Deleting the stack..." +aws cloudformation delete-stack \ + --stack-name "$STACK_NAME" + +aws cloudformation wait stack-delete-complete --stack-name "$STACK_NAME" \ No newline at end of file diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/src/constants.js b/javascriptv3/example_code/cross-services/photo_analyzer/src/constants.js new file mode 100644 index 00000000000..4390264b45f --- /dev/null +++ b/javascriptv3/example_code/cross-services/photo_analyzer/src/constants.js @@ -0,0 +1,12 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +export const stackName = "sdk-examples-photo-analyzer"; + +// Output names from CloudFormation. +// For more information see the setup.yaml Outputs. +export const outputNames = { + IMAGES_BUCKET_OUTPUT: "ImagesBucketName", + REPORTS_BUCKET_OUTPUT: "ReportsBucketName", + IDENTITY_POOL_OUTPUT: "IdentityPoolId", +}; diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/src/index.js b/javascriptv3/example_code/cross-services/photo_analyzer/src/index.js new file mode 100644 index 00000000000..144072112a8 --- /dev/null +++ b/javascriptv3/example_code/cross-services/photo_analyzer/src/index.js @@ -0,0 +1,255 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { + DetectLabelsCommand, + RekognitionClient, +} from "@aws-sdk/client-rekognition"; +import { + ListObjectsCommand, + PutObjectCommand, + S3Client, +} from "@aws-sdk/client-s3"; +import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; +import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; +import { SendEmailCommand, SESClient } from "@aws-sdk/client-ses"; + +import { outputNames } from "./constants.js"; + +const email = process.env["VERIFIED_EMAIL_ADDRESS"]; +const region = process.env["REGION"]; +/** @type {Record } */ +const outputs = JSON.parse(process.env["CFN_OUTPUTS"]); + +const imagesBucketName = outputs[outputNames.IMAGES_BUCKET_OUTPUT]; +const reportsBucketName = outputs[outputNames.REPORTS_BUCKET_OUTPUT]; +const identityPoolId = outputs[outputNames.IDENTITY_POOL_OUTPUT]; + +const credentials = fromCognitoIdentityPool({ + client: new CognitoIdentityClient({ region: "us-east-1" }), + identityPoolId, +}); + +const s3Client = new S3Client({ credentials, region }); +const rekognitionClient = new RekognitionClient({ credentials, region }); +const sesClient = new SESClient({ credentials, region }); + +/** + * Update the info text box. + * @param {string} info + */ +const updateInfo = (info = "") => { + const infoEl = document.getElementById("info"); + infoEl.innerText = info; +}; + +// Load images from Amazon S3 bucket to the table. +const loadTable = async () => { + try { + updateInfo(); + const { Contents } = await s3Client.send( + new ListObjectsCommand({ Bucket: imagesBucketName }), + ); + /** @type { HTMLUListElement | null } */ + const imageList = document.getElementById("image-list"); + if (imageList) { + imageList.innerHTML = ""; + for (const content of Contents) { + const li = document.createElement("li"); + const textNode = document.createTextNode( + `${content.Key} (${Math.ceil(content.Size / 1024)}KiB)`, + ); + li.append(textNode); + imageList.append(li); + } + } else { + throw new Error("Could not find element."); + } + } catch (caught) { + if (caught instanceof Error) { + const errMessage = `Error listing S3 objects. ${caught.name}: ${caught.message}`; + console.error(errMessage); + updateInfo(errMessage); + } else { + throw caught; + } + } +}; + +window.addToBucket = async () => { + try { + /** @type { HTMLInputElement } */ + const fileInput = document.getElementById("input-image"); + const file = fileInput.files[0]; + + await s3Client.send( + new PutObjectCommand({ + Bucket: imagesBucketName, + Body: file, + Key: file.name, + }), + ); + loadTable(); + updateInfo(`${file.name} added to ${imagesBucketName}.`); + } catch (caught) { + if (caught instanceof Error) { + const errMessage = `Error putting object in bucket. ${caught.name}: ${caught.message}`; + console.error(errMessage); + updateInfo(errMessage); + } else { + throw caught; + } + } + return false; +}; + +window.processImages = async () => { + try { + updateInfo(""); + const listPhotosParams = { + Bucket: imagesBucketName, + }; + // Retrieve list of objects in the Amazon S3 bucket. + const { Contents } = await s3Client.send( + new ListObjectsCommand(listPhotosParams), + ); + + // Loop through images. For each image, retrieve the image name, + // then analyze image by detecting it's labels, then parse results + // into CSV format. + for (const content of Contents) { + const imageName = content.Key; + const { Labels } = await rekognitionClient.send( + new DetectLabelsCommand({ + Image: { + S3Object: { + Bucket: imagesBucketName, + Name: imageName, + }, + }, + }), + ); + /** @type {string[][]} */ + const analysis = []; + // Parse results into CVS format. + for (const label of Labels) { + analysis.push([label.Name, label.Confidence]); + } + // Create a CSV file report for each images. + createCsv({ + headers: ["Object", "Confidence"], + rows: analysis, + name: imageName, + }); + } + } catch (caught) { + if (caught instanceof Error) { + const errMessage = `Error analyzing images. ${caught.name}: ${caught.message}`; + console.error(errMessage); + updateInfo(errMessage); + } else { + throw caught; + } + } + return false; +}; + +/** + * Process a list of rows into a CSV string and upload to S3 bucket. + * @param {{ headers: string[], rows: string[][], name: string }} + */ +const createCsv = async ({ headers, rows, name }) => { + let csv = `${headers.join(",")}\n${rows.map((row) => row.join(",")).join("\n")}`; + await uploadFile(csv, name); +}; + +// Helper function to upload reports to Amazon S3 bucket for reports. +const uploadFile = async (csv, key) => { + try { + await s3Client.send( + new PutObjectCommand({ + Bucket: reportsBucketName, + Body: csv, + Key: key + ".csv", + }), + ); + const region = await s3Client.config.region(); + const linkToCSV = `https://s3.console.aws.amazon.com/s3/object/${reportsBucketName}?region=${region}&prefix=${key}.csv`; + + // Send an email to notify the user when report is available. + sendEmail(`${key}.csv`, linkToCSV); + } catch (caught) { + if (caught instanceof Error) { + const errMessage = `Error uploading CSV. ${caught.name}: ${caught.message}`; + updateInfo(errMessage); + console.error(errMessage); + } else { + throw caught; + } + } +}; +// Helper function to send an email to the user. +const sendEmail = async (key, linkToCSV) => { + const toEmail = document.getElementById("email").value; + const fromEmail = email; + try { + // Set the parameters. + const params = { + Destination: { + /* required */ + CcAddresses: [ + /* Insert Cc email addresses here. */ + ], + ToAddresses: [ + toEmail, //RECEIVER_ADDRESS + /* Insert additional email addresses here.. */ + ], + }, + Message: { + /* required */ + Body: { + /* required */ + Html: { + Charset: "UTF-8", + Data: + "

    Hello!

    Please see the the analyzed video report for " + + key + + " here

    ", + }, + Text: { + Charset: "UTF-8", + Data: + "Hello,\\r\\n" + + "Please see the attached file for the analyzed video report at" + + linkToCSV + + "\n\n", + }, + }, + Subject: { + Charset: "UTF-8", + Data: key + " analyzed video report ready", + }, + }, + Source: fromEmail, // SENDER_ADDRESS + ReplyToAddresses: [ + /* more items */ + ], + }; + const data = await sesClient.send(new SendEmailCommand(params)); + console.log("Email sent.", data); + } catch (caught) { + if (caught instanceof Error) { + const errMessage = `Error sending email. ${caught.name}: ${caught.message}`; + console.error(errMessage); + updateInfo(errMessage); + } else { + throw caught; + } + } +}; + +window.addEventListener("load", () => { + loadTable(); +}); diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/setup.yaml b/javascriptv3/example_code/cross-services/photo_analyzer/stack.yaml similarity index 96% rename from javascriptv3/example_code/cross-services/photo_analyzer/setup.yaml rename to javascriptv3/example_code/cross-services/photo_analyzer/stack.yaml index 884f4ec4f8b..d591167eeb3 100644 --- a/javascriptv3/example_code/cross-services/photo_analyzer/setup.yaml +++ b/javascriptv3/example_code/cross-services/photo_analyzer/stack.yaml @@ -128,12 +128,12 @@ Resources: Version: "2012-10-17" Metadata: aws:cdk:path: SetupStackRekognition/rekognition-photo-analyzer-role/Resource - ExampleIdentityPool: + PhotoAnalyzerSdkExampleIdPool: Type: AWS::Cognito::IdentityPool Properties: AllowUnauthenticatedIdentities: true Metadata: - aws:cdk:path: SetupStackRekognition/ExampleIdentityPool + aws:cdk:path: SetupStackRekognition/PhotoAnalyzerSdkExampleIdPool CognitoDefaultUnauthenticatedRoleABBF7267: Type: AWS::IAM::Role Properties: @@ -143,7 +143,7 @@ Resources: Condition: StringEquals: cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPool + Ref: PhotoAnalyzerSdkExampleIdPool ForAnyValue:StringLike: cognito-identity.amazonaws.com:amr: unauthenticated Effect: Allow @@ -185,7 +185,7 @@ Resources: Type: AWS::Cognito::IdentityPoolRoleAttachment Properties: IdentityPoolId: - Ref: ExampleIdentityPool + Ref: PhotoAnalyzerSdkExampleIdPool Roles: unauthenticated: Fn::GetAtt: @@ -201,15 +201,15 @@ Resources: aws:cdk:path: SetupStackRekognition/CDKMetadata/Default Condition: CDKMetadataAvailable Outputs: - Bucketforimages: + ImagesBucketName: Value: Ref: bucketforimages293BECA3 - Bucketforreports: + ReportsBucketName: Value: Ref: bucketforreports8DC7D870 - Identitypoolid: + IdentityPoolId: Value: - Ref: ExampleIdentityPool + Ref: PhotoAnalyzerSdkExampleIdPool Conditions: CDKMetadataAvailable: Fn::Or: diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/webpack.config.js b/javascriptv3/example_code/cross-services/photo_analyzer/webpack.config.js new file mode 100644 index 00000000000..af3836de4ec --- /dev/null +++ b/javascriptv3/example_code/cross-services/photo_analyzer/webpack.config.js @@ -0,0 +1,30 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { resolve } from "node:path"; + +import webpack from "webpack"; +import { getCfnOutputs } from "@aws-doc-sdk-examples/lib/sdk/cfn-outputs.js"; + +import { stackName } from "./src/constants.js"; + +const defaultRegion = "us-east-1"; +const outputs = await getCfnOutputs( + stackName, + process.env["REGION"] ?? defaultRegion, +); + +export default { + entry: "./src/index.js", + output: { + filename: "main.js", + path: resolve(import.meta.dirname, "dist"), + }, + plugins: [ + new webpack.EnvironmentPlugin({ + VERIFIED_EMAIL_ADDRESS: "", + REGION: defaultRegion, + CFN_OUTPUTS: JSON.stringify(outputs), + }), + ], +}; diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/README.md b/javascriptv3/example_code/cross-services/sns-sample-app/README.md deleted file mode 100644 index 81260517180..00000000000 --- a/javascriptv3/example_code/cross-services/sns-sample-app/README.md +++ /dev/null @@ -1,439 +0,0 @@ -# Creating a Publish/Subscription Application - -## Purpose - -You can create a web application that has subscription and publish functionality by using the Amazon Simple Notification Service (Amazon SNS). The application created in this AWS tutorial lets a user subscribe to an Amazon SNS topic by entering a valid email address. A user can enter many emails and all of them are subscribed to the given SNS topic (once the email recipients confirm the subscription). The user can publish a message that results in all subscribed emails receiving the message. - -**Note**: Amazon SNS is a managed service that provides message delivery from publishers to subscribers (also known as producers and consumers). For more information, see [What is Amazon SNS?](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) - -To subscribe to an Amazon SNS topic, the user enters a valid email address into the web application. - -![AWS Tracking Application](images/pic1.png) - -The specified email address recieves an email message that lets the recipient confirm the subscription. - -![AWS Tracking Application](images/pic2.png) - -Once the email recipient accepts the confirmation, that email is subscribed to the specific SNS topic and recieves published messages. To publish a message, a user enters the message into the web applicaiton and then chooses the **Publish** button. - -![AWS Tracking Application](images/pic3.png) - -This example application lets you view all of the subscribed email recipients by choosing the **List Subscriptions** button, as shown in the following illustration. - -![AWS Tracking Application](images/pic4.png) - -## Prerequisites - -To build this cross-service example, you need the following: - -- An AWS account. For more information see [AWS SDKs and Tools Reference Guide](https://docs.aws.amazon.com/sdkref/latest/guide/overview.html). -- A project environment to run this Node JavaScript example, and install the required AWS SDK for JavaScript and third-party modules. For instructions, see [Create a Node.js project environment](#create-a-nodejs-project-environment) on this page. -- The following AWS resources: - - An unauthenticated AWS Identity and Access Management (IAM) user role with the following permissions: - - sns:\* - -**Note**: An unauthenticated role enables you to provide permissions to unauthenticated users to use the AWS Services. To create an authenticated role, see [Amazon Cognito Identity Pools (Federated Identities)](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html). - -For instructions on creating the minimum resources required for this tutorial, see [Create the resources](#create-the-resources) on this page. - -## ⚠ Important - -- We recommend that you grant this code least privilege, or at most the minimum permissions required to perform the task. For more information, see [Grant Least Privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) in the _AWS Identity and Access Management User Guide_. -- This code has not been tested in all AWS Regions. Some AWS services are available only in specific [Regions](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). -- Running this code might result in charges to your AWS account. We recommend you destroy the resources when you are finished. For instructions, see [Destroying the resources](#destroying-the-resources). -- Running the unit tests might result in charges to your AWS account. -- This tutorial is written to work with the specific versions defined in the _package.json_. If you change these versions, the tutorial may not work correctly. - -## Create the resources - -You can create the AWS resources required for this cross-service example using either of the following: - -- [The Amazon CloudFormation](#create-the-resources-using-amazon-cloudformation) -- [The AWS Management Console](#create-the-resources-using-the-aws-management-console) - -### Create the resources using Amazon CloudFormation - -To run the stack using the AWS CLI: - -1. Install and configure the AWS CLI following the instructions in the AWS CLI User Guide. - -2. Open the AWS Command Console from the _./sns-sample-app_ folder. - -3. Run the following command, replacing _STACK_NAME_ with a unique name for the stack. - -``` -aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM -``` - -**Important**: The stack name must be unique within an AWS Region and AWS account. You can specify up to 128 characters, and numbers and hyphens are allowed. - -4. Open [AWS CloudFormation in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the **Stacks** page. - -![ ](images/cloud_formation_stacks.png) - -5. Choose the **Resources** tab. The **Physical ID** of the **IDENTITY_POOL_ID** you require for this cross-service example is displayed. - -![ ](images/cloud_formation_resources_tab.png) - -For more information on the create-stack command parameters, see the [AWS CLI Command Reference guide](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html), and the [AWS CloudFormation User Guide](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html). - -### Create the resources using the AWS Management Console - -####Create an unauthenticated user role 4. Open [AWS Cognito in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the _Stacks_ page. 5. Choose **Manage Identity Pools**. 6. Choose **Create new identity pool**. 7. In the **Identity pool name** field, give your identity pool a name. 7. Select the **Enable access to unauthenticated identities** checkbox. 8. Choose **Create Pool**. 9. Choose **Allow**. 10. Take note of the **Identity pool ID**, which is highlighted in red in the **Get AWS Credentials** section. - -![ ](images/identity_pool_ids.png) - -11.Choose **Edit identity pool**. 12. Take note of the name of the role in the **Unauthenticated role** field. - -####Adding permissions to an unauthenticated user role 13. Open [IAM in the AWS Management Console](https://aws.amazon.com/iam/), and open the _Roles_ page. 14. Search for the unauthenticated role you just created. 15. Open the role. 16. Click the down arrow beside the policy name. 17. Choose **Edit Policy**. 18. Choose the **JSON** tab. 18. Delete the existing content, and paste the code below into it. - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Action": ["mobileanalytics:PutEvents", "cognito-sync:*"], - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "sns:*", - "Resource": "*", - "Effect": "Allow" - } - ] -} -``` - -19. Choose **Review Policy**. -20. Choose **Save Changes**. - -### Verifying an email address on Amazon SES - -1. Open [AWS SES in the AWS Management Console](https://aws.amazon.com/SES/), and open the **Email Addresses** page. -2. Choose **Verify a New Email Address**. -3. Enter a working email address, and choose **Verify This Email Address**. -4. Open the email in your email application, and verify it. - -## Create a Node.js project environment - -1. Clone the [AWS Code Samples repo](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. - See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for - instructions. - -2. Run the following commands in sequence in the AWS CLI command line to install the AWS service client modules and third-party modules listed in the _package.json_: - -``` -npm install node -g -cd javascriptv3/example_code/cross-services/sns-sample-app -npm install -``` - -## Building the code - -This app runs from the browser, so we create the interface using HTML and CSS. -The app uses JavaScript to provide basic interactive features, and Node.js to invoke the AWS Services. - -### Creating the HTML and CSS - -In **index.html**, the **head** section loads [JQuery](https://jquery.com/) and [BootStrap](https://getbootstrap.com/) libraries. -It also loads **stlyes.css**, which applies styles to the HTML, -and the **main.js**, which contains the following JavaScript and Node.js functions used in the app. - -**Note**: **main.js** is a bundled file containing all the required JavaScript. You'll create this later in the tutorial. - -The remaining code defines the interface features, including a table and buttons. - -```html - - - - - Subscription - - - - - - - - -
    -
    -

    Welcome to the Amazon Simple Notification Service example app

    -

    Now is:

    -
    -
    -

    Enter an email address

    - -
    - - - - - - - - -
    -

    -
    -
    -

    Enter a message to publish

    -
    -
    -
    - -

    -
    -
    -
    - -
    -
    - - - -``` - -### Creating the JavaScript and Node.js - -The **./src/libs/** folders contains a file for each of the AWS Service client required. You must -replace "REGION" with your AWS Region, and replace "IDENTITY_POOL_ID" with the Amazon Cognito identity pool id -you created in [Create the resources](#create-the-resources) on this page. - -```javascript -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { SNSClient } from "@aws-sdk/client-sns"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon Comprehend service client object. -const snsClient = new SNSClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { snsClient }; -``` - -In **./src/index.js**, you first import all the required AWS Service and third party modules, and set global parameters. - -```javascript -import { - SubscribeCommand, - ListSubscriptionsByTopicCommand, - ListSubscriptionsCommand, - UnsubscribeCommand, - PublishCommand, -} from "@aws-sdk/client-sns"; -import { snsClient } from "../libs/snsClient.js"; - -// Set global parameters. -const TOPIC_ARN = "TOPIC_ARN"; -``` - -Next, you define the following functions: - -- _subEmail_ - subscribe an email to the Amazon SNS topic. -- _getSubs_ - list the emails subscribed to the Amazon SNS topic. -- _delSub_ - remove an email from being subscribed to the Amazon SNS topic. -- _sendMessage_ - send an email to all email addresses subscribed to the Amazon SNS topic. - -**Note:** _loadItems_ and _validate_ are helper functions. - -```javascript -// Subscribe the email address to the Amazon SNS topic. -const subEmail = async () => { - const userEmail = document.getElementById("inputEmail1").value; - var result = validate(userEmail); - if (result == false) { - alert(userEmail + " is not valid. Please specify a valid email"); - return; - } - // Set the parameters - const params = { - Protocol: "email" /* required */, - TopicArn: TOPIC_ARN, //TOPIC_ARN - Endpoint: userEmail, //EMAIL_ADDRESS - }; - try { - const data = await snsClient.send(new SubscribeCommand(params)); - console.log("Success.", data); - return data; // For unit tests. - } catch (err) { - console.log("Error", err.stack); - } -}; -// Expose function to browser. -window.subEmail = subEmail; - -function loadItems(event) { - var subNum = event.target.responseText; - alert("Subscription validation is " + subNum); -} - -// Helper function to validate email addresses. -function validateEmail(email) { - const re = - /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return re.test(email); -} - -// Helper function to validate email addresses. -function validate(email) { - const $result = $("#result"); - - if (validateEmail(email)) { - return true; - } else { - return false; - } -} - -// List subscriptions to the Amazon SNS topic. -const getSubs = async () => { - const params = { - TopicArn: TOPIC_ARN, - }; - try { - const data = await snsClient.send( - new ListSubscriptionsByTopicCommand(params), - ); - console.log("Success.", data.Subscriptions[0].SubscriptionArn); - var alertBody = ""; - for (let i = 0; i < data.Subscriptions.length; i++) { - alertBody += - "Owner: " + - data.Subscriptions[i].Owner + - "\n" + - "Email: " + - data.Subscriptions[i].Endpoint + - "\n" + - "\n"; - } - alert(alertBody); - } catch (err) { - console.log("Error", err.stack); - } -}; -// Expose function to browser. -window.getSubs = getSubs; - -// Unsubscribe email subscription from Amazon SNS topic. -const delSub = async () => { - const userEmail = document.getElementById("inputEmail1").value; - var result = validate(userEmail); - if (result == false) { - alert(userEmail + " is not valid. Please specify a valid email"); - return; - } - try { - const data = await snsClient.send(new ListSubscriptionsCommand({})); - console.log("Success.", data.Subscriptions[0].Endpoint); - var alertBody = ""; - for (let i = 0; i < data.Subscriptions.length; i++) { - if (data.Subscriptions[i].Endpoint == userEmail) { - try { - const params = { - SubscriptionArn: data.Subscriptions[i].SubscriptionArn, - }; - const result = await snsClient.send(new UnsubscribeCommand(params)); - console.log("Subscription deleted.", result); - } catch (err) { - console.log("Error", err.stack); - } - } - } - } catch (err) { - console.log("Error", err.stack); - } -}; -// Expose function to browser. -window.delSub = delSub; - -// Send message to all emails subscribed to the Amazon SNS topic. -const sendMessage = async () => { - const messageText = document.getElementById("body").value; - if (messageText == "") { - alert("Please enter text"); - return; - } - const params = { - Message: messageText, - TopicArn: TOPIC_ARN, - }; - try { - const data = await snsClient.send(new PublishCommand(params)); - alert("Message published."); - } catch (err) { - console.log("Error", err.stack); - } -}; -// Expose function to browser. -window.sendMessage = sendMessage; -``` - -**Important**: You must bundle all the JavaScript and Node.js code required for the app into a single -file (**main.js**) to run the app. For instructions, see [Bundling the scripts](#bundling-the-scripts). - -### Bundling the scripts - -This is a static site consisting only of HTML, CSS, and client-side JavaScript. -However, a build step is required to enable the modules to work natively in the browser. - -To bundle the JavaScript and Node.js for this example in a single file named main.js, -enter the following commands in sequence in the AWS CLI command line: - -``` -cd javascriptv3/example_code/cross-services/sns-sample-app/src -webpack index.js --mode development --target web --devtool false -o main.js -``` - -## Run the app - -Open the index.html in your favorite browser, and follow the onscreen instructions. - -## Destroying the resources - -4. Open [AWS CloudFormation in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the _Stacks_ page. - -![ ](images/cloud_formation_stacks.png) - -5. Select the stack you created in [Create the resources](#create-the-resources) on this page. - -6. Choose **Delete**. - -### Next steps - -Congratulations! You have created and deployed the Amazon Simple Notification Service example app. -For more AWS multiservice examples, see -[usecases](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/usecases). diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/css/styles.css b/javascriptv3/example_code/cross-services/sns-sample-app/css/styles.css deleted file mode 100644 index ffd74ad014d..00000000000 --- a/javascriptv3/example_code/cross-services/sns-sample-app/css/styles.css +++ /dev/null @@ -1,29 +0,0 @@ -body > header { - background: #000; - padding: 5px; -} - -body > header > a > img, -body > header a { - display: inline-block; - vertical-align: middle; - padding: 0px 5px; - font-size: 1.2em; -} - -body > footer { - background: #eee; - padding: 5px; - margin: 10px 0; - text-align: center; -} - -#logged-in-info { - float: right; - margin-top: 18px; -} - -#logged-in-info form { - display: inline-block; - margin-right: 10px; -} diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/images/cloud_formation_resources_tab.png b/javascriptv3/example_code/cross-services/sns-sample-app/images/cloud_formation_resources_tab.png deleted file mode 100644 index 7c98018d46ca43580a3281d5d779b8fd6ef46085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116124 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 z%0D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 diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/images/cloud_formation_stacks.png b/javascriptv3/example_code/cross-services/sns-sample-app/images/cloud_formation_stacks.png deleted file mode 100644 index 7b3d853b7a7d9ab1609b94b250daccfb0077f8c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43167 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

    xn8k#k(kI_ug#GGS(J;*8#Age@>*>`pMe$T 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 S{V5viqadRyT_$Pz<^KQ?{$#}f diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/images/identity_pool_ids.png b/javascriptv3/example_code/cross-services/sns-sample-app/images/identity_pool_ids.png deleted file mode 100644 index c29f2fe43036c5f05e0bfb84276598cfeb087759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68165 zcmaHT1yCH@7A+Rs-3JNo?vMn61PcUrcZVRsT>~KmhXI1SySux)yF*~Gfj@cozI*e2 z{rX)+rRJRO(|vYtU3+!HKPpI}Arm7*K|!I(NJ}U~LBWebK|voP!b3(@A6SVY{~$R? zYdS+gq4)g$gN|oHCxHwixX8%AN7#jjMS}H|%XXw3#%iGT`7WPh1g=HhskRenT z$dH7ov$2zH%Kch~jhQCjxaIv&C zh2jBWAVFr3e$RZeH*;|_bTWm~b$I!GI?8_*w{$kPF@&7z1XbTr69XAW{5`C0=wxSU zXAadtvKI;&L-_0Z&rZgsP&Y4u$NxP|+}_sK)XoL!b|j%4G6w(qG!;u18&jx)vne_# zC<-VUiMJ~5X(y|mIy0ZwUS1GTxw<G3`(;c!i&a$k02a+{FY0n_*Y*Ys10asF7G!tMFWa6;5qLegBF*=8n|>{E^91@@#A(+__v z?UdYLAS3?%{i}W-p`quMRvX>w@PG{8+`BMX&to-G&If1ab13N2cb2oouyb|1a%#iD zDJg&4Tt_m6`>CLyAamzVCYoHhtBuTK#}*t876Lh*Oem$%eSo4zb5wTy8B~Qs!yiMI zzoWrnYur3p6`HPW&d>(0j|#7UacMbJ81e6#1ExP^x?{TZeYf{V#bV_IZ6s5#RKY5Pd$b6$EQP;PQKl9@g z9@alc?65>!2*6rYuXk=l{)fOYuN6vO2g|42vp!0*0=$Py@SF<-@# z_w7wI0baFbrY;!3(yY5o)jhZ zR6!7QIhN2E{uqrehvUKUMxS6{Exc5R*+a8>0r^x;FQQ;K?>e!Jl_Bcazi zS`bN*m`a7KC=<~LENoY*x!u1nD>1H0`GeQjByW<2(cq+hnzBJppCCB+DUK>M%3HOX z<8?CYVaySHE;C;)+G-;GKsJ`;8d}bw=;7Ti3vQ<;i%JmvMy+!#H1$L=Rw{OZcw9Vv(+Bo=8o(*VG6>I13%%f8V5z8m~R2lY-LCV_9W2Xw!A} zOz^J!Jo%malpTuUFx~pK<{-?_@ol4x3&kEv(R$z=qC&Y=g%1o45I$C>i}&FM0j6nd~M7tQq` z0Z+V=<#(UZiR;yxh*hnh`RG)XQ-*^jc6 zL8kMDdTZZl9N`yzSfqTvsCIed+Z1oi=~M-CN0(PGz`>e&t_3OkFK+zT9A{rVU$fZ| z4{Y!r4=#K}RWf$pomD7ld3+^`;7*rpE^SK1CF6te-E3tXgfDQ)Ew-X;qZ%X8#+VDn^f(#h;u-k+_t^hhyUx{z z0o|(jobnI+M%>Q&`^W_?dCkvY`@4rGk_N|azNi(rZ{paKvoM(ByxZj=-&cj)Sxdk9 z{&=`*2AV~C%pC~Cjz3m|F8a!M??U0P@^kchq;M+_;?qw~Y>b9My(N7y`+y^PWp{F! z@~1vdzi@30?rMUT7c_l+^H2egC!&q`^UcMvG`Zzh#*j5#JN8&slJG_njZc$A;+9*2 zbIvJu`l+6kV8rcDB!&tQM}Abhjp75fl}C=8^dV^7SotOPAyQmWt9;3L% z4W=*g@d=Jyj%i!j=xKE64IhRb1cvEF^xhpJ(e0X+U6XnsSjtcn2{^r`mJ;pWN7%SX zNq(}#ib_iuIuSz+Q3RU%@SZ%XBcs&Sn)eiQdF=H$kOC=ngp#heYmiMyh6aHcIWAG4LkyI*`kQva^_%#)h4(&0uh<^2an&U9n{JPsO@z24kj^MN1 z6uyora7jW%=QI8jwu4QKi)FaSn(fxOyC&L2L{073(wn@^A5A<8l?+?A_-gydJJEDs zxW@y++qSh(y5%32)KIx4UC-(M%kWce zBEJsdBHf_)7xnfz@FxI%tiQr76(3>Gj8|@Cq4SbHmiSF#OJ|0E>WnE5@7Q<~<;O#h z8Q1A(^+H#F4Th&v*t?cfp4D4$v*2F!Oul=n<~Ad5P9`Du3SV4h9qVoT=gmqG>yi!Y zk?E)gdAuQbfV+p`h1aolDerSG^AQ@+(kFRwPH$$D+WAbWlY!>oho&uie?4cD=TTSt zMsK%VU8>eqU8klVQ&Xp}aR;^3sM|v1k-{@nKr@3x;z_)3iKMm?`w#)H)_BKHKl%1r z>5S7I;7kF#B`zbwwzFW{YqNkqKy7RTl|(Ic?a+@_vJUJ0&KhGiiPinikedVv6^$xK zl^&8X$>IAx!Hf__`6R)BFK?~`tCnOIG^6AU94P!%<(nfJSm2k0J5K5)o3~L24ERU( zll^)l3imMSNcsKz<3tU&{D!1-JF>*-ka01JZbHFd zjfl}Y1-6^NTyzWhwO6Vcx#n$i&80Y4iu5CjwRkH8W&o>y7*RYuFXpUmqX!5-8V->P z+TTT#bEcVeLfg`WTxoAHFlcBmB?VWOQlkTnET%z>Pt0dbPokotXe*y6 z)G-dw+F2=fX)B@P4X- zC_ck0MlkVti8#TP6oBkl>TS{CAoc1kRP;qh03-%oeul*h&qV#iQ&K(gRjQ#wqD*u zuH2j1-HfW-jz8u1&1TX z?^ioYgx>Q4-zP^Xx6uS~M89;<;ec9NMQz3<`UDRcDEk*vmLpG14G-ch4-U>z;ea)t zgjZs!LUE|TJM8RcGJ{U8K{>B{zvpaw3SoB&#TIrL(ewe4cF%CV6^$xG^w)lV zIK9E=TA?iUj-`H#VKe&WZ@xm)z_Le8S7Q_Sby8{KwYYP?u*vQC|jIbD0(Meq_@ z4xbB}QZ4G)OlM44fz@#)?+qOMzvzpH(z`bl9FG#re^Q?5ZenUDtecK zdNQ;&IA_nh&B)S?Z`h4*N6pP029=GaUKz(Jg|thPtMWtrqmmLd9v;NU5yG;*L4Eyi zb>Z|%`{lVlY8~g@P>x_gjI3Oonhz-}ea_v6(v!SoN$I=$v&he0^F8S zla;n`u~?-Ys&C&n3SC_A+-(sU&=%OrYW)i9S(*#+O{)F9DY1C zG&dKEC(XYXeJ!+P5<6Nh9F$IFJ++wL-8x5P`*)Tq5r2IT==YEN2@8`pR=%VB^8~!$ zKSV<1q^b1(pT1nIv(n~_Wc75nUvy*WH-48B@^xp|o+YKNj{VCbBmuV0ccWB$_n{vVO#ycJd@-`(9! zf5&JA6+D4E!E*Z8e z_jvs7_sgoAiO=5;)$#Zf29gepPfSz~2GA)2dzShJKD&Kxpm>aK5`lx#*Vlh~db+s2 z?lxdoL3x84priRe7iM4l0$&7COu7Z(Os%!cfEGEIQYS4+@O}R8cTB7Z zrL3kVX{pID|HMkF-=2p=;RW_O;HF2cUW{sQ7khqwP8v0flBD+W@zHuXLe9Go|3``v z#3Rk?A)u;HZ?R|vSFjgeKSmuKD{5#n;YYrT>miC3{k*qv?t4cdK;)TXmoJLR!;S0f z`(o7@nvy0fZ{^PFM0`A7Zhyw`k8{#du?itKH8u6BcOjV$8Mj{AfVG%imOyE))w(d` zP30i|swzLGdPA8x^oJ)AkmU)CF%FHmzlbSbs4-HHJ6|>kDF|X`#+OZ31svT_uCZ1P z#hiL2++tZ{@PdR{VG!o8V#k92z3b~1afpWZ_Th?0cSI^_gJp>i=(kudntYc?=9xv(TWI1&z$60zWLlZtk3Nq6oiyR zz`a)xZ1Vh>6hovv>S@|8QU1d_7^Lbd66bv`y&pL; z`Ei7Es*f%AZeZ}5eBPjt!pngO`j$(-f+zHD%F;kubvBgl>Ei4r%LlM^TBUbu^|)_o z!u~BssHyp!zbfv0&NkQdBi)wJ2D&k)fx(nR6W_7iZp8i&-EknUa-vC`+YAyd6V@c3 zEMPrF3o~1Co;QAWv-oQS!WJhqS7|WUe(?@-Z?0Oys%u-h z&WLFU#E6XyrcV74N^Uen=OKZrV0Kk=DCf(G^_ZnP;^oE6a7?x@y7z#Kjg2i`I9V>@ zsRo0D#Gq1)a}Yby&y>Jf*e{YVq`h*i1A*`bIZ_`uB$(b2Ma8)aMCa=o4{p z1zak`*favVsy-PnOCG1IZxPAUru4H4c)J6fQXp?D364Cfcf!s;rYfE z=y}%n@dRvVEbU@poMGBnATa3VjC_cYE#q^JCi(u$SqzQq#mA`(a@ipi2AyUHPRE4l zuhdRJ9f6YjuD3m>;^B8j0>g7OI9wZB$X%>S0WM}ELwzofE_-0NlS0Or=gS^Ya%bzb zvdlea^kJawsG$5`2}Eq33dEz`RJXLGLEKDT`EobHCpG1U_JX&@+CuM40+6a_%Zn5d z-gtNjoQd|nRgsMdX@@2GhRm?!Kxo80i^ zr7^WFWc_aR*l~Ysm-*p={dO5Zc_;=jl;D24=;f?aF9j({tg)FrtcfI4VxVW`ulvlI z+95P?2{VNIpZedz$`l!E7N5Djj^(aknMm-LkwHC2UoAfh+Uz(hx=deo{j{+j59A5J zh}mv`mb_yDak!3nzm|A=rapXk7WP=V-ljWp1<2YTsC*6Hr$#-0C8W-5w%U2rkMDTw z{hH?MZd)of|I-as!ugC5t@@AbWM=Kd9+!Q>@{R28lmR`D@czy`nyJNNKiXO2WkBfE zl$8F4*?pYGO04JwMd;G*ykvgA%vWb|iV5T?AagRZP*ce}t8_oj;=}gOOWswj0ef1* zkzT(>-7b4kpgA`9Dj?`2w1v=314=zv#|B=s{ZZ~7Uj}5YO74mAo zYg40|sN15x$n^(Tmp%33fr5E9CWH+-?RB?IsT+VZ< zh1Sxt^92;t(F?P&32)7A9^zXt$f+m|;gi?ANutZlKFp@Iw2$h02xH`ZgWYMl|46n! zFJqVh@-%w))md3=zo|C|P|LNoCKYzRZE~}pJX6AR^@~R{DgFIXj%RDMFOdhU!&A~& zRR5XNdWJh&+}haB3dvxJ=OzKUOPg(va+TA9D|eiuHq~MS!KB`_{nm9MF6oy^&%XRI zUAtNj4{wE|*f`NpQX}av+;wwTYID%k(x{H#Z%pgv3DKR}lQciCiS+9g3-+i=&n@E= zwbxe>aBd2Vx~<_UnR_W_T* z=-Ao6WoBj;rOsN>P*C_O)FT+ws9|v0tjY)J666WXE$eC6j%caVKe%9uyEoz?`hu4MuN@Kj%b}f*=ju1+jIn{>$QwKn`zpJ zrdyf?AZ_`I9A&4;ea=A^GQaA&>`75rmwkP0k27$@5wIf` z74js9-%|aJVS0((UX2P1s?2LDBje3b4DS|s>c~f-9dlNLu49ikBH@$`u>OuX8q%bL zigd>H`~%v+4@W;j2fWS5r_Ynd@^40GW95e$WSBu;jYoVHL0``J)5=GUy`t26y9j&@ zztcoC2w_*cR%3B(d=mBM&-i8D#}UfWa$`k>l|Z}=k3n;PXhOvtdgpp(lPCPWf5&4w zynfcV#rK|qpkV)oOTyXKS0gE2d~KT}URGl_Ep{h?nL3r3iVz0}dKRBO zg3@C%KZ-%xd}`ZyW3t};G#as})$91VE2zXm^6B}#WSrt&e<5=kXFM;U<*m`(p`Iz7 zW^yvW=W84S%WhXGVXk}@V|hbiacexj9nSq=TqA(oUT^biKk%Vfj&>*4cnJkePBI>e z6%TrGM*c*-ciA_92*P4Z=~&=%u3QJhu|?ZLOSPMhmEh8n2D!bYNW<|O0n*2QS$UgZ z4W`9+Rb@}QSm=AGzZJwGm#5@oj^_9+O;V#{vHkB?cN(`XSFGEQ?&&|k*U481B$qMr zd%c(-S3sKplJ!o1)cGfMQ(4i*RI-U&!2F!*f?=51$cmx|6wcg`b0T<8gOTIS}g9>xt!ri^kvKA7b+}xD1=4(XyYMl1SK~`6FE5)^iz!v{k)v*%v-wMs0<-C zj+pd45pUN04}azLK}W43kQ!%Dw><^}sNd_q8cM=#XMhk!YC=0<*0;Xieq_d*dU<_a ztfh9`6ONN4M=OZoPlmFpzjl3doppSgH5(9<;w_5%McO-sWt8!*$sL8M_~+l@r`z)5=9@y zdbJh%RO|?3e;896uj{{`>y*IO_IF+-Rjz;YbZyV!VX$if-VP5Z99{q^a-Hp|<^Y1S zru9u!N*>D=+FT>Z$@)WOxfn>(!b*XS_+{FX2^(HzrzfH10g`2RR&7 z(g(j$$|;g4M$P+cv8a{Mf*R(E9MetO`QlynKjyWI#x4w<8hgIlY;a>_cp0I5uCyQ} zD*Q}t?@}B}2zm<+B_YE>(f5+Q?R>1Phe776GD}6%E`FC#K5FKbK?vosF5V<8LNhSQXqAm9;E%UijgUpS?*j7|LfBd>h47q==a^#*dvMV-xVZiWa>YWWp zZojnOh_OF{CPMhk+Z(#rS7GNlnwHAQs91MpT%Xfl6+vD?OrVjo!|}TSUp(nBWQ(Ua zf;X)R_=+(!rhQ)U-f40*`9|9ka2PGu@Zs?L=_?k)C!F!#DEuoo=j|fya}{Uwyj^|g+HMXrL(lU?bIVO;>(R>U zj3qosL0i|8&irmg)wpu*5h$AP{5JrkE_}YRy>p2@wSJf4JH9N@SbU4EVm{oDK?VOX zRh5YKyWRo|3eS=NFS2WDY8WRhmX|}j$Q01+T&MENUuidITK%WOF)t=cY~?iOCEvg3 zd`R%%H0FHwvHXRCfuV58)_s(xgji{rJRMQ6BK@5AERUiBXVN^?`(sBIq=rv+1ZZQm zpMper>Duwg%fGCc1g#_AsslDB4B1oI`NpyaXfi7H1xKSZu-IojYVyON))jRxUD zg)9mFwzxcG=a&_^wF&M#OoKvul-_2OsR`Eb#B+SVLAde3DeaY-NvyiHwU827Q96YU zuU~3dvD$kBx+aVb7|>dF<4d~7h-b;eW7pgi`i}F#M>3q{jIpSC=Z(2Rx%TR-Rv)TJ z9;WnKeL8VC@w14)>|xF8?0K**Jk~Mzyq+eaOt)iE8g2NxO-oLXEaSa(23C{>$|BL( zZspZ{Ib{reNS``JT*>N}IZeRlyzx~{f%$)w;xz<1-gQ!fpdx2|-Yri6K-HJCKKNGv zXj|`t2fx_5`B&Jaq;k^Ih*?=#LBYX>)r*KIC=hh^$Hc_PckkXIA|X-o^CxX=7z6|a z90+ixW!BL)t6 zVJX6Zy4{Nn9D%i1NWacW;rd;xZ`Xw^9FH--0N-0mIAkIrD}LN@F}meaI(}@KGmv}g z3#Xz}s78uIvY3r4m?*VbLCtEl7d^eweBaDh)v7MMTFQ#-qtQQxll3bK8782CS1{~l zwIS;3X{fVpQe*%ip>ngH;tTo#TnEqm!s5fMx`_+nSVuH8F1RM4+%*8aXRUJM_^NV| zD)Z{fEk3}7R^`_1BFtx{HRz)c@NtbO8#~Fd(@b;F;MW6nMvG3S6z;7v_||;~lUD4O z1!s+@UpGUeQr`_Ha0`cslO1_^F-rAYZ`z`>MjJ!oyK^9s$e1HJdHZhcFN*iUqLLW1WQq6(p6Wj3Z6R59;&PbOt!*p3P)=O=FChSmdzh{@i&6K$CdhXk& zjg6YvD5i|y@|=cZd|;Fi9vmstYd}SP5gBiC)6MIY*&Xl}|LJ4LOqln|YNsi4-M5q& zl@Ku^p+RbLb3OEL(leR}hdhL1Pao!-=Jr3x>i?Cp>KqDhN@-dW$*$}46IibEH7sR+ z_62C^n|Imps;hds!$fs-bQI<70z-CL6C;MVZ;YD(OlDZEL6u*itTB)`!Z5g=uHf(F5-BL` zAx7~qw`K(z50V2`hY$E8(l^5Q1B{8dY?~fo9M53#S~7IEH94Y^d7H-Uzb*^% z?Ank-#us?%86T#5?3kET2|MGV=;`;RwM%mB&GI$8a1WzjUcc*uU^|BECcuZ|NQwFy z7$6V<4ac!xqHlfT=Pm5>?X+5UT5@_4Ka(@3^ML0}XG*PFNDDFACNKPrwBcJbau8@q znzmB-^XRLmr}I&x#qo_N55{h_IUo0Xb%EC)izxQKw|mDRPM&Ust+;8T_4X?-wcFf6 zhVyKO9J}h+yAR4YMZwdK0*Ziww0K0pUr=c`F*`2&4n|#8BH&|}6v`C+>@=poO6kTQ zvnQvO=CY#KK<&$ho*0RpCoa(@eZlPZl8qBKRLS9~8^lWV9TF*oM z{Rn}bev=2!oS88(inSZ!t)e?RItv%sj}G5k5=*Yoa`#U`lhdB5?&o5tH77hlo?m7K z2)pBo%6(_A`W~g5CXb`%z>Vf5ZaW-)kKf_lPsP%nv-{?d-;bDa)tvS4m?LVU)>#vA z2xkGMU@O-70}$*>_6;exzaWBU-E1pWzcvo-7B1KJBu@>FjC65STxp*rAR0ZWv*sE< z;q&A9G%&rVI4ROFB5{4+=1*1O#?`s+IpF4KH~YIgo<>_j>H5>YJ>y{c+s@1%7KL-5HpSZut>OuFU)!lnh3m*RyABYt%Ao$7K!s;Kpmg|)#FQz;tOWjbVM&1^y z{bB99D)uoD>$buJ07U_`afOUM7eN3BDhmaHiSvebNg#Sq1cP%(R>QRBCP!a!iF>5998cq~HH672zc(SsVf9^eJnWc~#BLo=r{s z_-VYwE|6GlV|(MVZ(FQcsH{7NfZ;e_z`%TMH-UvMe)8GrzLOFY_O%(vnLSClGmH;$Kcx zs^=x2$9afn_^V`+>%MiVWxHR3IBH+OwLMPL1~}1d37<}B9CoXprsWWcy5!Y)Y>Fns zjl*bDYd}?2@9Cp!BW1*_sBYEV6wx0?sVm}ox8i3XZ~5og%r1Sxhz{1q@SSm7oitj0 zK0NkR8Z&)e_?h2?;!yTi{jxKqR6UhlQWDj=eC+}DSJX(UDtp@*>dP+y9*eol)`_)a)(T&?4Nq2!zV@3G^Xxc(JCM8CT ziCDjCq_CEICB2k6Bim&S_kv`0#Dr6TlnxgCFnd1V#Cy)yw`!YD^P}C4_#?<~Mc1kk z5t$+RVDPLa`qs9QV)}J7M^EsG;ieu__QQfAU%=z?6Yap06;Uzu7o&E@go5jmXU8&U z{Q&@HCUEZ;**4*lE4p(+36)33#PxExlshWl=b#x7El01T81+f6jZUNAFXr=!4w>6W zE@?3fn%hYrf7>wCuxFIo**wEptjSL<<)nv4s=g?)h*hVs(wDU1Q03gnX1e+hx;*uHbttZo0@w=IPUIUC}LvmMQ!B3i!L0KySqCTRUdc8w|+(Y z9s$^|08VwdKJG}TZU7nZnB6i2>zo9Sq=u&@L-5B#08T6C*BK9#ByessWz8V|`w=o6 zkK?v1300P2W177|H;-a%;==P>&TSMr4V#{o2RM6?qgve^OyCy>v`?Zkh94wRarXPz zXJBrHfLqV@c@-C<3?{e911(8e`|IOfm~Xdg_zdPymDiKs<_$)8cMz_*f5F(+6CHJ1 z>c;Ufwu5sv%jJBzVc<_QsOn`uIINd$0;@oM+}A;nGh1^Z`Sg;e009Ts7mcL7?8uEd zA-x5H#+`IWBvu?p43YOw(d`$T!=Kn!!SJ%p3z?^d0=eTUU7-p%bI}~H6+9C;fHVVR zAb02r>{UMEs*+#DbMw?Gsdn{M4obq{v0w6DvZTh(LckSG0Oz&`PWE%tFX3(s1WkR@ zEpD{Uyf0N46*!5QooOKTYun9_Wg;1??q7M1%IytPcmiiI%)ajm*xL)<4{sOlJf&fH zQ`m<#D0e9Gze>ElGE<0uQIQ$=iMU0%^{ zfz|CTA|hhJ(J7=mcZ|yRJ2E_Y-8}%cG6!({++Ru~Fa!Xikai&6s0dPQR`-LRzW86PKxqzpgYV!@UEUwQ$qk6zf)6CWLhONou{_9H*YpV8q-IU zO4Uo*wC9h)vlKVB*&E_x!H}+~fS8o?ViRxh%xL55_2aXz-|CIfo##@+e4OAWM@7V9 zBmJ2&R&EYQ?l}`5MZhLi`|OVy=r+_+I0R06lz+FW$9kH-bXAY2_KERcw)>9RIMjxo z5(Ac2EPAjH(0L(k&eAn<;G;b4r`nLcHCe56h6euCZDf%hFN;N{*y)KXb#n*qL{o^# zfrf366;*Br-A@?$dVp?p5ROI+Q$`7fvb64Z`8B2d=Kj&_!Pl$g!AwfJ=8sa zBqm-jvq{}q99cPW-f~;$7}HCj-%|ISmEB$hkwembcl{ zm+-6PZ;HUpO=*+=I}A%bt=qqmJ%~Vdu$8Op`zytJM|^!~QrlNnGabLaov^F$pNQTo zg5<9^w~%BNvf#Y-Y1V`|EBv1X2v%sw^xgCIsh9BSIxaw9F|)F}>^93b4J)$NwN`2r zB1Y3PRCriO8M8mLEWY#ZPbQ30Z1Ljq_Cl7C=+ibMZ|TBprXv_8>y!evj@5jAxf@az zY43fQC3mX)lU?H!TU5McJYA$C>g9;{K2(9*;^dp%#2JK!)wx$>71Q(%<2OLlDuN0h z7=Y1u0O{IW(*AExeBk}ar$gwEdU|6rQVi=)-gJ%02qfHPG3_YBJpJr7Zc6SW5{`p~ z!n*F+&pYX){!s%Q6Dv?=~gmqn(GNqT7Y1 zS;d_8iim842oi4Bj|6}vj4Dh*Y&AUhnUmAa!rO~qw;yXmbt1gjcE+mAX}*2iXhS36 zNg#@Ja^yBB`O(zI-!2*)q`8QeytfF!t-In5clf}-zqJ?ptUBV z-X~)%bEA6$Uu)J2Q)MS373AzxEE(pd7X-a93Z7})&ue4M$_<9Xc}nf$Q9j*T6{aRyE+I{N+; zAHR&z9EoIau5{qEetyT1P85Ugtezt*7&kJcYd%igKf*`H!Au!!({Z`|E-#8$va6yw ziPN4bSl%n*UtwMCug+&f8k#u0boU3jsw2eLmJprL|Mbch;eO&?!MDWlY_~KZFtE5t zq^qmzH(vAlbx>v|g{tR(Y3_X&29!3*$s>jmB7bDM#0pP(E|Xe?(HbmntMED*zgO}* zs~(etGL6ouM0=|JX`cLdp$gd^+tYYn4?2noz7!LvEch(S5nh!fWwxEfWwjEG&VCR9$2RqNm1g6KB@Zx{sSih-d{|%m zP0x$hNJMVN_Z0^HKL{mheB;>akT?M8jSmeC-CZ^do2`JctVNerGAm()-pnJ&)ilm& z)waabom`-cl&D#&#$cR3lNa57lU;p3eX%k#6|%j`uyW%Ub?1|XM&RMuU{46tLKq28 z%8Z+nLsS$URZnNy{+ZF#I68>XExI5@U4@|eF)?tlgd@t#sRR$obA{q(o7Kbhzht?@ zjFe%WbYZ=B4&aw zR(y6cpUCqGXwxZR(}e{0`|}cMNlfeTltyZ^;lmO@WL;oHn$Nr9YtM;OsN{;g$^#5KjRS-M~s?LGc!j)5Xs+4&+<8U zjohiRX(JvWU@t1sm1=+-ZZ=_T&knvtgrc$oD6VipP&cTPdUPtP9Jqd@utw_Sf_*yn z6M2Ln39h4<>2UZe#p)RP$MT#tp{SB<%$p7CmN{4h+-X31=Z{eAq^&A!?|l=!mg&}W zO2rtEH>|LiD{-H`4RKQisZ#8oFR-=XbOI~ z`2|Ue8uS0*WF{6sa+;wJ!*^Th%n4&-Rv+y#0I)SDC|H$yf}Wo4K3@_VIf=hQ+EzEW z-9iP(?l0hpU{z})t-JL*#9%8%SjW0EO3`Oy4KR+lrTDNUyF)=Yn zm{mEYR7d@jr}lM3=#Kt#LY37Syr`_ERPyxaHRA`uOw|&M&G}SFdQxbdy8RhxiNoE*ogtJe|Ca72@S^YKbe}#XXf@K*0CuFLAE!aTgS2X^ zh#W0WTU(pf-iI>j|GE0@sA-wni#P0{?<4$v_|!FE20`ogGHVpAwpav0u+d<~hnN`z znJB6c&B)NN?GWz_)sgv=Maca|cb5FGybZ)>p`%zU<iQ)!>CM{I# zF|hu;CapeYmfZTKG5FPVyVajLmcDsyDBZ6MkQ-azF4FH%{lzmZ^A8f?P8uY+;jek2 z2gvKnEA#>3zgnXP4|MtjEhwsbrj^HG;s=)Phsh6$&DPa20=B!Z1 zfi^B2GBTMfo45!3@0V!YS&(Nr#3L*+|IIa zy}}@j)7ZXh>v`6Qh=_ybdNv5#5mK)~Xw{CrPr@EouZ3Js4Cc#pk>C8SBdp>)#UjyU zjCtVL`iF`%Ch?(=OFCvus zh+_4k9Aq`kcAwV&CU>#Ja-&u;=VI$){nO9#m$7kZ#C$abHO+%Tz6Ri|-$|8ZHkQ8r zdQs{-jMycJz@@Vt1=Ard*1fVGi|7oq>iY3Imt#KiSu<8IC{YnH9R?#OC4Y=KX5(Qup+7_oq|nqf<&J!J^;$ zR@KwfyJ^m+`nmWl+7?K2?TUS~;n0MjcL)CaJC}jn!ZNFvV6JC*wTEc{Fz#NIp2@RPk?8b)$<%C^-a-XR&tW^6o)ELl+GwzuGK97_EtRRd<6!K)@j; z{-B|uG0OsJ^!&z$iZJ2^RZ6!Y#xt<^X*X2b*;?pF`1Y2?ThU^(T=tv8myFitn8>2B zN3rLvGly-82)Ces{Z#cP(`Kr}4)k}Hm zhpXgmRUeX@=u0DPr@pHQmWALM@UCtCr03-4Y8TrJfu3wZI0SnM?>P#akKF^$)3|ih zJ=dG&AWjz1%uAm{-B10TKd3(|#=)G=P+zilG0Xa@o?nX2WUw{tF z@z-I7G%lv~>YFtkl-|&z5Wwy$l%(4a=n2Rql5(6l`YBP36oDMhEPlZ<4D23W9GXnF zZ^$)cl9G~B6?Rxj1#ADy1?YsqZ%KPUcKacWoog$YDCdT=v8_0G5VesugJ+T}Y4A0z zW(fPwZC)o{O-jo2LU8@}8#Cy5=*yh(3>m9mjozf=<c=|0_XAVjm~8P6=3_gcGcY`o{L|h`Wm8%>uGd09J^hQ$+CT~t`3>w`wX2K zKRs#S8}np~Z0Rcu7PASk^Nto1^F%QeQ~vee;8n)jHm$RG>iT?RiF9sKmhZJ*8EM7W zQVdA{9*7v}fX4$0B89kog>(!>+Ze8|zb3BXW3Sy_<+m2SKA)9gULxu(SZ6iaj4Vv5 zGl}Ei11!fM2T4zxmgm$o;IbPcUwUW%_{nC|6O%C-vCBndI8J>$elM}c73dMu13f6G zCmOxuX~yn>Il=SQW4IqHCO+*jnYkXrtWO&y*}XcRW_*;YyleHO&8y9hBT21U)}6)y)0qX~+4 zCk?BQ!x8o;t9P?ZY+OHwedbd4Lc!J3@z34w5MxlU6@Gto z{O46&=b8wmwPsI)IMzoIb!BNoN^m6VT)vZh_&f#~c0er&vNeKYf(%3f6X z1v&1fyqfmAN?N7{M?3*U)6?vLaY|zs-dK=W&`mZC?sB%YH!Yg+C38aJ+Zk`JBtB8{ zPlmh<;{;e47TwAQ!FCuN*KU?c$1(H_+TwFFV&Bx&9*^&L4w}4cTGD0qlu_c7*u~fb zi7-+*W{>qxI>JZXS(6K(D$2&GoE6A(dvJV96+hv5PSo!|Y$jn@i=}H?0l4O(OkG9ao<{E6-TBr&B1- znvQt|B_AjAQFczs(z}Y5TNN*QL{1l5?+l}zg$CU|=TWCOidiDD`Bvf_qn%v~4c%W= zw>orZqc*ltmr^xNhmZ1;jdA_r`=J+Oa(Uo}a|g*>C<;ho+V1E@#L4*6(=M+qkN!q} zV~a!WZ81W--#TvUttD6a!>*Gz7PxA=geVNYO4qH==`RFFlb9zw&+jKQhuw# z_I_WRF0q^1&v|9>TcpAMNJ5vh>BGr^7pS;L>)OxKWfLeyU%8nWKRV6z8DeG%^IT^; zAoV@r<36bQHk6j2IuBCsgTP*(kGzP9Gr=FeAgK&aN8~c2`0wu2O6&W1l{@xZkIBBG z%rfZfu%Rq(5r6;aof*GTS8hFF*QFaX@n%#<6=!4=C?cCL>rv^Z_99e_cr%(UdbVY) zIlkXbRqQb1-B2Avl3Z;#+vQ!OJCyPv1qCp(p7eLceFnorZ;tbAiw10zHrxhKsTxjz z0|>sSDG5tNm2&>V`mS)iGgQnAC1^q)T}MJ!w05s4z)yMATp9*l>eM`?@EMVLO3!1# zD(@r>zc#jxH@1QoCgNrnTv1fBK@SS3HsAJ2{xF?&K_9kSyEF=sVBn^QKsBZ!EOqLi z;+@>>LKfe2Iql&CxZ@g{40rq`hz#1_dSl%U;+U>_*{_f%aoX^Ynp;+)rIA^pr0d1UtZM(0| zjWdbhb~FbS1Ht8r*_r0&fsV;53=%YPqP}sp#Cc(NTRN@k%G^8;znzWVO&h-dNJm$C zvf_o;F2S!TeZD*oEooO{_MK|`d{eT%5yMB?9pnSa0y)!<%`F+r*2kbEWLo&HU-hnD zOcyvzzf{IF_Uu0nD!PM-`_e6NI(H50D$?&4u%jp=Cn#02^Q852wS!6R`@rn)JQp;- zsD(i&cs+^vUsHBJ zK2gxYrVBIFtln}ckx}K0m9x5^;4Eo0C)EF#gn+%ypVo-1D2LgkZ)LQ+dh=!-^=3j= zdbs5nx5Lu=v(%_dskl=*f&u<={POo83fwD+8LCB2FHhfQf}F=0V!*Q}X zvf&yW(pN^BgL=>0r5JC~;42;&Fwfb-2te>BkYX@+2>$?kLbFqI%to^3j_VBrZ(X|z zANq=;?^7qP@M&0jP3dflnnf}*uFNQwp$RTFXcI4%aha>z2}&MKf*Ef+EnJaDM*{%; zYKi&wsyE@%Hc#uIEPDQH3Rs8kL19bYe~faC80S50i=yQmMJKBT23*%0(8X!H%@XZ( z1O_w8$_k_#Ey-ku6@0BPDD%1e^cz?PYLbL<_-XxBR32)R64$&OGxxpYcY0^X^>e}v zoe8p+R}yvC^+8TKr$L&}2ckR7R~o6y3a_)Vh)}Hyy(M{2i%$}*KXPzZxi!W4;p+zj zOWoXZ7l<5^Cq&Af?b=!K*{KPePx2GtO)6Z+O|BD-o~nB>_gQYSR;c5n{CAyN!5mLi zNqwY!NJJl1OpNb`d&g5QRimxTIo^mpnS5lqab&r%^UVh9*?MvHQJf5S@=tefVY_LP zS0wgkwOcQ(H%_ZWSd)$5=s8X?;t2`kQ8DzDoCI8wGV1h7H+=9UyvF zH7<1|9z2d=L?Re4Ut)LKh*Z7Nh`5>%&bI-b_?OHU)~&sovN4-dQ)dsiFDmzkE@r&p znM+$|BI-$UBvLM8so+e%1hAa5mJ}E&Z2fo3gHbqZG!vryRI+||&hzxkENSFPj?UA& z%ZP{9NlCc`1a_-NnKOT|OG(jnid-il;Sdpdo+GbP62LEo&=p`e$#{>LaKP>jicX7! zN3pa=nQ~g#CHMWr5cj2vCzXr7PbnqjGj4TI1aTD`R(P)*ztC$x#H@Zj#GK%XubMzV z9niwfCfR++6Nc(GSDV_20$dGc#MNx#&wlA2h`eEzPdJ(*AsI`NZiz2G(-Nr}xa+lK zX&nIP>sw#n zY?|iwbgsiaW^wK!@_#pzD`)!bT(1c`WFKbZso6Q*M|@Xu02 z_S+Jbl4AbX0A%w?@x#TBzJKc2;(FF@D5Pt07uac*`)jin;mQ&}{nDYG&o{-ZQa{S+ zgwkCNOE+{R>lC5(4ZrtggTkL9Hz5tP+W5Y29VBgMYvic@#|x~0;A-o~x4WEb-9H~) zkA!9nW_I||PI$Q(hBwQ`?tOJHMJ%Uo3`ib5-(z*Nx*r1o8K16pihM08=@E(I61|cm znk12St5d}P!u+35SRd!Q?6B@4uHFtjU1%rNq@-w@w$yvSmX5AHRB~xA>PRYimO1k` z2-BAc+Fw?)m^>$sjb@bdj;(Q=qok((xy3G0ax`XL>ALlURmN-AyCnJ9A4DR^ zCKte0q?$^D6crnh@lhw?^wcWeRmhS>-Rv+-VQ*u z;+WHhC;OV~4@f#c14AwD-2F$+B**;6&S_5~t2vy4JAU~!{YWlhFSyTJ@ryGt8^^tn z*w|Q^KmZCo2xY!Caq`2KEG}OefU1pN7&m%NbVC1Zqyt2mtZ`vv+3$9fq#)T~ete|e zlr2K7*An{L6T3gl43LtiD)>~>J@1Ed?%RJCiR!&OA2)Km{LwMC4Q)LgWtKd19saHq z5<&-&$8nSkrV!)T5q&9#bJW*S|- zAp;@)gqyY{0}gHM=fA3qa6(=`@V^$)391TPaI(3~A~x86ihWc~KYis3 zisWuZn*B|F_}dbQJs3z;r2v)zWWD?@cO@kB+422a6V^BJ?}l^tZX5@b0nNNjJoYF? znZBSzuG`Za6@0FDb_6I%#F+=6#kE`VkYE6iXVd$4q4U_*FD*}99UWyXW=^=SIeG9(}17PUT(83xZhBkiDLDqPS;hO3L3(#NGRb?d1=4bCWor1C%hmVkIT+r+d z)GxJywYwc`K|9Y}*D-(;ISge6%xXHi#}6I^sDi`qQDOBCEGHA`EsLup_A~(uVTRf` z$entaMRPJ~;84*8N=i@VX8RTN4^gwRxt;l_`lZWwM*R9^m#(?#!^A>yA z=bT2{Ob5+BgAy`=zB*b8OO{8sXdR)RLJ$Z+)?3(=tuA}%{Om&9s!$DZf7Mf?3af+UnogO$@$ zz+lIC`5gf2Xf-ti2*5-SBfrjPDXR`}xb?k>m&N1#lAx3D{jdJDnstAqTQH?~i2DyvzR**1bhp60!Kq;(7A z2<3=u@+%pB|HBsGyAUyt0xC+Hv`oyj-B#&gA#E6NR@04Qn{$v~MI~VCQAn#C=B*HDDG}4~$`@xrCI@-5N&69_iz|E3CgDYLr)?asIUzhl{5=tf+Z83xo_et(#l~wscW&-B zNoG@Dz(R2?kAr}GsyfjB4=^8oPv=-UwgjZILi<{|pZj*Y0BFfWM)b9kB?^zNu|6U( zEHuAL~E@$mSAa(_O1!A;-tWjkBK<%Ht5KCV#m!S_z^PGAlamUQM4Kc1?t&sKf zn)v=uV0mQohMblec^2K1Nxd@_CN1-q4{cif8^bTWXjYt=H)r!Y$*oK3h<89VHQzJ3 zQ;yjUb)!hYU!{n^yHHXz_M zG;aNV|LRq8An*$SpfuCMM-kCerrybhPZhwmOL z^J^Qg(jOeYqy+hWNR;wj+-RVYkbSQGOiBAJ#?S1J#EP@-mAtrq^Ja$#$v;I40s_S& zThV)aE~tBYw=_Jh#8QDcxelPJvc9U`R3wRKPJ6aFp%oi1_AyE@aq*lXKaeVwzBM&! znKw5#niZTJNa0dbW4`S(cTJ2a%Y<645Gm!MExaCx&1zGANiT9imb*xrHOLAZE0%#Y3S!0?Gm(1*LbNTH36m3&W7Pix#zYT z zAO;FRaR4xo4&ZXHYn?PKEpyQm`5FwUR>NvL09go;+ylxs_OCI2+IYHF&=1@8kYQ+~ z(i=iPk}F^FwN^|HSs|3BefRDi2M5PJFUdc;>yy0J2f)gS9=7fTY_pZF8>phf!kb~8 zfeTK*t5N|)jrvLs8x+?_dPqj`HvYb%5Yf&6Nl%M~`F#34fKvXvG@`ga15p}oksrs? zW7{6SYC$0(Axkb&E>et(pYCQ-ux0XA$YqBEV0xdH{aRR`&)6T+mm-e8SNyz_$_>zM zg(HK@F5UzbT6mOnbX!c@zvb!5eggg3-`FUdMjC313=Rbck-|`Q^3_Ums52Tdy**a8 ze@Em#k!yJ`d&o4aYwayF`2U3Z)I^5=yGO;_AV@HY)^)dh^e<;Bihbu@((uQJHpZz+ z10jsX$vaoy&1_EikETvOH;jg{A9l= z^k6A>O24wPqFi=zXr>Rh@MBy#B|=V2C)4aqALc4aJ?tOY_i>(U{Mb#ivoc!OJ)nN?vNCotjCHTDOC_3G5zVL z6IT@6K^A8{Am=YyUthnrAz;}fue2t2KWVokYpHYRQra@tGPV*YmQ_#~FuZf?8Rk`- z=|-hITXg1VH^kVXXu*0$RYBrFq4uW}X5?X@U}mOkiSABVs-?g??b24*uj=~Z6xp~; z!qlh?(-19nlg$R`FK74u;bE&|Oyv`l@j$UD@ch!iYw~=Neg4+?auR7rD&uFSw0}8M z6*!ID8$3AMc-Z3)%#*=^By zhsusTQhM|*u4vXV33eE+5gvBI_H<#6FA`*im?d(*`aqh{hsGSG#V*|wLV>4BBu@50 zqq{~d=F2#8`3y-G%A0gblrMIyz)!rfF}fr<0Lor(CmAKkcwYX zNo8ebDmM+%O zt}M^G89p(WeBX2Q(KGr(VxHP5Fz(wji6h(0by*{3JGRM3=zYmduk5VXy>exabuQa6bEY^jZ!w*mH^hV4VJR$iC#U3ue3!Hh; zlm=zD)peUCcVD?>(hoKoTZ=eDJwBO^(?!c7Poee*uW`^1Bs76vjM5y{|P z#C{Z5zx{9bY$HD)9)9n3zV{eB#egB8O5Lib$zw%$Fk$oQLGrrU1%!>v(>>#EMX&O+ zi+ZJz3J9NQoRmmh&=tMr>+0CoLopxN-ws;eEDTsM?6;Q<0fJJW7*kYzaXe9Y!F^bQ z#~ly*7q4kHyWfti;f_;aow@ysPMbsPG51>x+bhJ?-SVh(w1PM)vKvUDp``!8a#NtY zWEE8UW(L%stC;jS7hg3uHB6OE0mV-a!b!aVt2_))G8!}Pnu*|*zxw>?q8ss(Rz@{* z4s!DMXMu4XsCk#yt}bMQv!LZb))WFfwr$BD&lY=vX5)mJRz!e4xT}U=FYNfcYtfxi zN)U6lvqv;vd8~U|RL&RH#Ls)F)qZ{KF7^gxtc?UvH9xI^XE@E$tN0FHl}Ldl&e*EW~4UKkoHVh2MlM;g;&xjy^!&YmbjBy zvvZHz;pNHJ6Qi%NnjiWltu^s1nt1rvAdTs7-IKMCjIA64M20p`?Mt~OK1Q0SyWZ1~ z4nr#~9%Zjh%sAy2^p@M=qR^kYP6sXGjoDRyn=Um-}2$* zFJ6YHwcZ|dl!*8O7ApzFII5)4AGnJv`;+FWi_>8`8jlPWNDosLfS{k2F6X)m#mtzE z;nY1YI8fp3$A!io+z`_fDi*iD3z9bv-y&DYzeIs@}f&>Kfdwr+3?i z*4k{gKG+<7he|gOa+z_1o#bmDyZzWTb7=jK`v_epA@Q&YS!`n|?|0Ljm3UDRHj)?6 z9T^b9Ug8^*CVcK>o6qgbxPg%keBv3C-lA} zbax_HM~xV`bk`FS#nK7qb~5=T-r~95ris{zc>oZApT3)(cIGr$rE|*KjfyMgKDMv# z3=Nx~wTRdL6<7ZOM&2R|i}hb=vacSSU(*5#Mn3hcjP<>A0Ltk4ou+bC*JYDMcH|kp zu_w&mXZ{kd6=8X1I4DZ?%)>E~rEN)&SpWIQXRXY%(^<^u_(}e(U1=YEM8NRV#dL=Q zaGt9(S=%cE+2QzwP*2#MNysmENG)qrlSIs}Bp}uUzt4BXgC;Z2AcE}gzod8GmT<5s zZbJ?Z#bUnbW2_|zF-AnwC+qvOgVG-}y_!A*eehA??A8Gpg(#W7pzJO>-0xE7a%Wko zS&O5E$9OycAb$j5Tk~^Z1!~??s6UCA#kho!EHIxiEB^r0!H=4?$#!NtQ z`mGW}fF7LYQ|C>=T}^nUD(VCgi?eB99A!_DW2TW$(1_b;{jU)blHW}EHebNKH&%?c z?XDPB$bbL*VW>xu;9c{s0&(YGSMo2?_#=@l!DP)gFHSLuma zT5RF^>Y)*6b+zl@$Dp{>i5rbY=&OezsT9GK?QWst?|Q`7{DX(~l@0vi&tApE;6|By zun>t#jTuV~I?a5{Y*dO|;`F&VIMLZ`qPLuco(lY$K^2bA(JT^qe@;!LgqGZqOW{gX z+OX%%@Ln#CH@`FK*>PRREV|%~Uzvz>G|Wfg9V1?+ ziUa&*K34jByGxhePrn5ET33Noci#i7dw+`1>Eho8w?_2-ng!!C(;4J%3;&|Sf8m1g zKA#^|dVj29;QLtdzd$Yuia6_kgH?bF&HwMjHLC3Z|~54|BjJey9Z?{Ql6)El~zrOwX72YNfNr_Rs5>*?vapJJTLTBJ$-=#jIxzXhjiMe7QO_S7}N zdvKLv^km+$Gv0Zvh&u*cFb!7jKU)L%5^<{QE>can62)KiO z`PrnD_i1b6{!lf(%Zik6>+6Ad)vx8B^O7`N|3oa^bf3QtcXlSJ2jQS_D1gD>Hu1;%~%_g-3pWi$joc2+4S83+Cme z`qU6Z8YUmka@$OAPYO|!NVGr7fOVx8G{%noqE36YYdJ3wP$O`DeE&$%=VR5>)6=7T z`xyvSsvUe1cY5;XTyZ+%kvzfa5s;)ps(QFs_ISmx;g>ce2E;k22OZ>Z{FRxf^TK9> zyE@mNZpp=M_c>v!>5HCt*%7ap`ODAodM4PUM{$k@N2m9X$SM!F;So;;YtO2nf{{p) zf&_f<&DIq~J>#Wy+dbcO{;5lp@78tsja~U(i-+McH?oP|%x_6O{sxoXJYtg4n^RzS z^M40A-WZ8%x+j#GHg{@j*;!3myx4V1I=k4=MO@Of;uZAS?M6Ll|Hu2iecuB|zIXOR zj#O2yJD-ZfvDh`A)#{f_tgnrq|u6OSpg z*(=N6A8v1Xh}|8-vzu<@4U+DhC3mi?eYGY^1IKWDjgkwG4WHa1zohQ@}D($%OJ3GIISKQlRLvlI$Um zYwGQSIXU)P4*DY*-Q;yJsauwK5)2H75k4L|9O|aw9Zm43s54URMVjq7^SoB6Pl5hL zE7LY~4R7$uoVZv=&!Szh=5kyA>V+%P$=}ojb9Z)GMD%QwPSx0+e3xuOE&Aa6i?hBr zPwXgr&5uhD%MCgOScatv5nk}ej}jNMhj)ptfvoIWT~N)J zn9x!mxz^BRF{i?25I33oiA8o4ocudTF%uM?Ph+U1v`$LSLj+ZTEgU&8z=mUH0x%saFh0?;!H-=Hj&2l z&1Cb;I-SWn-!GO|-4>be+_0j_A6n?0XD=D0Dt%U$sxqj!RWUTeFz#fd@{-;?Yqq=M z6nWwIjKdV07uzd2H~m48{hE>1iL$7t*4o#l%5KwG?AryuptB@{)syExq(Ao?h@ZQ)5-b+pdK3G<-Csp1UJ?gW2m+NFdJvV*6RnPS< zUqmwVuczRp9v-N^&(-L*z~QtyRw5A2crzpJN8&;6{u#*TsRB02Mo~&tC_Bn&^^pF~ zZcKjvKbBTpzB)S~fxRq#T*Bd#?sUS_(vMJxT ziCl`dQ7B@ynn~jN+x7*J%r`$$L@w?Uxco>aIM~$C2a&M)vev0zhs-E=eC88Yy9`v2 zSdh%z71Yjj`DGim+lJ!^85{Eo0!=cRg$={!k~R;E7oK-?ypT1sSQtYY>|!UNd*ApL z`{l#CH?*c0W)EX??(3l5hRyh-gB0d_D=y7i^4P^+Pqk_y=x7+OhVl2GBRS}@=cRuf z`;XLeOFtzSovPtf7|RL()jSJtzd&8e zRgVpDdyX6usJE5`N__V@%wy;W3&bzU!w-MX27Bg<1BonBhmJ@v^$Xefj_Vd453jcu zXqN4kVtBuUvZkDP-YmRXT63ily3Fi0w(!Q*?8%@{Mm`G3ZPqJ=Dh=vz&$xd+PcKzd zMqk)~q_z~lGJ&d2Y*5jDO(&&yvb0vmggRoHFHjQ87?72HsZ__WF5+E3J+M^I=P?V$=Q7iw0Tu zFAj2zF5ISWQS*eRhjtGPlQdi7x^L|5&LbcjPF@Ll5#b?^ouZE9)d@LYeYPN;1xr*T zJGQD?ay=A!cb;Dgq6Fl7ut-q{a0%5yvvYd0;veHhBks3-;xW?R>muH5;AdQFBQv&b z3hqBc(nTs3=fbvHs!{UrcW-PQdObDa2;}>3E=DX*^`Jb9hxaQLgx2*M3t2_z4js7- ztiFftnIU&69yapHswqFL%PUplw&Pj!8(UDlHK%wQs0c9}*8Xf<nD4}6tivE4Bo>lTdwL-#+VKZjXMKr1nJ}jKE+L4#Z&TV$X+~t z;`9hk&NBxJZ@QI8y{eU!$z+VeHGd*_(Af9N!*2PrgB~H+0pH`-LXal*x%EQi_%?_0 zwinVLMKqZ>Nj@)>9@p7Weu7OpMk?QT#%>dbt~0K%5HVIoI(FkO^vGz)M80P54pc%B z@@_H<{Q<3t?RbH#^R70hZ_)J*FbY1#68q}bz3Z|KK1fGVV6J-~(Tl#b3jMQir%jtk zsMO}pa`WaOT678wn-eb%UT%QlYGdkI(w71@G3)h`oUi;(&Re}laL?e9uz9Nh7-$K4 zcyd670xj)Ag=rCu>}#(&Y)q4W*bI0vFCy{mZ*vOfJb53SUP`82aR_%fAmbi|L2rX3fxJDxd0&~Ts+J{>QaZMX+S&%PKwBVkW4 zYFNk=k? z>_#I!qPL%!tD#SRv24fu;|)Eg%6(g^awl#x@H>iH;g-;)A9NI{1#9`PFI^CFk~7qG zrkbLP=ZNsi;!T1iEgp5=_x#A-|5@JUXzNCLh>vf`0`lwSar5{SENFreu@EG?dPPdV zA_l>fQ$N9or<(|Qv6Z{?V9Hgqv3W!oh46BY3zZ?;Ly$ItGU_y=5DX9ZO!$>;=K3I_ zNrvAp&!C>eyt`iDj2)|5*01d3< zTg0Kw<5xK`b+{O?Yt8#N$2!_ayEB<;$;`{QV1AF01LtWEd9W+|%)Y~9HZf8P>h{Be zxKVtYZ|H$Wg-t{z_~p9=BqGa(khy+!jEM zl4j*oChP@N;AYg|Oo>{?YWgvoMXs63JT{!R!6Z_}$>%cV{iV)dx=lgg>QbthA+kOwF%g*tjg=M2HS|pMfy#z3& z?LwwwYjfNP5*7nA6?l~emDGIIsF*jbbl(N@*`%0}UU!ZN=bY-0MuPSH1!8RlGoEOK0on^iw;q4XWArp-ta? zeQv1K%aK`SQU#doGy3#;d31KWDmb$R=Q~Me_he82d$la;4kTTA1>J&5xuu^ew5u!-Ax372W;FXSEjO>PPpWbB8E$c?9Z{5Ryy?{>RmNUhfO0PCbLs2Nbx7ZXuen2=eGi}&y9yqpfWDl$~!hY&(FC$R=&3*=-l0}3laqC zkQTR~bGnpVUh)Jd_{MwM*k|5jD2Zb%(DW%ab$Kq!6}_cef@Ve(HD^vtK#qOrscM)D zWJEqIwXAwEQb>zP;~uiCLJZzs_B* z#ltAw7G-6{$bB;uKA3X>#j%UPK7Mf05X3?M7S6y{$L z<|ob5(GCZUl<_)CqILxeEDvqw(G~A1d+FkG=joqHJ(Qx z4y61Lk8>`1&q`UtBgQhSH8{Pgl$V!3dkKs_NunKN`N#W+>&XM6QxrbT^S&lFMv8Od z3pH^hPCHugHHog5S?0LZS$D;N==$x~W0-2T9_{XdL|Gr}MuOhfh}4$ypbDDrk6Q}} z{0NHr4J#wJH32Ku-%Af~f}3Z4%d%aP`|GuVlglM>Ldudai`Dkk_xW7naV9sMsrANN z4AnB9h*22%hv?Bj!w$3HB2dt+c5Ot8f>e4eUmHB;x*C0@qI6ID4;L&Z(?0xAkxIT2R3pwLN=nzJtFpg|E#-J*^C-)(2mX-V0KIe7 ziIm{Nf)3|#Z#6h30Xw!SXGAx&g^w`C*WIC;dZ~k@nDcy-)Yg`QGf$MA%oo0woqiDBu3VGKKy8g2$#yiOY73=0KEe^^K@&@fRY(u^^fy{2 zFn-a3lw%C69&B)*7X->RsVsO;H=UgR(`EWqPev>J(fP(5O4QasjwHUM=Q3i)Y{s-@ zt-W=Ee6AtzT2SNOTFUj;2!U)E>S@_0xnO1C;=g9shklq(`)%__pIZN7Q~qQE>@qTU zfI8fC&4Q%Yc0MS`8(PbPs_4GxGB!!NByDaBYAMt*#x zei2G)v-^>gTGuGkeWu1z^r*_Lts{tnx9QbV7S{YIR>UiA9#P zhsMXpcl@BR=!cYsKgAfxnAN@zfl`v?=hsF1xKI+`91tEYXnaUYqf>_A+o}9R@sFu~ zYXka1fgx*$4eKvGBO8|!^=m>|!#v}BT=M03gEJ4Wnqu7hqzd9lC2mS=yixgBVQ29T zb|U3_^3Ji*uLdD(zN1hEvCbZ={65eTjo=zu$iXY~PkGYwg6{YnQ*4qp7*S8PZ4lc( zefDVjj$CVEx=oLmqaI6sOZ}($>LP>Fhb#i)nRgq@D%#mU1$~j`%^l)BC`pFa1iTe4 z{!&MQ`Fkzan9*;T_sW3cCzYp92k3#k3Yjbl{Ji3ftl;hC{#dzJDyw%(*7!d`L?0D_4;Qm3!8F8#QJ+5!FI(z%PqgVe;6w(8MOZUf`tK-+qU5m9XY?MFA{5Is>7ln`178uvBx|gu5Y;SJ`WPsf56mOnn zHz?*kd<&$mwO{;CF6*%pRuPP5VeIzY1mol>wRa!ijDH>#HB1*ox%xioK~*0)v6V%d zk^qCbY^U)viDNmR7d&A5K?VWlDIMPF*`3$Z^92<=-hQ=i>=P!6wO+!b#@2`~12)ls zN(%FK^V|Ar^udB`a?|=f<{WIiT@`OK6&t|$jRjziKudo=6WxgW3-X)k3Y$aW>CRd1 znde!;t0YRPgYMsr`v(&3y^s1g9R?%lF~M@RXz9#z3;s(knS{yuM7d+CC2p;9xAjWK z+Futi)1j;Oi-;8>txH$mnF{Aiv{1Z%rPr>Naeb(w|F8PDhAV&a^HtVVKQD##9p7yY zs)kl)RA;#`;ksVe;3i)4$z8kjyL1Yn7~pB}OWzS<-kfok*JwJSH?f8HX5z5Awr4aj zuNdw9KJi^lFZXqdmG{v3Uh$ZhryTL0-L-z2<*UH`Tb`juCzuY4*% z-8Gu2a2X4`W?-bFI#qPTENam^Jp#j5Zcdx6cqXI;S>bHCZO|!+{qo*eap#!jh^R*> z`hhluL3U2XQ@bSH_!|tKqk!uUK|`C`BxyUR_ifH#TD=DQlEQTAK;V9ZJ4*xh_{qf{ zZ;i*x0|a!svt#Wc#sTy!_Gzq6K$PQ_*53 z{aFgbNvAh6ecE{jH|h~`#~Bh;!GB~>_lB5yl46 zVmCqWLl#%pTQR`3qg&98`plw*)>YOPYysH|>BjJ&3(*Gub2h>lXD%_A5#P>oX+=p{ zMld)2O4TJ#doc7|!*1Z_=g(0;vLG4f9S9Cv=9b8Rh|;#_OTdvAikquJhA zr@tYzI%FVVj{n=`Lr#n4_wNNeJ$d^YP&nrnO!%n8Q1P2?v8@O&>iP>8Fa=4|$iB`E zRiQ-fL+-g5Y+pgimw%dM0@~lnLA=BhU!^PGR#fX^nCb|-jn90Z#{D(bhwv?=De5L= zQ^r+mg376bp_b|gio)2lDJe6Pq-Q6cGs&kt1Dok6+*ns-1gnlZO^W)Xn(*o!H z54eNYI>mF1hsYf#;UJJ29l_>qjJics)PvDyJ6mc|4}x6L9GGmJ4cu%U=aFAKY4pW@ z_hGEoFxn)7BtBh{Som_{j)@y1*?#KacKpmiTJFV_t;mBTIAY^;J8tONova#O-_yAZ zKdh7g9z1h}hD6+FE3^Di9DCgh!^and$y{Q=dI|bRzFzkzPhi1u^iknXN$hQGNMo4JNn@}m&2v5a z?N=c*I!7x?{_|u-48!!yXORZwcEpat)D)%XB-wM~Z~bi$qysJJEAZlhT>4^TC96Rt zU--LN`?qBS&uTlxaW>!NNl9HgZV^q{ zxsAvB*~}W>zO^}wyO8_2UV`T`XUpMF{2<&h>TIyvih8Yczty;3CzCd26e_2Auvl7g ziE1HD?%9H4?!mneq=UdsNk9K2H&E1{y#<=zrD@U^;Vy0jDf)aWfKnIW*hC~A;)*hw zAT6IVCiAD3Jo#Dokprs*U!Gy#IC#M#oD;;cDI6s#k(4nwJsR9} z&xSD4MmB~P;zU?o;Qy?k+UK+&xol-uy~(2{sryiD>K)D0!5GZs%NJi)Yt!gCd;QDD z_`=v)n{65Kj%iLh^&X#cAIbNHVP9QQ@2^k`U}WGI9^5c&t1zWjG<`6x6lvZ|)~ks!y4yrqrf-=ls!tIHkQcGsI2eQC@QwRL>C`E4y_>eMkC_uO zFMli^2pHRZ7@(KMP-;Lg*>1!%8~~T%;rDZ}TUbQZqwmo(ur~Ki<%ynaRgZdg3Flpj zR|A!;H)?Nk?bp&;qJsYz-fV7>KZeNS(nfz1jw0V_J6vv95-ZeCM@T(PT5i57eh)G_ zuaf&U$r%@O#eYvy>#(|2UF_9!mA$}g*aQBJvpL$zbACdHv&#D_EN4Ps?2tm(-TuI= z78RFuy&DaOEzO~~$>fHkxquWmz5{Oz`KR}{cE2?em@t(&Qr z!xu|9tVIn+@6w4FU$S4K4R*jL^r=6gJ#GU-eTk@)yM!vJADH7mI;5#Q5eDRP(WT@w z-a?E7)O3%)>ms>y-@z>^C{@W$63a>9{;hmz6>f#;8;5M#+tX!-|9}=2gbw-hwD)E$ zr+%?H8_7}}NFuhN{wT)TVWGQmB0fWU3)IryB% zyf+c}?BE(A3@y2?Dwl-5@(?$LJ{wFzm95*uQqiV^lDP9C1ND%<#S-&;SH8XE^ZZWC z>el=ViOg^Cm6^Q%mtHC2w!c`F{>!CV%m1?UH%}1Y>iL&|hWKk$QN*Q11pPZz!%au~ zf2D#r@!j^Mg2FPe_v|ICYeY-)quxVTZlv=?TxSg9VgDdq@lrg zVEpBt^4gu$=>PT)3=apIOaA>B1x0=T|M9@vg#R_}0hjIn>1tA4zZ2heE3$KP(!?>p zSHU~ogko)8e51xQJsZ%we)URbZzdG$BV^h_(q<7OuWDkFxmiwY;vJ}-EQG(el@k-6 zl?99OKVnxnT_V6^_F1E_9!gpE+3i)tiUOsB3V5d2gXFV5HHD5y;g-JXX*xXnsgk_U zpW6dyVi*(g4Nt9L1HIIVTHPro2&;H$}jG z`$-oJq87}I+17#%I72apc-TEMTx^Wru0>UKwWy5D&9+|?MZ5w6M{<*kiz9t~*YS>z zkEw6p_FhRhI68Tf5 z-MKJml#Q+J^?)!I|CIQ6N|*%^DWjQ-3wb~ovu`-igCAxg+Zz@Q_DkXSB;Nzp%janS^iM%d(;l@%v$p9R;xQ`$<} zW}}EPP&odk<--hKPt@~9R8QgQSJ_fzVUG&V)`g+{{R!Oor_FGTJhB;W0<(~pmrs{+ zy%JDZ$VVe&wB@s_*Lr@twB?)+FY9c`rVa&IIK8V~tFCwtv&plc_Z?0bm9`9&`XBS- zAsbN&3WupM7oY^g*Vh+Mzs`kKS64T)S2I(tUl@9(j`w>6e-zpub~tTc+T6om+H|F@ zK=JY|P}|uB%yk5M(F?`f`=;d=0RxUbv)304miE7p!b?m{6fkK@0l*vA-Dy!g8Ug*b zcusY>n9K92)(zU$Q$oC~i#6`E`AvmQpW@Qe7$njOZv&R4<>`4JXdSxodt>oaB%PUC zahO(=&+Z4w#igy$9K3mVn7n{-!$%c1B|SY_ymqtLPoM6HKR}awfwKNsVSao|CU`o%nS?+ ztKGDwSAk|<0oC?XzRY0UCHibX21?SVrf@*fa zu9LXjSzBMv3uX#@5CBHjhdt-%TJ8*c!j(WxO-+9DT^)K6{QLMeM>5!jVfyKIGC?f= zZYHdvQlih7_yyRWN0BtHn;9U=>sRX_XJWMrUJQhUgupbPs;e6`d5Z#^D+FvXbKnEB z*Mqr$H+=t#!GG1STP3ijp;YlOpfva3@Q|LK{*9Sg!0&?urXgZ8!e|0U+?SD+rDtN& z{a;$T#1xo!dAaDyz7)``4rsKT@HDT^d!OyMiekZ?_SRpX%>75s{Fdj7{7y2wr>t%t zrX^GUBvJv2SDO&nOhC(Nrb{WwF>i`zosqCyZmIbI)9r)7Hd`>r9Du8dX@wv>fk65A zzwSO(Dd`x?Q$M@dRD`8VyL(?APt^lQ@LNg&-huh(mq#QdBzq&WsArfLdS2oRRq6lB zJUN_$W0L@7nJ|nj7I+@f}e5Ku``x&#H0?k+`2LPffzySqUN zB}8&agOHA)y9A_0x^rL#7+|D^7~;Noj_3RCz4Jr-G4Sqp@3q%j`&rL^mPT-}jJdfv zU=?KXy}qaGsSUt<0=qXUDaoam-uv3*xQ!aSH#QzQw_TvClazsDlKlgkSUdFpWLxvU zu|q+?2mtRS0DK=<(#@TnJP0Ha2vVuCOzq3dOuoLpcPS{YL+Z8vy*OUdU`|L&;Rn{| zf9#W4=f~_|01*5LiHWO%uY!UOGL}B(^Lb2&Ss*2*p9pg79MIX@uTOvOrNtu|p>X{2&3SbbV}#5)9^Wg0 zwo1v9WM}5n{b*9t7$sZi!fhIiblUJizQsU*5GhlanaeV}>OR~>G%3=1agN>rpS1kd zQ}jgauMZre(fpE{yqWP+acgOFCK=g< z)Z(~*k1H{|6rCA1sT_f&V?`)_02^%WMU3L>()*fbzUD$u)3E1H7c4IVRI82^vs);y zNyM*rX16{J6mZ6Wft7Bf-rXQ6wT{*aG!juCCEHofJT0o&=hNo#I<6^3%;bmT#89NT z1ZqQl&lV$A{mUe8lm}VWr#AMrkgHo4Vc;ILsDrsxsW_O2cbJBt(!s}#VEem&moX1TgUg?k{6xegntfznMiL-NMcHG zhBz{SctYF2{|M45Rc-V=cXfxDg=@|g8sr6yR$Z_>(y}J)4_f4jT787{3Cv0Ks3zh) z9v1L8CQdALK4@A||E4jEgqG(V(L1aRE}-rGz_fZjAD0l6))`OuZWlH0`ZHVpJwv&^ zx;~^d6cIr&aV|wRHxo)a(232X27{e_@;TWIrfChFRe1uUl7kJ4=A1q@ES_{>m@o+i96e-s7u8ANa3p7 zaXQ{C+w6mY)!-E8MFkLkj2x0BX&Q&oS^G|ONe9i_9hmV|!7!ryKK~LGuCYa4Xu|F< zg3NDkBU$X1eK;bQL`m|}yw55COpzXb+ zw^?Y%!WYU9rDPWZ+N!cGd=5Da)ZZE&A*S+s_D*{Zd@bRAy`Ry)_O#I?JooQ3Of^rj z9C8f{Y5pXzI9xiVB8zAG*|2!Oh=mp`V>8kFl%8QukhY&$ z+Q=etM6n3XMgLZC>&0Luy^v2-Eej5zYq{^PWbZ7$+;?Du(e}KtHG@e7;v0yL;U6Gy2;H}K8YJoTo+>Xfe09!#dwPO~jIO?cpx$6Op>JB35OvNZ zn5FE2t_1u?e8}?LyZoVvvEv=M{epWl{Qo*yw~K}%*HOA_{B$KV_Zw}I6rKo%m-Ol*uxU;cV9$I4?9m)&j$Lb#a|7ES(31!Y^e+XV(x6Yl2DksuMy?XK38vzd+w0 z9I?Wi$aOmFA+QA%L9B~F+}7=$4xYaUH+5=r z$3w$wdWV4x_I2duHkbKrxajPo1rfHFJ)iFQxPwAk>ptk&kPuiUPt8O;bIaD>Nh7Vs z0_`dNE|=Apns}8m;h|URt}A-OhrU^~Rz7{_HO?dpEcbOxB$XA9^(w4{>yggm6O@ve zF;Lex3tIY4yV2Hg`WS6)T9Nv7;Np2kp+>G+WL(`W`r zZbYg2T`kM1(n2q)7RO5BqwUzK)_rxlJ|{*+Jq`q~-R|=QtzZVZ$n8rH9(QZ+w7?#_ zCV#!xzA+bYekJnR?fD6X&EpfUQutJU-tEF=U-N^b8PC^H>7EzSdK$(Tga}Uh)$JQsBL!u*Z|v9>cYG4~?f2Y&au#c>pTUgGVycM2csLx+G5f!z@vXl6 zuY(70lwpcIBWb~Dk@R!1%b+7ca^gtaU9gQ<=i9CoA{fq0A z@YX;9lTik3VTooz%-Ig#7MtHukz=>^4_jhy^$kBoMjU1}KAIv{lm6&r`>nB-232PR z35-;Q6I*5M7v)s9H|y#97S5_TI}QuKfrLkS++X0r>B38duvt&z|u@9 z3DVGCF{fV7r1*l8J*NUE1&bB!U{u}PA-2{mjR>o3T#;b?)t+{x=S_R^zSF0#8xV;w zsiC)BNL%sQXJdE<;tIo?Y_I4wyhy4cHGFa~Zb%6qN1AEd;>F$Ki%g{L$S%A@@;uuu zzRn>p(Aiy_1d~{U_ESORKuU(H3l1t5Of(=6b*Wvmi#YDNJ&XKS$4#HqiRN0qTTLQB zYWTc2p@O73jfNcFNR)YyP zSwjv5;{~3xsUJkJhD{3BW4$D=QU*K+lOhKHa@X7|*cnK3^IdtR=VZ)&Gw9m*h zM>eLsIET&+%n;42>4Rsnb)uMh*unZi%f|KxwEH6DC977jSeyU-hPvqC#vbH}**^sX z@GTvFb#XGF@G#H&$-`3?mdK#tj2494wEtzz)m`s{Cw9!j~lLz>8i{fTs`G~QeF z(+J_e`c&;)nRm~g>0r=_QY~5^z|KoEzCa{4O|+3`ai3k6)X2U@3gD=3`pr%#4UH<$ z=p?T{;*d>Jr!n&FwY@as6{zTDoip`>Gw6#3K7wmn>$wflDL zSGSNno}&Q{Sl_ZXb|l(MF~ThkTEfk62rtd@EQRk4X01K8pNdl#D9r*W(0A~k&99d6jh8e*)->hPpxo_zN z6IPEUO@G`SsG(N_w@Mb)w(^hA-xN-};5mExZD-rkaY6OWf0*l38ykM(BIgBa^FgCi zf#OAmMjfiZ+BQE&Oom)&6ZJR;C3YY&d3pNtG;4J#zk74u5tCu2F;sqaBnXkt(vEQ~ zb`Yv;BG2|f2coL*<1emt#;7 zf8uqY#dYD9RzW8Eo1C2#-gj8!H~AEU+Zu1993pIFUL>$IxRINn0F|4epRRlBjLLOAnea^wvZkc_!xwXOU zCz$Db%gYvaFIni?dDYI`5fX$q(>xhqaj+vyoSxsJ%fSfGNyV#xi_FEI{Wevd%cYGp#~nF;<9%{$eV1EDcG|u(Z8KI{JooV z|LOu{Y1e9D;rLA2yE(Is3#DH`V$OP590ECRYFUnt%V~OlI@6-UNzs6B{Rld;##L|h z^3EGr+Zaf+wLku3tm+V5m_9@XGp4tESGIt>iK>XZu~`tYJj#9Nf;9O4V3{dLtgPCv zs}CZl+MSs5kb{GlwRSiOTs_`$+?sm}X1GO?v(?OUZ)|^IpivrE9~k5A_)5Z!B7UL+ z%iCTCX-RziR$?(bPE{eIU$=m8PY>XbTie5nk0cZiY&{O__j@LAZ&h&4`guw5P@u0b zQB8?;plFA>A`_+PY`0%=3DWBhB(S#tqvk6$SBrzQ(|W;EE!mmhi!=l-IPy zZhps~T=m_1CZWwxWAhhngd4{k_T0wEpCk{IPFg$s851s}5ovRP^O6YLj&Wp>{{*xI z*QH)GbYIl{nmfS9D=CB_oyO}%smKC4+wI%;#+M>lK1o$5Wp=+L@H3WKuv8nplrrDU zb<|S$Wj{a3U2bhqvS{dKl}NT$f%mk)#`$g4mi~z`JJV<3HDWI)kRX3O^6d7ZKC@2@%` z&8Sr)Pa_fST*Bl!i>?Tdzx+A5Sa1_b}JEA{I6u=(f%L$6!`@L2XE~g z_?|O~6Aeu3ep<+?tw9Tf1DCG1@|cy>{AMUJ_L(}q)voJ}LU;!YLYv%q)YibzP5HPB z9K#Z}9Q?)&N%6%W)Ig{hX>8~r02yH|T}JNVy7G=_obzt7`3I_bUiiZKW`f{buKYjhzWayreH-%N|BJDnL0I$uj(xR*Ono1}*!`G$+)pQ~xkCOWut zc?1+T^UM5o z&SJ_dXyFBhbMZ~ayOrY>na}{%16PQ&#$H#V9!gmLsRLVra$w~230j6_r_W01&?Djd zhZqd#$M~d)Rm#VIoMrMgS>qbMRu?a#o}E^Kr5wHOf@2|n4r|R#&)iXGj2HY76MC_) z9~O(w(;qBIb?1z^`SwMZ)z+nYQvUq2ZeXUZ^ddve8)=n8h?SY zhtry|?G>sLawlk$5Eb_|y!uPP04Y6;oBi%ICc7>Isg}*ufOL>QTZs9E1w(2O= zJt8eoOls)jkFRS0Kl}EQh9)0=)irkmIC$ChYu;;6_VD)BG%}LnvK0{#(U?o({!mG$ zZ0`5_=f#;ex%17j2FZi!3QSE@-_Z|UnhIh1bJw=knhodK(nspF{av%sd)+CSOL6h+*Qj(wu)EO7d%|+8|Mk zW8HseT=fS7>pvdk`3PXEbouUZMSd~I;;(=8G5~4|FL2JgbY*k&`B!oO&-X>H86?-Z zk@)4af1y6$he+in4cm1QtxUi9p{hIdFfV7mDcMC-Rdil;{$O5v7Qc)?G25z>Yj+$A zND*(6FOCj-LSD=O2eE=&N#)tPwW21`p)&ED-P-?@Z^5^Kl(kQg9|u2M?p-v8K~1c# z0~^_r``mY)wjxfqb@dB0RVDkhjnLv9;c(F@J>DOR&6ebXLZZSt#EuRRPrBF%g#R9T zqf}Xd*Z9=M)v$63JQGO%lch<`tV=>kUDLZVqGsbQjc#)~=1$zY3*>L}^be*-lwF#{ zq87&nC+os+y#>i`*a_EFIck9uP`6+BH%8}wYj4cz7M_hXV?H9!CVVR`q?)?1uAv^s+_W&ilu-w$tG24MQi~d#hYc1iSCa1n}WqT&{0u zkuwyXkma z*)%|t$6lGJ>p=Un#lUt;{Z-qoM)A*kKeuOCdbZzF@p1UVn$!7r*+~&Wtc=6gKvQw+`M)qzl%W`x|3kOfd0pD<-pzTSZ6%)jPuAlYEDhzx zJ92jYUw}~2Z8kTmgA`5+hu^oG@=VweiRW>A@ao131vMk0=(;ioFV%CGq(0cdK&#JV-0g7He}b#fbQx1{phh;H%oRFQRt-8 zf169k20$5v4xY+8#K`Ta(RK=kRuaDQ14;VZ7G?se^!$SS*lzwI21fgo0aboqcO^^y zcNu&3?&R2D{#a~v&lY=^c~4(8e;DPL%}n-$n%8NXL!;@+4}^_>X20h;Jd6gabT**o_dHF-5qIQ?x z<4-*uV37~rfP6V={>*3otzb;-;2X2j&}R2r;rl#I97;NhslJY%(2NSbH^-?24AYHW zoX>ZQrm`QY;Zh&h0$D)(tW}im`qDx)Vsc+GG+KIu`01I~6( zZ=s!O!H)E(WogmFH|v3-O0ZXRrKwXdJ{)D2R+Gs3$+q#ObGy68Cj{9W75MJ>i6iyh zch#^-ucQ5@8rW}PRQ(hGRvikr*qGMLdNN`|dZ&80*}7PD{YcPBJvTlNW%fC%H1?)D zdl_lM&`sfY0$3k^?GubB_#60Fr_RYzW*yiWL42N!m*KEd$^I>-k%ey3vJvIJDjcuQ z<#Z$8xF#$%`st6VvzB+=U&WeInBASy>~J^Vv+aLg7FL(I0$4fh8ae|159RP03Y>QX zD#`zS0{ZgJq4Ct3*T;fSk$%~oV)wN{;`C=Wk`F>1Q zWP(bjSZC;_s9>=RkO*)c2Wzs!j$OMdu?W(94NhkdpwQ>393LtB?slNta$kWNkL`7+ zHB*NgU6MvPt#6_B@vs^29ZwOBb%v-qMq*qh(+O_|+PI8JEQ~_i`F%;^?}?` z#{hQs@>Fi?t(B@`r}<;+a?H78A5>(22pTSV;Eil9o!>mGKC1L+O?5nNEPfEkGa0yU zd8U`mRo)ERlz!6hD>K@-NKB^DqJ@8IpGd&7K(r`HXUlyt|x}!ND1^JkK zMZN7;tvpo&PRVSb(2!DR+!FEIqU9QF_8e1|{)`RVTO7vV)xlo7Zys}cITMmomCb`k zp&>7gnXZOsV6T;&u1k0B#|m3;jqQ`QtlV#oAK2MhXDF#jo_Va(eku%lRqL;YK&FBfTXM(T@?b#*lN)@~ zPQSb!B{#4s%C(GECyN=eB0WP&upG9_HOsms%UCRFOX`U8GLOxVa1@Q^#+cn@&}UUs z5G{2~JggbBxU>F1lfhr+cQKE5BU+liVpqh{U$cKkm0ia#uC^2G-F`89)TEV)g}K1v zH)1y(n7;INPyK;1)~xk+$$_Nyl0{X-&Fu~tx3LSXgcKXb@i*@8JupPm zxBs@`0}P@azx@~Kx5V!_EZ+q(#a>XYu1t{d`c%Bz^)3kqgfKV6Z~gwqwEL3M%cNwk zYoHSi_$~*$VYuwa?dJXFpizdq1Zz~dM+3BT%RFGL`4BG9CwJ2Yp{Ok_JSe|jcoQ1S z*Sq1BD4r4hRn0xoC3T~j@R8J*y$@DU{?iltn{8SP{iO`=^B;Q|8(AMr) z=>5%|daqk)=AiaS?pRDjQPwJRhJIJYV=7!CEr~e5=g3n4mZaEFGUeNDiDDKT>zVNi z3MKV#BVH4WH%U(P@ObLEws@1lJLAW7!G5$Zaw8*IUVFOiA7X^IVQz&R_%uVx^bOJC zHN}EVh2n|#vEJ04s*7c?Ao1WA@hZGgIgmBzGn9f(6yR3OiO0Lce*kqlVhF#)i$u6i z{&v9b_u;{~Jqc+Kv$W3Deb+64E`qIk>*mY?=Wgw|Yktf2mu_=~zojKcAVqa@4Q&Ro zyZ`1lrTwk3eq)e{Ko-QU!CS$*NM+fMPTZ&Y?n(57_J;fAZnhRFZ|aXd8dEj4tf~vR z2&OBGM0a2(7u#21rUYw6_Hons=Iia=1qgRZ7dt|4YS~G~H)f!e<|eTu`e{tgf-FxmXb8#?y8r z|I0`~>>F?h^D_$U+^@)gH)v9sa2n`u(^N5dZ~9SzOLeN;XIv_}i1&}%+VQC%ip>M# z-WBi2f5emN@eLRbZ;?Jdh}EMu?u|Wg8xv? z)=~L`)>>w`j*RjQMtig90O$Dr=X9Y*;fJ7|aJGJ5{*q`X_= zBr%P{uBc5g>uxhY4jkP6cIN_4C51j)b<2k~;G+UljUc-V+9Z1Z3DelO(d{Hw4F`j& zJO*tBo`5-}sxG-D4QQp3oAE>SSg9eRRy>aUItLie$%SonM z*^Q5UAO1(KvVYSXm{ovseALS3-hC^3JedX&sQ~Bomge;d`;Xj^muZECBg=O?g*r4$ zTIaK=%QU!E3iT!7&3hwzWg;W0e3$&D^Yy!w4CXeZ%cN`y@T!3M^{?<3jzf2q86|## zz2Oxu@4!KY_g?Qw5I>Y&r-S~Ywf^j52A4JAL0IX$vTk9ZGaX09{*yGgX{MFAzPjFB zo}tZy?Lpc8A&co`E?|&vZVcJl_WIX=R2H{&OQP(#@cUR(HCX(ik%t(^@YYrc!(fMV zTa^z*_e(NxyTUDZmsyHKB@%RgCTy6TE_|4~^TFZ zC39dp2r91(@b<3{clJg56N@foM2?hWrwX(o8ZaqZ_}VWzQbL?VIwDbsUaiZL<;dcF zY&dGuuPRxfWv0O-xE5cg8JnqWSurR?ww)y^mAiNC=;)f}c2*+w=sXTHuxQf7H(>S~ z_acdx(Ve$#pO1MrFaO%STe>MYEAel|Og+pFeUB9Z9$=mlLz({MRCymECV(60tiH@( z1mPY%7WC;9qwSiFw{Qs|H|}*$a+lnl0saOgVo|hfWBVa__LqM(B(XO~xXDf{o_!ku zE`WqLIJ{)KSo6$2UGof)4KjxN1R0-sGC_4e_4t`Eee~U-dojd7NHQH%g+o=#c6NXb zZl-H%3M%1G$GK|Vj6a6y$MyCJd~7&wmc%|i?SaOe526@ke9li8p$F&pFU*bX*K@4% zlT+2F_7)`#GS(ZALQoikqob2X*QH6XMk_L)wRp+mOi??dDf^`EOxJ384&m*878-KE zu+V{zX|X(dC#l%BpX0lHc2m^E`dC?j1R|MzY>%`K3Y-Z-fiE4AA5O92{ch%BRJ08m zW(A9b4h{^Da|-dH(99hvh4j-n>CFpsR9)?oqoqrVfJ|Z}APK#W1su}NI=S|u1KX~{ z_QM%kOAI~qVXxI%&%O>gPzGSY2#8C544nBznu~uFYpTLJ&DUPBbQsZrrSPHONG|4p zFxJP!Sl@7PBU)SiZaLjCL#!U975EJOOX|*>gnO1$)V$VVnTY8G(Ra6FXYRN5mfJ)q zpdAuA%;sWJTBWWDiCVCofqye+ks<)>m;g`{gDjy(8QCMIcwF0+BeI}vh;&Io+k!^? zT+Z&We!-I8r}=cVPyIpf=aDO}7|kv8KAgbVLS`hc!Q#bZfp6`Vr(R5u-Y|Rk(`C2* zX$}@p+{3o!{w>X*Irk%Y7p7L8l^?6SkQwsr3D{Nv&ls4=T19>-G2j3i9( zy*c`=M12B+lfxpV*o~8Noo}v-4`$V@ryzZ_=GlHZQ)%3UN%WtLl;Tp9sTczNJV+CQ z{ao}iMHOTDFOShjxgFofmW`VAB$diyQjX$p;|wicTATL@tPXdF7hjABY{u3jmZTzg zcLBcR56{z4zbrKPYj`kCI4pyQWF}a$IVjXQ=ln z=u(2J-nQbqQlEC_F11|pXkN>1_$|zNys#!|?&6a+;+@Sld%K4fX~p#I5Q~DMCM~0U zZtPeht^rp&@>q-ntu`k1>q+o+8b|n)#igw2olTuq{!#kTzx3Zk3Z=Xr+I6x9PtX5_ zz?o2Df^vHnHAsx}U$L7jGhv{41G(G=y;69#r5&2(%i*q};FoBo@&v}=LkE8I%3V2w zV_6@DNvkEWT7?l#eJ#Hz4yh=9=E9W_{%6hXDU6m~{%<|l2)a&e^f0Im);1X^ceaSL zD_(~$RboGgg}e*re^xk9dzHSEVcglrLS@O5(L%?7F~SY70_)z)+YVf=+DohoI^M)b zqmNrn?BV$Ei`hkUlzmwMUGMzy=3IT~plGwkZ}w#;d<=qv-eK=lQa3c>u%@<36<%JW z!_>uqyGQ6@!Cl=uwEYSls9c3+bEO=;r|UXS4IiY!>}!|JurYMRH^(oiyP>ov*@Q{w zsQUG8{5eH0hZ;VNd>PPy`1%88`0rQ;Ftq9N1x^xFSqmO6 zDEnW954N{*oh01!F&xH~-o{yWD`}P#g0|vH}6)Ij~-$BW~m@nz!C^%E$!OegwYiiMaDN|ZOp{w2$fOQBV*+%T3 zZdBpr?6?hLE32{oUh(8!b{`cWfF)#0{Z1&unF?w1UBbdHLzduH;V){|f*E(I$%gmW zAH}zDqGNkYv33kQ;ytJheG8iTZxoQPD;q)t&(Azmb^u!I!*-}Cx- zy$3XycAGfCX1tEQdYNOU1_`xZI8vI{%>QByA&#mn5A_emSvqc5LOnKbPl@}+ZFr23 zc4o98_DSMEE(Z47*Cbd=`y_Q`#T7eY8+-27)I}*~_+9MI^*U_&9L@2iQ7xX>+wz9_>CYLyu}BIZaO9bpp%|H52r`MChu$ife}ba>ic zA3^g!7akPy091lMc2zL4>#f1+R3lT}=R^JdSkZy8cwcidYLOTtH*x< zlsev>)9WR#L_|JsemI!FFj-6>VNUe6%rdl0_Ih8THdNZmX6E~AwJf_0Iz71KM_yRc zdAE6esB?I@w*l~h#uRN9KQUEFDG4@555AQ&kRqyvcs?c9-c87-BGPhAr=MzCgcTHk zUCi%J?mVbiOUkyN2NC5DY znOjJ3mmlvO#%1QU6I&rDNyzM&njrm+ z6yedvmh7q$N&fW#U&=Dca#hOcp!R-yCb>7pzc>?helr7nmp?Ew{E^8Y92l59iNY); z*}^~gw7v+NZcds-B?kRVjh@VVIsDH_@qx}Vj%mosh}dhzN!}db*20|P5)&u8&{&k0 z3o!^uV+!!8@mF(U50m37&$7wE<`85RHaFmyHiCLjF5>K1UI=(JC+k>ohdQyuclP({ zw)jjw;E??bV>)>P_lN+td6}>z^uA9jb&$=>GZ!5I&QvJ5DGYwD2UJ?+5?z};-HC)U zXouS0@+~g`1xv80hCs%&Z7%tovWp`54i3BlK)xB`$v)JKDzO>CUHus$mb@C}9)ZG(FMu)eujI9OMO0c!QOioo~n zPm5%Kxd5&}?*2w)G&J5At{{9T+9B5u4Nx}0y(F1mR_`N4?+$0)$Rnu`uS)3qhx}P( zIr8tJiVqr}E!s`Wdrg(!HNPukL5J8Ok30Tb;^-TCMw|ViFEaN-K9N~EueHW&EPyw% z@XVvml`h1yMkmSd8pGblJJ5>ivx-9F+-o0IVAcXz;vzgpY=;{OxZ*1c`BdNBfrvGF zm9RB;om|*ihjuT8nST9{Yks5pQAXz^B}C|U?lpBSjLWRktjwmNs8|SKe_nW(S$GyA zflDdGZBnW0#l1Pt_zruh6_%pOW4)Hs7DlE9#D?9tXP<~rLB!w&a>>c#$=I3JHWtM0 zJ7g(e?kjwF>^NYRwKgc>u3O*9`P^3Q-M1FPbnDw3Iy4Z~vw76Nz6XdtRKVGz`-h=+ zQ5#SK32MJZHRm#24Ycsl@x_Uw4Pt8;r483mO>b^uG~Z zxBB3FUJ7tQHq?~pmqwYC#1mTcZebe#__qea0Z~{V6Ps7bmp71NPk&S$k>7eiNK8UI z@FE$wjXT71YQ| zIkWE5Lznr0du)w3VfV;6Ud_CvjDoov3|4mo=3ohG27 z?Py+5!+Dp~_C2+~&l-X8w1`s9#`c|Z%kqA0ppb1DD2_@WDiw?osQhg29X6{Ny033D zFJDoJWe$&=s?ymVS^{dDMk^&GiWi<_i&Dc1D4mv{zT)P8E*IV6{c!5txgs+Bbdyts zg69kGndFEuOvPSc|I{1$r3uIaz4>lGM)1CG`q-5z{;QMyz25I%ekn=P?VVpK(2B9L zulAsp_guNf5+szej zIZwpY1c;Wz_DxwhS}p$Z&el9yLPpZt=YQvIt%o93!Pdrx>Z((D6sWQ^+ybghj#Wb; z*Jarkp(MS8w`uM11_Z6LfST!%M3q}>*oDe&-mtY*FL3Jxg3YXn{0E}^e(F{`wf*02 zNFYfCE~mL^l?=5w>#iR;e3&pvEE%{i(ru*!*atvTK2k_AM85eCW}gPc0j^8EGsPDC zV%Ozck( z-rf7C@R0?a{$0|%p8U^kW)&2t8?Gqpo$VL@dE)tN)KlT>$i_VfpE9B!&(?ZAspMS- zqjx1Gi_Uhht^^=f;F324a-Hf-%vF6~vF(_!U$MOAoLom+m+A*o*do7#HXM6J6Z9qy$*ld;<<(Fp6=7Fp>8rY0BH*euh&GtYQN0 z!~Vnau?PK_17auXoOm-5n<)+m3}#i(>-$Y>mv`UT|cJXdAbe!FR$m0x38db zA+f{DNz>(*$CEEin7)4gclC08N7~)Vu=ss8cBIao_TL0~W=Fbyh{`Pe6-Uyx6u*RG z6Bhdv>g@sh5bRib?5jxf+T~F8M$_%*or{c{6_Xxu4|>OOAC`VqB8*_Ed{FI0N`Tvm z$E=`s>u&=CePKXijWR=0(S;>-TkpWan|8*L{rf*(M)5=kl}#-O$w z;3Dh1lSp8%hbe5;=r#R;;8t4MEuJ4HjCm)>Z%5Lsm9gO`lYHHEargNiM%2UPl%Lq+ z1MjsxA`BSy-LQWRq51{T+#51m7)S+on-CBex>5OBZIxSXci4n z9*TZP?_z%nv6HEAtYkE@=M{8XUOD}>q$BXw-*rwOo(WK&B^~n>D~ifADIHZZsEb_H zmq?@%yD;|*1Z4T{iXV3&k4DRa>7wbsa{JJ;Fd{!Jm~|iyZlt#VTh&TPQCx{sA_t2& zFV4_^4yIv8#Be82B2wAeqeEe#IwPzt?#$;`Y$4G~gh)hy+b9#VI6#@s0Epm2nr zVVaire17}2bPQj2*8Jzgl?cczet2PfX*XIn^c^A+T}|9x=l{qtEL~oHi~k9Uxj@E{ zE+@sHl>n>eP&tzhVRUBz)_#0(&~!wU5~EXH2CzQY>DHgmXeT=$3dbDFu;%W=2Q8-? ztj}g!O8z7aQr{u~y87xXOhx_xbj2!xroI((JJUN}Z|>~m5>{tT9k6*;CeDiB`-Z>(BMM0mDQfX6-Qk z^d$EM(67puVCS+zzZ4i3&{{Y;E{^rF_z6r!^^)O z9?%c@Me?Q-?|!zm{qN!Y>mikbxXA!glUB{c5)m3wn-V? z-?%yha`Cn1+eVjEHpRrF@=+#I)=wM5&V_vE`ojM2Zl zQ=j7c9o7Pf_JJua+wuygTDgAg%a<>^YvNX`77@G`qE043HyE#6X)(eKUBCo&{S{oX z^`rU2Y@uxVHN&`q{n0D@TZMcM=0KbN==X{M?TL$m^gYEaT3jICMnS?7FO=`@%xhp+D}LJTbfTyZlBuCh@1pSp9i%)`M0)~z?%Ed z6ph@b4{{p3jEadN9KHbleURr(_>vvrtoImk%&?eMm0rgd+&Qx9_U>;B9j=dmdXhJM zeu5usP&)a0z{GME>Q8SVy)dxt@2*>CDggwi4iN4O&_A}v?3VC>VB>1{*;aB+jz(M1 z#qdDo^XJc@1Fp~Hx$#0}L4fCiBD!|GU>@S^JUj&@B{A3H8;2V&Yk3~QHmt606c!+B z3g?AwNu${-(^T{Iv10$7gG>`;Wo5*9+Saw~O~UQ6-F=-e3ycc*N=;uz(lj7g-E;_v zV!zhQH!?i)$z9ec2V$?#x7_dk-4x7}*S)>faioLE@WoT0pDiF9$gmoul?@hcTyW{GLMG-M^V)sB-WAjgs1tOMOggn)cmcE7xr>1YUxqK4K!`6%f=`|To@6@k zS_nYeWat$yFl#>?gav{x1B#06rK#uytOzMSJlt+2kv;*HPu*^JtXqhfuzSeHh9BRH zBkScQES$l$-Fo9T#j;luRy`oQQaQI{b{u%J5?OD^4GQ`l&PYm4{j>AkZCCLuPz-}q z`uFeOD=^Y$8!SadMWFii6oaU^I4eK{;I+0kHm}|Iqc?BfbnY4eQV93%-2=tYiQS3p zBJ)}TZtOqe;lVfUjw0*s>Dk}wWjp}x!sECAsxIV|l$2g3KubtVOG}W2r6n07BNVu} zFXpvP1?q|FEC9FA#-d2En^MCM&^QcZ$!L zHN^qSGZmQDlhxbkojLsWnknPwbG43Ly9N*|qNTuNdQdnX(dv7S zGN36E(?_gLp|L1 zbWG^ImVh^U^ym@jGaxE)xVw;%CE;CV)`bTW_uf^_kq+$KovX2@L{60h5NLt=;m(}M zcB^yiX~g+?07%?xTM2MNC&0X3&o34*uQ*eN?rPJ4P2MQ0g+@Ct92he4J%3RTfjE}!A0~C!aFvN7C?bbPgc(NJ7j`f#kNOo>+tD~(65MYqJ zKEIcNFEB{<0rm*8S!fixw#VGux5*qj*dH@92LTi4+LZuoIVb3h9R%327+}+YRYa07 z!V@*5u|8`RYtQ?@V(G-(-U1r~N=(-@@_##U%wwvPY6w~aTO2{5c4~HG?2oD z!^FpzVAd7!ZowOn{Yl|Ax+VMM2{y3tNSew4FFZeQ2wH`~e)jjT0-_lRSiB4#6E}BU zhI6afcI*DW8z7B@E$iUG$)XVR`Rms(K!FAa=;ll%=4LS+c&#X;Uri8_mPVxzOLNc5 zL`&-)W8fhfXk=t$-fe(OG)o;&KO&HQ{rc`V#dzW-=(^k9N+cupwZ|a|`i%o*mbWQ5 zLG4a;?tm6h!~$Z^r|;)atad9%LRJ>NSI!i29Z>lIwcFLW%{kV+G%^}GKRv*z(B+Jw z7GT|$&VlvM2@iZ@ zYEd5wd8qJl&tybiVU90jC{2|$K$=lHhXlxyA@g0K6UK4(vKGq4DKfwrjExZqBuBkg zbvIIx*n*`0<|(=0(W>k2gQK}ID+ntHb@9aeA*zKG8d0ZGzn&?DVEp^a!`MUhm_}#uS;04U_G~*Cl2f|Au@@ ztOLLs6$pEhF%L}u{!U3v&2fugUS7ZY*KYK$mDQj&8Bymhi`&aZ9(xyy=?`D(A4A4g z8gbv4n@7jS{#bDV3@J?D>7bRn3*^T$(j}atg&@O+vE`6+mwP#Fb=2_#PkR^H(*|p< zBIJ$!CMH9X009ihJ`;=QE>?~)dwwnQfZS7R*OvG>KXIUE2myI+yh`Uv)XfM+uO|A8 zAq7Cb3P@FetP)630fX%z%{9vZa8kyA<~oK+P1cKFNXsy`WomSc8qH&RS3EYoZ?Gl; z2p0i%XbAS-G|K8p79%s!3q)j8-#g2<_(1y6b4Qa5PEayJR=r94)D4hFanq@+tn7GL z^(WIL`tT#{$D5mYj1>Q;xv!3j@`?T?L?r|PMM4@uq+4JK0Rg2Hl!4>P?xJe&@2__8&2c{`j z3QWr0zRN~sg>Pi%^bCyU8`z3Tl)MRdswXKl={uH@?0@bibP?f*$v3@ueL$a;C@ZfuUQf4yFru{<+Fbmlo{I#QReHLRHVuQdQ;=^Rk)w zRfkW&RtL_Gd~w9U8m-^Pvff3eu;wi?9mJ}~hi~r|Euh@Tk}gIL&E~@Ro{v$kJ+jJz zzqg}H7aQE5vPTaFE)j4kf#h=r)tOq^5F>n9(~KT=yf3|(qT*^hD{ZY*)7_O? zgMz9vzsfqP(>+b0_50(xU9*riZJ~c}{io&TE3P^X4Ls$qA#AEFCXP+p$S&{jOibC_Mfhe zKTTa=(F1R16!VTK4%nD=)07jJ^(fYlZV$hGtwT&8fSzu_;J4$xpJefJ$o1)wPl~Ah zytcU7i%0p$_xL)jW8I;dh6Ijkpt0J2yW+uBQG3&9G4#uXkcgXKeLvqmz@Til4en{U zEi5J|DrVwIJnK7Z{$0+4D+HJIkmX<&(sMLi$l=H!IJ99fVd=}cJ%sZ=-9)+WCf3H( z?FUfrspQq;RGr~F;$rCdv^RjQ2)t7LX4l7zc1pW(lquEL`DtKTgFDqY)`TaTK@V-z z-q%$9vz@!s{6r@e2qfqpi-@E^&rW#kNr2xL9i-z3W(qh5!0`mm!P>#xj+0gOBseyJ z?fD}&H@B2ONnVrnK~#pt;m;r6Z4je_1ozG6eJ{8o*DSY4Gy`N%ucg{r2^KPtqUny9 zmru{5LNWM9?*t5eJ1=4#sSs;x!(!jLL8x0^^WYpaVtZ&Sy2#<2XfsYYacCpLbMo9^!@DZ zPX#RD|9}tfWP!`sUI;h1fo)uTTmt5SFR)1rZq6rFR>7#fky%w_ZSRz*y(Cl|eh^r< zlxG^3?(hpjT;e_SuP~^I`tiqh1LMJkZ# z2>FXfHv0CM&Y(cW4dr)9*J|44WZ?KR8Xc3{qnm0`fKTe}op7ON_fhpHt9e@I!;Lw; z3x--r$4_ru-Q2d3@O#XYZId3v-S<~w%&4x*K}gePfl3pompi(W+xs(iYC}u#HgySl z`X=+;`NG4-+jFiremLB+isG(~F7k?UJKX9z%67Ng9KRXSb}yG{U-{a3Ud{YFOJQKs z`Ml*rzNGL-lII~x*z z*gY|dM`fw*fRH#an&Qzd!!$U$*DexejQ@|(u4b@s#w&szV+?{>m;Fd zjm-x43hUA%cc}8&9uu#}2@67&QXcVagCpU;gJa-7JuV^Ua}zr?iApj?>fJ5rcPf6p zkMx86sW@oSfCs*(i-H!M({QP^Z)xz`d<~L!AJZ)zK6fShS3B1xO9`BE;GS3#b~L=S z(*{FMaL6jGqF_!2$=@v=4eDP{-_Rx8(VBEC@AO?`zWFWx7)Df>P>?N8Rb z|2>KkJW3k<@8Ubi%EzX&V|S^Lzndo0Ncw@M(AWQCo75mG=_CelBz702#`#MSkCRSH z>WQ-colf|F4?{n0#di<y=R&a_)eowtSH{O zu{iUOkJQ-kIi8=>p9H@gX1+e?!!`~hYa}d@ijTK z#jk0|b{nX5c3Z9ryua7kUgejkC5{!F#1ocStlBNj%9^T02{!(u1;djk0pL)ao12rC zmcBHr)6?k)2nk<+FTi9@A5g6d4y7^j^Y<%0>W^$UVAVbzq*)R!`Qh7eSg3!_4_$4!U){#blTG9g0Qn}*KNOl zx7D9RVo&Py$u7d^nap?@T==?&?Jf09_H9{WNNF{14`UFJlLt4*7+PL+~_-b)YDt*hL<&ky5Na07WGFf?f&0B~Z!s|W9ig~%`ZoU+W zZ#)tit{YI;(y46-(gg8)o#EbMxVM(8r;yxd-5iaRjgG!1F z+c0KZ68ZHmzMh8MO(SeH=j}gPy{+F5S-(h+53nTDk?C!pga|FMNM5+zZP;9UkSj%g zZF=^FUn)ToY0{migf3%$rcBoOKeb3D`pz^Ido3!6{2u95GYqEaSU?=kU{+RhTe1?i z1k*Dy1@?+Ke}3*7?E2oAq^4|vhd!8Z(<6B>;~+6p9wAwu%S>Ne>o-gvY+|QOq&AAT zjWo%iZpn)ic@6QPQA2co_oFeMw*6N8ZBy1SV1pmBH#0I*m>gG^mYny6u!XmZr>JPv zoO9qWhjN&4vg{E@nbA~j9#5(<3{0btk_KtcD z;*MNU@7K=sj&NL%P_*V%ZhguW(e=&j#>89XK*UhPHHzSkZ_Q`Um|~-z4_VrLd`ORx zZ@+Ah$M4Z<1{>A(P?7$*#tkLNzYlIj_TrcAjBhq;HtQhmLRVnZ56$mB+mbh4UnV?= zTGPD%3c%M|1J7p)PGKF67baFgklAsO~{cLQVSC%(Bix zC0gxaq+KIAwUW=&wzD|}*YJ(&jv;u4lox6uC4Mi`TK2{cUD$#(>A*2hjOvH)B=P+D ztkqM$;NVBX!onkGVX?8&Zf+3Z*3f-#>~ogAw;>tNA;tT5T{**Y4VQ$r6pDG39s{1FQvWA_$Gd;X$u@kwd@sz^J$EUJ# zq4sIOTnxj`P_)w9FJgzegdJXswZflpGzdl!M&UN<`4<&KqcvYnZxXtQHm6yB5o9`T zghUlr)l$EV+3RGR_N>11=N0omF2K_E`JASWPA%C~QtLWQo{mUR_%yym3ch{bPx~S@ zHj#m0H+o)gN;OetldOLwNyNVm`@Mc#KvZ$ukqt-MdCixJM8{a04~%BwF%~vN?5=a% z0XOS@p9b2h9hFzlF8X(Ni&)p5Ow~<=E{31hjSh51w;74mMd-*k1;oj^4c9lYvC#4H z#qg&E#+{CrKgL4vlDF%PEzA!y^2P8$5-(sxL?j;pv{V{6Qf~@M%21%b1O(zc@`Jvu2`SH2C2Ey7 zhp-`b_G8Q2+&5&he+||z=9l1HYxolGOZXmJ%96f@dtL&?#+kPtF8dX6OiJM1eDgsYYua=7rc&eP77Ap+J<@BVC6p`A>rN-H;^*lua*jZ?(k>^P2b)fh6N2cdva!7^ zmpx5dDC8YipT~?-(pO6n#D1_NfdsK8ldtnn_zlkxcg|bZ)q6i{5i}UPW2_3t3Mfme zM+OI=8DAhYowhOP_ie3Q@-Mg(2M>f&_lxmb*WCCJ)1V_bCEW|NIupSS&T~8tm1la* z2Qm$_1@+|}$B6IsvQAc_T~wRtIGYqPFM2bbBNd-bg)h>b9a%Tq=kYs^$sueVLkU5x zU=4|o0}F~ep*smA=2>wQLe2GaJkLwJher@Fj%Dj9XCpN9kUAq%FW=sbTtD(#4Umzg z-_JO79<1vs`1qzjbL2Y95?of_>Xov&5F())eZLBwdyw`xsgBw3yp?_PLXBQaU9cdI zN%d?i9xU{1$Gv=~kGaEU(-GwB-35bg zcc({`QgY;pii7(OU|buP9giOi^~QY(bB>20?nmq`7%Jn%cQe&@hxa?5WzOd2ZDCSS z_B;yisf|fTb>yJlf0H`A*NPvY)?Ko`Sc*3={}S@%)oWZ5t-e*3>XH)TLpJ!Q+~N1r z)@DL*L8UUqU1K?e%>cBQUP-JZIM|4hBiUr9`{!qU=Jda+ys$J#y|$b^F}>vXG&ich z%#M;5HIOR0c9jzMq#c$@uZ5#J-+zOGYkN~%@(nwGxnH%#bk{deS&LJx3hqB%nasg? z)8;a z2BJFO{JI^{YAcgsy}7bZGlaljGhDYBg-Bwrv}= zajOtB#otR#meW>ifI;AM;nJy*v_=#VdtV#$3ZZ)HISK^~*WCw&<|eT%KCf$ZIU|N~ zaJiHgWpz9VUNF8=SO3Id9%i33x)YIC7mO-6Jy&|aiARg-Rt(pv2YqpFMe@Oys^Gbh zfu_zg4T>g;-|$qYCXi3zftNfFXFY?(`j z*;@@`ca=L6Z!@c0=Tv;0QId>UZ{*pX$r=%_|6{cN1OBS4sI)T?iL>|qjzqa$@v!6W zpj&~VLYMs$mbncNR$9}>yPSW7hw5hpi*}H<^p=z&(3R-&xMKypQAZqM{LiHwhMF-= zoo>#zM&k}1v62LlMl|o%bv?=-Ku=Z-m~snlD&17j+vzB78`s%85ju_8L-zBpXKhI} ztGuiafE*?+8N~!Dy_?bFjPul@1d(R|Mb2A2ecy$SsfESF%Nq@x1=cMhx#8-cbo-EM z^+QX+KS6@iM)kR{9haKYo2h0b%va_|B{8rqCFJLbPj2LoEOFYd{_12s&<#{D*!EH) zb`*}8#bU_jOS35FIPUH3B;)e(2^~7#u0))59`zd1Uzl^l=BYML1c|Ng=jJ_qd;7Jl zwgrB&_;Xp(1i~Vb1d>X^Wp~N^X~`}8`2smt@7^sVE`wQbB?sBW-UGSz1%DA0cGqUw zAonV?IWFSE<%dvvcOe<(xc-W@$_G|8M>wHDNwPjIl8Rf_kezC7^N$~vZ)iVG>f)+< z*rk~nT#`^kGQwX{Q4iV44z7gB%}+g$*%^75u61!&$wH)SmT-f!(%^Sp9KQuOCFBs7 zZ9@HYa|+R=I}s7#On2(+2L`!;-m1%UfA;e)gi|cP($a2c#Jn?$QCUgNc495{>Pt@m{BaL7W>>b3Qp%O#K&=(a*)7 z@bhQQDbus(76&OR>Yq=lL;*O>evd=onOJ$xVu65RCI3)YSM8#3O$(`t?=;+`H?d}3 zi>hH|qWlB!eCnpKT~m|mc%ElxONa;uOb``hDV z5#Co7<_{dts3SJL#>|NRDb+WBF;qWpF3AF2J56HSXF+%A>{fDmer9K50W>=!0z)c0 z0bR%GY2x$|>z4-Cj#&GPQ=H?Sw?W5)2NErk7;Efkq*seMY)KlZ8E#SVm!Gr}wiZ?g zd=CU~f``|d=67anDm`WNd|16eQH!_5IME%?kD+*{(JJ!-b`JJ{7{z&x;IkgQljMo& z7yajo=@GWn4zXVy$dc3YmbSH@`HiZmq?AyF1FpRHzQj7nsf>&HD|}e}jn=s+OzdO* zws2$5-jILo)uQUQ!P9|O1dF?d_8rHUscw{#`Q5*sBWc^~GCT2=R>h)XG4-6$e~L!U z^-Mm+b{UUpn^EVb1#U$jTag1e=@M5cTN2zvp2_XEuRp|57c;v~PB4A{7bcZpCAiat zhPi>3C5YWOlh6eDe5!o5_LPqJN`H{Mh85HxZ|1cO)FECqa-OV5vYq^3^(4YJzVsu^y)#{v|%it|aoTh`ksmdk+|2QM2SYSw`R>BRTpf2p5jV2KDJ~8U;yExC>gmu_& zSpUUm0Vpe<$#qoPvG@l}DI-GZ?cKmF-37Hly+B^BnN9ih=`Wt6=6Uy_kFQGzg`FgZ z!gTM0gIn}+rP>q%G++*3B2JKc*1MVgB5#iy{!M?L9hY9{i z5ep@a>ePP!qA``PIzhZQX>8!RAGZpK*HiKElxB4RtcO3N=VN{BFMI*)^v$2vI?Dua z!+z5E$=n*|5J^r8&R^V~+ByahsrhRnf&G`5Ll0b-u8cJsVbhsPun(lM6&;DI3h{2= zq*2bf4?w|(einbJQg7bA)hn(nFsXh#xq1zjUSqbN6G;=tr(`cST%5O&t7zBje^2fo zWb3CHBtM9uZw{VUJo<1#OdQiy@rLyzx)TV_gaWX%?`+X+Cxs=J1>bHt%CpTp`)%g6 z3OW9I1(gzITRf0n?o$GfuJ3680SvzC$&fDNh7~*gQUU*(COK1pe~Ik8)*7u4sM&nK z1VaYhsT8b0gf@UqRo=Y5U8mLge*i*OhuJDoG4arKlfhe2wxA&_W6~PiTT*WdN*w?4S>J2w+q#OGIXI8swYVp z1LZi_RhuDPvj{N8t-a!R@)Tq-TMJVn#=W&BFMk#^{djw|;1|q6#OVr74vS9TI3^pWG6tPOdGc^U6s%8Wmr=7e&^4Jc#{x^Y|4_IEvy^Np%n4iEHz;AJ~0On&RlKELlWpDDy+rg8#Skyeuf}kH@rn#hu z+2+An#PRV$S1_=X`h6pW*;$;R|KcvKaf<(8rZJuX1s1#Ym8{;kkYthy=s7SCss=RD z%c$Vs$VLy&Z@L0<8QFe*n;-m8@I3p!F(m@oEO5V_cStB0my^?y?zeIMZDF?hM1GdW zDW5f9?Xk@Yh(C!neC}ZfFgj)u2$lGhkgWoVbpeT0bn7$bzP&&O{4uJo*aQ0bpn#RZ zhvi!EcTAg8g8W-Yt+qxQBkI&%_BF_?oR2U-D!+xTeIdr;V}I8zKVhPwI;eeqzHf5^ zsfkQaVS^WzBa+WJ$n+*M8$G^1 zPaISGr83RFH*24ZZL84sCu*X+V1NBRI%!o1P2c`%HyVd0ZuO)*AQs^IdR0_B1q_Bu z6c#|Tjg1ln1O%5*5QtzN4ZN#5Zo1P*?OE)SLVC>gSaZ-#qwRR?9Z3g zbp0m;oh^(RH@51c`zjko1%8raQWEVV$nS{!JoFvU=u9XIcW!E_+Zar_Q@0#&mW#Dl zuv_{ex4l)jD{(gRypm7tv}|V~b5XC`qiS`)S^JUo+LpyaW)i8RHsbRgNC|yFTfarR z-DWUz+b*Z+61_vp8mIVFj_m{0#Ed&@(k?3r^V5lw_V>cDX}M821cc3bHGWb16*gT( z=7VTImkmqyFUn*0W|<6U?VK0qFd_{ZKxi8TWB-HPUjo*DI))8AhJA06yf%=G}FJvlqZVqTNLuvZc)0Zy$x(ePm?P8++AEt}4}6 zr5q`I4_3pNFfueKKO1jjQ@A~Vj_zEdaPQ%9d>oep*V$vkgCJ^~2%i+#hQbA5)NCGS zZ;levI{oj+#x6(4M^kV6LGc%)yR&;_oV}&F;U7}GaSm(P4;*8|OkK9AMt4iW75lG2 zf5;jJ;^xw~H|!xL?F|maK2nxjZAyHlXdWa?7qy@Kj|aaH!zv{Fa_tA()wcI_i$<@+o z?n>iYiBgRaY|$Bx5^<|eDZ={wI&<^&LE)Z4Gi2B+#+M*)%+LT|3UtkPlHyt0>Q* z6dV&;gUbQe5)|6eiqdld%I2+3oKvGv3{fSJuU#JB=GHjoqJ|#6GZ=Mztd8*}f zxT0Os0;`IN-m}h6m8D2u1h(PJ=K!I?T8MYBL2a~l_SkJ2#8Mc{<$7xY9Vj-*T;5ie%!GCmC1 zS_w&K9+lig%yf^pH-;;BUaVR1BFpZFJz^N<-G1LXu84b2sRAZ3+N|IHaZ*Qx{j14K z>0z0c?O_I93|YN2abOU#Wb&At zL4A3I$niDx*eZ?eCTU-g7cS#H5>B-0%9N!r3Vq-nSj#CtClZ> z1C=4a@@H_(7;_HM&L?x3gN&pp0q?u(nYb1e;72t!Hr^#8)9`p8EsK+d{%ysjJSx^9 zI45;s+`tJ!VefHm2AKYx&O^XqQ&LtYLb?Ecr3v&4P!}f}T^#R)Z?G9?rTVV;=xnF& z#J(H3lNf2u{Z+-~yQRz72@rih9v%GK7`l^!ovFIYVs78P&YTFsQ{ZFx6G_XuYhUAQ9tuk@*O@Ht#A6 zDaBK_WCXXJotKoO4Ta#yO}DiRz~nZ=ejkS7iJ#iojF-Vxq!1AZcYbp&u7%7((S{DG z!7BPGu7t%xmJ(sb3WG+zpb@t(E#uL}ebWJLXJ%DSV|dc~x=kR|>@<5( zMwz2Vzrrna-Y-i(>}>60CO_|=M9?;7>o>t7e{+AcZP52{Z=zYBU}9$?!D%cr-`8tF znPP~1TRh;k1|!q-l!BN8>~qTd45)GwVSO!P=JA2P`LR`1&Z~2FYG6)MNgYskB`za%AQJJ-q9kw|kj!&FAMz!?q zXiC1RxbU-is0NMWxz(ja`A`QwI$pJ7PIN#QCp$qf!x!;nP(+N@aQAjzgj$Cqp!gnI z_7zJLQ#QPtR{a7`7GS5rd(~%mKQvkJJZq!og?a?^Q+lYE?-MVvFzT0&b;k0u2q@b59_|S2@zVk zpWIoiMR=7bMp07I3(xNsXi+kV)OtseL0Y!>n_#cpNvo8b-Tk$QhrfHD?#>g3r(Q_- zbDK!QeevChpGg@S8vZmYxQuTm6y8$?oI1>(@9CrL^fHaT^#e-~hZ=H<1 z&l`m)IjwutQLPNde}Ydc%xl&&X|D-wv=xh}s@R^-qr*&sUuIvlZB*^8-&rHR5a|F- z`KDkaE*_s(2dP0_;Ucc5+emMLEuDbiPrnS7qnw<(T&ZZf)R$*=dg7>>``!Su)g?tv zGH5eY_m*FiXJuyG2sfT>I+dk=m9fpAsn$Q~K@U5iiP4M};nIH*=O-8SG;) z%@~nU3$?MZdJb{ZEVkF_8Jy4zoEvEMU;Zo)0In18$P?umE_sOnXt~6GfM*TTdeW*P zkrunN!f$LlTO|m|Z!+|likgLohfBYFiRBPNOdWtf)qD%dA!6G6BEvyUC|1V%M20S)stcApPs1 zhH;r7T}+u37Wa;SfH?iy!O$uihk!^>7fAKkaq^t?1+>#{JdP!w%L5OTlf{um`Ils3 zLvTg#XyrHZ#;1>9Jo+^XayP67KpN2B^duk(iqKni(}4eTLpdjEdHEg44EUSEf|oUp zdhLxU#{A{y;q$YBA3U`lf^G*k+4Nc20skFG1VVwQozF)M1(*(?GF~RW(9_=p4)oyr zCPPlf{VPQmb`#`H0Z$-o@B3y@NRJwo%{;;d!k)EBew*wTA=l%f@S)o_2 ztkey9MQdluY(V7#NT$LmY)`q;Eu;ym7NR__kBg%?0}DQ*-30xJ0cMB1|#|y zf%e5p=lc3wZi(5ybql!}X$RQFLaV5K#jZQSuXKe`rK`Pay?z-yAS(;|TFd`+f%s#t z;J@odB^`L(n`<9g{T|4n`JYeUx2wKfc~2lE=K0mTuUnTqzIx$x#oaeRdfbqqcYB zPSLm)E?`9R|NXIUdYV~)(r&TQCJP1ScEJmYXK!-;k=Otm_0grV1K3EtZWjODP?5g) z>i_zq{OGYYU5ZMIYw~lACp#nh(v-(cP+J`lg09To-U2;VgYVFLOS$FSzQ=gIIrVT# z!`XbwrHl_eu!1J7`mZ~6bF;lke*E*@0l_ugO9(gaUA)c~z9XTXkXqb(E3vlU~58OA+;gA;eMMaV1J^QG&a>GinZZ zFSdPuGoL%!wUam~4?KJ_v376^1?`5s8fCf#SY7RQ>Y|7q%)g{$ieIIQ%E(xI-i7sM}~U zpgxrIxR9DIVfNj*h?B!1O_@8T`l(6{vLR~$k3w>dEylVje|o;9tUUJI9Ctj?Uvm(H zDom8><8=OCyz=k53yba^7{Kt;Y)3*bcJLMyYK4v_k zKB~IcELQfG46b0@XlcT3O_l4hfsTcaifoA)383UmBB>+xhVRvF?`C67U|4c3MjhBy zY^j~^?mzuDeD1?AHR&@AEK50xyc!RI{5oDA4fmX*4w2!R!{Nj2|I+0x+4HuGmXeD|lt+=#$EM?z3`27d&(G&BUM~~Fwl3@# zv}i(7>cqD$hNsSal(m|zA9^V8w`dX@N9-cm8OFoLi0??qndnt1RxvVBNA{6C($i`* z<|l35{?mA_8S8fsD{J7!uU5~XxCaS^tU-p=%ftd5#Up)o4-%H*kWj5oF1RA?E4-ws z`~+V(D7^$9wREh*n}(-C!l>eKbZ2g?BwJbCG3Kay@=U**i@6F9DoqY=>?Jyh>p)^O z(Y<`Ix30M?bV4Zf+H<#vn0$QN*jbMDwCYoGabnj^Na!!ojew{(_sjYZnPgq<@G~O5 zze>g_N~qgBji!4M4*o=n;E1F@ta`oJ(%AS$-!A-|h3271XlaT${6I?ghbOJ8PV;uV z&*Q3k-!uHPbtebA1zSxa4+Ry5#_!=3g5u+OchW@edkF-43z=Og8MUp>d1 z;5Xjq87|xvzw8*@i+0P;l!~~M1-tY0Pm*KVe}DS9wYM0Wl&(+~CV=bpNrE~f>cvr| zPkv}JjeCXv8G}Km+t;HMCK1n<+0D;7QoZaP$PKn?iDF;L?3F4|uKYcBqB5H9sl0hDjXh1VzVPNf+bM3tQ2-qw7s&| zi77dHBe4!|s7kc*>wBN?F*|wj2vHUpDUs{EmbS4*XA^O2>3OuOvQ$kV?5!tVAIlkC zQ|WpBQ}9PVIaTxzeftJm*~*8qhADwGGciH~!<*E+th!6PlFATmiF^0iPn+(SfbeE; z>CZROw;Go-F8-)y>!^#vr8Iuzk7CTDE!9+clNiYNbC|n-4&bKwcDKTj27WlCiv1~%zRW$VKRlolRw8)6XIhva5j)@o&kkRuGZ$HL-4((pscuWYYju! z;~Q({?0R(>isRxt?N5j4++E^fdvSh1>m^3U!ZcL9qp;*RQQ* zmWJwvr>5jVJ^H-zYniRk7wn3+r;;f{N2Z39uO6Uy&W`+I^X>@$?Wj!o2K+nQm3SFF zh@sN_kw1~dYN+}bhloelQpan+W0V3F!{cN>t1{nYx7!cj*s#2H^QK?Ry!3UC@W7%A zx$*4xN`EHflP6VAP)MLRBF;3X>p*FDlkP<7+h|uChi(yMsWVD}G+317)m55^wgo4? z3!NROM5^1L&nd4S7Jhzuxx1b)GVY{RUpJdHOtblgdexs7;pqu&+tL_r80>4XwQ zL*Ffl@210;962f_L?{EL^9rvCw&K=|Y@tw;Ukde2nGS@86GuK>1Ki1PccZTcC zi4!NzX+3=K@V9OZ@qvL-frPPRPyViA9}OQ^7bck@=NepR=i_o}G>i4Ce7Ic$#|KRF%o+Yp5cx z>UX9K(w`m9_HlhVR66_px45i3Ved53JnxgHaDH{8<{=x6!#(*M&Cupm1B3ON@@B$h z`dXHo)tVSE!2c#cUv*S=_u94dq#INZ{s6}Gvl6iv0VTyyvvoims%fD|hTBNZ@9!VX z4B>F;;;xRwnZo*&sB)o4!4pkKJ3}*SSq=Lu4?_E1M3WGa0V*J=gD|e8I|R}Yx83ad zw_)W|M%j^T6?#C+^^&M{B-mj+HY(8}R+Z*B*3AlK@`g{!pNqHBVhNZVjQ%ngf4kwg z230b$=4cqoZ_N`@?6vI854_v(BSndv_J?MT&e?J;cDb!#e3V+L;oN#I-Ur@Z9v7(@ z{M@%=US2TfB*}AwpXYEZmhcl=rqy)Bfg@Ce04@9_^lziw?*JgKTaiS%EG?D^Np7OnV(;+pJ1bg}m|gZZ}mP)qWq> zE&hZ+5i@MA5}!{e6nJnZMs^U3kLQE!ZuG~jEVP&iNru&L4nr3BSkE+bEeXy-AUK+1 z4KZowR!$JK{A_%L8>^Md?WV<61|LRDh!=^Q-&)5pjj3+?$C5@*zSzb<#~@jUHduw` zP$Z3i!at&XmJ!YL8?1h%vP^vkz;ho=6y;Tzg4BpM2_TAMK{ey-3adl7Vy z&}Fg+CU8R!2MziC;MR7`3*>Py0V%Qc9x?@Aia7%F8@_va(; zWHC0RoGjU%m`uH?_r6FoYXKCVp_x#FP=h2>&!R3(h4n)(!O>guQRP4CAUJYl_#*m{ zy-rb1iPnr-?grLW=IGi4?gELDD{!V10Zo1qRsXj-F6)z^Z%M922heU(WR z{|9Oi@`bWm@2l-icpQ_7S?H&brrp5%vEJ}mo6$%CSoMK3t#b^1ow>3NewkOtBCG~N zF3)w49bEokYO(8n7SiSYDu|WEIQOF^!Jzq0t}`!NY;LYI89SCYDc{28A<+CfCP1@)ayeP;jarl^<;N0!(9VWOP&2}U zPz=pDT8Wh)w#;Ll+}+)ux#MES^%=SFpwrAFRoEe9` zX=oY0ZSY*GZtGjgD!ZGLL3W+MI@Ki3f!MzE-mA3`*2$Xk$9EsX!hBL%!OB3#`z}Nq z(y4i=T|hJ8;>Ug;>)kn;h!dgMe-U66HWc% z!w(6?bLSVoyA|m0Kr6;RKPRwdkInTV0$Db@qFZ-j5|9`j`n3t{1tPAqW_kgb>&+>A z)7<+%?smu?SPFP%`q|`K6A*0?91ql|mbwagYpihlt;ymR(QrjBXpLv6wpEifTa6WE z|9u(OG=6`!T!zUtfr_o3J1_}oy2Ya!nfSZCtTH<QA(k@yW}#f^g}b-m%~9dj3me(2KA%1#C88ng(^t* z8|=GdH=mlnvILSi`TEY)*+5rgZA_}tKEmiO3dN69cy(@(U2aYYf~skWW*(!)3Kc;SHSHV)g_TI~dORNv zdTpWtn;6_P@Q$)bOo%io>f7JbZL?eXBX`cXQzEWe6cwa*b|k*uC6g*sFY;o}&&B_9 z&D#1`n+J#aE!!O#QMvjLK9O>%sFWVXbHI=ndv20B-BomTK3PoGrzpo_g|p8!=x>w- z`MXc7HtY;{bQl{(!7b6c(pEpAp3q&>)W}!2XBHyuhT3@ql@A<7M%;~Fe4ChKmbqmd z@MBI}SXfd5bh|bC`X}uwna^QCQ%vaVv84MiP!nX@nr25%bY5GzMy(k?Oq_p^!if&0E8Br;ry=eh%FzNQ~u{9#}B95ttVdz1A233Yf^%c$&W!d%J$o`jF^(jeZe#vox+C zkYo?IoZZ`ECN^uy7;4udh<86mWctGHn-xA_gde0gun6L#n!!3_@B&}F>%g%94e{7C zg_=gk+LR!u6hV2nw`LEna;ATZ73WdaagrLR0tWxF4E)3Nm2@mf& zg?JBEJ^#)oUW$R9sq5lbSlNo_H z@Dd+?Oz_*hJs2pWN#iP~v|ee)3QtzVIOQ~->HYD28D$g6jDS-=SWa#bW$qlq#FtgK z*bkl8OQE|0cRg`@h|6~e17Ch#J?(n1y}#~mQ;2F;V@eXzsKZCCUx#FzY5BunVJs0G z4$I==V}e=3shPpb4VA=f8s%AKZ-sl#^1_bZck&Z&OIyo?n5WyC7v-p4;^yGp0z?MY zQl&vkd*mBiwr53P>dN7tnRN!O?BM1!9`h-s@?EJMLh@^nb=vCy$d1nL+l&6kxNjm& zi@=sjo*^~D%yex}-YuuY8Th48uNr}w`vP}H$#dMf_`#l6&Gg)IHQZ<*%an_ACNEo|Y+JSSdK-dF_a{_s7MAaM zgi#Hp%|&%g<5)({iao-jTyTYfMJr-#2>R7DD+GwlWZ7-=U`m3xm0YJOmCtc)tl5TD z9;*t7^{RNc!cykyBMR!?C`rl%Y)hE?0JJfDx zY{uXq#RIxKg2(YNGg2)TWm93ymr8#j=D(0a*$oPrQVPK}W|U_oUG1~F)+EF1f8Is~ zuNf#ug0sN5Qa-^uu{O2p%)dAQ(DZ+kpZ$|Y$0J!*|23|^rmvF$#CBp?_kZ#03Rg#+ zL`IAAaCXJQd`W{!gU3Nmki57hW!(awpboV3)l!)3vO(*Of@B7?#l|pd2qg+C+BF(u zz2@Io;S=LWM;G2pWOYJWAZJ(*cU7B;jXowGx-Rw#DSLU2cDZ}Vi%&k6Hp}LmqSTbM z#&WX=$CMWn1LP!F-^)FrCdx)Sw#DhR;A4-Go#T=THcW1mx;wgZU)xO%kk;I z=cuJUt4eqEer%AUx6W-z9jjDl&T)((EQfe*Jv@|9_IG|%)ALfWdz8S%3)e<5C0S~f zv=^QN9~qcl=e5vCR8KSOfhyTMA~E(d#lz^Hx)!I)?yF&*d}S|lCjWgv}OLA4HQB`!(wn`V?ES3VZq z*;SFUJY34N*Kc0?Qfx*T+!uF1g1sFOLLF+L4~=I6+!ZX99VNT}nqak5swDn6U_E;l z##3s${c{?haP~R9;XYbhm{m~NtFYKC1;#se1Ex zR6y2cPSen~STcL${Z6QN5%O!-F!;yRO1rGU=eTy(pi;{U=?Thi4^%_$K}Krb(^=X+ ze@{Y0RZSb%d#nMP1KZ|KJVX2ihm{31^uBJC1)u7XBv!DsVUErRi7E^ z7wXnm2M(F|RFG(v7@s+fZ0ZxbB-^|D4$;dBSp(ypkaaK-zQS9a8ip}^ysiUg9$D0d z#<>(QA#i)?;JG~N0Y~$Mtu@kTG+)8vU}9wbYn=OAr6ck=LIJ4$L*6Mn0cA!Cm4Flo z6LM=!SS+sNRpQvi2(y-fUuK-nh_hGSllg2~gTGf!wTj-=dQZql7OGErITKN08Vh zaMBk&osY_N#XR+t>Ug`LBapGww|CMU2|n|Y0UC1O?F0viyawom5Jt@BgL}bz1A+(X zM++9S)#BrwA1v+P5p=Nm5y_3vV5jP~M}UoL9#;Q^J~4Zc0RDZtFnbKEJ>YXe^Xd5e zC2&}%jXK7|h+75?m29d}0#zKeg2r!+oR%E@QoQS!O*QOYrzI{Fr%#DIH;_#PWtl)9 zh)q494;e*4r}|pz`eUEeC2+-p|J9{#sAv*8Kn}VQ88QCX>w@`oKjz%{82J&@!PTluIGHsaMNJ zmE+n_s8LP~kUxnUyphQPQDhG@;;kjk#Kl(;eA8KY#v8o5QHl6DXZLM;Kh*5Pi(Kb- zhGQVzjw0}mJ*ie^IJB$IGy=bv9=>A`c(OHL3n(>O9=)l zogx(*pM|B~^Wth_(4y}WXPWyvR*fDqX!Tfp39GkSAM~xuy(wvmQs|u-a2!=67qY3T zT;_RnG`*Zt*99H;1a@F)DjM~M7m}zpf7~xyHVJSK6z*xsPo&CNX`MTU7=7G;_qyZ_ zw|_RZaN{$ucK*z5anEK2jo%lvHF<-p-#C|z*K=_7KD-cT8~tPd`(Vv0JB#hfqD!U1 zYggf6w}aREUS^oMWBnG~SFV5D@v)ZmIh(YcgFxOH+9;2_2zaM3#i0Htp*aJ`3#St% zQ$1T@?+p(%0SsJIhu6fnJAiGQz{wzvZ2(!KBC>deB$J_H5Ol0W|yr}pTxUBn_8AuvX#wayniHwZ{Y#FGc8!C|5 zcLg&zG@HGL40c0EAbX%FM&b>Z@JWGF=sy#Z?yp4aT8u34MvIHMSjut~C^;56h8657 zRTqCs!-Is21!~XOjprv(4f$U)yVAQ_eam)=NFfR2?-JNdf>i^3r@XR9+f@d19CW8N zfS?f>Iykp*GdVc zx?f~@?WP41ObH#Koz@433_qrcSWINaWvFjTF{^uD7@}Yl1=6<;L;G>GYMpvPef@A##(y?VtzI&`QPB43$aK z9?q%-87>Qs!_N(E9wrIG$AB+59E+#{-0`+!UU~DEm6g!Co7zfTy=$321=yIV7-oiA z535Yo!i)ZYr9dW8pd-*quq+a+K+>a?Kitt+b!59Ynp%TJcsq7LiQsSAh-;Dypq1(# zF^1g2xDJ+*SiWy(QWhwa=m-6ECBZVm9)r!#=WDfvm|d!VL~H0LKDff0;4}YbBX`~) zi5Q+SrxmwkV$(OWu1Y9eO<((#(r=IYO#372`wreuvZ{DDKZ~lPo2?x5)MxLp(Qc`K zVS6vxitnv5jm~gE>4IKp)|Mewq3Dn=GX879^tA>1;=Q%CT zY(AG_k$l+DcrdFt>l{-)Raw6~BmvCqOG1W;=a}D>v97JwPZHf65%cjmVSZ85^I;oE zu;h)--D+ka{qO6xTciD4!m{b}ex^x*lD@CuY)Gs2jWqGkJ!Ln@Xh)W!Ld)s*^e;p- zhU+5W15p*QMhQWP_+Wte}7o>$As9giQFPHy^SY~*NZkw#(VN8WlxTB#*;b2u8uzoM+Z1c zPYVxto2>O*As+)76#Ye3R0j5qV7cDM;oKnE7S#YR>MEmW+yFcxhHn|?f3t37Kr9*! z1vW9JuaG|}XY%O?Icf280?_${c_Ov%Qqeq=y@cOW?$mKU>hUAOeGY}@+i4Ap)9g|z z#}B!pp{d;fo_h|qbg*tYe(3W8=%>Rl)~TO2-c!*~{=OV=t?$h*{`FD*xFggPl>qZmlg<{8{zX(% z?=OHn9Gd4G^Xh1MBp|X47ponm)p?`ikA?G>;se59GB!#{m@y?^{%hhd`nM#41Y1-k z0Axk&d7yKLPjNCx(O1&!yQN%E=;Zckd91=wFJwbCL;THudg#$8-^Z3E5rvjin;sDc zdlo>z0{pz{4X<4QefZ^Tp0WUnEJ*&O@{4i%yv8C*U3TBBH5}SS)$U5!G>MqkFUJ9p zm>04=u}LXnW$EReu9>ZHh+%(ljvd?N8+23)74ASJK#F@eL+cw7Vg*|9#C|KcO^b`6 znK06b!1Ki9A7H*Q;yoBHOCA$%@+A0vYx17EWzEh~1hJg3fdi?q%Vs7QJ`&#ZuxX~n zohGJpOjYbu=qj_0I*3Hc3ud5f7ki(I&6d}K($`5j?eQKHq<;GWX>9qYou;0agVy0m zmMk&8M>#tcqgKlgsum@5vlT1ds1qH@f@JhLc}dgC_5Rq#I2pAN*?@cgHZ@2S1i5&Q z6QtJU;IK2PUW_YIttKW?>vqW!Oq&%S%{OR63oFk2+nN)jYG26q{uTEGGmaNC4v>u; zbjAF@^C-=SaYU*t?5Asgk?Oe4S2HT5h>7KgW~~I6G8~b9^mSxDCDHhOx`N~ORz4Qw z?wUf)#QHmZn2;$t5DUmEi&k@$-|3%uqwu(M^rb@vD;QBuC-x2M`adP!h77x_!nHG1 ztDKAu(MY@d^($yLWn-bMdSy#Edd_es<{o+N>sZ(wyl6t6Shs6nJt;fnNHrnP^ zeB)m}Q%LHpWnoucw=7lmubJEGioTDrvmR>@JhV0S@PXSOwcWi%G-enfFYbjBNBTe8 ziqw5_lJlq+-0#R~@1~CKNr5A2-)rpGh;vWVgn9|uiMa>z!g$;JN8v8wm4WjQlV92w ze%~GjM@Ihu*nRSJRf*#u^T_6S-HO|+nkP$3141cMq$q^Z%^-S(H>4^QF}|H&6u&QF zP8*{*=bqxuwoE>4#7rSuKQz}6ig*9nAs@pY)luW_qB7!$=5_gD5>no~Y=Xo(b&t?P z{ge47R;*m|YrXor0*~ZN;}}xZle$au0U|18eR(J+geot{IC=Eci`xlbWPdEUF2Hb- zb{Du!Xs-=&@`<#haN&XX3MpXEM+OPp#)QJGcElnLlt_g?s(hP%i2IY&KlC*tarat2$2|K`3^=;dfX|Q{ibh)t3l!Tz)_>!S8u= z#W$jb6>d|F2xq0}6B0lu@)@L8)r16jZ%u!0<#l6SV3C6{5x7-&rFf>yr=r@qrwgqx zLwSSvqDR_tKv4L|1GuT%JwV{V*^u^)^1Q`22HB%nYPz5xy^zs<8L^r;NZ}7L3~#|+ zwA);2NI<3zd&-c=)pV6FsD^Je(1QHV)91<@k$k!+(WJk0_)3I$>)eY%POc4P8=;Gm z^E1$kAX1fG{DPe7W@NiXoM4Qdu)lb5*l>Q zY;*Mu$E^%~!h6Uo+YUbTuStEfxUR<{scSrT9oQh!DYW(O zAKGHpnlB$#(M#(5mcDa+;YoB&O$E3o?h@nf0&MJxrrSqiMSvvPMVw>gvlB!#<28cV z)qyj&@^~kBEc+_~kyZ5)Nu~b8WCj!QMoKa6ZRF$FjWhfqZ(Zr9PPIjRx?h;k1L&ZL zCSlNcBvI<@fXipUx|WqX32(RncOtyH*q4xPxmw{}AQ^YV)^!_;em@IstUY(O1X^-a zLN5`ExLY|$nS5zEKa!LUH$HXW+bv}Fai#dM68T2RI&Uvjr~|{J7U+zb`MSgbWGM=> z@>51g`}znGtK=oQ>Cz5b*Y^&3|zO(dv0Y|!-` zb%@`)q`z6I%I35=qy1nn^kky2|8O(St+f&naA^rHI(`-ik$XS@m0h_cKhiLX+nIcV z#1w6`F|x{*Ck`XNI%ZNWC#d#HKd*=09*unQ!lRMpEI*IpE$Oioag64PQ9-g9<=f+_ zPm8V#I?~&@ZAgr7eDipoJM`2L=TtiCksH0In-A*wl=O8bd*)_*)_9Ag*|Z3`P%qtJ zXxTbzy!@nt58Qz}a#hlxEbe0VaC(F9Gu$3lx#e3?kbykd4A|uiV-Mzm&^Txe0 zX$_!pKpLi@A!$op&+l&AeuWhnf+@u-ErJ~WS(A$kT$?J1;>Rk#$GMD@9)Ex6NdZAmKA{FD**=u~c zOrkNr-vN3vL%q?lfpFo!e8Wh|0w_Y#*DAw@QSK7X>qGHDvC_?H#FI3Y%8I2+6VD|~ zWqm2`Z2|ZE6v#~eGv8;5upxsnHBTRTs%8OWg|73Wq2Gj4z2~EgYMzcSwYAa>)!12P z*ZXqytqlsiOc0f&qt_K)aMFrA2yFGC-W^5kQUVqqtSa0++S6h9uU<+&{^L)RcHd-- z)Zjrc3Q28~6zUvN`EFDwdb@|wjemtp4GHr)%q3&>bv4)}8+^udF&?;}{h#(d0&=&H zJph92VRLv#p;vGs%7{BMC&fuVj3cna2i`f>+53WyQci^afh+UFY!6GFC8(K&$SGw~ ze+Q7#-?D!1BcLo__9kljr-c`(`EYXH37ftIdNHHd>6x^(VK>S0W3sE(`X}_{;Gt0( zR@j@cRo1hTTJn*7ssaGGk*%kMC9j{m$Dv1H+MKrMdHk3Ju^t&!d)yTA=%0vpyuEh^ zl0XGMPV5N%g3|w+zJkT@QYIQ0qiIE}gYm+yu)GgXv~L{$DJ%%{7k$gDfr;pEwG<+| ztPj{bEF{jU8~uG7ct&)nQ`q+HO@MZBDZs{0@c;X2QYkzuJ@*uB0i>QH6ao78g>>t~ z^&v~1T>f z^s+fvq3O+LtP$Ny*5z0bTT#WfmRmU3c@4&c>$YX88-nD*TfvfzhQx>b(Z>?&>*FtD z*F1ci{RovVumF;sR?M<03jF*_n74@qa2cIIyl-V_9MC~0X1R&5G0weCIyyQEGb)TT z@eTnnxz`kJ*7fq0&$iz%dV<~fKak+q9i`K|8&LE&H!Of14}q1+%1cvj1} zNLUOx1w88v5HsM}LO+7R@?{%4L9vK9QLN*rDOwx2Ss+MW0h%8Iyz0TZpSL2oYdi$i zfTphe-9e!`@X}chQJ3GX3cPL~e*#JakP4ue!D?^#0`v0Khzym21!h1r-U}cr0a#WS z9)y0ftmp}3vi<@n+wr9Z(2Oxa5uE`#2Mk1uaO!`4v(N{LA*O7ijxyBf9@~YV$SBz4 zlv|{^+`*H^z^wyDKJ$vheLPVU;a00dI&O4dI)UmNOY>XJ0=AjvTIjUhST_`Lmr7{a zAbjMbPz1o`Q}je~gNXdW#w4Z_iuz-)X&9I|>h0fS1M*w6$yVTAc33Yr_Yyl+V{{m?1@mh`I zK`n=9`OT1m9)C4ur7Z+2lmrW~c=`Wqz7uNA;)FpD!w$4$KIErUX@q5*$G)Qsy7xZR zt(KrlG~3C2=<)8>-n?wx)ZrmH0bGG&IZUBKCWBQDE+V}aqTEal$E{i;3Dhc0Ioj3~ zPOw`5rl7FZXSK#+{SXwkSFRSe@?H%pl8MDjg#~(H0*a`{$gM%Yy2BN>-2RqR=zPS$ z9vN2?I)ytFtt);pGYR*EF1>dioOQpu#t=qX3yoRTmP9o|t#GGoGc-}uy_G_*{7=5< z(WAMV3Er|$|GAA9tJfd2YSi%}Q$x=e_4K|$f_vyYr9m6b#D$nUF;ySd@lGv#6oPyk zg9WTMWcaYIluIcq6s~ZX3z_yOH#84VrS+b1D>HFjpW-h&#E9iK$HvJ71iR^dgNMzh zrQqnJv@~6orX^Pm#*9Ym_!gNDEj4AjRlh|3;cvw~>kWrN$;*w(qf`E5d4_2vis#m* z&7oX+ltPy{oh~e;wjEmoJMyomA=E;bW~q=yNKc<|KjtJ*3-nShVCt}s4R)A#*m?#A z+Mx-sPWj^k_7M8$?`n`HDyCNOc`yI;WbJlsREzRXKSYiDXnm&<2fNO%6)L^+eG0r; zM$oEW*+ez%a*N5G6Le$o-z7i@dhkmbl#M++aBFmryW>H(*_Ena+DiRL|Rez8)#|n&y#ZwE$jA_*TNp3)BbjGodBWD z;O4*;RciYr>L%AdK2UpQrR+ z0-Gp{I@7B(^)EMjjPJn@Nk0I?T~lUErL3bubH^W2})oz>GmNHXYd`72q`A{*& z);>$8;IxGd^3>7p#_%B%D~;ZWqGDV!0%K&y`<%bDk;|uSs?s^#{Ej8@=lj3CmluIF zW&ib|>kf=I?%^VHyXTm=L9qVhM~uRA;OKxOC1_=d_bjX&xq<$)j)T#I3FCQcJT%WR z)F%p7n48Xa;5-S>Z`D@VU#!JXmw`aWvX>&IT#^l25->30fJXqXg~+k8pB0#?9}{>@ zX?k@Q*lg^LWOY)d9R~Pd{M#q8^E4Q_LHrz`ed8X4M%|Ga<++B~&lr{>`nq~fk`p*F zZ+eo_=Rr1tM2e6(6)wPD(63d&TL|x#c@o8yXn?ZypiAW7(ao7os0<-mO`b z@qv?TBS|eXMGGdgTt&9uLnir(bhEy#3o%=MqdD|E_De|5&(IrT=X<2v_3rfqtsOk~ zAh%UJ=j%1ylzYUnG+Jj$OiLKKLoM`RaZ`ne$C;kjH8PMS7lz7F+JxuKUdhqCjta#U zZulh+EKBT8ldCEo>1XeD#wW~Y&7Qg4(`zka8KkR{@_NLq`Oa>D$)U^J+6373E%WMz zq2qlSgUT&w{4WN42Z8-Ot^8Uul;?cy=FtqI^#xDp0U9W^bY7iX2HRLr17#|R zKIlPv56qL?@N>qO;vjGMODVLh6hc>QYZ@@dS^Xj5ziu64u{$aMgf(}9k4XhTAILqa z`C;*0LSk$yllm#}KyT>ITT|kTT&~%9wc$&VB&y0zPZob{EKF{%ADn%JDL(XoJ*q z!uFw3g7-t7_1mMNE7!$q4iB8=GNa_^*SZ-&)b>ZSZY_hop)vuGp5NQlXG`Q)es;kR zSEF!mZK%zwd53UAQ8>?8n+KPm;!UJRD*{`~P}6Kv@AyzZz^KDG=#7q7bbQ0QmOuyi zqV1~5YUM||cIhHFLV}Ja-3B?c>~34z8Ywgs5!MC2#mZ%mBFCW@e&O5D{(ocrgTt*x z`dkzhr>eA*8?Ntuey`1h)}D@H%${ZkwHiVX{fUQIB%Su1n9^4FTzFFmM8 z=ujurzS33zj6(Su3GwV!XVEt_q+Y1FFtG%h4Z$8=`}x)tH*ZafD{{euh}fTGRn@Ke zt-v-CsWV_CnRgR#CXA@GrYlEN;f?aAl}SCTF=LaNc}ur?+M6+euZS|4PRf{3ln%cX ziC8Psv<{Kt6Esu_VT=OId7kfwQ#-jHZ}U>xt+8g|nb z`_F`XsBZ5}w5SC(IF>xT_(bK4XTZkmY@OVdsL5mY6SH}^oF`nAL9nRuTQ-r67Y3># z3stAjmAA-Sk2wQbraDF&>y)3Tpg4G`DQSXUg`D>YN=^p^;kH!8nRR>6+7@72sg#XI z*iqKPdW3S5-%*Q0xnkp1@u%1$MG)((yXGl1P}o&i+OK@SPyFAZ`mGNfxljc=>~CnC zBi?AC?2hd_!PWgJx#9Pv$`68fYu5U7$k-8ugMqz-V+;)Fbe$4lc@}@exkVp%eZuBP z;ftP|z$ef{=ijaxDDgHZ_tnT=<+)R@WOVk^uuhU8 zcwhfQI#o(^Ggh!$Ij66~c$K+iAs;~RGZRhn>o z8WGkFPdvns$G|pK0#?tZ!Ke&NieSpcCzLN8lNC}*)uT&8#Zig+YBq)xKzt{D-UUYU zb|+}pOE^)V+i(a{``HMIn|8ZDz^4Vl6PsJiC9woLjqW)!fd8=*< ziAaS3VSrIC(iXdH=mv{NWPk`_(z{HujYiE|T{6`kAB?E6AKf!I>{Hl}CY5h5YOJQE zx8@oC>ew}I2$N${8=sw#+ZOu78*ZE(T(!+_BjRs3Bx~%Y9nNMENh&x0z+LE6M9TwY zm=6${p&2UW&1msUHtx*nkxbZdE%u?RfrF$VP!oE}8=lX8s9WKbqh#8;;?Z+p;?Na4 zbbEO32~aY6`wH1*RW0?*La?z{u!RrZD9u}7SEr`=15oLBwiB8zx}#;-QCxG+E-&54 zE#il(BnQCjo&znO;k__SbS>>OEp!|<|5TCQ4J^7ZK==ypMLqCqG8dCEE;6ezb}m`+ z20R2WP%~N7cU7OaeB?}QlB;p)C9YzmC7|3LXrK$$!(TB?{?24)p`B{`AQG>^&lKk~X^18pgI8)qU^CbY)%7HaA~nB!QL zyE~*gOW4&TkTe#bRq<`(j5U-qs7+5eY4zT>Or2I;9UgtsjY;ppBJOw4S0SheNR0DV zcO)#bUsW#nvu99u!;d4OpN<5B`mW!Na+K$ zdczSyzm9E#hQxFu^nF0&gOi(WE5?A{2^QNS!NT;6E64H1QHL;S`04(WqMTluFZ{O~ z|1{tzMrJDS|6Zdi2RKkmK(>~ZO375;xfZ75c|QHI0MfmrbUkksk#zG<1*8{K%&I$Tk`7j+hGeF#>XB$$VvyNk&nB#l1l*Vdt^M06%ODXR7*49H}ce;tfNBi zwSDn39~CR3*+928ijQtnMHP<5VLINzisL(O!^LbK6<^fQ+0`_R{^M~Eo>G_>xTkIr zNUy28W;rpgP^ek=Ld=RFz$(o+Wgi@itcnZasQt+gYe zix^kK!3OKQ?W}x1gcWIfr1f~EW)n@Y296g=%A-j!U1=8~l6mmy4~$xIDi0%qY)v)b+o)3hCYc5a2v>g7qN za)2`1Qe-jC zD`ar+O2meEXt3;uk5?_YIn1gxyuLxAS|Sm0F}tHqd5efS~}$3Y{?I!z2I133np%wBpGq|Y%xC&HfOSL!^F6I z-DXjA+Sm3BX@!m#In3>@mbnRl>!uN zo80q`&GGm)Sp0~p>-n9IZv>mG<62^TsqZ#hj5yeV6PR^A=U%=M%8ymX*J-pq_;j}| z&Moa*v^} z-Br{BQ~feL-w9Y2VAI|HH00sRH#40TzB_EW97tY;)b3v}v@srj>J)aq>^hP)gMYrd zsOH{$!lmq-0VH@9Bg*sLFn}rjQ2x^_9OGMV!t?#?NUU%=$HsJjz?<&*H}X~w31_Hm z1g-8Pp7y)bgbCZ{v*GXjoIdLOCzPb!ovLn>=Gi$RmQ=x7%=`!-Ek`S$vVx;z+Ez_h z|3}>!Qdd8#C@TWGERNgXpo^ekk(U|5jyV?9j?HmL_gT>8-dlbxaI$Qk*TR55$ z?H-%BWk);1sY3w@xpBr}Tv<`L!nZ#Xo2*NJFg`bFx|t(fs=+(-?c2BP&zJUIp)ExqF7;9xfXwfNrR zwfG&o1FUe##F3B;EjOcem(nGcB+>s9^a-4Z@12v|)$+7FCvRmsHgksI60aW(p1bw5 z+;DIBknw6k6myHH{{LmFmP7&dgK2NdMIFls>t|#AMQg(ytOoYbCf6yMi@JH|>*D!3 zU6o2T+CF~rx5X}s)dnf^ygx6@MI`aIGqyUK|5{#`CD8NX%(em`*YJBY!2oF^yL`a0 zSNbRacOz(Ek)!QnARcP6egD2O<K2iLB@1bA-nI87lsYt5IsqqY7W>niaX=njdaid=kHyI_ zEg!%9v3-~t26KnUP$5a9hRWf8Iviv_HF)0^h!{e>BRuz-dhO-X0ySnQqTx=K|E13{ zK9>#0ddlKVT}&G>#@R<T9k~8kGbC}A_2zOhK0jP*B(3}TH@Ib)iuK`T!>i|C+c?_PkI!}HI$Gn| zkzmq)DLP-=g~S;CQJTc{%^yW{!N_4bvI`maDzLYN)>#-Byy;?9o=!bzw+y~~gvdo- zoB=k>laCbB$$Dc~>OZ#s?xpb`#QoW@J?lU$$)JVFX0>V4U3vu)_Q!piP~pP4xqfOY zSiMzSSJUlU=(-?O%!l@e&O|Fqa1z@*`cdvYhaEVx%)jAG`3MlMZ3=?oL(;JLxyAL< z_+7|S+~n^Tu{JxPz!LABdk!W3zZ;-`IYITbdz3SK)pJgL+nf)IeNy-Q!cVE_k6S6& zAsIM2+Bhm0Ihl*S<%eju!nBNyJn)admIBSsCIF39zh4AtFt_EQC5TX;yNtjccK;nGKG#^%{2e?bA0Z=6AO z3;yMy$DXigt~yUI^sj@nIX#M43&l&AMDLo)#{PLj`Ey2lhe8%@-ye)!#l&NoR`=kV z&E(E@oFQL4-!yO*_bxu@QD0QNl<^mC{zd zy>sZ}r`t;u*iYx-w@Yy%a6gm4pdKxCJIw}Jo@ zoOc1%pSNUYr*?@}EPb3Y za1FWf+ljw8-%({`_rn&|P>s`-E16#gfYd`jRR_iBqJ<(OBjg;tg{ zla%@O!ek-y4=dLvc&9&V= z-XQ~}u1S6h8N-onS_U(eWoN>#%IlgQ*ixyBu-dPK3BacEL<03IM;TBMg>KCouIUMR zLI4tTJJSEJ)z`n@mX-~ojJ?P@bqEEHooTV}{uQ?bNu%LpCw{DntK07dsiOSWRmTfabXmNZfQh8 zL`99F2(oV`A_^i)6xjuXB6~xSRhAHi22=!vfNYY;q9D5Zq6rWn zki7chbWism@0>UD-kdYsHmhw|>9-fuL0!h(Spa1preN7X^VyP$0em z&iy@wh)6A{6#?WX%wVDk^?JXWnA*Es?ArLH&JUM-)XVSA-fKHu2;q=vqj?P85n`23q*e5dl%7~s=1dz3RzD%A7fgfz^b8s=o}WG!n%I0h zN7*l46??}GGaBtC9#s5!s0O1f?3%1rhFPYo?Y+1teA>MDmczTb(AQ^@2jUd?+h@8O z6c^Qpk8Ue-bLW%{rj^yIt5}u8l9PYPUfrK)>gX-d#1Md-YC|qmqaE z5PnFnZl%)}0i>+m6Q*6q>$2KwkJv4r_^c`uYumN8tri;VS7E!0;_YcJBUZNufXgC9K>U^ujEHkRk@N>Vw^89M55l)7mzHd+rNMuI zxvQy@6n!GbL5*i}vP2C>b;Y!yhzp*?k)QPs0N9qtrmAqx@ctLS0Jd5G=W831vnu&c z^2Fr^O{5aJ^b@Jlc;Ib!g^BT�yjH?|TxGvqcD9gHOh~*!D^Cd`>!U_jM{-r#hts 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 C?24@b diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/images/pic2.png b/javascriptv3/example_code/cross-services/sns-sample-app/images/pic2.png deleted file mode 100644 index 2f3971e7a526c0c4e2be3312f46bab1d28dc5677..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22155 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 Yc!oHIJ~b~HU)lMGlbd6?gWv6c1B2iUdjJ3c diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/images/pic3.png b/javascriptv3/example_code/cross-services/sns-sample-app/images/pic3.png deleted file mode 100644 index 282d63b0ff54460e823afa200cfd3df81cd29219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30657 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 diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/images/pic5.png b/javascriptv3/example_code/cross-services/sns-sample-app/images/pic5.png deleted file mode 100644 index 4a1a67204ba206268f7af2df2af28d0dbf5ff3f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17773 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 diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/images/pic6.png b/javascriptv3/example_code/cross-services/sns-sample-app/images/pic6.png deleted file mode 100644 index 54e85259658d0690cf27e8e2697c368a5da03dfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21513 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 diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/index.html b/javascriptv3/example_code/cross-services/sns-sample-app/index.html deleted file mode 100644 index 061f0522cfa..00000000000 --- a/javascriptv3/example_code/cross-services/sns-sample-app/index.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - Subscription - - - - - - - - -

    -
    -

    Welcome to the Amazon Simple Notification Service example app

    -

    Now is:

    -
    -
    -

    Enter an email address

    - -
    - - - - - - - -
    -
    -
    -
    -

    Enter a message to publish

    -
    -
    -
    - -

    -
    -
    -
    - -
    -
    - - - - diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/js/index.js b/javascriptv3/example_code/cross-services/sns-sample-app/js/index.js deleted file mode 100644 index 16f4db2a953..00000000000 --- a/javascriptv3/example_code/cross-services/sns-sample-app/js/index.js +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -index.js contains the JavaScript for a tutorial demonstrating subscription and publish functionality by using the -Amazon Simple Notification Service (Amazon SNS) using the JavaScript SDK for JavaScript v3. -To run the full tutorial, see https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/cross-services/sns-sample-app. ---> - - -Inputs: -- TOPIC_ARN - */ -import { - SubscribeCommand, - ListSubscriptionsByTopicCommand, - ListSubscriptionsCommand, - UnsubscribeCommand, - PublishCommand -} from "@aws-sdk/client-sns"; -import { snsClient } from "../libs/snsClient.js"; - -// Set global parameters. -const TOPIC_ARN = "TOPIC_ARN"; - -/* -*/ - -// Subscribe the email address to the Amazon SNS topic. -const subEmail = async () => { - const userEmail = document.getElementById("inputEmail1").value; - var result = validate(userEmail); - if (result == false) { - alert(userEmail + " is not valid. Please specify a valid email"); - return; - } - // Set the parameters - const params = { - Protocol: "email" /* required */, - TopicArn: TOPIC_ARN, //TOPIC_ARN - Endpoint: userEmail, //EMAIL_ADDRESS - }; - try { - const data = await snsClient.send(new SubscribeCommand(params)); - console.log("Success.", data); - return data; // For unit tests. - } catch (err) { - console.log("Error", err.stack); - } -}; -// Expose the function to the browser. -window.subEmail = subEmail; - -// Helper function to validate email addresses. -function validateEmail(email) { - const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return re.test(email); -} - -// Helper function to validate email addresses. -function validate(email) { - if (validateEmail(email)) { - return true; - } else { - return false; - } -} - -// List the subscriptions to the Amazon SNS topic. -const getSubs = async () => { - const params = { - TopicArn: TOPIC_ARN, - }; - try { - const data = await snsClient.send( - new ListSubscriptionsByTopicCommand(params) - ); - console.log("Success.", data.Subscriptions[0].SubscriptionArn); - var alertBody = ""; - for (let i = 0; i < data.Subscriptions.length; i++) { - alertBody += - "Owner: " + - data.Subscriptions[i].Owner + - "\n" + - "Email: " + - data.Subscriptions[i].Endpoint + - "\n" + - "\n"; - } - alert(alertBody); - } catch (err) { - console.log("Error", err.stack); - } -}; -// Expose the function to the browser. -window.getSubs = getSubs; - -// Unsubscribe an email subscription from Amazon SNS topic. -const delSub = async () => { - const userEmail = document.getElementById("inputEmail1").value; - var result = validate(userEmail); - if (result == false) { - alert(userEmail + " is not valid. Please specify a valid email"); - return; - } - try { - const data = await snsClient.send(new ListSubscriptionsCommand({})); - console.log("Success.", data.Subscriptions[0].Endpoint); - for (let i = 0; i < data.Subscriptions.length; i++) { - if (data.Subscriptions[i].Endpoint == userEmail) { - try { - const params = { - SubscriptionArn: data.Subscriptions[i].SubscriptionArn, - }; - const result = await snsClient.send(new UnsubscribeCommand(params)); - console.log("Subscription deleted.", result); - } catch (err) { - console.log("Error", err.stack); - } - } - } - } catch (err) { - console.log("Error", err.stack); - } -}; -// Expose the function to the browser. -window.delSub = delSub; - -// Send a message to all emails subscribed to the Amazon SNS topic. -const sendMessage = async () => { - const messageText = document.getElementById("body").value; - if (messageText == "") { - alert("Please enter text"); - return; - } - const params = { - Message: messageText, - TopicArn: TOPIC_ARN, - }; - try { - await snsClient.send(new PublishCommand(params)); - alert("Message published."); - } catch (err) { - console.log("Error", err.stack); - } -}; -// Expose the function to the browser. -window.sendMessage = sendMessage; -/* -*/ diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/libs/snsClient.js b/javascriptv3/example_code/cross-services/sns-sample-app/libs/snsClient.js deleted file mode 100644 index f226ad51900..00000000000 --- a/javascriptv3/example_code/cross-services/sns-sample-app/libs/snsClient.js +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -snsClient.js is a helper function that creates the Amazon Simple Notification Service (Amazon SNS) service clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[sns-functions.JavaScript.snsClient] -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { SNSClient } from "@aws-sdk/client-sns"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon Comprehend service client object. -const snsClient = new SNSClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { snsClient }; -// snippet-end:[sns-functions.JavaScript.snsClient] diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/package.json b/javascriptv3/example_code/cross-services/sns-sample-app/package.json deleted file mode 100644 index e2fd45c5213..00000000000 --- a/javascriptv3/example_code/cross-services/sns-sample-app/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "@aws-doc-sdk-examples/aws-sdk-v3-iam-examples", - "version": "1.0.0", - "main": "index.js", - "repository": "git@github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/iam.git", - "author": "Brian Murray , Alex Forsyth ", - "license": "Apache 2.0", - "scripts": { - "build": "webpack ./js/index.js --mode development --target web --devtool false -o ./js/main.js", - "build-cdk": "aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM", - "test": "exit 0" - }, - "dependencies": { - "@aws-sdk/client-cognito-identity": "^3.32.0", - "@aws-sdk/credential-provider-cognito-identity": "^3.32.0", - "@aws-sdk/client-iam": "^3.32.0", - "@aws-sdk/client-sns": "^3.32.0", - "jest": "^26.6.3" - }, - "devDependencies": { - "webpack": "^4.42.0", - "webpack-cli": "^3.3.11" - }, - "type": "module" -} diff --git a/javascriptv3/example_code/cross-services/sns-sample-app/setup.yaml b/javascriptv3/example_code/cross-services/sns-sample-app/setup.yaml deleted file mode 100644 index 7bacf8c6be8..00000000000 --- a/javascriptv3/example_code/cross-services/sns-sample-app/setup.yaml +++ /dev/null @@ -1,150 +0,0 @@ -Resources: - MyTopic86869434: - Type: AWS::SNS::Topic - Properties: - KmsMasterKeyId: - Fn::Join: - - "" - - - "arn:" - - Ref: AWS::Partition - - ":kms:" - - Ref: AWS::Region - - ":" - - Ref: AWS::AccountId - - :alias/aws/sns - Metadata: - aws:cdk:path: SetupStack1/MyTopic/Resource - ExampleIdentityPool: - Type: AWS::Cognito::IdentityPool - Properties: - AllowUnauthenticatedIdentities: true - Metadata: - aws:cdk:path: SetupStack1/ExampleIdentityPool - CognitoDefaultUnauthenticatedRoleABBF7267: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRoleWithWebIdentity - Condition: - StringEquals: - cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPool - ForAnyValue:StringLike: - cognito-identity.amazonaws.com:amr: unauthenticated - Effect: Allow - Principal: - Federated: cognito-identity.amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: SetupStack1/CognitoDefaultUnauthenticatedRole/Resource - CognitoDefaultUnauthenticatedRoleDefaultPolicy2B700C08: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: - - mobileanalytics:PutEvents - - cognito-sync:* - Effect: Allow - Resource: "*" - - Action: sns:* - Effect: Allow - Resource: "*" - Version: "2012-10-17" - PolicyName: CognitoDefaultUnauthenticatedRoleDefaultPolicy2B700C08 - Roles: - - Ref: CognitoDefaultUnauthenticatedRoleABBF7267 - Metadata: - aws:cdk:path: SetupStack1/CognitoDefaultUnauthenticatedRole/DefaultPolicy/Resource - DefaultValid: - Type: AWS::Cognito::IdentityPoolRoleAttachment - Properties: - IdentityPoolId: - Ref: ExampleIdentityPool - Roles: - unauthenticated: - Fn::GetAtt: - - CognitoDefaultUnauthenticatedRoleABBF7267 - - Arn - Metadata: - aws:cdk:path: SetupStack1/DefaultValid - CDKMetadata: - Type: AWS::CDK::Metadata - Properties: - Modules: aws-cdk=1.109.0,@aws-cdk/assets=1.84.0,@aws-cdk/aws-applicationautoscaling=1.84.0,@aws-cdk/aws-autoscaling-common=1.84.0,@aws-cdk/aws-cloudwatch=1.84.0,@aws-cdk/aws-codeguruprofiler=1.84.0,@aws-cdk/aws-cognito=1.84.0,@aws-cdk/aws-ec2=1.84.0,@aws-cdk/aws-ecr=1.84.0,@aws-cdk/aws-ecr-assets=1.84.0,@aws-cdk/aws-events=1.84.0,@aws-cdk/aws-iam=1.84.0,@aws-cdk/aws-kms=1.84.0,@aws-cdk/aws-lambda=1.84.0,@aws-cdk/aws-logs=1.84.0,@aws-cdk/aws-s3=1.84.0,@aws-cdk/aws-s3-assets=1.84.0,@aws-cdk/aws-sns=1.84.0,@aws-cdk/aws-sqs=1.84.0,@aws-cdk/aws-ssm=1.84.0,@aws-cdk/cloud-assembly-schema=1.84.0,@aws-cdk/core=1.84.0,@aws-cdk/custom-resources=1.84.0,@aws-cdk/cx-api=1.84.0,@aws-cdk/region-info=1.84.0,jsii-runtime=node.js/v14.7.0 - Metadata: - aws:cdk:path: SetupStack1/CDKMetadata/Default - Condition: CDKMetadataAvailable -Outputs: - Identitypoolid: - Value: - Ref: ExampleIdentityPool - SNStopicARN: - Value: - Ref: MyTopic86869434 -Conditions: - CDKMetadataAvailable: - Fn::Or: - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - ap-east-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ap-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ca-central-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-north-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-northwest-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-central-1 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - eu-north-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-2 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-3 - - Fn::Equals: - - Ref: AWS::Region - - me-south-1 - - Fn::Equals: - - Ref: AWS::Region - - sa-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-2 - - Fn::Equals: - - Ref: AWS::Region - - us-west-1 - - Fn::Equals: - - Ref: AWS::Region - - us-west-2 diff --git a/javascriptv3/example_code/libs/package.json b/javascriptv3/example_code/libs/package.json index 7442ab61ef2..ab8ea4369e7 100644 --- a/javascriptv3/example_code/libs/package.json +++ b/javascriptv3/example_code/libs/package.json @@ -9,6 +9,7 @@ "test": "vitest run **/*.unit.test.js" }, "dependencies": { + "@aws-sdk/client-cloudformation": "^3.637.0", "@aws-sdk/client-lambda": "^3.168.0", "@types/archiver": "^5.3.1", "archiver": "^5.3.1", diff --git a/javascriptv3/example_code/libs/sdk/cfn-outputs.js b/javascriptv3/example_code/libs/sdk/cfn-outputs.js new file mode 100644 index 00000000000..6d26a387f7b --- /dev/null +++ b/javascriptv3/example_code/libs/sdk/cfn-outputs.js @@ -0,0 +1,45 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { + CloudFormationClient, + DescribeStacksCommand, +} from "@aws-sdk/client-cloudformation"; + +/** + * Get the CFN outputs for a stack. + * @param {string} stackName + * @param {Optional} region + * @returns {Promise} + */ +export const getCfnOutputs = async (stackName, region) => { + const cfnClient = new CloudFormationClient({ region }); + + try { + const { Stacks } = await cfnClient.send( + new DescribeStacksCommand({ StackName: stackName }), + ); + if (!Stacks.length === 1) { + throw new Error("Error getting CFN outputs. No stacks found."); + } else { + const outputs = Stacks[0].Outputs ?? []; + return outputs.reduce((prev, { OutputKey, OutputValue }) => { + return { + ...prev, + [OutputKey]: OutputValue, + }; + }, {}); + } + } catch (caught) { + if ( + caught instanceof Error && + caught.message.includes(`Stack with id ${stackName} does not exist`) + ) { + const error = new Error(`Stack with id ${stackName} was not found.`); + error.name = "StackNotFound"; + throw error; + } else { + throw caught; + } + } +}; diff --git a/javascriptv3/package.json b/javascriptv3/package.json index 0f05631aef0..4d4b0b39231 100644 --- a/javascriptv3/package.json +++ b/javascriptv3/package.json @@ -36,6 +36,7 @@ "example_code/cross-services/feedback-sentiment-analyzer/ExtractText", "example_code/cross-services/feedback-sentiment-analyzer/SynthesizeAudio", "example_code/cross-services/feedback-sentiment-analyzer/TranslateText", + "example_code/cross-services/photo_analyzer", "example_code/cross-services/photo-asset-manager", "example_code/cross-services/transcribe-streaming-app", "example_code/cross-services/wkflw-topics-queues", From 3eb8b338faed1ed262a9c7e4a533d424fef26c3e Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Wed, 4 Sep 2024 15:48:07 -0400 Subject: [PATCH 65/98] JavaScript (v3): S3 - Add 'delete all objects' scenario. (#6812) --- .doc_gen/metadata/s3_metadata.yaml | 17 ++++++ javascriptv3/example_code/s3/README.md | 13 ++++ .../s3/scenarios/delete-all-objects.js | 60 +++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 javascriptv3/example_code/s3/scenarios/delete-all-objects.js diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index 100da914af6..74849c80821 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -3392,3 +3392,20 @@ s3_Scenario_ProcessS3EventNotification: services: s3: {PutBucketNotificationConfiguration} sqs: {ReceiveMessage, GetQueueAttributes, DeleteMessageBatch} +s3_Scenario_DeleteAllObjects: + title: Delete all objects in a given &S3; bucket using an &AWS; SDK. + title_abbrev: Delete all objects in a bucket + synopsis: delete all of the objects in an &S3; bucket. + category: Scenarios + languages: + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/s3 + sdkguide: + excerpts: + - description: Delete all objects for a given &S3; bucket. + snippet_files: + - javascriptv3/example_code/s3/scenarios/delete-all-objects.js + services: + s3: {DeleteObjects, ListObjectsV2} diff --git a/javascriptv3/example_code/s3/README.md b/javascriptv3/example_code/s3/README.md index d1cd36780f4..2b149823891 100644 --- a/javascriptv3/example_code/s3/README.md +++ b/javascriptv3/example_code/s3/README.md @@ -77,6 +77,7 @@ functions within the same service. - [Create a presigned URL](scenarios/presigned-url-upload.js) - [Create a web page that lists Amazon S3 objects](../web/s3/list-objects/src/App.tsx) +- [Delete all objects in a bucket](scenarios/delete-all-objects.js) - [Get the legal hold configuration of an object](actions/get-object-legal-hold.js) - [Lock Amazon S3 objects](scenarios/object-locking/index.js) - [Upload or download large files](scenarios/multipart-upload.js) @@ -175,6 +176,18 @@ This example shows you how to list Amazon S3 objects in a web page. +#### Delete all objects in a bucket + +This example shows you how to delete all of the objects in an Amazon S3 bucket. + + + + + + + + + #### Get the legal hold configuration of an object This example shows you how to get the legal hold configuration of an S3 bucket. diff --git a/javascriptv3/example_code/s3/scenarios/delete-all-objects.js b/javascriptv3/example_code/s3/scenarios/delete-all-objects.js new file mode 100644 index 00000000000..4402b9851e8 --- /dev/null +++ b/javascriptv3/example_code/s3/scenarios/delete-all-objects.js @@ -0,0 +1,60 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { + DeleteObjectsCommand, + paginateListObjectsV2, + S3Client, +} from "@aws-sdk/client-s3"; + +/** + * + * @param {{ bucketName: string }} config + */ +export const main = async ({ bucketName }) => { + const client = new S3Client({}); + try { + console.log(`Deleting all objects in bucket: ${bucketName}`); + + const paginator = paginateListObjectsV2( + { client }, + { + Bucket: bucketName, + }, + ); + + const objectKeys = []; + for await (const { Contents } of paginator) { + objectKeys.push(...Contents.map((obj) => ({ Key: obj.Key }))); + } + + const deleteCommand = new DeleteObjectsCommand({ + Bucket: bucketName, + Delete: { Objects: objectKeys }, + }); + + await client.send(deleteCommand); + + console.log(`All objects deleted from bucket: ${bucketName}`); + } catch (caught) { + if (caught instanceof Error) { + console.error( + `Failed to empty ${bucketName}. ${caught.name}: ${caught.message}`, + ); + } + } +}; + +// Call function if run directly. +import { fileURLToPath } from "url"; +import { parseArgs } from "util"; +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + bucketName: { + type: "string", + }, + }; + + const { values } = parseArgs({ options }); + main(values); +} From 029c29b25cc54265f60424c541bfc0792a882d91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2024 12:49:58 -0700 Subject: [PATCH 66/98] Bump webpack from 5.76.2 to 5.94.0 in /python/cross_service/photo_analyzer/frontend (#6813) Bump webpack in /python/cross_service/photo_analyzer/frontend Bumps [webpack](https://github.com/webpack/webpack) from 5.76.2 to 5.94.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.76.2...v5.94.0) --- updated-dependencies: - dependency-name: webpack dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../photo_analyzer/frontend/package-lock.json | 728 +++++++++--------- 1 file changed, 355 insertions(+), 373 deletions(-) diff --git a/python/cross_service/photo_analyzer/frontend/package-lock.json b/python/cross_service/photo_analyzer/frontend/package-lock.json index 305225e9353..acb17cd3041 100644 --- a/python/cross_service/photo_analyzer/frontend/package-lock.json +++ b/python/cross_service/photo_analyzer/frontend/package-lock.json @@ -3143,30 +3143,30 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -3178,12 +3178,12 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { @@ -3908,19 +3908,10 @@ "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { "version": "4.17.17", @@ -4416,133 +4407,133 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -4610,10 +4601,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "peerDependencies": { "acorn": "^8" } @@ -5425,9 +5416,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -5436,13 +5427,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -5543,9 +5538,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "funding": [ { "type": "opencollective", @@ -5554,6 +5549,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -6913,9 +6912,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.314", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.314.tgz", - "integrity": "sha512-+3RmNVx9hZLlc0gW//4yep0K5SYKmIvB5DXg1Yg6varsuAHlHwTeqeygfS8DWwLCsNOWrgj+p9qgM5WYjw1lXQ==" + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==" }, "node_modules/emittery": { "version": "0.8.1", @@ -6950,9 +6949,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7056,9 +7055,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "node_modules/es-set-tostringtag": { "version": "2.0.1", @@ -7098,9 +7097,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -8615,9 +8614,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -12213,9 +12212,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/nopt": { "version": "5.0.0", @@ -12669,9 +12668,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -14972,9 +14971,9 @@ } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -15934,12 +15933,12 @@ } }, "node_modules/terser": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", - "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -15951,15 +15950,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -16317,9 +16316,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -16328,14 +16327,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -16456,9 +16459,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -16484,33 +16487,32 @@ } }, "node_modules/webpack": { - "version": "5.76.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", - "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -16766,11 +16768,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -19537,27 +19534,27 @@ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" }, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } } } @@ -19568,12 +19565,12 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@leichtgewicht/ip-codec": { @@ -20081,19 +20078,10 @@ "@types/json-schema": "*" } }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "@types/express": { "version": "4.17.17", @@ -20479,133 +20467,133 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -20660,10 +20648,10 @@ } } }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "requires": {} }, "acorn-jsx": { @@ -21272,14 +21260,14 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "bser": { @@ -21350,9 +21338,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==" + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==" }, "canvas": { "version": "2.11.0", @@ -22345,9 +22333,9 @@ } }, "electron-to-chromium": { - "version": "1.4.314", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.314.tgz", - "integrity": "sha512-+3RmNVx9hZLlc0gW//4yep0K5SYKmIvB5DXg1Yg6varsuAHlHwTeqeygfS8DWwLCsNOWrgj+p9qgM5WYjw1lXQ==" + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==" }, "emittery": { "version": "0.8.1", @@ -22370,9 +22358,9 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -22461,9 +22449,9 @@ } }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "es-set-tostringtag": { "version": "2.0.1", @@ -22494,9 +22482,9 @@ } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" }, "escape-html": { "version": "1.0.3", @@ -23599,9 +23587,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "grapheme-splitter": { "version": "1.0.4", @@ -26358,9 +26346,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "nopt": { "version": "5.0.0", @@ -26679,9 +26667,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "picomatch": { "version": "2.3.1", @@ -28143,9 +28131,9 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -28888,12 +28876,12 @@ } }, "terser": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", - "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -28906,15 +28894,15 @@ } }, "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "requires": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" } }, "test-exclude": { @@ -29166,12 +29154,12 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { @@ -29270,9 +29258,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -29292,41 +29280,35 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "5.76.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", - "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "requires": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", From b30175a66565e41ae9f81b72e4be2d6a61b64590 Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Wed, 4 Sep 2024 17:16:47 -0400 Subject: [PATCH 67/98] JavaScript (v3): Integration test fixes (#6814) * JavaScript (v3): CloudWatch Events - Make integ test cleanup more robust. * JavaScript (v3): DynamoDb - Fix bad scenario options for partiql examples. * JavaScript (v3): SES - Mark tests for sequential runs instead of concurrent. --- .../cloudwatch-events.integration.test.js | 64 ++++++++++++++----- .../dynamodb/scenarios/partiql-batch.js | 2 +- .../dynamodb/scenarios/partiql-single.js | 2 +- javascriptv3/example_code/ses/vite.config.js | 12 ++++ 4 files changed, 61 insertions(+), 19 deletions(-) create mode 100644 javascriptv3/example_code/ses/vite.config.js diff --git a/javascriptv3/example_code/cloudwatch-events/tests/cloudwatch-events.integration.test.js b/javascriptv3/example_code/cloudwatch-events/tests/cloudwatch-events.integration.test.js index 4309df2f4f2..532b7ac64c2 100644 --- a/javascriptv3/example_code/cloudwatch-events/tests/cloudwatch-events.integration.test.js +++ b/javascriptv3/example_code/cloudwatch-events/tests/cloudwatch-events.integration.test.js @@ -39,11 +39,21 @@ const createLogGroup = async (logGroupName) => { * @param {string} ruleName - The name of the rule. */ const deleteRule = async (ruleName) => { - const cweClient = new CloudWatchEventsClient({}); - const command = new DeleteRuleCommand({ - Name: ruleName, - }); - await cweClient.send(command); + try { + const cweClient = new CloudWatchEventsClient({}); + const command = new DeleteRuleCommand({ + Name: ruleName, + }); + await cweClient.send(command); + } catch (caught) { + if (caught instanceof Error) { + console.error( + `Failed to delete rule: ${ruleName}. ${caught.name}: ${caught.message}`, + ); + } else { + throw caught; + } + } }; /** @@ -52,12 +62,22 @@ const deleteRule = async (ruleName) => { * @param {string[]} targetIds - The IDs of the targets to remove. */ const removeTargets = async (ruleName, targetIds) => { - const cweClient = new CloudWatchEventsClient({}); - const command = new RemoveTargetsCommand({ - Rule: ruleName, - Ids: targetIds, - }); - await cweClient.send(command); + try { + const cweClient = new CloudWatchEventsClient({}); + const command = new RemoveTargetsCommand({ + Rule: ruleName, + Ids: targetIds, + }); + await cweClient.send(command); + } catch (caught) { + if (caught instanceof Error) { + console.error( + `Failed to remove targets: ${targetIds} from rule: ${ruleName}. ${caught.name}: ${caught.message}`, + ); + } else { + throw caught; + } + } }; /** @@ -65,15 +85,25 @@ const removeTargets = async (ruleName, targetIds) => { * @param {string} logGroupName - The name of the log group. */ const deleteLogGroup = async (logGroupName) => { - const cwlClient = new CloudWatchLogsClient({}); - const command = new DeleteLogGroupCommand({ - logGroupName: logGroupName, - }); - await cwlClient.send(command); + try { + const cwlClient = new CloudWatchLogsClient({}); + const command = new DeleteLogGroupCommand({ + logGroupName: logGroupName, + }); + await cwlClient.send(command); + } catch (caught) { + if (caught instanceof Error) { + console.error( + `Failed to delete log group: ${logGroupName}. ${caught.name}: ${caught.message}`, + ); + } else { + throw caught; + } + } }; describe("CloudWatch Events integration test", () => { - const logGroupName = "test-log-group"; + const logGroupName = "cloudwatch-events-test-log-group"; const ruleName = "test-rule"; const rulePattern = JSON.stringify({ source: ["my.app"], diff --git a/javascriptv3/example_code/dynamodb/scenarios/partiql-batch.js b/javascriptv3/example_code/dynamodb/scenarios/partiql-batch.js index 9983c20a939..b462f08e206 100644 --- a/javascriptv3/example_code/dynamodb/scenarios/partiql-batch.js +++ b/javascriptv3/example_code/dynamodb/scenarios/partiql-batch.js @@ -35,7 +35,7 @@ export const main = async (confirmAll = false) => { "deleteTable", `A table named ${tableName} already exists. If you choose not to delete this table, the scenario cannot continue. Delete it?`, - { confirmAll }, + { type: "confirm", confirmAll }, ); const deleteTable = await input.handle({}); if (deleteTable) { diff --git a/javascriptv3/example_code/dynamodb/scenarios/partiql-single.js b/javascriptv3/example_code/dynamodb/scenarios/partiql-single.js index cf21ce1b1ee..6ef0762c6bc 100644 --- a/javascriptv3/example_code/dynamodb/scenarios/partiql-single.js +++ b/javascriptv3/example_code/dynamodb/scenarios/partiql-single.js @@ -35,7 +35,7 @@ export const main = async (confirmAll = false) => { "deleteTable", `A table named ${tableName} already exists. If you choose not to delete this table, the scenario cannot continue. Delete it?`, - { confirmAll }, + { type: "confirm", confirmAll }, ); const deleteTable = await input.handle({}); if (deleteTable) { diff --git a/javascriptv3/example_code/ses/vite.config.js b/javascriptv3/example_code/ses/vite.config.js new file mode 100644 index 00000000000..ee40485c2b6 --- /dev/null +++ b/javascriptv3/example_code/ses/vite.config.js @@ -0,0 +1,12 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + testTimeout: 3600000, // 1 hour timeout + sequence: { + concurrent: false, // Run tests sequentially + }, + }, +}); From 65e4f46e0517d26a4b97e5ced90411e01e8d9c0b Mon Sep 17 00:00:00 2001 From: Rachel Hagerman <110480692+rlhagerm@users.noreply.github.com> Date: Thu, 5 Sep 2024 10:27:26 -0500 Subject: [PATCH 68/98] .NET: Add S3 bucket encryption example (#6778) This example demonstrates setting and getting the server side encryption for a bucket. --- .doc_gen/metadata/s3_metadata.yaml | 24 +++ .../PutBucketEncryption.sln | 31 ++++ .../ServerSideEncryption.cs | 158 ++++++++++++++++++ .../ServerSideEncryption.csproj | 17 ++ .../ServerSideEncryptionTests.cs | 103 ++++++++++++ .../ServerSideEncryptionTests.csproj | 29 ++++ dotnetv3/S3/README.md | 2 + 7 files changed, 364 insertions(+) create mode 100644 dotnetv3/S3/PutBucketEncryption/PutBucketEncryption.sln create mode 100644 dotnetv3/S3/PutBucketEncryption/ServerSideEncryption/ServerSideEncryption.cs create mode 100644 dotnetv3/S3/PutBucketEncryption/ServerSideEncryption/ServerSideEncryption.csproj create mode 100644 dotnetv3/S3/PutBucketEncryption/ServerSideEncryptionTests/ServerSideEncryptionTests.cs create mode 100644 dotnetv3/S3/PutBucketEncryption/ServerSideEncryptionTests/ServerSideEncryptionTests.csproj diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index 74849c80821..e031785335a 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -2427,6 +2427,30 @@ s3_GetObjectAttributes: - cpp.example_code.s3.GetObjectAttributes services: s3: {GetObjectAttributes} +s3_PutBucketEncryption: + languages: + .NET: + versions: + - sdk_version: 3 + github: dotnetv3/S3/PutBucketEncryption + excerpts: + - description: + snippet_tags: + - S3.dotnetv3.PutBucketServerSideEncryption + services: + s3: {PutBucketEncryption} +s3_GetBucketEncryption: + languages: + .NET: + versions: + - sdk_version: 3 + github: dotnetv3/S3/PutBucketEncryption + excerpts: + - description: + snippet_tags: + - S3.dotnetv3.GetBucketServerSideEncryption + services: + s3: {GetBucketEncryption} s3_DownloadBucketToDirectory: title: Download all objects in an &S3long; (&S3;) bucket to a local directory title_abbrev: Download objects to a local directory diff --git a/dotnetv3/S3/PutBucketEncryption/PutBucketEncryption.sln b/dotnetv3/S3/PutBucketEncryption/PutBucketEncryption.sln new file mode 100644 index 00000000000..7385e83e320 --- /dev/null +++ b/dotnetv3/S3/PutBucketEncryption/PutBucketEncryption.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.10.35201.131 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerSideEncryption", "ServerSideEncryption\ServerSideEncryption.csproj", "{4225C4A2-0FAC-4A42-9A26-D82B6A41EC7D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerSideEncryptionTests", "ServerSideEncryptionTests\ServerSideEncryptionTests.csproj", "{49B7349D-97CC-4622-B32E-BABAAF21E572}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4225C4A2-0FAC-4A42-9A26-D82B6A41EC7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4225C4A2-0FAC-4A42-9A26-D82B6A41EC7D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4225C4A2-0FAC-4A42-9A26-D82B6A41EC7D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4225C4A2-0FAC-4A42-9A26-D82B6A41EC7D}.Release|Any CPU.Build.0 = Release|Any CPU + {49B7349D-97CC-4622-B32E-BABAAF21E572}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49B7349D-97CC-4622-B32E-BABAAF21E572}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49B7349D-97CC-4622-B32E-BABAAF21E572}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49B7349D-97CC-4622-B32E-BABAAF21E572}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E1A86E11-AEE8-495D-9C84-EE59DCAA0C1B} + EndGlobalSection +EndGlobal diff --git a/dotnetv3/S3/PutBucketEncryption/ServerSideEncryption/ServerSideEncryption.cs b/dotnetv3/S3/PutBucketEncryption/ServerSideEncryption/ServerSideEncryption.cs new file mode 100644 index 00000000000..93e0b1e989c --- /dev/null +++ b/dotnetv3/S3/PutBucketEncryption/ServerSideEncryption/ServerSideEncryption.cs @@ -0,0 +1,158 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +using System.Net; +using System.Text.RegularExpressions; +using Amazon.S3; +using Amazon.S3.Model; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace ServerSideEncryption; + +// snippet-start:[S3.dotnetv3.ServerSideEncryption] +/// +/// Set and read the server side encryption settings for a bucket. +/// +public static class ServerSideEncryption +{ + public static IAmazonS3 _s3Client = null!; + public static string _bucketName = null!; + public static string _kmsKeyId = null!; + public static bool _interactive = true; + + static async Task Main(string[] args) + { + // Use the AWS .NET Core Setup package to set up dependency injection for the Amazon S3 service. + // Use your AWS profile name, or leave it blank to use the default profile. + using var host = Host.CreateDefaultBuilder(args) + .ConfigureServices((_, services) => + services.AddAWSService() + ).Build(); + + // Now the client is available for injection. + _s3Client = host.Services.GetRequiredService(); + + Console.WriteLine(new string('-', 80)); + Console.WriteLine("This example demonstrates setting and getting the server side encryption for a bucket."); + Console.WriteLine(new string('-', 80)); + + var retries = 5; + var success = false; + while (!success && retries > 0) + { + if (_interactive) + { + _bucketName = PromptUserForResource("Enter the name of a bucket to set encryption:"); + _kmsKeyId = PromptUserForResource("Enter the Id of the KMS Key to use for encryption:"); + } + success = await SetBucketServerSideEncryption(_bucketName, _kmsKeyId); + retries--; + } + + if (success) + { + await GetEncryptionSettings(_bucketName); + } + + Console.WriteLine(new string('-', 80)); + Console.WriteLine("Example complete."); + Console.WriteLine(new string('-', 80)); + + } + + // snippet-start:[S3.dotnetv3.PutBucketServerSideEncryption] + /// + /// Set the bucket server side encryption to use AWSKMS with a customer-managed key id. + /// + /// Name of the bucket. + /// The Id of the KMS Key. + /// True if successful. + public static async Task SetBucketServerSideEncryption(string bucketName, string kmsKeyId) + { + var serverSideEncryptionByDefault = new ServerSideEncryptionConfiguration + { + ServerSideEncryptionRules = new List + { + new ServerSideEncryptionRule + { + ServerSideEncryptionByDefault = new ServerSideEncryptionByDefault + { + ServerSideEncryptionAlgorithm = ServerSideEncryptionMethod.AWSKMS, + ServerSideEncryptionKeyManagementServiceKeyId = kmsKeyId + } + } + } + }; + try + { + var encryptionResponse = await _s3Client.PutBucketEncryptionAsync(new PutBucketEncryptionRequest + { + BucketName = bucketName, + ServerSideEncryptionConfiguration = serverSideEncryptionByDefault, + }); + + return encryptionResponse.HttpStatusCode == HttpStatusCode.OK; + } + catch (AmazonS3Exception ex) + { + Console.WriteLine(ex.ErrorCode == "AccessDenied" + ? $"This account does not have permission to set encryption on {bucketName}, please try again." + : $"Unable to set bucket encryption for bucket {bucketName}, {ex.Message}"); + } + return false; + } + // snippet-end:[S3.dotnetv3.PutBucketServerSideEncryption] + + // snippet-start:[S3.dotnetv3.GetBucketServerSideEncryption] + /// + /// Get and print the encryption settings of a bucket. + /// + /// Name of the bucket. + /// Async task. + public static async Task GetEncryptionSettings(string bucketName) + { + // Check and print the bucket encryption settings. + Console.WriteLine($"Getting encryption settings for bucket {bucketName}."); + + try + { + var settings = + await _s3Client.GetBucketEncryptionAsync( + new GetBucketEncryptionRequest() { BucketName = bucketName }); + + foreach (var encryptionSettings in settings?.ServerSideEncryptionConfiguration?.ServerSideEncryptionRules!) + { + Console.WriteLine( + $"\tAlgorithm: {encryptionSettings.ServerSideEncryptionByDefault.ServerSideEncryptionAlgorithm}"); + Console.WriteLine( + $"\tKey: {encryptionSettings.ServerSideEncryptionByDefault.ServerSideEncryptionKeyManagementServiceKeyId}"); + } + } + catch (AmazonS3Exception ex) + { + Console.WriteLine(ex.ErrorCode == "InvalidBucketName" + ? $"Bucket {bucketName} was not found." + : $"Unable to get bucket encryption for bucket {bucketName}, {ex.Message}"); + } + } + // snippet-end:[S3.dotnetv3.GetBucketServerSideEncryption] + + /// + /// Prompt the user for a non-empty resource. + /// + /// The valid resource. + private static string PromptUserForResource(string prompt) + { + Console.WriteLine(prompt); + string resourceName = Console.ReadLine()!; + var regex = "[0-9a-zA-Z-_.]+"; + if (!Regex.IsMatch(resourceName, regex)) + { + Console.WriteLine($"Invalid resource. Please use a name that matches the pattern {regex}."); + return PromptUserForResource(prompt); + } + return resourceName!; + } +} +// snippet-end:[S3.dotnetv3.ServerSideEncryption] \ No newline at end of file diff --git a/dotnetv3/S3/PutBucketEncryption/ServerSideEncryption/ServerSideEncryption.csproj b/dotnetv3/S3/PutBucketEncryption/ServerSideEncryption/ServerSideEncryption.csproj new file mode 100644 index 00000000000..266cdfbb8b8 --- /dev/null +++ b/dotnetv3/S3/PutBucketEncryption/ServerSideEncryption/ServerSideEncryption.csproj @@ -0,0 +1,17 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + + diff --git a/dotnetv3/S3/PutBucketEncryption/ServerSideEncryptionTests/ServerSideEncryptionTests.cs b/dotnetv3/S3/PutBucketEncryption/ServerSideEncryptionTests/ServerSideEncryptionTests.cs new file mode 100644 index 00000000000..3877b98a589 --- /dev/null +++ b/dotnetv3/S3/PutBucketEncryption/ServerSideEncryptionTests/ServerSideEncryptionTests.cs @@ -0,0 +1,103 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +using System.Net; +using Amazon.S3; +using Amazon.S3.Model; +using Moq; +using Xunit.Extensions.Ordering; + +namespace ServerSideEncryptionTests; + +public class ServerSideEncryptionTests +{ + /// + /// Test the method setting bucket encryption. Should return successful. + /// + /// Async task. + [Fact] + [Order(1)] + [Trait("Category", "Unit")] + public async Task TestSetEncryption() + { + // Arrange. + var mockS3Service = new Mock(); + + mockS3Service.Setup(client => client.PutBucketEncryptionAsync( + It.IsAny(), + It.IsAny())) + .Returns((PutBucketEncryptionRequest r, + CancellationToken token) => + { + return Task.FromResult(new PutBucketEncryptionResponse() + { + HttpStatusCode = HttpStatusCode.OK, + }); + }); + + ServerSideEncryption.ServerSideEncryption._s3Client = mockS3Service.Object; + + // Act. + var success = + await ServerSideEncryption.ServerSideEncryption.SetBucketServerSideEncryption( + "testName", "testKey"); + + // Assert. + Assert.True(success); + + mockS3Service.Verify(ms => ms.PutBucketEncryptionAsync( + It.Is(r => + r.BucketName == "testName"), + CancellationToken.None), Times.Once); + } + + /// + /// Test the method getting bucket encryption. Should not have exceptions. + /// + /// Async task. + [Fact] + [Order(2)] + [Trait("Category", "Unit")] + public async Task TestGetEncryption() + { + // Arrange. + var mockS3Service = new Mock(); + + mockS3Service.Setup(client => client.GetBucketEncryptionAsync( + It.IsAny(), + It.IsAny())) + .Returns((GetBucketEncryptionRequest r, + CancellationToken token) => + { + return Task.FromResult(new GetBucketEncryptionResponse() + { + HttpStatusCode = HttpStatusCode.OK, + ServerSideEncryptionConfiguration = new ServerSideEncryptionConfiguration() + { + ServerSideEncryptionRules = new List() + { + new ServerSideEncryptionRule() + { + ServerSideEncryptionByDefault = new ServerSideEncryptionByDefault() + { + ServerSideEncryptionAlgorithm = ServerSideEncryptionMethod.AWSKMS + } + } + } + } + }); + }); + + ServerSideEncryption.ServerSideEncryption._s3Client = mockS3Service.Object; + + // Act. + await ServerSideEncryption.ServerSideEncryption.GetEncryptionSettings( + "testName"); + + // Assert. + mockS3Service.Verify(ms => ms.GetBucketEncryptionAsync( + It.Is(r => + r.BucketName == "testName"), + CancellationToken.None), Times.Once); + } +} \ No newline at end of file diff --git a/dotnetv3/S3/PutBucketEncryption/ServerSideEncryptionTests/ServerSideEncryptionTests.csproj b/dotnetv3/S3/PutBucketEncryption/ServerSideEncryptionTests/ServerSideEncryptionTests.csproj new file mode 100644 index 00000000000..387e3b46278 --- /dev/null +++ b/dotnetv3/S3/PutBucketEncryption/ServerSideEncryptionTests/ServerSideEncryptionTests.csproj @@ -0,0 +1,29 @@ + + + + net6.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + + diff --git a/dotnetv3/S3/README.md b/dotnetv3/S3/README.md index 174b8636141..bdfff1ac68c 100644 --- a/dotnetv3/S3/README.md +++ b/dotnetv3/S3/README.md @@ -50,6 +50,7 @@ Code excerpts that show you how to call individual service functions. - [DeleteObjects](S3_Basics/S3Bucket.cs#L221) - [GetBucketAcl](BucketACLExample/BucketACL.cs#L75) - [GetBucketCors](s3CORSExample/S3CORS.cs#L125) +- [GetBucketEncryption](PutBucketEncryption/ServerSideEncryption/ServerSideEncryption.cs#L107) - [GetBucketLifecycleConfiguration](LifecycleExample/Lifecycle.cs#L169) - [GetBucketWebsite](WebsiteConfigExample/WebsiteConfig.cs#L72) - [GetObject](S3_Basics/S3Bucket.cs#L85) @@ -62,6 +63,7 @@ Code excerpts that show you how to call individual service functions. - [PutBucketAccelerateConfiguration](TransferAccelerationExample/TransferAcceleration.cs#L6) - [PutBucketAcl](BucketACLExample/BucketACL.cs#L37) - [PutBucketCors](s3CORSExample/S3CORS.cs#L104) +- [PutBucketEncryption](PutBucketEncryption/ServerSideEncryption/ServerSideEncryption.cs#L64) - [PutBucketLifecycleConfiguration](LifecycleExample/Lifecycle.cs#L145) - [PutBucketLogging](ServerAccessLoggingExample/ServerAccessLogging.cs#L6) - [PutBucketNotificationConfiguration](EnableNotificationsExample/EnableNotifications.cs#L6) From b3b365ef34ed204cbfcc3bec0242dacb05b50d34 Mon Sep 17 00:00:00 2001 From: Scott Macdonald <57190223+scmacdon@users.noreply.github.com> Date: Thu, 5 Sep 2024 11:29:19 -0400 Subject: [PATCH 69/98] Java Update the MVP to a Basics for S3 (#6790) * refactored S3 MVP into a Basics Scenario --- .doc_gen/metadata/s3_metadata.yaml | 16 +- javav2/example_code/s3/README.md | 15 +- .../main/java/com/example/s3/CopyObject.java | 74 --- .../java/com/example/s3/CreateBucket.java | 78 --- .../main/java/com/example/s3/CreateJob.java | 129 ---- .../java/com/example/s3/DeleteObjects.java | 76 --- .../java/com/example/s3/GetObjectData.java | 84 --- .../main/java/com/example/s3/ListObjects.java | 78 --- .../main/java/com/example/s3/PutObject.java | 78 --- .../java/com/example/s3/S3BucketDeletion.java | 3 +- .../main/java/com/example/s3/S3Scenario.java | 353 ----------- .../example/s3/async/CreateBucketAsync.java | 78 --- .../example/s3/async/GetObjectDataAsync.java | 83 --- .../java/com/example/s3/async/S3AsyncOps.java | 84 --- .../com/example/s3/scenario/S3Actions.java | 376 ++++++++++++ .../com/example/s3/scenario/S3Scenario.java | 297 ++++++++++ .../s3/src/main/resources/log4j2.xml | 6 +- .../s3/src/test/java/AmazonS3Test.java | 555 ------------------ .../s3/src/test/java/S3ActionsTest.java | 165 ++++++ .../s3/src/test/java/S3BatchTest.java | 3 +- 20 files changed, 865 insertions(+), 1766 deletions(-) delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/CopyObject.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/CreateBucket.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/CreateJob.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/DeleteObjects.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/GetObjectData.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/ListObjects.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/PutObject.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/S3Scenario.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/async/CreateBucketAsync.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/async/GetObjectDataAsync.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/async/S3AsyncOps.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/scenario/S3Actions.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/scenario/S3Scenario.java delete mode 100644 javav2/example_code/s3/src/test/java/AmazonS3Test.java create mode 100644 javav2/example_code/s3/src/test/java/S3ActionsTest.java diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index e031785335a..a6d6ac9586a 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -466,6 +466,15 @@ s3_DeleteObject: - description: snippet_tags: - s3.abapv1.delete_object + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: + snippet_tags: + - s3.java2.delete_objects.main Swift: versions: - sdk_version: 1 @@ -1616,7 +1625,7 @@ s3_DeleteBucket: excerpts: - description: snippet_tags: - - s3.java2.s3_bucket_ops.delete_bucket + - s3.java2.bucket_deletion.main PHP: versions: - sdk_version: 3 @@ -2832,9 +2841,12 @@ s3_Scenario_GettingStarted: github: javav2/example_code/s3 sdkguide: excerpts: - - description: + - description: A scenario example. snippet_tags: - s3.java2.s3_scenario.main + - description: A wrapper class that contains the operations. + snippet_tags: + - s3.java2.s3_actions.main JavaScript: versions: - sdk_version: 3 diff --git a/javav2/example_code/s3/README.md b/javav2/example_code/s3/README.md index bffcc989c8a..0c83200459f 100644 --- a/javav2/example_code/s3/README.md +++ b/javav2/example_code/s3/README.md @@ -38,35 +38,36 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javav Code examples that show you how to perform the essential operations within a service. -- [Learn the basics](src/main/java/com/example/s3/S3Scenario.java) +- [Learn the basics](src/main/java/com/example/s3/scenario/S3Scenario.java) ### Single actions Code excerpts that show you how to call individual service functions. -- [CopyObject](src/main/java/com/example/s3/CopyObject.java#L6) -- [CreateBucket](src/main/java/com/example/s3/CreateBucket.java#L6) -- [DeleteBucket](src/main/java/com/example/s3/S3BucketOps.java#L79) +- [CopyObject](src/main/java/com/example/s3/scenario/S3Actions.java#L203) +- [CreateBucket](src/main/java/com/example/s3/scenario/S3Actions.java#L85) +- [DeleteBucket](src/main/java/com/example/s3/scenario/S3Actions.java#L342) - [DeleteBucketPolicy](src/main/java/com/example/s3/DeleteBucketPolicy.java#L6) - [DeleteBucketWebsite](src/main/java/com/example/s3/DeleteWebsiteConfiguration.java#L6) +- [DeleteObject](src/main/java/com/example/s3/scenario/S3Actions.java#L315) - [DeleteObjects](src/main/java/com/example/s3/DeleteMultiObjects.java#L6) - [GetBucketAcl](src/main/java/com/example/s3/GetAcl.java#L6) - [GetBucketPolicy](src/main/java/com/example/s3/GetBucketPolicy.java#L6) -- [GetObject](src/main/java/com/example/s3/GetObjectData.java#L6) +- [GetObject](src/main/java/com/example/s3/scenario/S3Actions.java#L144) - [GetObjectLegalHold](src/main/java/com/example/s3/lockscenario/S3LockActions.java#L94) - [GetObjectLockConfiguration](src/main/java/com/example/s3/lockscenario/S3LockActions.java#L345) - [GetObjectRetention](src/main/java/com/example/s3/lockscenario/S3LockActions.java#L309) - [HeadObject](src/main/java/com/example/s3/GetObjectContentType.java#L6) - [ListBuckets](src/main/java/com/example/s3/ListBuckets.java#L6) - [ListMultipartUploads](src/main/java/com/example/s3/ListMultipartUploads.java#L6) -- [ListObjectsV2](src/main/java/com/example/s3/ListObjects.java#L6) +- [ListObjectsV2](src/main/java/com/example/s3/scenario/S3Actions.java#L177) - [PutBucketAcl](src/main/java/com/example/s3/SetAcl.java#L6) - [PutBucketCors](src/main/java/com/example/s3/S3Cors.java#L6) - [PutBucketLifecycleConfiguration](src/main/java/com/example/s3/LifecycleConfiguration.java#L6) - [PutBucketPolicy](src/main/java/com/example/s3/SetBucketPolicy.java#L6) - [PutBucketWebsite](src/main/java/com/example/s3/SetWebsiteConfiguration.java#L6) -- [PutObject](src/main/java/com/example/s3/PutObject.java#L6) +- [PutObject](src/main/java/com/example/s3/scenario/S3Actions.java#L120) - [PutObjectLegalHold](src/main/java/com/example/s3/lockscenario/S3LockActions.java#L255) - [PutObjectLockConfiguration](src/main/java/com/example/s3/lockscenario/S3LockActions.java#L206) - [PutObjectRetention](src/main/java/com/example/s3/lockscenario/S3LockActions.java#L61) diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/CopyObject.java b/javav2/example_code/s3/src/main/java/com/example/s3/CopyObject.java deleted file mode 100644 index 03dc519b032..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/CopyObject.java +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3; - -// snippet-start:[s3.java2.copy_object.main] -// snippet-start:[s3.java2.copy_object.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.CopyObjectRequest; -import software.amazon.awssdk.services.s3.model.CopyObjectResponse; -import software.amazon.awssdk.services.s3.model.S3Exception; -// snippet-end:[s3.java2.copy_object.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ - -public class CopyObject { - public static void main(String[] args) { - final String usage = """ - - Usage: - - - Where: - objectKey - The name of the object (for example, book.pdf). - fromBucket - The S3 bucket name that contains the object (for example, bucket1). - toBucket - The S3 bucket to copy the object to (for example, bucket2). - """; - - if (args.length != 3) { - System.out.println(usage); - System.exit(1); - } - - String objectKey = args[0]; - String fromBucket = args[1]; - String toBucket = args[2]; - System.out.format("Copying object %s from bucket %s to %s\n", objectKey, fromBucket, toBucket); - Region region = Region.US_EAST_1; - S3Client s3 = S3Client.builder() - .region(region) - .build(); - - copyBucketObject(s3, fromBucket, objectKey, toBucket); - s3.close(); - } - - public static String copyBucketObject(S3Client s3, String fromBucket, String objectKey, String toBucket) { - CopyObjectRequest copyReq = CopyObjectRequest.builder() - .sourceBucket(fromBucket) - .sourceKey(objectKey) - .destinationBucket(toBucket) - .destinationKey(objectKey) - .build(); - - try { - CopyObjectResponse copyRes = s3.copyObject(copyReq); - return copyRes.copyObjectResult().toString(); - - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - return ""; - } -} -// snippet-end:[s3.java2.copy_object.main] diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/CreateBucket.java b/javav2/example_code/s3/src/main/java/com/example/s3/CreateBucket.java deleted file mode 100644 index b95f7548731..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/CreateBucket.java +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3; - -// snippet-start:[s3.java2.create_bucket_waiters.main] -// snippet-start:[s3.java2.create_bucket_waiters.import] -import software.amazon.awssdk.core.waiters.WaiterResponse; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.CreateBucketRequest; -import software.amazon.awssdk.services.s3.model.HeadBucketRequest; -import software.amazon.awssdk.services.s3.model.HeadBucketResponse; -import software.amazon.awssdk.services.s3.model.S3Exception; -import software.amazon.awssdk.services.s3.waiters.S3Waiter; -import java.net.URISyntaxException; -// snippet-end:[s3.java2.create_bucket_waiters.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ - -public class CreateBucket { - public static void main(String[] args) throws URISyntaxException { - final String usage = """ - - Usage: - \s - - Where: - bucketName - The name of the bucket to create. The bucket name must be unique, or an error occurs. - """; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String bucketName = args[0]; - System.out.format("Creating a bucket named %s\n", bucketName); - Region region = Region.US_EAST_1; - S3Client s3 = S3Client.builder() - .region(region) - .build(); - - createBucket(s3, bucketName); - s3.close(); - } - - public static void createBucket(S3Client s3Client, String bucketName) { - try { - S3Waiter s3Waiter = s3Client.waiter(); - CreateBucketRequest bucketRequest = CreateBucketRequest.builder() - .bucket(bucketName) - .build(); - - s3Client.createBucket(bucketRequest); - HeadBucketRequest bucketRequestWait = HeadBucketRequest.builder() - .bucket(bucketName) - .build(); - - // Wait until the bucket is created and print out the response. - WaiterResponse waiterResponse = s3Waiter.waitUntilBucketExists(bucketRequestWait); - waiterResponse.matched().response().ifPresent(System.out::println); - System.out.println(bucketName + " is ready"); - - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} -// snippet-end:[s3.java2.create_bucket_waiters.main] diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/CreateJob.java b/javav2/example_code/s3/src/main/java/com/example/s3/CreateJob.java deleted file mode 100644 index 70911fe116b..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/CreateJob.java +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3; - -// snippet-start:[s3.java2.create_job.main] -// snippet-start:[s3.java2.create_job.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3control.S3ControlClient; -import software.amazon.awssdk.services.s3control.model.S3Tag; -import software.amazon.awssdk.services.s3control.model.S3SetObjectTaggingOperation; -import software.amazon.awssdk.services.s3control.model.JobOperation; -import software.amazon.awssdk.services.s3control.model.JobManifestLocation; -import software.amazon.awssdk.services.s3control.model.JobManifestSpec; -import software.amazon.awssdk.services.s3control.model.JobManifest; -import software.amazon.awssdk.services.s3control.model.JobReport; -import software.amazon.awssdk.services.s3control.model.CreateJobRequest; -import software.amazon.awssdk.services.s3control.model.S3ControlException; -import java.util.ArrayList; -// snippet-end:[s3.java2.create_job.import] - -/** - * To run this code example, ensure that you have followed the documentation - * provided here: - * - * https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-create-job.html - * - * In addition, before running this Java V2 code example, set up your - * development environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ - -public class CreateJob { - public static void main(String[] args) { - final String usage = """ - - Usage: - > - - Where: - accountId - The account id value that owns the Amazon S3 bucket. - iamRoleArn - The ARN of the AWS Identity and Access Management (IAM) role that has permissions to create a batch job. - manifestLocation - The location where the manaifest file required for the job (for example, arn:aws:s3:::/manifest.csv). - reportBucketName - The Amazon S3 bucket where the report is written to (for example, arn:aws:s3:::). - """; - - if (args.length != 4) { - System.out.println(usage); - System.exit(1); - } - - String accountId = args[0]; - String iamRoleArn = args[1]; - String manifestLocation = args[2]; - String reportBucketName = args[3]; - String uuid = java.util.UUID.randomUUID().toString(); - Region region = Region.US_EAST_1; - S3ControlClient s3ControlClient = S3ControlClient.builder() - .region(region) - .build(); - createS3Job(s3ControlClient, accountId, iamRoleArn, manifestLocation, reportBucketName, uuid); - s3ControlClient.close(); - } - - public static void createS3Job(S3ControlClient s3ControlClient, String accountId, String iamRoleArn, - String manifestLocation, String reportBucketName, String uuid) { - try { - ArrayList tagSet = new ArrayList<>(); - S3Tag s3Tag = S3Tag.builder() - .key("keyOne") - .value("ValueOne") - .build(); - - tagSet.add(s3Tag); - S3SetObjectTaggingOperation objectTaggingOperation = S3SetObjectTaggingOperation.builder() - .tagSet(s3Tag) - .build(); - - JobOperation jobOperation = JobOperation.builder() - .s3PutObjectTagging(objectTaggingOperation) - .build(); - - JobManifestLocation jobManifestLocation = JobManifestLocation.builder() - .objectArn(manifestLocation) - .eTag("60e460c9d1046e73f7dde5043ac3ae85") - .build(); - - JobManifestSpec manifestSpec = JobManifestSpec.builder() - .fieldsWithStrings(new String[] { "Bucket", "Key" }) - .format("S3BatchOperations_CSV_20180820") - .build(); - - JobManifest jobManifest = JobManifest.builder() - .spec(manifestSpec) - .location(jobManifestLocation) - .build(); - - JobReport jobReport = JobReport.builder() - .bucket(reportBucketName) - .prefix("reports") - .format("Report_CSV_20180820") - .enabled(true) - .reportScope("AllTasks") - .build(); - - CreateJobRequest jobRequest = CreateJobRequest.builder() - .accountId(accountId) - .description("Job created using the AWS Java SDK") - .manifest(jobManifest) - .operation(jobOperation) - .report(jobReport) - .priority(42) - .roleArn(iamRoleArn) - .clientRequestToken(uuid) - .confirmationRequired(false) - .build(); - - s3ControlClient.createJob(jobRequest); - - } catch (S3ControlException e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} -// snippet-end:[s3.java2.create_job.main] diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/DeleteObjects.java b/javav2/example_code/s3/src/main/java/com/example/s3/DeleteObjects.java deleted file mode 100644 index e4d7c6f016b..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/DeleteObjects.java +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3; - -// snippet-start:[s3.java2.delete_objects.main] -// snippet-start:[s3.java2.delete_objects.import] -import software.amazon.awssdk.services.s3.model.Delete; -import software.amazon.awssdk.services.s3.model.ObjectIdentifier; -import software.amazon.awssdk.services.s3.model.S3Exception; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.DeleteObjectsRequest; -import java.util.ArrayList; -// snippet-end:[s3.java2.delete_objects.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ - -public class DeleteObjects { - public static void main(String[] args) { - final String usage = """ - Usage: - - Where: - bucketName - The Amazon S3 bucket to delete the website configuration from. - objectName - The object name. - """; - - if (args.length != 2) { - System.out.println(usage); - System.exit(1); - } - - String bucketName = args[0]; - String objectName = args[1]; - System.out.println("Deleting " + objectName + " from the Amazon S3 bucket: " + bucketName); - Region region = Region.US_EAST_1; - S3Client s3 = S3Client.builder() - .region(region) - .build(); - - deleteBucketObjects(s3, bucketName, objectName); - s3.close(); - } - - public static void deleteBucketObjects(S3Client s3, String bucketName, String objectName) { - ArrayList toDelete = new ArrayList<>(); - toDelete.add(ObjectIdentifier.builder() - .key(objectName) - .build()); - - try { - DeleteObjectsRequest dor = DeleteObjectsRequest.builder() - .bucket(bucketName) - .delete(Delete.builder() - .objects(toDelete).build()) - .build(); - - s3.deleteObjects(dor); - - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - - System.out.println("Done!"); - } -} -// snippet-end:[s3.java2.delete_objects.main] diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectData.java b/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectData.java deleted file mode 100644 index 609c3a65f61..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectData.java +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3; - -// snippet-start:[s3.java2.getobjectdata.main] -// snippet-start:[s3.java2.getobjectdata.import] -import software.amazon.awssdk.core.ResponseBytes; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.GetObjectRequest; -import software.amazon.awssdk.services.s3.model.S3Exception; -import software.amazon.awssdk.services.s3.model.GetObjectResponse; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -// snippet-end:[s3.java2.getobjectdata.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ - -public class GetObjectData { - public static void main(String[] args) { - final String usage = """ - - Usage: - - - Where: - bucketName - The Amazon S3 bucket name.\s - keyName - The key name.\s - path - The path where the file is written to.\s - """; - - if (args.length != 3) { - System.out.println(usage); - System.exit(1); - } - - String bucketName = args[0]; - String keyName = args[1]; - String path = args[2]; - Region region = Region.US_EAST_1; - S3Client s3 = S3Client.builder() - .region(region) - .build(); - - getObjectBytes(s3, bucketName, keyName, path); - } - - public static void getObjectBytes(S3Client s3, String bucketName, String keyName, String path) { - try { - GetObjectRequest objectRequest = GetObjectRequest - .builder() - .key(keyName) - .bucket(bucketName) - .build(); - - ResponseBytes objectBytes = s3.getObjectAsBytes(objectRequest); - byte[] data = objectBytes.asByteArray(); - - // Write the data to a local file. - File myFile = new File(path); - OutputStream os = new FileOutputStream(myFile); - os.write(data); - System.out.println("Successfully obtained bytes from an S3 object"); - os.close(); - - } catch (IOException ex) { - ex.printStackTrace(); - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} -// snippet-end:[s3.java2.getobjectdata.main] diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListObjects.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListObjects.java deleted file mode 100644 index dcff1f915f9..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/ListObjects.java +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3; - -// snippet-start:[s3.java2.list_objects.main] -// snippet-start:[s3.java2.list_objects.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.ListObjectsRequest; -import software.amazon.awssdk.services.s3.model.ListObjectsResponse; -import software.amazon.awssdk.services.s3.model.S3Exception; -import software.amazon.awssdk.services.s3.model.S3Object; -import java.util.List; -// snippet-end:[s3.java2.list_objects.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ - -public class ListObjects { - public static void main(String[] args) { - final String usage = """ - - Usage: - \s - - Where: - bucketName - The Amazon S3 bucket from which objects are read.\s - """; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String bucketName = args[0]; - Region region = Region.US_EAST_1; - S3Client s3 = S3Client.builder() - .region(region) - .build(); - - listBucketObjects(s3, bucketName); - s3.close(); - } - - public static void listBucketObjects(S3Client s3, String bucketName) { - try { - ListObjectsRequest listObjects = ListObjectsRequest - .builder() - .bucket(bucketName) - .build(); - - ListObjectsResponse res = s3.listObjects(listObjects); - List objects = res.contents(); - for (S3Object myValue : objects) { - System.out.print("\n The name of the key is " + myValue.key()); - System.out.print("\n The object is " + calKb(myValue.size()) + " KBs"); - System.out.print("\n The owner is " + myValue.owner()); - } - - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } - - // convert bytes to kbs. - private static long calKb(Long val) { - return val / 1024; - } -} -// snippet-end:[s3.java2.list_objects.main] diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/PutObject.java b/javav2/example_code/s3/src/main/java/com/example/s3/PutObject.java deleted file mode 100644 index c226f5fa677..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/PutObject.java +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3; - -// snippet-start:[s3.java2.s3_object_upload.main] -// snippet-start:[s3.java2.s3_object_upload.import] -import software.amazon.awssdk.core.sync.RequestBody; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.PutObjectRequest; -import software.amazon.awssdk.services.s3.model.S3Exception; -import java.io.File; -import java.util.HashMap; -import java.util.Map; -// snippet-end:[s3.java2.s3_object_upload.import] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ - -public class PutObject { - public static void main(String[] args) { - final String usage = """ - - Usage: - \s - - Where: - bucketName - The Amazon S3 bucket to upload an object into. - objectKey - The object to upload (for example, book.pdf). - objectPath - The path where the file is located (for example, C:/AWS/book2.pdf).\s - """; - - if (args.length != 3) { - System.out.println(usage); - System.exit(1); - } - - String bucketName = args[0]; - String objectKey = args[1]; - String objectPath = args[2]; - Region region = Region.US_EAST_1; - S3Client s3 = S3Client.builder() - .region(region) - .build(); - - putS3Object(s3, bucketName, objectKey, objectPath); - s3.close(); - } - - // This example uses RequestBody.fromFile to avoid loading the whole file into - // memory. - public static void putS3Object(S3Client s3, String bucketName, String objectKey, String objectPath) { - try { - Map metadata = new HashMap<>(); - metadata.put("x-amz-meta-myVal", "test"); - PutObjectRequest putOb = PutObjectRequest.builder() - .bucket(bucketName) - .key(objectKey) - .metadata(metadata) - .build(); - - s3.putObject(putOb, RequestBody.fromFile(new File(objectPath))); - System.out.println("Successfully placed " + objectKey + " into bucket " + bucketName); - - } catch (S3Exception e) { - System.err.println(e.getMessage()); - System.exit(1); - } - } -} -// snippet-end:[s3.java2.s3_object_upload.main] \ No newline at end of file diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketDeletion.java b/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketDeletion.java index 430b47a906e..a73be7dcf73 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketDeletion.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketDeletion.java @@ -3,7 +3,6 @@ package com.example.s3; -// snippet-start:[s3.java2.bucket_deletion.main] // snippet-start:[s3.java2.s3_bucket_deletion.delete_objects] // snippet-start:[s3.java2.bucket_deletion.import] // snippet-start:[s3.java2.s3_bucket_ops.delete_bucket.import] @@ -80,4 +79,4 @@ public static void deleteObjectsInBucket(S3Client s3, String bucket) { } } // snippet-end:[s3.java2.s3_bucket_deletion.delete_objects] -// snippet-end:[s3.java2.bucket_deletion.main] + diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/S3Scenario.java b/javav2/example_code/s3/src/main/java/com/example/s3/S3Scenario.java deleted file mode 100644 index e4d2d327d07..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/S3Scenario.java +++ /dev/null @@ -1,353 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3; - -// snippet-start:[s3.java2.s3_scenario.import] -import java.io.File; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.io.FileOutputStream; -import java.io.OutputStream; -import java.net.URLEncoder; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.Random; -import software.amazon.awssdk.core.ResponseBytes; -import software.amazon.awssdk.core.waiters.WaiterResponse; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.CreateBucketRequest; -import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse; -import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable; -import software.amazon.awssdk.core.sync.RequestBody; -import software.amazon.awssdk.services.s3.waiters.S3Waiter; -import software.amazon.awssdk.services.s3.model.UploadPartRequest; -import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; -import software.amazon.awssdk.services.s3.model.HeadBucketResponse; -import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; -import software.amazon.awssdk.services.s3.model.HeadBucketRequest; -import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest; -import software.amazon.awssdk.services.s3.model.CompletedPart; -import software.amazon.awssdk.services.s3.model.S3Exception; -import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload; -import software.amazon.awssdk.services.s3.model.GetObjectRequest; -import software.amazon.awssdk.services.s3.model.PutObjectRequest; -import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; -import software.amazon.awssdk.services.s3.model.GetObjectResponse; -import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; -import software.amazon.awssdk.services.s3.model.S3Object; -import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; -import software.amazon.awssdk.services.s3.model.CopyObjectRequest; -import software.amazon.awssdk.services.s3.model.CopyObjectResponse; -// snippet-end:[s3.java2.s3_scenario.import] - -// snippet-start:[s3.java2.s3_scenario.main] -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - * - * This Java code example performs the following tasks: - * - * 1. Creates an Amazon S3 bucket. - * 2. Uploads an object to the bucket. - * 3. Downloads the object to another local file. - * 4. Uploads an object using multipart upload. - * 5. List all objects located in the Amazon S3 bucket. - * 6. Copies the object to another Amazon S3 bucket. - * 7. Deletes the object from the Amazon S3 bucket. - * 8. Deletes the Amazon S3 bucket. - */ - -public class S3Scenario { - public static final String DASHES = new String(new char[80]).replace("\0", "-"); - - public static void main(String[] args) throws IOException { - final String usage = """ - - Usage: - - - Where: - bucketName - The Amazon S3 bucket to create. - key - The key to use. - objectPath - The path where the file is located (for example, C:/AWS/book2.pdf). - savePath - The path where the file is saved after it's downloaded (for example, C:/AWS/book2.pdf). - toBucket - An Amazon S3 bucket to where an object is copied to (for example, C:/AWS/book2.pdf).\s - """; - - if (args.length != 5) { - System.out.println(usage); - System.exit(1); - } - - String bucketName = args[0]; - String key = args[1]; - String objectPath = args[2]; - String savePath = args[3]; - String toBucket = args[4]; - Region region = Region.US_EAST_1; - S3Client s3 = S3Client.builder() - .region(region) - .build(); - - System.out.println(DASHES); - System.out.println("Welcome to the Amazon S3 example scenario."); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("1. Create an Amazon S3 bucket."); - createBucket(s3, bucketName); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("2. Update a local file to the Amazon S3 bucket."); - uploadLocalFile(s3, bucketName, key, objectPath); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("3. Download the object to another local file."); - getObjectBytes(s3, bucketName, key, savePath); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("4. Perform a multipart upload."); - String multipartKey = "multiPartKey"; - multipartUpload(s3, toBucket, multipartKey); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("5. List all objects located in the Amazon S3 bucket."); - listAllObjects(s3, bucketName); - anotherListExample(s3, bucketName); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("6. Copy the object to another Amazon S3 bucket."); - copyBucketObject(s3, bucketName, key, toBucket); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("7. Delete the object from the Amazon S3 bucket."); - deleteObjectFromBucket(s3, bucketName, key); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("8. Delete the Amazon S3 bucket."); - deleteBucket(s3, bucketName); - System.out.println(DASHES); - - System.out.println(DASHES); - System.out.println("All Amazon S3 operations were successfully performed"); - System.out.println(DASHES); - s3.close(); - } - - // Create a bucket by using a S3Waiter object. - public static void createBucket(S3Client s3Client, String bucketName) { - try { - S3Waiter s3Waiter = s3Client.waiter(); - CreateBucketRequest bucketRequest = CreateBucketRequest.builder() - .bucket(bucketName) - .build(); - - s3Client.createBucket(bucketRequest); - HeadBucketRequest bucketRequestWait = HeadBucketRequest.builder() - .bucket(bucketName) - .build(); - - // Wait until the bucket is created and print out the response. - WaiterResponse waiterResponse = s3Waiter.waitUntilBucketExists(bucketRequestWait); - waiterResponse.matched().response().ifPresent(System.out::println); - System.out.println(bucketName + " is ready"); - - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } - - public static void deleteBucket(S3Client client, String bucket) { - DeleteBucketRequest deleteBucketRequest = DeleteBucketRequest.builder() - .bucket(bucket) - .build(); - - client.deleteBucket(deleteBucketRequest); - System.out.println(bucket + " was deleted."); - } - - /** - * Upload an object in parts. - */ - public static void multipartUpload(S3Client s3, String bucketName, String key) { - int mB = 1024 * 1024; - // First create a multipart upload and get the upload id. - CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder() - .bucket(bucketName) - .key(key) - .build(); - - CreateMultipartUploadResponse response = s3.createMultipartUpload(createMultipartUploadRequest); - String uploadId = response.uploadId(); - System.out.println(uploadId); - - // Upload all the different parts of the object. - UploadPartRequest uploadPartRequest1 = UploadPartRequest.builder() - .bucket(bucketName) - .key(key) - .uploadId(uploadId) - .partNumber(1).build(); - - String etag1 = s3.uploadPart(uploadPartRequest1, RequestBody.fromByteBuffer(getRandomByteBuffer(5 * mB))) - .eTag(); - CompletedPart part1 = CompletedPart.builder().partNumber(1).eTag(etag1).build(); - - UploadPartRequest uploadPartRequest2 = UploadPartRequest.builder().bucket(bucketName).key(key) - .uploadId(uploadId) - .partNumber(2).build(); - String etag2 = s3.uploadPart(uploadPartRequest2, RequestBody.fromByteBuffer(getRandomByteBuffer(3 * mB))) - .eTag(); - CompletedPart part2 = CompletedPart.builder().partNumber(2).eTag(etag2).build(); - - // Call completeMultipartUpload operation to tell S3 to merge all uploaded - // parts and finish the multipart operation. - CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder() - .parts(part1, part2) - .build(); - - CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder() - .bucket(bucketName) - .key(key) - .uploadId(uploadId) - .multipartUpload(completedMultipartUpload) - .build(); - - s3.completeMultipartUpload(completeMultipartUploadRequest); - } - - private static ByteBuffer getRandomByteBuffer(int size) { - byte[] b = new byte[size]; - new Random().nextBytes(b); - return ByteBuffer.wrap(b); - } - - public static void getObjectBytes(S3Client s3, String bucketName, String keyName, String path) { - try { - GetObjectRequest objectRequest = GetObjectRequest - .builder() - .key(keyName) - .bucket(bucketName) - .build(); - - ResponseBytes objectBytes = s3.getObjectAsBytes(objectRequest); - byte[] data = objectBytes.asByteArray(); - - // Write the data to a local file. - File myFile = new File(path); - OutputStream os = new FileOutputStream(myFile); - os.write(data); - System.out.println("Successfully obtained bytes from an S3 object"); - os.close(); - - } catch (IOException ex) { - ex.printStackTrace(); - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } - - public static void uploadLocalFile(S3Client s3, String bucketName, String key, String objectPath) { - PutObjectRequest objectRequest = PutObjectRequest.builder() - .bucket(bucketName) - .key(key) - .build(); - - s3.putObject(objectRequest, RequestBody.fromFile(new File(objectPath))); - } - - public static void listAllObjects(S3Client s3, String bucketName) { - ListObjectsV2Request listObjectsReqManual = ListObjectsV2Request.builder() - .bucket(bucketName) - .maxKeys(1) - .build(); - - boolean done = false; - while (!done) { - ListObjectsV2Response listObjResponse = s3.listObjectsV2(listObjectsReqManual); - for (S3Object content : listObjResponse.contents()) { - System.out.println(content.key()); - } - - if (listObjResponse.nextContinuationToken() == null) { - done = true; - } - - listObjectsReqManual = listObjectsReqManual.toBuilder() - .continuationToken(listObjResponse.nextContinuationToken()) - .build(); - } - } - - public static void anotherListExample(S3Client s3, String bucketName) { - ListObjectsV2Request listReq = ListObjectsV2Request.builder() - .bucket(bucketName) - .maxKeys(1) - .build(); - - ListObjectsV2Iterable listRes = s3.listObjectsV2Paginator(listReq); - - // Process response pages. - listRes.stream() - .flatMap(r -> r.contents().stream()) - .forEach(content -> System.out.println(" Key: " + content.key() + " size = " + content.size())); - - // Helper method to work with paginated collection of items directly. - listRes.contents().stream() - .forEach(content -> System.out.println(" Key: " + content.key() + " size = " + content.size())); - - for (S3Object content : listRes.contents()) { - System.out.println(" Key: " + content.key() + " size = " + content.size()); - } - } - - public static void deleteObjectFromBucket(S3Client s3, String bucketName, String key) { - DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder() - .bucket(bucketName) - .key(key) - .build(); - - s3.deleteObject(deleteObjectRequest); - System.out.println(key + " was deleted"); - } - - public static String copyBucketObject(S3Client s3, String fromBucket, String objectKey, String toBucket) { - String encodedUrl = null; - try { - encodedUrl = URLEncoder.encode(fromBucket + "/" + objectKey, StandardCharsets.UTF_8.toString()); - } catch (UnsupportedEncodingException e) { - System.out.println("URL could not be encoded: " + e.getMessage()); - } - CopyObjectRequest copyReq = CopyObjectRequest.builder() - .copySource(encodedUrl) - .destinationBucket(toBucket) - .destinationKey(objectKey) - .build(); - - try { - CopyObjectResponse copyRes = s3.copyObject(copyReq); - System.out.println("The " + objectKey + " was copied to " + toBucket); - return copyRes.copyObjectResult().toString(); - - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - return ""; - } -} -// snippet-end:[s3.java2.s3_scenario.main] diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/async/CreateBucketAsync.java b/javav2/example_code/s3/src/main/java/com/example/s3/async/CreateBucketAsync.java deleted file mode 100644 index 1a4035f10de..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/async/CreateBucketAsync.java +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3.async; - -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3AsyncClient; -import software.amazon.awssdk.services.s3.model.CreateBucketRequest; -import software.amazon.awssdk.services.s3.model.CreateBucketResponse; -import software.amazon.awssdk.services.s3.model.S3Exception; - -import java.net.URISyntaxException; -import java.util.concurrent.CompletableFuture; - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class CreateBucketAsync { - - public static void main(String[] args) throws URISyntaxException { - final String usage = """ - - Usage: - \s - - Where: - bucketName - The name of the bucket to create. The bucket name must be unique, or an error occurs. - """; - - if (args.length != 1) { - System.out.println(usage); - System.exit(1); - } - - String bucketName = args[0]; - System.out.format("Creating a bucket named %s\n", - bucketName); - - Region region = Region.US_EAST_1; - S3AsyncClient s3AsyncClient = S3AsyncClient.builder() - .region(region) - .build(); - - createBucket(s3AsyncClient, bucketName); - } - - public static void createBucket(S3AsyncClient s3AsyncClient, String bucketName) { - try { - CreateBucketRequest bucketRequest = CreateBucketRequest.builder() - .bucket(bucketName) - .build(); - - CompletableFuture futureGet = s3AsyncClient.createBucket(bucketRequest); - futureGet.whenComplete((resp, err) -> { - try { - if (resp != null) { - System.out.println(bucketName + " is ready~"); - } else { - err.printStackTrace(); - } - } finally { - // Only close the client when you are completely done with it. - s3AsyncClient.close(); - } - }); - futureGet.join(); - - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/async/GetObjectDataAsync.java b/javav2/example_code/s3/src/main/java/com/example/s3/async/GetObjectDataAsync.java deleted file mode 100644 index 602d92d0d71..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/async/GetObjectDataAsync.java +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3.async; - -import software.amazon.awssdk.core.async.AsyncResponseTransformer; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3AsyncClient; -import software.amazon.awssdk.services.s3.model.GetObjectRequest; -import software.amazon.awssdk.services.s3.model.GetObjectResponse; -import software.amazon.awssdk.services.s3.model.S3Exception; -import java.nio.file.Paths; -import java.util.concurrent.CompletableFuture; - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ - -public class GetObjectDataAsync { - public static void main(String[] args) { - final String usage = """ - - Usage: - - - Where: - bucketName - The Amazon S3 bucket name.\s - keyName - The key name.\s - path - The path where the file is written to.\s - """; - - if (args.length != 3) { - System.out.println(usage); - System.exit(1); - } - String bucketName = args[0]; - String keyName = args[1]; - String path = args[2]; - Region region = Region.US_EAST_1; - S3AsyncClient s3AsyncClient = S3AsyncClient.builder() - .region(region) - .build(); - - getObject(s3AsyncClient, bucketName, keyName, path); - s3AsyncClient.close(); - } - - public static void getObject(S3AsyncClient s3AsyncClient, String bucketName, String keyName, String path) { - try { - GetObjectRequest objectRequest = GetObjectRequest - .builder() - .key(keyName) - .bucket(bucketName) - .build(); - - CompletableFuture futureGet = s3AsyncClient.getObject(objectRequest, - AsyncResponseTransformer.toFile(Paths.get(path))); - - futureGet.whenComplete((resp, err) -> { - try { - if (resp != null) { - System.out.println("Object downloaded. Details: " + resp); - } else { - err.printStackTrace(); - } - } finally { - // Only close the client when you are completely done with it. - s3AsyncClient.close(); - } - }); - futureGet.join(); - - } catch (S3Exception e) { - System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); - } - } -} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/async/S3AsyncOps.java b/javav2/example_code/s3/src/main/java/com/example/s3/async/S3AsyncOps.java deleted file mode 100644 index 8fc43b421e6..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/async/S3AsyncOps.java +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.example.s3.async; - -// snippet-start:[s3.java2.async_ops.complete] -// snippet-start:[s3.java2.async_ops.import] -import software.amazon.awssdk.core.async.AsyncRequestBody; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3AsyncClient; -import software.amazon.awssdk.services.s3.model.PutObjectRequest; -import software.amazon.awssdk.services.s3.model.PutObjectResponse; -import java.nio.file.Paths; -import java.util.concurrent.CompletableFuture; -// snippet-end:[s3.java2.async_ops.import] -// snippet-start:[s3.java2.async_ops.main] - -/** - * Before running this Java V2 code example, set up your development - * environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ - -public class S3AsyncOps { - public static void main(String[] args) { - - final String usage = """ - - Usage: - - - Where: - bucketName - The name of the Amazon S3 bucket (for example, bucket1).\s - key - The name of the object (for example, book.pdf).\s - path - The local path to the file (for example, C:/AWS/book.pdf).\s - """; - - if (args.length != 3) { - System.out.println(usage); - System.exit(1); - } - - String bucketName = args[0]; - String key = args[1]; - String path = args[2]; - Region region = Region.US_EAST_1; - S3AsyncClient s3AsyncClient = S3AsyncClient.builder() - .region(region) - .build(); - - putObjectAsync(s3AsyncClient, bucketName, key, path); - } - - public static void putObjectAsync(S3AsyncClient client, String bucketName, String key, String path) { - PutObjectRequest objectRequest = PutObjectRequest.builder() - .bucket(bucketName) - .key(key) - .build(); - - CompletableFuture future = client.putObject(objectRequest, - AsyncRequestBody.fromFile(Paths.get(path))); - future.whenComplete((resp, err) -> { - try { - if (resp != null) { - System.out.println("Object uploaded. Details: " + resp); - } else { - // Handle error. - err.printStackTrace(); - } - } finally { - // Only close the client when you are completely done with it. - client.close(); - } - }); - - future.join(); - } -} - -// snippet-end:[s3.java2.async_ops.main] -// snippet-end:[s3.java2.async_ops.complete] \ No newline at end of file diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/scenario/S3Actions.java b/javav2/example_code/s3/src/main/java/com/example/s3/scenario/S3Actions.java new file mode 100644 index 00000000000..8e0b42e9e9d --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/scenario/S3Actions.java @@ -0,0 +1,376 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.example.s3.scenario; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.core.ResponseBytes; +import software.amazon.awssdk.core.async.AsyncRequestBody; +import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; +import software.amazon.awssdk.core.waiters.WaiterResponse; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; +import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload; +import software.amazon.awssdk.services.s3.model.CompletedPart; +import software.amazon.awssdk.services.s3.model.CopyObjectRequest; +import software.amazon.awssdk.services.s3.model.CopyObjectResponse; +import software.amazon.awssdk.services.s3.model.CreateBucketRequest; +import software.amazon.awssdk.services.s3.model.CreateBucketResponse; +import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest; +import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; +import software.amazon.awssdk.services.s3.model.DeleteBucketResponse; +import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; +import software.amazon.awssdk.services.s3.model.DeleteObjectResponse; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; +import software.amazon.awssdk.services.s3.model.HeadBucketRequest; +import software.amazon.awssdk.services.s3.model.HeadBucketResponse; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectResponse; +import software.amazon.awssdk.core.async.AsyncResponseTransformer; +import software.amazon.awssdk.services.s3.model.UploadPartRequest; +import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Publisher; +import software.amazon.awssdk.services.s3.waiters.S3AsyncWaiter; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.concurrent.CompletableFuture; + +// snippet-start:[s3.java2.s3_actions.main] +public class S3Actions { + + private static final Logger logger = LoggerFactory.getLogger(S3Actions.class); + private static S3AsyncClient s3AsyncClient; + public static S3AsyncClient getAsyncClient() { + if (s3AsyncClient == null) { + /* + The `NettyNioAsyncHttpClient` class is part of the AWS SDK for Java, version 2, + and it is designed to provide a high-performance, asynchronous HTTP client for interacting with AWS services. + It uses the Netty framework to handle the underlying network communication and the Java NIO API to + provide a non-blocking, event-driven approach to HTTP requests and responses. + */ + + SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() + .maxConcurrency(50) // Adjust as needed. + .connectionTimeout(Duration.ofSeconds(60)) // Set the connection timeout. + .readTimeout(Duration.ofSeconds(60)) // Set the read timeout. + .writeTimeout(Duration.ofSeconds(60)) // Set the write timeout. + .build(); + + ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() + .apiCallTimeout(Duration.ofMinutes(2)) // Set the overall API call timeout. + .apiCallAttemptTimeout(Duration.ofSeconds(90)) // Set the individual call attempt timeout. + .build(); + + s3AsyncClient = S3AsyncClient.builder() + .region(Region.US_EAST_1) + .httpClient(httpClient) + .overrideConfiguration(overrideConfig) + .build(); + } + return s3AsyncClient; + } + + // snippet-start:[s3.java2.create_bucket_waiters.main] + /** + * Creates an S3 bucket asynchronously. + * + * @param bucketName the name of the S3 bucket to create + * @return a {@link CompletableFuture} that completes when the bucket is created and ready + * @throws RuntimeException if there is a failure while creating the bucket + */ + public CompletableFuture createBucketAsync(String bucketName) { + CreateBucketRequest bucketRequest = CreateBucketRequest.builder() + .bucket(bucketName) + .build(); + + CompletableFuture response = getAsyncClient().createBucket(bucketRequest); + return response.thenCompose(resp -> { + S3AsyncWaiter s3Waiter = getAsyncClient().waiter(); + HeadBucketRequest bucketRequestWait = HeadBucketRequest.builder() + .bucket(bucketName) + .build(); + + CompletableFuture> waiterResponseFuture = + s3Waiter.waitUntilBucketExists(bucketRequestWait); + return waiterResponseFuture.thenAccept(waiterResponse -> { + waiterResponse.matched().response().ifPresent(headBucketResponse -> { + logger.info(bucketName + " is ready"); + }); + }); + }).whenComplete((resp, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to create bucket", ex); + } + }); + } + // snippet-end:[s3.java2.create_bucket_waiters.main] + + // snippet-start:[s3.java2.s3_object_upload.main] + /** + * Uploads a local file to an AWS S3 bucket asynchronously. + * + * @param bucketName the name of the S3 bucket to upload the file to + * @param key the key (object name) to use for the uploaded file + * @param objectPath the local file path of the file to be uploaded + * @return a {@link CompletableFuture} that completes with the {@link PutObjectResponse} when the upload is successful, or throws a {@link RuntimeException} if the upload fails + */ + public CompletableFuture uploadLocalFileAsync(String bucketName, String key, String objectPath) { + PutObjectRequest objectRequest = PutObjectRequest.builder() + .bucket(bucketName) + .key(key) + .build(); + + CompletableFuture response = getAsyncClient().putObject(objectRequest, AsyncRequestBody.fromFile(Paths.get(objectPath))); + return response.whenComplete((resp, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to upload file", ex); + } + }); + } + // snippet-end:[s3.java2.s3_object_upload.main] + + // snippet-start:[s3.java2.getobjectdata.main] + /** + * Asynchronously retrieves the bytes of an object from an Amazon S3 bucket and writes them to a local file. + * + * @param bucketName the name of the S3 bucket containing the object + * @param keyName the key (or name) of the S3 object to retrieve + * @param path the local file path where the object's bytes will be written + * @return a {@link CompletableFuture} that completes when the object bytes have been written to the local file + */ + public CompletableFuture getObjectBytesAsync(String bucketName, String keyName, String path) { + GetObjectRequest objectRequest = GetObjectRequest.builder() + .key(keyName) + .bucket(bucketName) + .build(); + + CompletableFuture> response = getAsyncClient().getObject(objectRequest, AsyncResponseTransformer.toBytes()); + return response.thenAccept(objectBytes -> { + try { + byte[] data = objectBytes.asByteArray(); + Path filePath = Paths.get(path); + Files.write(filePath, data); + logger.info("Successfully obtained bytes from an S3 object"); + } catch (IOException ex) { + throw new RuntimeException("Failed to write data to file", ex); + } + }).whenComplete((resp, ex) -> { + if (ex != null) { + throw new RuntimeException("Failed to get object bytes from S3", ex); + } + }); + } + // snippet-end:[s3.java2.getobjectdata.main] + + // snippet-start:[s3.java2.list_objects.main] + /** + * Asynchronously lists all objects in the specified S3 bucket. + * + * @param bucketName the name of the S3 bucket to list objects for + * @return a {@link CompletableFuture} that completes when all objects have been listed + */ + public CompletableFuture listAllObjectsAsync(String bucketName) { + ListObjectsV2Request initialRequest = ListObjectsV2Request.builder() + .bucket(bucketName) + .maxKeys(1) + .build(); + + ListObjectsV2Publisher paginator = getAsyncClient().listObjectsV2Paginator(initialRequest); + return paginator.subscribe(response -> { + response.contents().forEach(s3Object -> { + logger.info("Object key: " + s3Object.key()); + }); + }).thenRun(() -> { + logger.info("Successfully listed all objects in the bucket: " + bucketName); + }).exceptionally(ex -> { + throw new RuntimeException("Failed to list objects", ex); + }); + } + // snippet-end:[s3.java2.list_objects.main] + + // snippet-start:[s3.java2.copy_object.main] + /** + * Asynchronously copies an object from one S3 bucket to another. + * + * @param fromBucket the name of the source S3 bucket + * @param objectKey the key (name) of the object to be copied + * @param toBucket the name of the destination S3 bucket + * @return a {@link CompletableFuture} that completes with the copy result as a {@link String} + * @throws RuntimeException if the URL could not be encoded or an S3 exception occurred during the copy + */ + public CompletableFuture copyBucketObjectAsync(String fromBucket, String objectKey, String toBucket) { + CopyObjectRequest copyReq = CopyObjectRequest.builder() + .sourceBucket(fromBucket) + .sourceKey(objectKey) + .destinationBucket(toBucket) + .destinationKey(objectKey) + .build(); + + CompletableFuture response = getAsyncClient().copyObject(copyReq); + response.whenComplete((copyRes, ex) -> { + if (copyRes != null) { + logger.info("The " + objectKey + " was copied to " + toBucket); + } else { + throw new RuntimeException("An S3 exception occurred during copy", ex); + } + }); + + return response.thenApply(CopyObjectResponse::copyObjectResult) + .thenApply(Object::toString); + } + // snippet-end:[s3.java2.copy_object.main] + + /** + * Performs a multipart upload to an Amazon S3 bucket. + * + * @param bucketName the name of the S3 bucket to upload the file to + * @param key the key (name) of the file to be uploaded + * @return a {@link CompletableFuture} that completes when the multipart upload is successful + */ + public CompletableFuture multipartUpload(String bucketName, String key) { + int mB = 1024 * 1024; + + CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder() + .bucket(bucketName) + .key(key) + .build(); + + return getAsyncClient().createMultipartUpload(createMultipartUploadRequest) + .thenCompose(createResponse -> { + String uploadId = createResponse.uploadId(); + System.out.println("Upload ID: " + uploadId); + + // Upload part 1. + UploadPartRequest uploadPartRequest1 = UploadPartRequest.builder() + .bucket(bucketName) + .key(key) + .uploadId(uploadId) + .partNumber(1) + .contentLength((long) (5 * mB)) // Specify the content length + .build(); + + CompletableFuture part1Future = getAsyncClient().uploadPart(uploadPartRequest1, + AsyncRequestBody.fromByteBuffer(getRandomByteBuffer(5 * mB))) + .thenApply(uploadPartResponse -> CompletedPart.builder() + .partNumber(1) + .eTag(uploadPartResponse.eTag()) + .build()); + + // Upload part 2. + UploadPartRequest uploadPartRequest2 = UploadPartRequest.builder() + .bucket(bucketName) + .key(key) + .uploadId(uploadId) + .partNumber(2) + .contentLength((long) (3 * mB)) + .build(); + + CompletableFuture part2Future = getAsyncClient().uploadPart(uploadPartRequest2, + AsyncRequestBody.fromByteBuffer(getRandomByteBuffer(3 * mB))) + .thenApply(uploadPartResponse -> CompletedPart.builder() + .partNumber(2) + .eTag(uploadPartResponse.eTag()) + .build()); + + // Combine the results of both parts. + return CompletableFuture.allOf(part1Future, part2Future) + .thenCompose(v -> { + CompletedPart part1 = part1Future.join(); + CompletedPart part2 = part2Future.join(); + + CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder() + .parts(part1, part2) + .build(); + + CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder() + .bucket(bucketName) + .key(key) + .uploadId(uploadId) + .multipartUpload(completedMultipartUpload) + .build(); + + // Complete the multipart upload + return getAsyncClient().completeMultipartUpload(completeMultipartUploadRequest); + }); + }) + .thenAccept(response -> System.out.println("Multipart upload completed successfully")) + .exceptionally(ex -> { + System.err.println("Failed to complete multipart upload: " + ex.getMessage()); + throw new RuntimeException(ex); + }); + } + + // snippet-start:[s3.java2.delete_objects.main] + /** + * Deletes an object from an S3 bucket asynchronously. + * + * @param bucketName the name of the S3 bucket + * @param key the key (file name) of the object to be deleted + * @return a {@link CompletableFuture} that completes when the object has been deleted + */ + public CompletableFuture deleteObjectFromBucketAsync(String bucketName, String key) { + DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder() + .bucket(bucketName) + .key(key) + .build(); + + CompletableFuture response = getAsyncClient().deleteObject(deleteObjectRequest); + response.whenComplete((deleteRes, ex) -> { + if (deleteRes != null) { + logger.info(key + " was deleted"); + } else { + throw new RuntimeException("An S3 exception occurred during delete", ex); + } + }); + + return response.thenApply(r -> null); + } + // snippet-end:[s3.java2.delete_objects.main] + + // snippet-start:[s3.java2.bucket_deletion.main] + /** + * Deletes an S3 bucket asynchronously. + * + * @param bucket the name of the bucket to be deleted + * @return a {@link CompletableFuture} that completes when the bucket deletion is successful, or throws a {@link RuntimeException} + * if an error occurs during the deletion process + */ + public CompletableFuture deleteBucketAsync(String bucket) { + DeleteBucketRequest deleteBucketRequest = DeleteBucketRequest.builder() + .bucket(bucket) + .build(); + + CompletableFuture response = getAsyncClient().deleteBucket(deleteBucketRequest); + response.whenComplete((deleteRes, ex) -> { + if (deleteRes != null) { + logger.info(bucket + " was deleted."); + } else { + throw new RuntimeException("An S3 exception occurred during bucket deletion", ex); + } + }); + return response.thenApply(r -> null); + } + // snippet-end:[s3.java2.bucket_deletion.main] + + private static ByteBuffer getRandomByteBuffer(int size) { + ByteBuffer buffer = ByteBuffer.allocate(size); + for (int i = 0; i < size; i++) { + buffer.put((byte) (Math.random() * 256)); + } + buffer.flip(); + return buffer; + } +} +// snippet-end:[s3.java2.s3_actions.main] \ No newline at end of file diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/scenario/S3Scenario.java b/javav2/example_code/s3/src/main/java/com/example/s3/scenario/S3Scenario.java new file mode 100644 index 00000000000..ac660ce94a9 --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/scenario/S3Scenario.java @@ -0,0 +1,297 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + + +package com.example.s3.scenario; + +// snippet-start:[s3.java2.s3_scenario.main] + +import java.io.IOException; +import java.util.Scanner; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.services.s3.model.PutObjectResponse; +import software.amazon.awssdk.services.s3.model.S3Exception; + +/** + * Before running this Java V2 code example, set up your development + * environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html + * + * This Java code example performs the following tasks: + * + * 1. Creates an Amazon S3 bucket. + * 2. Uploads an object to the bucket. + * 3. Downloads the object to another local file. + * 4. Uploads an object using multipart upload. + * 5. List all objects located in the Amazon S3 bucket. + * 6. Copies the object to another Amazon S3 bucket. + * 7. Deletes the object from the Amazon S3 bucket. + * 8. Deletes the Amazon S3 bucket. + */ + +public class S3Scenario { + + public static Scanner scanner = new Scanner(System.in); + static S3Actions s3Actions = new S3Actions(); + public static final String DASHES = new String(new char[80]).replace("\0", "-"); + private static final Logger logger = LoggerFactory.getLogger(S3Scenario.class); + public static void main(String[] args) throws IOException { + final String usage = """ + Usage: + + + Where: + key - The unique identifier for the object stored in the S3 bucket. + objectPath - The full file path of the object within the S3 bucket (e.g., "documents/reports/annual_report.pdf"). + savePath - The local file path where the object will be downloaded and saved (e.g., "C:/Users/username/Downloads/annual_report.pdf"). + toBucket - The name of the S3 bucket to which the object will be copied. + """; + + if (args.length != 4) { + logger.info(usage); + return; + } + + String bucketName = "scenario-" + UUID.randomUUID(); + String key = args[0]; + String objectPath = args[1]; + String savePath = args[2]; + String toBucket = args[3]; + + logger.info(DASHES); + logger.info("Welcome to the Amazon Simple Storage Service (S3) example scenario."); + logger.info(""" + Amazon S3 is a highly scalable and durable object storage + service provided by Amazon Web Services (AWS). It is designed to store and retrieve + any amount of data, from anywhere on the web, at any time. + + The `S3AsyncClient` interface in the AWS SDK for Java 2.x provides a set of methods to + programmatically interact with the Amazon S3 (Simple Storage Service) service. This allows + developers to automate the management and manipulation of S3 buckets and objects as + part of their application deployment pipelines. With S3, teams can focus on building + and deploying their applications without having to worry about the underlying storage + infrastructure required to host and manage large amounts of data. + + This scenario walks you through how to perform key operations for this service. + Let's get started... + """); + waitForInputToContinue(scanner); + logger.info(DASHES); + + try { + // Run the methods that belong to this scenario. + runScenario(bucketName, key, objectPath, savePath, toBucket); + + } catch (Throwable rt) { + Throwable cause = rt.getCause(); + if (cause instanceof S3Exception kmsEx) { + logger.info("KMS error occurred: Error message: {}, Error code {}", kmsEx.getMessage(), kmsEx.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + } + } + + private static void runScenario(String bucketName, String key, String objectPath, String savePath, String toBucket) throws Throwable { + logger.info(DASHES); + logger.info("1. Create an Amazon S3 bucket."); + try { + CompletableFuture future = s3Actions.createBucketAsync(bucketName); + future.join(); + waitForInputToContinue(scanner); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof S3Exception s3Ex) { + logger.info("S3 error occurred: Error message: {}, Error code {}", s3Ex.getMessage(), s3Ex.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + + } + logger.info(DASHES); + + logger.info(DASHES); + logger.info("2. Upload a local file to the Amazon S3 bucket."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = s3Actions.uploadLocalFileAsync(bucketName, key, objectPath); + future.join(); + logger.info("File uploaded successfully to {}/{}", bucketName, key); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof S3Exception s3Ex) { + logger.info("S3 error occurred: Error message: {}, Error code {}", s3Ex.getMessage(), s3Ex.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + + logger.info(DASHES); + logger.info("3. Download the object to another local file."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = s3Actions.getObjectBytesAsync(bucketName, key, savePath); + future.join(); + logger.info("Successfully obtained bytes from S3 object and wrote to file {}", savePath); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof S3Exception s3Ex) { + logger.info("S3 error occurred: Error message: {}, Error code {}", s3Ex.getMessage(), s3Ex.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("4. Perform a multipart upload."); + waitForInputToContinue(scanner); + String multipartKey = "multiPartKey"; + try { + // Call the multipartUpload method + CompletableFuture future = s3Actions.multipartUpload(bucketName, multipartKey); + future.join(); + logger.info("Multipart upload completed successfully for bucket '{}' and key '{}'", bucketName, multipartKey); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof S3Exception s3Ex) { + logger.info("S3 error occurred: Error message: {}, Error code {}", s3Ex.getMessage(), s3Ex.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("5. List all objects located in the Amazon S3 bucket."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = s3Actions.listAllObjectsAsync(bucketName); + future.join(); + logger.info("Object listing completed successfully."); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof S3Exception s3Ex) { + logger.info("S3 error occurred: Error message: {}, Error code {}", s3Ex.getMessage(), s3Ex.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("6. Copy the object to another Amazon S3 bucket."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = s3Actions.copyBucketObjectAsync(bucketName, key, toBucket); + String result = future.join(); + logger.info("Copy operation result: {}", result); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof S3Exception s3Ex) { + logger.info("S3 error occurred: Error message: {}, Error code {}", s3Ex.getMessage(), s3Ex.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("7. Delete objects from the Amazon S3 bucket."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = s3Actions.deleteObjectFromBucketAsync(bucketName, key); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof S3Exception s3Ex) { + logger.info("S3 error occurred: Error message: {}, Error code {}", s3Ex.getMessage(), s3Ex.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } + try { + CompletableFuture future = s3Actions.deleteObjectFromBucketAsync(bucketName, "multiPartKey"); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof S3Exception s3Ex) { + logger.info("S3 error occurred: Error message: {}, Error code {}", s3Ex.getMessage(), s3Ex.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("8. Delete the Amazon S3 bucket."); + waitForInputToContinue(scanner); + try { + CompletableFuture future = s3Actions.deleteBucketAsync(bucketName); + future.join(); + + } catch (RuntimeException rt) { + Throwable cause = rt.getCause(); + if (cause instanceof S3Exception s3Ex) { + logger.info("S3 error occurred: Error message: {}, Error code {}", s3Ex.getMessage(), s3Ex.awsErrorDetails().errorCode()); + } else { + logger.info("An unexpected error occurred: " + rt.getMessage()); + } + throw cause; + } + waitForInputToContinue(scanner); + logger.info(DASHES); + + logger.info(DASHES); + logger.info("You successfully completed the Amazon S3 scenario."); + logger.info(DASHES); + } + + private static void waitForInputToContinue(Scanner scanner) { + while (true) { + logger.info(""); + logger.info("Enter 'c' followed by to continue:"); + String input = scanner.nextLine(); + + if (input.trim().equalsIgnoreCase("c")) { + logger.info("Continuing with the program..."); + logger.info(""); + break; + } else { + // Handle invalid input. + logger.info("Invalid input. Please try again."); + } + } + } +} +// snippet-end:[s3.java2.s3_scenario.main] \ No newline at end of file diff --git a/javav2/example_code/s3/src/main/resources/log4j2.xml b/javav2/example_code/s3/src/main/resources/log4j2.xml index e6ac524bde5..ade99171a77 100644 --- a/javav2/example_code/s3/src/main/resources/log4j2.xml +++ b/javav2/example_code/s3/src/main/resources/log4j2.xml @@ -1,14 +1,12 @@ - - - - + + diff --git a/javav2/example_code/s3/src/test/java/AmazonS3Test.java b/javav2/example_code/s3/src/test/java/AmazonS3Test.java deleted file mode 100644 index 37f2d9e7c5f..00000000000 --- a/javav2/example_code/s3/src/test/java/AmazonS3Test.java +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertFalse; - -import com.example.s3.CopyObject; -import com.example.s3.CopyObjectStorage; -import com.example.s3.CreateAccessPoint; -import com.example.s3.CreateBucket; -import com.example.s3.DeleteBucketPolicy; -import com.example.s3.DeleteMultiObjects; -import com.example.s3.DeleteObjects; -import com.example.s3.GetObjectData; -import com.example.s3.GetObjectPresignedUrl; -import com.example.s3.GetObjectRestoreStatus; -import com.example.s3.LifecycleConfiguration; -import com.example.s3.ListObjects; -import com.example.s3.PutObject; -import com.example.s3.RestoreObject; -import com.example.s3.S3Cors; -import com.example.s3.S3Scenario; -import com.example.s3.S3ZipExample; -import com.google.gson.Gson; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.TestMethodOrder; -import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.s3.S3Client; - -import java.io.IOException; - -import software.amazon.awssdk.services.s3.presigner.S3Presigner; -import software.amazon.awssdk.services.s3control.S3ControlClient; -import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; -import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; -import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; - -/** - * To run these integration tests, you must set the required values - * in the config.properties file or AWS Secrets Manager. - */ -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class AmazonS3Test { - private static S3Client s3; - private static S3Presigner presigner; - private static S3ControlClient s3ControlClient; - - // Define the data members required for the tests. - private static String bucketName = ""; - private static String objectKey = ""; - private static String objectPath = ""; - private static String toBucket = ""; - private static String policyText = ""; - private static String id = ""; - private static String presignKey = ""; - private static String presignBucket = ""; - private static String path = ""; - private static String bucketNamePolicy = ""; - private static String accountId = ""; - private static String accessPointName = ""; - private static String bucketNameZip = ""; - - // Used for the encryption test. - private static String encryptObjectName = ""; - private static String encryptObjectPath = ""; - private static String encryptOutPath = ""; - private static String keyId = ""; - - // Used for restore tests. - private static String restoreImagePath = ""; - private static String restoreBucket = ""; - private static String restoreImageName = ""; - - // Used for the Scenario test. - private static String bucketNameSc = ""; - private static String keySc = ""; - private static String objectPathSc = ""; - private static String savePathSc = ""; - private static String toBucketSc = ""; - private static String images = ""; - private static String[] imageKeys; - - @BeforeAll - public static void setUp() throws IOException { - s3 = S3Client.builder() - .region(Region.US_EAST_1) - .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) - .build(); - - presigner = S3Presigner.builder() - .region(Region.US_EAST_1) - .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) - .build(); - - s3ControlClient = S3ControlClient.builder() - .region(Region.US_EAST_1) - .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) - .build(); - - // Get the values to run these tests from AWS Secrets Manager. - Gson gson = new Gson(); - String json = getSecretValues(); - SecretValues values = gson.fromJson(json, SecretValues.class); - bucketName = values.getBucketName() + java.util.UUID.randomUUID(); - objectKey = values.getObjectKey(); - objectPath = values.getObjectPath(); - toBucket = values.getToBucket(); - policyText = values.getPolicyText(); - id = values.getId(); - presignKey = values.getPresignKey(); - presignBucket = values.getPresignBucket(); - path = values.getPath(); - bucketNamePolicy = values.getBucketNamePolicy(); - accountId = values.getAccountId(); - accessPointName = values.getAccessPointName(); - encryptObjectName = values.getEncryptObjectName(); - encryptObjectPath = values.getEncryptObjectPath(); - encryptOutPath = values.getEncryptOutPath(); - keyId = values.getKeyId(); - restoreImagePath = values.getRestoreImagePath(); - restoreBucket = values.getRestoreBucket(); - restoreImageName = values.getRestoreImageName(); - bucketNameSc = values.getBucketNameSc() + java.util.UUID.randomUUID(); - keySc = values.getKeySc(); - objectPathSc = values.getObjectPathSc(); - savePathSc = values.getSavePathSc(); - toBucketSc = values.getToBucketSc(); - bucketNameZip = values.getBucketNameZip(); - images = values.getImages(); - imageKeys = images.split("[,]", 0); - - // Uncomment this code block if you prefer using a config.properties file to - // retrieve AWS values required for these tests. - /* - * try (InputStream input = - * AmazonS3Test.class.getClassLoader().getResourceAsStream("config.properties")) - * { - * Properties prop = new Properties(); - * - * if (input == null) { - * System.out.println("Sorry, unable to find config.properties"); - * return; - * } - * prop.load(input); - * bucketName = prop.getProperty("bucketName")+ java.util.UUID.randomUUID();; - * objectKey = prop.getProperty("objectKey"); - * objectPath= prop.getProperty("objectPath"); - * toBucket = prop.getProperty("toBucket"); - * policyText = prop.getProperty("policyText"); - * id = prop.getProperty("id"); - * presignKey = prop.getProperty("presignKey"); - * presignBucket= prop.getProperty("presignBucket"); - * path = prop.getProperty("path"); - * bucketNamePolicy = prop.getProperty("bucketNamePolicy"); - * accountId = prop.getProperty("accountId"); - * accessPointName = prop.getProperty("accessPointName"); - * encryptObjectName = prop.getProperty("encryptObjectName"); - * encryptObjectPath = prop.getProperty("encryptObjectPath"); - * encryptOutPath = prop.getProperty("encryptOutPath"); - * keyId = prop.getProperty("keyId"); - * restoreImagePath = prop.getProperty("restoreImagePath"); - * restoreBucket = prop.getProperty("restoreBucket"); - * restoreImageName = prop.getProperty("restoreImageName"); - * bucketNameSc = prop.getProperty("bucketNameSc")+ - * java.util.UUID.randomUUID();; - * keySc = prop.getProperty("keySc"); - * objectPathSc = prop.getProperty("objectPathSc"); - * savePathSc = prop.getProperty("savePathSc"); - * toBucketSc = prop.getProperty("toBucketSc"); - * bucketNameZip = prop.getProperty("bucketNameZip"); - * images = prop.getProperty("images"); - * imageKeys = images.split("[,]", 0); - * - * } catch (IOException ex) { - * ex.printStackTrace(); - * } - */ - } - - @Test - @Tag("IntegrationTest") - @Order(1) - public void createBucket() { - assertDoesNotThrow(() -> CreateBucket.createBucket(s3, bucketName)); - System.out.println("Test 1 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(2) - public void putObject() { - assertDoesNotThrow(() -> PutObject.putS3Object(s3, bucketName, objectKey, objectPath)); - System.out.println("Test 2 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(3) - public void copyBucketObject() { - String result = CopyObject.copyBucketObject(s3, bucketName, objectKey, toBucket); - assertFalse(result.isEmpty()); - System.out.println("Test 3 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(6) - public void deleteBucketPolicy() { - assertDoesNotThrow(() -> DeleteBucketPolicy.deleteS3BucketPolicy(s3, bucketNamePolicy)); - System.out.println("Test 6 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(7) - public void getObjectPresignedUrl() { - assertDoesNotThrow(() -> GetObjectPresignedUrl.getPresignedUrl(presigner, presignBucket, presignKey)); - System.out.println("Test 8 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(8) - public void getObjectData() { - assertDoesNotThrow(() -> GetObjectData.getObjectBytes(s3, bucketName, objectKey, path)); - System.out.println("Test 9 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(9) - public void listObjects() { - assertDoesNotThrow(() -> ListObjects.listBucketObjects(s3, bucketName)); - System.out.println("Test 10 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(10) - public void createAccessPoint() { - assertDoesNotThrow(() -> CreateAccessPoint.createSpecificAccessPoint(s3ControlClient, accountId, bucketName, - accessPointName)); - assertDoesNotThrow( - () -> CreateAccessPoint.deleteSpecificAccessPoint(s3ControlClient, accountId, accessPointName)); - System.out.println("Test 11 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(11) - public void lifecycleConfiguration() { - assertDoesNotThrow(() -> LifecycleConfiguration.setLifecycleConfig(s3, bucketName, accountId)); - assertDoesNotThrow(() -> LifecycleConfiguration.getLifecycleConfig(s3, bucketName, accountId)); - assertDoesNotThrow(() -> LifecycleConfiguration.deleteLifecycleConfig(s3, bucketName, accountId)); - System.out.println("Test 12 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(12) - public void s3Cors() { - assertDoesNotThrow(() -> S3Cors.setCorsInformation(s3, bucketName, accountId)); - assertDoesNotThrow(() -> S3Cors.getBucketCorsInformation(s3, bucketName, accountId)); - assertDoesNotThrow(() -> S3Cors.deleteBucketCorsInformation(s3, bucketName, accountId)); - System.out.println("Test 13 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(13) - public void deleteMultiObjects() { - assertDoesNotThrow(() -> DeleteMultiObjects.deleteBucketObjects(s3, bucketName)); - System.out.println("Test 14 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(14) - public void deleteObjects() { - assertDoesNotThrow(() -> DeleteObjects.deleteBucketObjects(s3, bucketName, objectKey)); - assertDoesNotThrow(() -> DeleteObjects.deleteBucketObjects(s3, bucketName, encryptObjectName)); - System.out.println("Test 15 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(15) - public void copyObjectStorage() { - assertDoesNotThrow(() -> PutObject.putS3Object(s3, restoreBucket, restoreImageName, restoreImagePath)); - assertDoesNotThrow( - () -> CopyObjectStorage.copyBucketObject(s3, restoreBucket, restoreImageName, restoreBucket)); - System.out.println("Test 16 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(16) - public void restoreObject() { - assertDoesNotThrow(() -> RestoreObject.restoreS3Object(s3, restoreBucket, restoreImageName, accountId)); - System.out.println("Test 17 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(17) - public void getRestoreStatus() { - assertDoesNotThrow(() -> GetObjectRestoreStatus.checkStatus(s3, restoreBucket, restoreImageName)); - System.out.println("Test 18 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(18) - public void s3ZipExample() { - assertDoesNotThrow(() -> S3ZipExample.createZIPFile(s3, bucketNameZip, imageKeys)); - System.out.println("Test 19 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(19) - public void deleteBucket() { - assertDoesNotThrow(() -> S3Scenario.deleteBucket(s3, bucketName)); - System.out.println("Test 19 passed"); - } - - @Test - @Tag("IntegrationTest") - @Order(20) - public void testScenario() { - System.out.println(S3Scenario.DASHES); - System.out.println("1. Create an Amazon S3 bucket."); - assertDoesNotThrow(() -> S3Scenario.createBucket(s3, bucketNameSc)); - System.out.println(S3Scenario.DASHES); - - System.out.println(S3Scenario.DASHES); - System.out.println("2. Update a local file to the Amazon S3 bucket."); - assertDoesNotThrow(() -> S3Scenario.uploadLocalFile(s3, bucketNameSc, keySc, objectPathSc)); - System.out.println(S3Scenario.DASHES); - - System.out.println(S3Scenario.DASHES); - System.out.println("3. Download the object to another local file."); - assertDoesNotThrow(() -> S3Scenario.getObjectBytes(s3, bucketNameSc, keySc, savePathSc)); - System.out.println(S3Scenario.DASHES); - - System.out.println(S3Scenario.DASHES); - System.out.println("4. Perform a multipart upload."); - String multipartKey = "multiPartKey"; - assertDoesNotThrow(() -> S3Scenario.multipartUpload(s3, toBucketSc, multipartKey)); - System.out.println(S3Scenario.DASHES); - - System.out.println(S3Scenario.DASHES); - System.out.println("5. List all objects located in the Amazon S3 bucket."); - assertDoesNotThrow(() -> S3Scenario.listAllObjects(s3, bucketNameSc)); - assertDoesNotThrow(() -> S3Scenario.anotherListExample(s3, bucketNameSc)); - System.out.println(S3Scenario.DASHES); - - System.out.println(S3Scenario.DASHES); - System.out.println("6. Copy the object to another Amazon S3 bucket."); - assertDoesNotThrow(() -> S3Scenario.copyBucketObject(s3, bucketNameSc, keySc, toBucketSc)); - System.out.println(S3Scenario.DASHES); - - System.out.println(S3Scenario.DASHES); - System.out.println("7. Delete the object from the Amazon S3 bucket."); - assertDoesNotThrow(() -> S3Scenario.deleteObjectFromBucket(s3, bucketNameSc, keySc)); - System.out.println(S3Scenario.DASHES); - - System.out.println(S3Scenario.DASHES); - System.out.println("8. Delete the Amazon S3 bucket."); - assertDoesNotThrow(() -> S3Scenario.deleteBucket(s3, bucketNameSc)); - System.out.println(S3Scenario.DASHES); - - System.out.println("Test 20 passed"); - } - - private static String getSecretValues() { - SecretsManagerClient secretClient = SecretsManagerClient.builder() - .region(Region.US_EAST_1) - .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) - .build(); - String secretName = "test/s3"; - - GetSecretValueRequest valueRequest = GetSecretValueRequest.builder() - .secretId(secretName) - .build(); - - GetSecretValueResponse valueResponse = secretClient.getSecretValue(valueRequest); - return valueResponse.secretString(); - } - - @Nested - @DisplayName("A class used to get test values from test/s3 (an AWS Secrets Manager secret)") - class SecretValues { - private String bucketName; - private String bucketNamePolicy; - private String presignBucket; - - private String objectKey; - - private String presignKey; - private String path; - - private String objectPath; - - private String toBucket; - private String policyText; - - private String id; - - private String accountId; - - private String accessPointName; - - private String encryptObjectName; - - private String encryptObjectPath; - - private String encryptOutPath; - - private String keyId; - - private String restoreImagePath; - - private String restoreBucket; - - private String restoreImageName; - - private String bucketNameSc; - - private String keySc; - - private String objectPathSc; - - private String savePathSc; - - private String toBucketSc; - - private String bucketNameZip; - - private String images; - - public String getBucketName() { - return bucketName; - } - - public String getBucketNamePolicy() { - return bucketNamePolicy; - } - - public String getPresignBucket() { - return presignBucket; - } - - public String getObjectKey() { - return objectKey; - } - - public String getPresignKey() { - return presignKey; - } - - public String getPath() { - return path; - } - - public String getObjectPath() { - return objectPath; - } - - public String getToBucket() { - return toBucket; - } - - public String getPolicyText() { - return policyText; - } - - public String getId() { - return id; - } - - public String getAccountId() { - return accountId; - } - - public String getAccessPointName() { - return accessPointName; - } - - public String getEncryptObjectName() { - return encryptObjectName; - } - - public String getEncryptObjectPath() { - return encryptObjectPath; - } - - public String getEncryptOutPath() { - return encryptOutPath; - } - - public String getKeyId() { - return keyId; - } - - public String getRestoreImagePath() { - return restoreImagePath; - } - - public String getRestoreBucket() { - return restoreBucket; - } - - public String getRestoreImageName() { - return restoreImageName; - } - - public String getBucketNameSc() { - return bucketNameSc; - } - - public String getKeySc() { - return keySc; - } - - public String getObjectPathSc() { - return objectPathSc; - } - - public String getSavePathSc() { - return savePathSc; - } - - public String getToBucketSc() { - return toBucketSc; - } - - public String getBucketNameZip() { - return bucketNameZip; - } - - public String getImages() { - return images; - } - } -} diff --git a/javav2/example_code/s3/src/test/java/S3ActionsTest.java b/javav2/example_code/s3/src/test/java/S3ActionsTest.java new file mode 100644 index 00000000000..92933228214 --- /dev/null +++ b/javav2/example_code/s3/src/test/java/S3ActionsTest.java @@ -0,0 +1,165 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import com.example.s3.scenario.S3Actions; +import com.google.gson.Gson; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestMethodOrder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; +import software.amazon.awssdk.services.s3.model.PutObjectResponse; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.concurrent.CompletableFuture; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class S3ActionsTest { + private static final Logger logger = LoggerFactory.getLogger(S3ActionsTest.class); + private static S3Actions s3Actions; + private static final String BUCKET_NAME = "test-bucket-" + System.currentTimeMillis(); + private static String path = ""; + private static String objectPath = ""; + + private static String objectKey = ""; + + @BeforeAll + static void setup() throws Exception { + s3Actions = new S3Actions(); + + // Get the values to run these tests from AWS Secrets Manager. + Gson gson = new Gson(); + String json = getSecretValues(); + SecretValues values = gson.fromJson(json, SecretValues.class); + objectPath = values.getObjectPath(); + objectKey = values.getObjectKey(); + path = values.getPath(); + + // Create a test file to upload + Path path1 = Paths.get(path); + if (!Files.exists(path1)) { + Files.write(path1, "This is a test file.".getBytes()); + } + + CompletableFuture createBucketFuture = s3Actions.createBucketAsync(BUCKET_NAME); + createBucketFuture.join(); // Wait for bucket creation + } + + @Test + @Tag("IntegrationTest") + @Order(1) + void testUploadLocalFileAsync() { + // Ensure the method doesn't throw any exceptions + assertDoesNotThrow(() -> { + CompletableFuture future = s3Actions.uploadLocalFileAsync(BUCKET_NAME, objectKey, path); + future.join(); // Wait for the operation to complete + }); + logger.info("Test 1 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(2) + void testGetObjectBytesAsync() { + // Ensure the method doesn't throw any exceptions + assertDoesNotThrow(() -> { + CompletableFuture future = s3Actions.getObjectBytesAsync(BUCKET_NAME, objectKey, "downloaded-file.txt"); + future.join(); // Wait for the operation to complete + }); + logger.info("Test 2 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(3) + void testGetObjectBytesAsyncWithException() { + String invalidKey = "non-existent-key"; + CompletableFuture future = s3Actions.getObjectBytesAsync(BUCKET_NAME, invalidKey, "downloaded-file.txt"); + assertThrows(RuntimeException.class, future::join); + logger.info("Test 3 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(4) + void testListAllObjectsAsync() { + assertDoesNotThrow(() -> { + CompletableFuture future = s3Actions.listAllObjectsAsync(BUCKET_NAME); + future.join(); // Wait for the operation to complete + }); + logger.info("Test 4 passed"); + } + + @Test + @Tag("IntegrationTest") + @Order(5) + void testListAllObjectsAsyncWithException() { + String invalidBucket = "non-existent-bucket"; + CompletableFuture future = s3Actions.listAllObjectsAsync(invalidBucket); + assertThrows(RuntimeException.class, future::join); + logger.info("Test 5 passed"); + } + + @AfterAll + static void teardown() throws Exception { + // Delete the S3 bucket and the test file after testing + s3Actions.deleteObjectFromBucketAsync(BUCKET_NAME, objectKey).join(); + s3Actions.getAsyncClient().deleteBucket(DeleteBucketRequest.builder().bucket(BUCKET_NAME).build()).join(); + } + + private static String getSecretValues() { + SecretsManagerClient secretClient = SecretsManagerClient.builder() + .region(Region.US_EAST_1) + .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) + .build(); + String secretName = "test/s3"; + + GetSecretValueRequest valueRequest = GetSecretValueRequest.builder() + .secretId(secretName) + .build(); + + GetSecretValueResponse valueResponse = secretClient.getSecretValue(valueRequest); + return valueResponse.secretString(); + } + + @Nested + @DisplayName("A class used to get test values from test/s3 (an AWS Secrets Manager secret)") + class SecretValues { + private String objectKey; + + private String path; + + private String objectPath; + + public String getObjectKey() { + return objectKey; + } + + + public String getPath() { + return path; + } + + public String getObjectPath() { + return objectPath; + } + + } +} diff --git a/javav2/example_code/s3/src/test/java/S3BatchTest.java b/javav2/example_code/s3/src/test/java/S3BatchTest.java index 9ada7bfe46d..b6fed4aeef5 100644 --- a/javav2/example_code/s3/src/test/java/S3BatchTest.java +++ b/javav2/example_code/s3/src/test/java/S3BatchTest.java @@ -40,7 +40,7 @@ public static void setUp() throws IOException { // Get the values to run these tests from AWS Secrets Manager. Gson gson = new Gson(); String json = getSecretValues(); - AmazonS3Test.SecretValues values = gson.fromJson(json, AmazonS3Test.SecretValues.class); + SecretValues values = gson.fromJson(json, SecretValues.class); accountId = values.getAccountId(); actions = new S3BatchActions(); @@ -203,5 +203,6 @@ public String getAccountId() { } + } } From 35fb2fa76a6ba7e61d1f694b5710b4c51ebf70f7 Mon Sep 17 00:00:00 2001 From: ford prior Date: Thu, 5 Sep 2024 12:39:58 -0400 Subject: [PATCH 70/98] Python - EC2: Audit results implemented (#6734) --- .../resilient_service/.gitignore | 1 + python/example_code/ec2/README.md | 38 +- python/example_code/ec2/elastic_ip.py | 195 ++++--- python/example_code/ec2/hello/hello_ec2.py | 30 +- python/example_code/ec2/instance.py | 328 +++++++----- python/example_code/ec2/key_pair.py | 130 +++-- python/example_code/ec2/requirements.txt | 2 + .../ec2/scenario_get_started_instances.py | 497 +++++++++++------- python/example_code/ec2/security_group.py | 162 +++--- python/example_code/ec2/test/conftest.py | 62 --- .../ec2/test/test_associate_elastic_ip.py | 60 --- python/example_code/ec2/test/test_cleanup.py | 84 --- .../test/test_create_and_list_key_pairs.py | 65 --- .../ec2/test/test_create_instance.py | 90 ---- .../ec2/test/test_create_security_group.py | 72 --- .../test_scenario_get_started_instances.py | 39 ++ ...st_scenario_get_started_instances_integ.py | 43 -- .../ec2/test/test_stop_and_start_instance.py | 81 --- 18 files changed, 891 insertions(+), 1088 deletions(-) create mode 100644 python/cross_service/resilient_service/.gitignore delete mode 100644 python/example_code/ec2/test/conftest.py delete mode 100644 python/example_code/ec2/test/test_associate_elastic_ip.py delete mode 100644 python/example_code/ec2/test/test_cleanup.py delete mode 100644 python/example_code/ec2/test/test_create_and_list_key_pairs.py delete mode 100644 python/example_code/ec2/test/test_create_instance.py delete mode 100644 python/example_code/ec2/test/test_create_security_group.py create mode 100644 python/example_code/ec2/test/test_scenario_get_started_instances.py delete mode 100644 python/example_code/ec2/test/test_scenario_get_started_instances_integ.py delete mode 100644 python/example_code/ec2/test/test_stop_and_start_instance.py diff --git a/python/cross_service/resilient_service/.gitignore b/python/cross_service/resilient_service/.gitignore new file mode 100644 index 00000000000..cfaad761185 --- /dev/null +++ b/python/cross_service/resilient_service/.gitignore @@ -0,0 +1 @@ +*.pem diff --git a/python/example_code/ec2/README.md b/python/example_code/ec2/README.md index 25d6a2ddd7c..6271628ade1 100644 --- a/python/example_code/ec2/README.md +++ b/python/example_code/ec2/README.md @@ -36,7 +36,7 @@ python -m pip install -r requirements.txt ### Get started -- [Hello Amazon EC2](hello/hello_ec2.py#L4) (`DescribeSecurityGroups`) +- [Hello Amazon EC2](hello/hello_ec2.py#L11) (`DescribeSecurityGroups`) ### Basics @@ -50,32 +50,32 @@ Code examples that show you how to perform the essential operations within a ser Code excerpts that show you how to call individual service functions. -- [AllocateAddress](elastic_ip.py#L34) -- [AssociateAddress](elastic_ip.py#L59) -- [AuthorizeSecurityGroupIngress](security_group.py#L62) -- [CreateKeyPair](key_pair.py#L40) +- [AllocateAddress](elastic_ip.py#L56) +- [AssociateAddress](elastic_ip.py#L82) +- [AuthorizeSecurityGroupIngress](security_group.py#L68) +- [CreateKeyPair](key_pair.py#L57) - [CreateLaunchTemplate](../../cross_service/resilient_service/auto_scaler.py#L346) -- [CreateSecurityGroup](security_group.py#L35) -- [DeleteKeyPair](key_pair.py#L91) +- [CreateSecurityGroup](security_group.py#L42) +- [DeleteKeyPair](key_pair.py#L118) - [DeleteLaunchTemplate](../../cross_service/resilient_service/auto_scaler.py#L409) -- [DeleteSecurityGroup](security_group.py#L129) +- [DeleteSecurityGroup](security_group.py#L148) - [DescribeAvailabilityZones](../../cross_service/resilient_service/auto_scaler.py#L438) - [DescribeIamInstanceProfileAssociations](../../cross_service/resilient_service/auto_scaler.py#L184) -- [DescribeImages](instance.py#L195) -- [DescribeInstanceTypes](instance.py#L217) -- [DescribeInstances](instance.py#L85) -- [DescribeKeyPairs](key_pair.py#L70) -- [DescribeSecurityGroups](security_group.py#L102) +- [DescribeImages](instance.py#L253) +- [DescribeInstanceTypes](instance.py#L274) +- [DescribeInstances](instance.py#L106) +- [DescribeKeyPairs](key_pair.py#L89) +- [DescribeSecurityGroups](security_group.py#L108) - [DescribeSubnets](../../cross_service/resilient_service/auto_scaler.py#L731) - [DescribeVpcs](../../cross_service/resilient_service/auto_scaler.py#L630) -- [DisassociateAddress](elastic_ip.py#L89) +- [DisassociateAddress](elastic_ip.py#L121) - [RebootInstances](../../cross_service/resilient_service/auto_scaler.py#L21) -- [ReleaseAddress](elastic_ip.py#L112) +- [ReleaseAddress](elastic_ip.py#L162) - [ReplaceIamInstanceProfileAssociation](../../cross_service/resilient_service/auto_scaler.py#L205) -- [RunInstances](instance.py#L34) -- [StartInstances](instance.py#L141) -- [StopInstances](instance.py#L168) -- [TerminateInstances](instance.py#L116) +- [RunInstances](instance.py#L43) +- [StartInstances](instance.py#L190) +- [StopInstances](instance.py#L221) +- [TerminateInstances](instance.py#L158) ### Scenarios diff --git a/python/example_code/ec2/elastic_ip.py b/python/example_code/ec2/elastic_ip.py index 8c7bcaab47f..cffed9e385a 100644 --- a/python/example_code/ec2/elastic_ip.py +++ b/python/example_code/ec2/elastic_ip.py @@ -1,7 +1,8 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 - import logging +from typing import Any, Dict, List, Optional, Union + import boto3 from botocore.exceptions import ClientError @@ -11,126 +12,196 @@ # snippet-start:[python.example_code.ec2.ElasticIpWrapper.class] # snippet-start:[python.example_code.ec2.ElasticIpWrapper.decl] class ElasticIpWrapper: - """Encapsulates Amazon Elastic Compute Cloud (Amazon EC2) Elastic IP address actions.""" - - def __init__(self, ec2_resource, elastic_ip=None): + """Encapsulates Amazon Elastic Compute Cloud (Amazon EC2) Elastic IP address actions using the client interface.""" + + class ElasticIp: + """Represents an Elastic IP and its associated instance.""" + + def __init__( + self, allocation_id: str, public_ip: str, instance_id: Optional[str] = None + ) -> None: + """ + Initializes the ElasticIp object. + + :param allocation_id: The allocation ID of the Elastic IP. + :param public_ip: The public IP address of the Elastic IP. + :param instance_id: The ID of the associated EC2 instance, if any. + """ + self.allocation_id = allocation_id + self.public_ip = public_ip + self.instance_id = instance_id + + def __init__(self, ec2_client: Any) -> None: """ - :param ec2_resource: A Boto3 Amazon EC2 resource. This high-level resource - is used to create additional high-level objects - that wrap low-level Amazon EC2 service actions. - :param elastic_ip: A Boto3 VpcAddress object. This is a high-level object that - wraps Elastic IP actions. + Initializes the ElasticIpWrapper with an EC2 client. + + :param ec2_client: A Boto3 Amazon EC2 client. This client provides low-level + access to AWS EC2 services. """ - self.ec2_resource = ec2_resource - self.elastic_ip = elastic_ip + self.ec2_client = ec2_client + self.elastic_ips: List[ElasticIpWrapper.ElasticIp] = [] @classmethod - def from_resource(cls): - ec2_resource = boto3.resource("ec2") - return cls(ec2_resource) + def from_client(cls) -> "ElasticIpWrapper": + """ + Creates an ElasticIpWrapper instance with a default EC2 client. + + :return: An instance of ElasticIpWrapper initialized with the default EC2 client. + """ + ec2_client = boto3.client("ec2") + return cls(ec2_client) # snippet-end:[python.example_code.ec2.ElasticIpWrapper.decl] # snippet-start:[python.example_code.ec2.AllocateAddress] - def allocate(self): + def allocate(self) -> "ElasticIpWrapper.ElasticIp": """ Allocates an Elastic IP address that can be associated with an Amazon EC2 instance. By using an Elastic IP address, you can keep the public IP address constant even when you restart the associated instance. - :return: The newly created Elastic IP object. By default, the address is not - associated with any instance. + :return: The ElasticIp object for the newly created Elastic IP address. + :raises ClientError: If the allocation fails, such as reaching the maximum limit of Elastic IPs. """ try: - response = self.ec2_resource.meta.client.allocate_address(Domain="vpc") - self.elastic_ip = self.ec2_resource.VpcAddress(response["AllocationId"]) - except ClientError as err: - logger.error( - "Couldn't allocate Elastic IP. Here's why: %s: %s", - err.response["Error"]["Code"], - err.response["Error"]["Message"], + response = self.ec2_client.allocate_address(Domain="vpc") + elastic_ip = self.ElasticIp( + allocation_id=response["AllocationId"], public_ip=response["PublicIp"] ) - raise - else: - return self.elastic_ip + self.elastic_ips.append(elastic_ip) + except ClientError as err: + if err.response["Error"]["Code"] == "AddressLimitExceeded": + logger.error( + "Max IP's reached. Release unused addresses or contact AWS Support for an increase." + ) + raise err + return elastic_ip # snippet-end:[python.example_code.ec2.AllocateAddress] # snippet-start:[python.example_code.ec2.AssociateAddress] - def associate(self, instance): + def associate( + self, allocation_id: str, instance_id: str + ) -> Union[Dict[str, Any], None]: """ Associates an Elastic IP address with an instance. When this association is created, the Elastic IP's public IP address is immediately used as the public IP address of the associated instance. - :param instance: A Boto3 Instance object. This is a high-level object that wraps - Amazon EC2 instance actions. - :return: A response that contains the ID of the association. + :param allocation_id: The allocation ID of the Elastic IP. + :param instance_id: The ID of the Amazon EC2 instance. + :return: A response that contains the ID of the association, or None if no Elastic IP is found. + :raises ClientError: If the association fails, such as when the instance ID is not found. """ - if self.elastic_ip is None: - logger.info("No Elastic IP to associate.") - return + elastic_ip = self.get_elastic_ip_by_allocation(self.elastic_ips, allocation_id) + if elastic_ip is None: + logger.info(f"No Elastic IP found with allocation ID {allocation_id}.") + return None try: - response = self.elastic_ip.associate(InstanceId=instance.id) - except ClientError as err: - logger.error( - "Couldn't associate Elastic IP %s with instance %s. Here's why: %s: %s", - self.elastic_ip.allocation_id, - instance.id, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + response = self.ec2_client.associate_address( + AllocationId=allocation_id, InstanceId=instance_id ) + elastic_ip.instance_id = ( + instance_id # Track the instance associated with this Elastic IP. + ) + except ClientError as err: + if err.response["Error"]["Code"] == "InvalidInstanceID.NotFound": + logger.error( + f"Failed to associate Elastic IP {allocation_id} with {instance_id} " + "because the specified instance ID does not exist or has not propagated fully. " + "Verify the instance ID and try again, or wait a few moments before attempting to " + "associate the Elastic IP address." + ) raise return response # snippet-end:[python.example_code.ec2.AssociateAddress] # snippet-start:[python.example_code.ec2.DisassociateAddress] - def disassociate(self): + def disassociate(self, allocation_id: str) -> None: """ Removes an association between an Elastic IP address and an instance. When the association is removed, the instance is assigned a new public IP address. + + :param allocation_id: The allocation ID of the Elastic IP to disassociate. + :raises ClientError: If the disassociation fails, such as when the association ID is not found. """ - if self.elastic_ip is None: - logger.info("No Elastic IP to disassociate.") + elastic_ip = self.get_elastic_ip_by_allocation(self.elastic_ips, allocation_id) + if elastic_ip is None or elastic_ip.instance_id is None: + logger.info( + f"No association found for Elastic IP with allocation ID {allocation_id}." + ) return try: - self.elastic_ip.association.delete() + # Retrieve the association ID before disassociating + response = self.ec2_client.describe_addresses(AllocationIds=[allocation_id]) + association_id = response["Addresses"][0].get("AssociationId") + + if association_id: + self.ec2_client.disassociate_address(AssociationId=association_id) + elastic_ip.instance_id = None # Remove the instance association + else: + logger.info( + f"No Association ID found for Elastic IP with allocation ID {allocation_id}." + ) + except ClientError as err: - logger.error( - "Couldn't disassociate Elastic IP %s from its instance. Here's why: %s: %s", - self.elastic_ip.allocation_id, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + if err.response["Error"]["Code"] == "InvalidAssociationID.NotFound": + logger.error( + f"Failed to disassociate Elastic IP {allocation_id} " + "because the specified association ID for the Elastic IP address was not found. " + "Verify the association ID and ensure the Elastic IP is currently associated with a " + "resource before attempting to disassociate it." + ) raise # snippet-end:[python.example_code.ec2.DisassociateAddress] # snippet-start:[python.example_code.ec2.ReleaseAddress] - def release(self): + def release(self, allocation_id: str) -> None: """ Releases an Elastic IP address. After the Elastic IP address is released, it can no longer be used. + + :param allocation_id: The allocation ID of the Elastic IP to release. + :raises ClientError: If the release fails, such as when the Elastic IP address is not found. """ - if self.elastic_ip is None: - logger.info("No Elastic IP to release.") + elastic_ip = self.get_elastic_ip_by_allocation(self.elastic_ips, allocation_id) + if elastic_ip is None: + logger.info(f"No Elastic IP found with allocation ID {allocation_id}.") return try: - self.elastic_ip.release() + self.ec2_client.release_address(AllocationId=allocation_id) + self.elastic_ips.remove(elastic_ip) # Remove the Elastic IP from the list except ClientError as err: - logger.error( - "Couldn't release Elastic IP address %s. Here's why: %s: %s", - self.elastic_ip.allocation_id, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + if err.response["Error"]["Code"] == "InvalidAddress.NotFound": + logger.error( + f"Failed to release Elastic IP address {allocation_id} " + "because it could not be found. Verify the Elastic IP address " + "and ensure it is allocated to your account in the correct region " + "before attempting to release it." + ) raise # snippet-end:[python.example_code.ec2.ReleaseAddress] + @staticmethod + def get_elastic_ip_by_allocation( + elastic_ips: List["ElasticIpWrapper.ElasticIp"], allocation_id: str + ) -> Optional["ElasticIpWrapper.ElasticIp"]: + """ + Retrieves an Elastic IP object by its allocation ID from a given list of Elastic IPs. + + :param elastic_ips: A list of ElasticIp objects. + :param allocation_id: The allocation ID of the Elastic IP to retrieve. + :return: The ElasticIp object associated with the allocation ID, or None if not found. + """ + return next( + (ip for ip in elastic_ips if ip.allocation_id == allocation_id), None + ) + # snippet-end:[python.example_code.ec2.ElasticIpWrapper.class] diff --git a/python/example_code/ec2/hello/hello_ec2.py b/python/example_code/ec2/hello/hello_ec2.py index b5c449f8b76..c4aebf7a8b9 100644 --- a/python/example_code/ec2/hello/hello_ec2.py +++ b/python/example_code/ec2/hello/hello_ec2.py @@ -1,25 +1,37 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 +import logging -# snippet-start:[python.example_code.ec2.Hello] import boto3 +from botocore.exceptions import ClientError + +logger = logging.getLogger(__name__) -def hello_ec2(ec2_resource): +# snippet-start:[python.example_code.ec2.Hello] +def hello_ec2(ec2_client): """ - Use the AWS SDK for Python (Boto3) to create an Amazon Elastic Compute Cloud - (Amazon EC2) resource and list the security groups in your account. + Use the AWS SDK for Python (Boto3) to list the security groups in your account. This example uses the default settings specified in your shared credentials and config files. - :param ec2_resource: A Boto3 EC2 ServiceResource object. This object is a high-level - resource that wraps the low-level EC2 service API. + :param ec2_client: A Boto3 EC2 client. This client provides low-level + access to AWS EC2 services. """ print("Hello, Amazon EC2! Let's list up to 10 of your security groups:") - for sg in ec2_resource.security_groups.limit(10): - print(f"\t{sg.id}: {sg.group_name}") + try: + paginator = ec2_client.get_paginator("describe_security_groups") + response_iterator = paginator.paginate(MaxResults=10) + for page in response_iterator: + for sg in page["SecurityGroups"]: + logger.info(f"\t{sg['GroupId']}: {sg['GroupName']}") + except ClientError as err: + logger.error("Failed to list security groups.") + if err.response["Error"]["Code"] == "AccessDeniedException": + logger.error("You do not have permission to list security groups.") + raise if __name__ == "__main__": - hello_ec2(boto3.resource("ec2")) + hello_ec2(boto3.client("ec2")) # snippet-end:[python.example_code.ec2.Hello] diff --git a/python/example_code/ec2/instance.py b/python/example_code/ec2/instance.py index 35726394e3b..03d1c7cace0 100644 --- a/python/example_code/ec2/instance.py +++ b/python/example_code/ec2/instance.py @@ -1,7 +1,8 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 - import logging +from typing import Any, Dict, List, Optional + import boto3 from botocore.exceptions import ClientError @@ -10,243 +11,302 @@ # snippet-start:[python.example_code.ec2.InstanceWrapper.class] # snippet-start:[python.example_code.ec2.InstanceWrapper.decl] -class InstanceWrapper: - """Encapsulates Amazon Elastic Compute Cloud (Amazon EC2) instance actions.""" +class EC2InstanceWrapper: + """Encapsulates Amazon Elastic Compute Cloud (Amazon EC2) instance actions using the client interface.""" - def __init__(self, ec2_resource, instance=None): + def __init__( + self, ec2_client: Any, instances: Optional[List[Dict[str, Any]]] = None + ) -> None: """ - :param ec2_resource: A Boto3 Amazon EC2 resource. This high-level resource - is used to create additional high-level objects - that wrap low-level Amazon EC2 service actions. - :param instance: A Boto3 Instance object. This is a high-level object that - wraps instance actions. + Initializes the EC2InstanceWrapper with an EC2 client and optional instances. + + :param ec2_client: A Boto3 Amazon EC2 client. This client provides low-level + access to AWS EC2 services. + :param instances: A list of dictionaries representing Boto3 Instance objects. These are high-level objects that + wrap instance actions. """ - self.ec2_resource = ec2_resource - self.instance = instance + self.ec2_client = ec2_client + self.instances = instances or [] @classmethod - def from_resource(cls): - ec2_resource = boto3.resource("ec2") - return cls(ec2_resource) + def from_client(cls) -> "EC2InstanceWrapper": + """ + Creates an EC2InstanceWrapper instance with a default EC2 client. + + :return: An instance of EC2InstanceWrapper initialized with the default EC2 client. + """ + ec2_client = boto3.client("ec2") + return cls(ec2_client) # snippet-end:[python.example_code.ec2.InstanceWrapper.decl] # snippet-start:[python.example_code.ec2.RunInstances] - def create(self, image, instance_type, key_pair, security_groups=None): + def create( + self, + image_id: str, + instance_type: str, + key_pair_name: str, + security_group_ids: Optional[List[str]] = None, + ) -> List[Dict[str, Any]]: """ - Creates a new EC2 instance. The instance starts immediately after - it is created. + Creates a new EC2 instance in the default VPC of the current account. - The instance is created in the default VPC of the current account. + The instance starts immediately after it is created. - :param image: A Boto3 Image object that represents an Amazon Machine Image (AMI) - that defines attributes of the instance that is created. The AMI - defines things like the kind of operating system and the type of - storage used by the instance. + :param image_id: The ID of the Amazon Machine Image (AMI) to use for the instance. :param instance_type: The type of instance to create, such as 't2.micro'. - The instance type defines things like the number of CPUs and - the amount of memory. - :param key_pair: A Boto3 KeyPair or KeyPairInfo object that represents the key - pair that is used to secure connections to the instance. - :param security_groups: A list of Boto3 SecurityGroup objects that represents the - security groups that are used to grant access to the - instance. When no security groups are specified, the - default security group of the VPC is used. - :return: A Boto3 Instance object that represents the newly created instance. + :param key_pair_name: The name of the key pair to use for SSH access. + :param security_group_ids: A list of security group IDs to associate with the instance. + If not specified, the default security group of the VPC is used. + :return: A list of dictionaries representing Boto3 Instance objects representing the newly created instances. """ try: instance_params = { - "ImageId": image.id, + "ImageId": image_id, "InstanceType": instance_type, - "KeyName": key_pair.name, + "KeyName": key_pair_name, } - if security_groups is not None: - instance_params["SecurityGroupIds"] = [sg.id for sg in security_groups] - self.instance = self.ec2_resource.create_instances( + if security_group_ids is not None: + instance_params["SecurityGroupIds"] = security_group_ids + + response = self.ec2_client.run_instances( **instance_params, MinCount=1, MaxCount=1 - )[0] - self.instance.wait_until_running() + ) + instance = response["Instances"][0] + self.instances.append(instance) + waiter = self.ec2_client.get_waiter("instance_running") + waiter.wait(InstanceIds=[instance["InstanceId"]]) except ClientError as err: - logging.error( - "Couldn't create instance with image %s, instance type %s, and key %s. " - "Here's why: %s: %s", - image.id, - instance_type, - key_pair.name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + params_str = "\n\t".join( + f"{key}: {value}" for key, value in instance_params.items() + ) + logger.error( + f"Failed to complete instance creation request.\nRequest details:{params_str}" ) + error_code = err.response["Error"]["Code"] + if error_code == "InstanceLimitExceeded": + logger.error( + ( + f"Insufficient capacity for instance type '{instance_type}'. " + "Terminate unused instances or contact AWS Support for a limit increase." + ) + ) + if error_code == "InsufficientInstanceCapacity": + logger.error( + ( + f"Insufficient capacity for instance type '{instance_type}'. " + "Select a different instance type or launch in a different availability zone." + ) + ) raise - else: - return self.instance + return self.instances # snippet-end:[python.example_code.ec2.RunInstances] # snippet-start:[python.example_code.ec2.DescribeInstances] - def display(self, indent=1): + def display(self, state_filter: Optional[str] = "running") -> None: """ - Displays information about an instance. + Displays information about instances, filtering by the specified state. - :param indent: The visual indent to apply to the output. + :param state_filter: The instance state to include in the output. Only instances in this state + will be displayed. Default is 'running'. Example states: 'running', 'stopped'. """ - if self.instance is None: - logger.info("No instance to display.") + if not self.instances: + logger.info("No instances to display.") return + instance_ids = [instance["InstanceId"] for instance in self.instances] + paginator = self.ec2_client.get_paginator("describe_instances") + page_iterator = paginator.paginate(InstanceIds=instance_ids) + try: - self.instance.load() - ind = "\t" * indent - print(f"{ind}ID: {self.instance.id}") - print(f"{ind}Image ID: {self.instance.image_id}") - print(f"{ind}Instance type: {self.instance.instance_type}") - print(f"{ind}Key name: {self.instance.key_name}") - print(f"{ind}VPC ID: {self.instance.vpc_id}") - print(f"{ind}Public IP: {self.instance.public_ip_address}") - print(f"{ind}State: {self.instance.state['Name']}") + for page in page_iterator: + for reservation in page["Reservations"]: + for instance in reservation["Instances"]: + instance_state = instance["State"]["Name"] + + # Apply the state filter (default is 'running') + if state_filter and instance_state != state_filter: + continue # Skip this instance if it doesn't match the filter + + # Create a formatted string with instance details + instance_info = ( + f"• ID: {instance['InstanceId']}\n" + f"• Image ID: {instance['ImageId']}\n" + f"• Instance type: {instance['InstanceType']}\n" + f"• Key name: {instance['KeyName']}\n" + f"• VPC ID: {instance['VpcId']}\n" + f"• Public IP: {instance.get('PublicIpAddress', 'N/A')}\n" + f"• State: {instance_state}" + ) + print(instance_info) + except ClientError as err: logger.error( - "Couldn't display your instance. Here's why: %s: %s", - err.response["Error"]["Code"], - err.response["Error"]["Message"], + f"Failed to display instance(s). : {' '.join(map(str, instance_ids))}" ) - raise + error_code = err.response["Error"]["Code"] + if error_code == "InvalidInstanceID.NotFound": + logger.error( + "One or more instance IDs do not exist. " + "Please verify the instance IDs and try again." + ) + raise # snippet-end:[python.example_code.ec2.DescribeInstances] # snippet-start:[python.example_code.ec2.TerminateInstances] - def terminate(self): + def terminate(self) -> None: """ - Terminates an instance and waits for it to be in a terminated state. + Terminates instances and waits for them to reach the terminated state. """ - if self.instance is None: - logger.info("No instance to terminate.") + if not self.instances: + logger.info("No instances to terminate.") return - instance_id = self.instance.id + instance_ids = [instance["InstanceId"] for instance in self.instances] try: - self.instance.terminate() - self.instance.wait_until_terminated() - self.instance = None + self.ec2_client.terminate_instances(InstanceIds=instance_ids) + waiter = self.ec2_client.get_waiter("instance_terminated") + waiter.wait(InstanceIds=instance_ids) + self.instances.clear() + for instance_id in instance_ids: + print(f"• Instance ID: {instance_id}\n" f"• Action: Terminated") + except ClientError as err: - logging.error( - "Couldn't terminate instance %s. Here's why: %s: %s", - instance_id, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + logger.error( + f"Failed instance termination details:\n\t{str(self.instances)}" ) + error_code = err.response["Error"]["Code"] + if error_code == "InvalidInstanceID.NotFound": + logger.error( + "One or more instance IDs do not exist. " + "Please verify the instance IDs and try again." + ) raise # snippet-end:[python.example_code.ec2.TerminateInstances] # snippet-start:[python.example_code.ec2.StartInstances] - def start(self): + def start(self) -> Optional[Dict[str, Any]]: """ - Starts an instance and waits for it to be in a running state. + Starts instances and waits for them to be in a running state. :return: The response to the start request. """ - if self.instance is None: - logger.info("No instance to start.") - return + if not self.instances: + logger.info("No instances to start.") + return None + instance_ids = [instance["InstanceId"] for instance in self.instances] try: - response = self.instance.start() - self.instance.wait_until_running() + start_response = self.ec2_client.start_instances(InstanceIds=instance_ids) + waiter = self.ec2_client.get_waiter("instance_running") + waiter.wait(InstanceIds=instance_ids) + return start_response except ClientError as err: logger.error( - "Couldn't start instance %s. Here's why: %s: %s", - self.instance.id, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + f"Failed to start instance(s): {','.join(map(str, instance_ids))}" ) + error_code = err.response["Error"]["Code"] + if error_code == "IncorrectInstanceState": + logger.error( + "Couldn't start instance(s) because they are in an incorrect state. " + "Ensure the instances are in a stopped state before starting them." + ) raise - else: - return response # snippet-end:[python.example_code.ec2.StartInstances] # snippet-start:[python.example_code.ec2.StopInstances] - def stop(self): + def stop(self) -> Optional[Dict[str, Any]]: """ - Stops an instance and waits for it to be in a stopped state. + Stops instances and waits for them to be in a stopped state. - :return: The response to the stop request. + :return: The response to the stop request, or None if there are no instances to stop. """ - if self.instance is None: - logger.info("No instance to stop.") - return + if not self.instances: + logger.info("No instances to stop.") + return None + instance_ids = [instance["InstanceId"] for instance in self.instances] try: - response = self.instance.stop() - self.instance.wait_until_stopped() + # Attempt to stop the instances + stop_response = self.ec2_client.stop_instances(InstanceIds=instance_ids) + waiter = self.ec2_client.get_waiter("instance_stopped") + waiter.wait(InstanceIds=instance_ids) except ClientError as err: logger.error( - "Couldn't stop instance %s. Here's why: %s: %s", - self.instance.id, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + f"Failed to stop instance(s): {','.join(map(str, instance_ids))}" ) + error_code = err.response["Error"]["Code"] + if error_code == "IncorrectInstanceState": + logger.error( + "Couldn't stop instance(s) because they are in an incorrect state. " + "Ensure the instances are in a running state before stopping them." + ) raise - else: - return response + return stop_response # snippet-end:[python.example_code.ec2.StopInstances] # snippet-start:[python.example_code.ec2.DescribeImages] - def get_images(self, image_ids): + def get_images(self, image_ids: List[str]) -> List[Dict[str, Any]]: """ Gets information about Amazon Machine Images (AMIs) from a list of AMI IDs. - :param image_ids: The list of AMIs to look up. - :return: A list of Boto3 Image objects that represent the requested AMIs. + :param image_ids: The list of AMI IDs to look up. + :return: A list of dictionaries representing the requested AMIs. """ try: - images = list(self.ec2_resource.images.filter(ImageIds=image_ids)) + response = self.ec2_client.describe_images(ImageIds=image_ids) + images = response["Images"] except ClientError as err: - logger.error( - "Couldn't get images. Here's why: %s: %s", - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + logger.error(f"Failed to stop AMI(s): {','.join(map(str, image_ids))}") + error_code = err.response["Error"]["Code"] + if error_code == "InvalidAMIID.NotFound": + logger.error("One or more of the AMI IDs does not exist.") raise - else: - return images + return images # snippet-end:[python.example_code.ec2.DescribeImages] # snippet-start:[python.example_code.ec2.DescribeInstanceTypes] - def get_instance_types(self, architecture): + def get_instance_types( + self, architecture: str = "x86_64", sizes: List[str] = ["*.micro", "*.small"] + ) -> List[Dict[str, Any]]: """ - Gets instance types that support the specified architecture and are designated - as either 'micro' or 'small'. When an instance is created, the instance type - you specify must support the architecture of the AMI you use. - - :param architecture: The kind of architecture the instance types must support, - such as 'x86_64'. - :return: A list of instance types that support the specified architecture - and are either 'micro' or 'small'. + Gets instance types that support the specified architecture and size. + See https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceTypes.html + for a list of allowable parameters. + + :param architecture: The architecture supported by instance types. Default: 'x86_64'. + :param sizes: The size of instance types. Default: '*.micro', '*.small', + :return: A list of dictionaries representing instance types that support the specified architecture and size. """ try: inst_types = [] - it_paginator = self.ec2_resource.meta.client.get_paginator( - "describe_instance_types" - ) - for page in it_paginator.paginate( + paginator = self.ec2_client.get_paginator("describe_instance_types") + for page in paginator.paginate( Filters=[ { "Name": "processor-info.supported-architecture", "Values": [architecture], }, - {"Name": "instance-type", "Values": ["*.micro", "*.small"]}, + {"Name": "instance-type", "Values": sizes}, ] ): inst_types += page["InstanceTypes"] except ClientError as err: logger.error( - "Couldn't get instance types. Here's why: %s: %s", - err.response["Error"]["Code"], - err.response["Error"]["Message"], + f"Failed to get instance types: {architecture}, {','.join(map(str, sizes))}" ) + error_code = err.response["Error"]["Code"] + if error_code == "InvalidParameterValue": + logger.error( + "Parameters are invalid. " + "Ensure architecture and size strings conform to DescribeInstanceTypes API reference." + ) raise else: return inst_types diff --git a/python/example_code/ec2/key_pair.py b/python/example_code/ec2/key_pair.py index 8ae648fa382..c375033893e 100644 --- a/python/example_code/ec2/key_pair.py +++ b/python/example_code/ec2/key_pair.py @@ -1,9 +1,10 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 - import logging import os import tempfile +from typing import Optional, Union + import boto3 from botocore.exceptions import ClientError @@ -13,54 +14,72 @@ # snippet-start:[python.example_code.ec2.KeyPairWrapper.class] # snippet-start:[python.example_code.ec2.KeyPairWrapper.decl] class KeyPairWrapper: - """Encapsulates Amazon Elastic Compute Cloud (Amazon EC2) key pair actions.""" - - def __init__(self, ec2_resource, key_file_dir, key_pair=None): + """ + Encapsulates Amazon Elastic Compute Cloud (Amazon EC2) key pair actions. + This class provides methods to create, list, and delete EC2 key pairs. + """ + + def __init__( + self, + ec2_client: boto3.client, + key_file_dir: Union[tempfile.TemporaryDirectory, str], + key_pair: Optional[dict] = None, + ): """ - :param ec2_resource: A Boto3 Amazon EC2 resource. This high-level resource - is used to create additional high-level objects - that wrap low-level Amazon EC2 service actions. + Initializes the KeyPairWrapper with the specified EC2 client, key file directory, + and an optional key pair. + + :param ec2_client: A Boto3 Amazon EC2 client. This client provides low-level + access to AWS EC2 services. :param key_file_dir: The folder where the private key information is stored. This should be a secure folder. - :param key_pair: A Boto3 KeyPair object. This is a high-level object that - wraps key pair actions. + :param key_pair: A dictionary representing the Boto3 KeyPair object. + This is a high-level object that wraps key pair actions. Optional. """ - self.ec2_resource = ec2_resource + self.ec2_client = ec2_client self.key_pair = key_pair - self.key_file_path = None + self.key_file_path: Optional[str] = None self.key_file_dir = key_file_dir @classmethod - def from_resource(cls): - ec2_resource = boto3.resource("ec2") - return cls(ec2_resource, tempfile.TemporaryDirectory()) + def from_client(cls) -> "KeyPairWrapper": + """ + Class method to create an instance of KeyPairWrapper using a new EC2 client + and a temporary directory for storing key files. + + :return: An instance of KeyPairWrapper. + """ + ec2_client = boto3.client("ec2") + return cls(ec2_client, tempfile.TemporaryDirectory()) # snippet-end:[python.example_code.ec2.KeyPairWrapper.decl] # snippet-start:[python.example_code.ec2.CreateKeyPair] - def create(self, key_name): + def create(self, key_name: str) -> dict: """ Creates a key pair that can be used to securely connect to an EC2 instance. The returned key pair contains private key information that cannot be retrieved again. The private key data is stored as a .pem file. :param key_name: The name of the key pair to create. - :return: A Boto3 KeyPair object that represents the newly created key pair. + :return: A dictionary representing the Boto3 KeyPair object that represents the newly created key pair. + :raises ClientError: If there is an error in creating the key pair, for example, if a key pair with the same name already exists. """ try: - self.key_pair = self.ec2_resource.create_key_pair(KeyName=key_name) + response = self.ec2_client.create_key_pair(KeyName=key_name) + self.key_pair = response self.key_file_path = os.path.join( - self.key_file_dir.name, f"{self.key_pair.name}.pem" + self.key_file_dir.name, f"{self.key_pair['KeyName']}.pem" ) with open(self.key_file_path, "w") as key_file: - key_file.write(self.key_pair.key_material) + key_file.write(self.key_pair["KeyMaterial"]) except ClientError as err: - logger.error( - "Couldn't create key %s. Here's why: %s: %s", - key_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + if err.response["Error"]["Code"] == "InvalidKeyPair.Duplicate": + logger.error( + f"A key pair called {key_name} already exists. " + "Please choose a different name for your key pair " + "or delete the existing key pair before creating." + ) raise else: return self.key_pair @@ -68,46 +87,57 @@ def create(self, key_name): # snippet-end:[python.example_code.ec2.CreateKeyPair] # snippet-start:[python.example_code.ec2.DescribeKeyPairs] - def list(self, limit): + def list(self, limit: Optional[int] = None) -> None: """ Displays a list of key pairs for the current account. - :param limit: The maximum number of key pairs to list. + WARNING: Results are not paginated. + + :param limit: The maximum number of key pairs to list. If not specified, + all key pairs will be listed. + :raises ClientError: If there is an error in listing the key pairs. """ try: - for kp in self.ec2_resource.key_pairs.limit(limit): - print(f"Found {kp.key_type} key {kp.name} with fingerprint:") - print(f"\t{kp.key_fingerprint}") + response = self.ec2_client.describe_key_pairs() + key_pairs = response.get("KeyPairs", []) + + if limit: + key_pairs = key_pairs[:limit] + + for key_pair in key_pairs: + logger.info( + f"Found {key_pair['KeyType']} key '{key_pair['KeyName']}' with fingerprint:" + ) + logger.info(f"\t{key_pair['KeyFingerprint']}") except ClientError as err: - logger.error( - "Couldn't list key pairs. Here's why: %s: %s", - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + logger.error(f"Failed to list key pairs: {str(err)}") raise # snippet-end:[python.example_code.ec2.DescribeKeyPairs] # snippet-start:[python.example_code.ec2.DeleteKeyPair] - def delete(self): + def delete(self, key_name: str) -> bool: """ - Deletes a key pair. - """ - if self.key_pair is None: - logger.info("No key pair to delete.") - return + Deletes a key pair by its name. - key_name = self.key_pair.name + :param key_name: The name of the key pair to delete. + :return: A boolean indicating whether the deletion was successful. + :raises ClientError: If there is an error in deleting the key pair, for example, + if the key pair does not exist. + """ try: - self.key_pair.delete() + self.ec2_client.delete_key_pair(KeyName=key_name) + logger.info(f"Successfully deleted key pair: {key_name}") self.key_pair = None - except ClientError as err: - logger.error( - "Couldn't delete key %s. Here's why: %s : %s", - key_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + return True + except self.ec2_client.exceptions.ClientError as err: + logger.error(f"Deletion failed for key pair: {key_name}") + error_code = err.response["Error"]["Code"] + if error_code == "InvalidKeyPair.NotFound": + logger.error( + f"The key pair '{key_name}' does not exist and cannot be deleted. " + "Please verify the key pair name and try again." + ) raise # snippet-end:[python.example_code.ec2.DeleteKeyPair] diff --git a/python/example_code/ec2/requirements.txt b/python/example_code/ec2/requirements.txt index 621e276912d..c6e3a02042f 100644 --- a/python/example_code/ec2/requirements.txt +++ b/python/example_code/ec2/requirements.txt @@ -1,2 +1,4 @@ boto3>=1.26.79 pytest>=7.2.1 +alive-progress==2.4.1 +rich==13.5.2 \ No newline at end of file diff --git a/python/example_code/ec2/scenario_get_started_instances.py b/python/example_code/ec2/scenario_get_started_instances.py index 28fcf356b1b..5b19524954c 100644 --- a/python/example_code/ec2/scenario_get_started_instances.py +++ b/python/example_code/ec2/scenario_get_started_instances.py @@ -1,131 +1,147 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -""" -Purpose - -Shows how to use the AWS SDK for Python (Boto3) with Amazon Elastic Compute Cloud -(Amazon EC2) to do the following: - -* Create a key pair that is used to secure SSH communication between your computer and - an EC2 instance. -* Create a security group that acts as a virtual firewall for your EC2 instances to - control incoming and outgoing traffic. -* Find an Amazon Machine Image (AMI) and a compatible instance type. -* Create an instance that is created from the instance type and AMI you select, and - is configured to use the security group and key pair created in this example. -* Stop and restart the instance. -* Create an Elastic IP address and associate it as a consistent IP address for your instance. -* Connect to your instance with SSH, using both its public IP address and your Elastic IP - address. -* Clean up all of the resources created by this example. -""" - import logging +import time import urllib.request -import sys +import uuid import boto3 +from alive_progress import alive_bar +from rich.console import Console from elastic_ip import ElasticIpWrapper -from instance import InstanceWrapper +from instance import EC2InstanceWrapper from key_pair import KeyPairWrapper from security_group import SecurityGroupWrapper -# Add relative path to include demo_tools in this code example without need for setup. -sys.path.append("../..") -from demo_tools import demo_func -import demo_tools.question as q - logger = logging.getLogger(__name__) +console = Console() # snippet-start:[python.example_code.ec2.Scenario_GetStartedInstances] -class Ec2InstanceScenario: - """Runs an interactive scenario that shows how to get started using EC2 instances.""" +class EC2InstanceScenario: + """ + A scenario that demonstrates how to use Boto3 to manage Amazon EC2 resources. + Covers creating a key pair, security group, launching an instance, associating + an Elastic IP, and cleaning up resources. + """ - def __init__(self, inst_wrapper, key_wrapper, sg_wrapper, eip_wrapper, ssm_client): + def __init__( + self, + inst_wrapper: EC2InstanceWrapper, + key_wrapper: KeyPairWrapper, + sg_wrapper: SecurityGroupWrapper, + eip_wrapper: ElasticIpWrapper, + ssm_client: boto3.client, + remote_exec: bool = False, + ): """ - :param inst_wrapper: An object that wraps instance actions. - :param key_wrapper: An object that wraps key pair actions. - :param sg_wrapper: An object that wraps security group actions. - :param eip_wrapper: An object that wraps Elastic IP actions. - :param ssm_client: A Boto3 AWS Systems Manager client. + Initializes the EC2InstanceScenario with the necessary AWS service wrappers. + + :param inst_wrapper: Wrapper for EC2 instance operations. + :param key_wrapper: Wrapper for key pair operations. + :param sg_wrapper: Wrapper for security group operations. + :param eip_wrapper: Wrapper for Elastic IP operations. + :param ssm_client: Boto3 client for accessing SSM to retrieve AMIs. + :param remote_exec: Flag to indicate if the scenario is running in a remote execution + environment. Defaults to False. If True, the script won't prompt + for user interaction. """ self.inst_wrapper = inst_wrapper self.key_wrapper = key_wrapper self.sg_wrapper = sg_wrapper self.eip_wrapper = eip_wrapper self.ssm_client = ssm_client + self.remote_exec = remote_exec - @demo_func - def create_and_list_key_pairs(self): + def create_and_list_key_pairs(self) -> None: """ - 1. Creates an RSA key pair and saves its private key data as a .pem file in secure - temporary storage. The private key data is deleted after the example completes. - 2. Lists the first five key pairs for the current account. + Creates an RSA key pair for SSH access to the EC2 instance and lists available key pairs. """ - print( - "Let's create an RSA key pair that you can be use to securely connect to " - "your EC2 instance." - ) - key_name = q.ask("Enter a unique name for your key: ", q.non_empty) - self.key_wrapper.create(key_name) - print( - f"Created a key pair {self.key_wrapper.key_pair.key_name} and saved the " - f"private key to {self.key_wrapper.key_file_path}.\n" + console.print("**Step 1: Create a Secure Key Pair**", style="bold cyan") + console.print( + "Let's create a secure RSA key pair for connecting to your EC2 instance." ) - if q.ask("Do you want to list some of your key pairs? (y/n) ", q.is_yesno): - self.key_wrapper.list(5) + key_name = f"MyUniqueKeyPair-{uuid.uuid4().hex[:8]}" + console.print(f"- **Key Pair Name**: {key_name}") - @demo_func - def create_security_group(self): + # Create the key pair and simulate the process with a progress bar. + with alive_bar(1, title="Creating Key Pair") as bar: + self.key_wrapper.create(key_name) + time.sleep(0.4) # Simulate the delay in key creation + bar() + + console.print(f"- **Private Key Saved to**: {self.key_wrapper.key_file_path}\n") + + # List key pairs (simulated) and show a progress bar. + list_keys = True + if list_keys: + console.print("- Listing your key pairs...") + start_time = time.time() + with alive_bar(100, title="Listing Key Pairs") as bar: + while time.time() - start_time < 2: + time.sleep(0.2) + bar(10) + self.key_wrapper.list(5) + if time.time() - start_time > 2: + console.print( + "Taking longer than expected! Please wait...", + style="bold yellow", + ) + + def create_security_group(self) -> None: """ - 1. Creates a security group for the default VPC. - 2. Adds an inbound rule to allow SSH. The SSH rule allows only - inbound traffic from the current computer’s public IPv4 address. - 3. Displays information about the security group. - - This function uses 'http://checkip.amazonaws.com' to get the current public IP - address of the computer that is running the example. This method works in most - cases. However, depending on how your computer connects to the internet, you - might have to manually add your public IP address to the security group by using - the AWS Management Console. + Creates a security group that controls access to the EC2 instance and adds a rule + to allow SSH access from the user's current public IP address. """ - print("Let's create a security group to manage access to your instance.") - sg_name = q.ask("Enter a unique name for your security group: ", q.non_empty) - security_group = self.sg_wrapper.create( - sg_name, "Security group for example: get started with instances." - ) - print( - f"Created security group {security_group.group_name} in your default " - f"VPC {security_group.vpc_id}.\n" + console.print("**Step 2: Create a Security Group**", style="bold cyan") + console.print( + "Security groups manage access to your instance. Let's create one." ) + sg_name = f"MySecurityGroup-{uuid.uuid4().hex[:8]}" + console.print(f"- **Security Group Name**: {sg_name}") + # Create the security group and simulate the process with a progress bar. + with alive_bar(1, title="Creating Security Group") as bar: + self.sg_wrapper.create( + sg_name, "Security group for example: get started with instances." + ) + time.sleep(0.5) + bar() + + console.print(f"- **Security Group ID**: {self.sg_wrapper.security_group}\n") + + # Get the current public IP to set up SSH access. ip_response = urllib.request.urlopen("http://checkip.amazonaws.com") current_ip_address = ip_response.read().decode("utf-8").strip() - print("Let's add a rule to allow SSH only from your current IP address.") - print(f"Your public IP address is {current_ip_address}.") - q.ask("Press Enter to add this rule to your security group.") - response = self.sg_wrapper.authorize_ingress(current_ip_address) - if response["Return"]: - print("Security group rules updated.") - else: - print("Couldn't update security group rules.") - self.sg_wrapper.describe() + console.print( + "Let's add a rule to allow SSH only from your current IP address." + ) + console.print(f"- **Your Public IP Address**: {current_ip_address}") + console.print("- Automatically adding SSH rule...") + + # Update security group rules to allow SSH and simulate with a progress bar. + with alive_bar(1, title="Updating Security Group Rules") as bar: + response = self.sg_wrapper.authorize_ingress(current_ip_address) + time.sleep(0.4) + if response and response.get("Return"): + console.print("- **Security Group Rules Updated**.") + else: + console.print( + "- **Error**: Couldn't update security group rules.", + style="bold red", + ) + bar() + + self.sg_wrapper.describe(self.sg_wrapper.security_group) - @demo_func - def create_instance(self): + def create_instance(self) -> None: """ - 1. Gets a list of Amazon Linux 2 AMIs from AWS Systems Manager. Specifying the - '/aws/service/ami-amazon-linux-latest' path returns only the latest AMIs. - 2. Gets and displays information about the available AMIs and lets you select one. - 3. Gets a list of instance types that are compatible with the selected AMI and - lets you select one. - 4. Creates an instance with the previously created key pair and security group, - and the selected AMI and instance type. - 5. Waits for the instance to be running and then displays its information. + Launches an EC2 instance using an Amazon Linux 2 AMI and the created key pair + and security group. Displays instance details and SSH connection information. """ + # Retrieve Amazon Linux 2 AMIs from SSM. ami_paginator = self.ssm_client.get_paginator("get_parameters_by_path") ami_options = [] for page in ami_paginator.paginate(Path="/aws/service/ami-amazon-linux-latest"): @@ -133,142 +149,241 @@ def create_instance(self): amzn2_images = self.inst_wrapper.get_images( [opt["Value"] for opt in ami_options if "amzn2" in opt["Name"]] ) - print( + console.print("\n**Step 3: Launch Your Instance**", style="bold cyan") + console.print( "Let's create an instance from an Amazon Linux 2 AMI. Here are some options:" ) - image_choice = q.choose( - "Which one do you want to use? ", [opt.description for opt in amzn2_images] - ) - print("Great choice!\n") + image_choice = 0 + console.print(f"- Selected AMI: {amzn2_images[image_choice]['ImageId']}\n") - print( - f"Here are some instance types that support the " - f"{amzn2_images[image_choice].architecture} architecture of the image:" - ) + # Display instance types compatible with the selected AMI inst_types = self.inst_wrapper.get_instance_types( - amzn2_images[image_choice].architecture + amzn2_images[image_choice]["Architecture"] ) - inst_type_choice = q.choose( - "Which one do you want to use? ", [it["InstanceType"] for it in inst_types] + inst_type_choice = 0 + console.print( + f"- Selected instance type: {inst_types[inst_type_choice]['InstanceType']}\n" ) - print("Another great choice.\n") - - print("Creating your instance and waiting for it to start...") - self.inst_wrapper.create( - amzn2_images[image_choice], - inst_types[inst_type_choice]["InstanceType"], - self.key_wrapper.key_pair, - [self.sg_wrapper.security_group], - ) - print(f"Your instance is ready:\n") + + console.print("Creating your instance and waiting for it to start...") + with alive_bar(1, title="Creating Instance") as bar: + self.inst_wrapper.create( + amzn2_images[image_choice]["ImageId"], + inst_types[inst_type_choice]["InstanceType"], + self.key_wrapper.key_pair["KeyName"], + [self.sg_wrapper.security_group], + ) + time.sleep(21) + bar() + + console.print(f"**Success! Your instance is ready:**\n", style="bold green") self.inst_wrapper.display() - print("You can use SSH to connect to your instance.") - print( + console.print( + "You can use SSH to connect to your instance. " "If the connection attempt times out, you might have to manually update " "the SSH ingress rule for your IP address in the AWS Management Console." ) self._display_ssh_info() - def _display_ssh_info(self): + def _display_ssh_info(self) -> None: """ - Displays an SSH connection string that can be used to connect to a running - instance. + Displays SSH connection information for the user to connect to the EC2 instance. + Handles the case where the instance does or does not have an associated public IP address. """ - print("To connect, open another command prompt and run the following command:") - if self.eip_wrapper.elastic_ip is None: - print( - f"\tssh -i {self.key_wrapper.key_file_path} " - f"ec2-user@{self.inst_wrapper.instance.public_ip_address}" - ) + if ( + not self.eip_wrapper.elastic_ips + or not self.eip_wrapper.elastic_ips[0].allocation_id + ): + if self.inst_wrapper.instances: + instance = self.inst_wrapper.instances[0] + instance_id = instance["InstanceId"] + + waiter = self.inst_wrapper.ec2_client.get_waiter("instance_running") + console.print( + "Waiting for the instance to be in a running state with a public IP...", + style="bold cyan", + ) + + with alive_bar(1, title="Waiting for Instance to Start") as bar: + waiter.wait(InstanceIds=[instance_id]) + time.sleep(20) + bar() + + instance = self.inst_wrapper.ec2_client.describe_instances( + InstanceIds=[instance_id] + )["Reservations"][0]["Instances"][0] + + public_ip = instance.get("PublicIpAddress") + if public_ip: + console.print( + "\nTo connect via SSH, open another command prompt and run the following command:", + style="bold cyan", + ) + console.print( + f"\tssh -i {self.key_wrapper.key_file_path} ec2-user@{public_ip}" + ) + else: + console.print( + "Instance does not have a public IP address assigned.", + style="bold red", + ) + else: + console.print( + "No instance available to retrieve public IP address.", + style="bold red", + ) else: - print( - f"\tssh -i {self.key_wrapper.key_file_path} " - f"ec2-user@{self.eip_wrapper.elastic_ip.public_ip}" + elastic_ip = self.eip_wrapper.elastic_ips[0] + elastic_ip_address = elastic_ip.public_ip + console.print( + f"\tssh -i {self.key_wrapper.key_file_path} ec2-user@{elastic_ip_address}" ) - q.ask("Press Enter when you're ready to continue the demo.") - @demo_func - def associate_elastic_ip(self): + if not self.remote_exec: + console.print("\nOpen a new terminal tab to try the above SSH command.") + input("Press Enter to continue...") + + def associate_elastic_ip(self) -> None: """ - 1. Allocates an Elastic IP address and associates it with the instance. - 2. Displays an SSH connection string that uses the Elastic IP address. + Allocates an Elastic IP address and associates it with the EC2 instance. + Displays the Elastic IP address and SSH connection information. """ - print( + console.print("\n**Step 4: Allocate an Elastic IP Address**", style="bold cyan") + console.print( "You can allocate an Elastic IP address and associate it with your instance\n" "to keep a consistent IP address even when your instance restarts." ) - elastic_ip = self.eip_wrapper.allocate() - print(f"Allocated static Elastic IP address: {elastic_ip.public_ip}.") - self.eip_wrapper.associate(self.inst_wrapper.instance) - print(f"Associated your Elastic IP with your instance.") - print( + + with alive_bar(1, title="Allocating Elastic IP") as bar: + elastic_ip = self.eip_wrapper.allocate() + time.sleep(0.5) + bar() + + console.print( + f"- **Allocated Static Elastic IP Address**: {elastic_ip.public_ip}." + ) + + with alive_bar(1, title="Associating Elastic IP") as bar: + self.eip_wrapper.associate( + elastic_ip.allocation_id, self.inst_wrapper.instances[0]["InstanceId"] + ) + time.sleep(2) + bar() + + console.print(f"- **Associated Elastic IP with Your Instance**.") + console.print( "You can now use SSH to connect to your instance by using the Elastic IP." ) self._display_ssh_info() - @demo_func - def stop_and_start_instance(self): + def stop_and_start_instance(self) -> None: """ - 1. Stops the instance and waits for it to stop. - 2. Starts the instance and waits for it to start. - 3. Displays information about the instance. - 4. Displays an SSH connection string. When an Elastic IP address is associated - with the instance, the IP address stays consistent when the instance stops - and starts. + Stops and restarts the EC2 instance. Displays instance state and explains + changes that occur when the instance is restarted, such as the potential change + in the public IP address unless an Elastic IP is associated. """ - print("Let's stop and start your instance to see what changes.") - print("Stopping your instance and waiting until it's stopped...") - self.inst_wrapper.stop() - print("Your instance is stopped. Restarting...") - self.inst_wrapper.start() - print("Your instance is running.") + console.print("\n**Step 5: Stop and Start Your Instance**", style="bold cyan") + console.print("Let's stop and start your instance to see what changes.") + console.print("- **Stopping your instance and waiting until it's stopped...**") + + with alive_bar(1, title="Stopping Instance") as bar: + self.inst_wrapper.stop() + time.sleep(360) + bar() + + console.print("- **Your instance is stopped. Restarting...**") + + with alive_bar(1, title="Starting Instance") as bar: + self.inst_wrapper.start() + time.sleep(20) + bar() + + console.print("**Your instance is running.**", style="bold green") self.inst_wrapper.display() - if self.eip_wrapper.elastic_ip is None: - print( - "Every time your instance is restarted, its public IP address changes." + + elastic_ip = ( + self.eip_wrapper.elastic_ips[0] if self.eip_wrapper.elastic_ips else None + ) + + if elastic_ip is None or elastic_ip.allocation_id is None: + console.print( + "- **Note**: Every time your instance is restarted, its public IP address changes." ) else: - print( - "Because you have associated an Elastic IP with your instance, you can \n" - "connect by using a consistent IP address after the instance restarts." + console.print( + f"Because you have associated an Elastic IP with your instance, you can \n" + f"connect by using a consistent IP address after the instance restarts: {elastic_ip.public_ip}" ) + self._display_ssh_info() - @demo_func - def cleanup(self): + def cleanup(self) -> None: """ - 1. Disassociate and delete the previously created Elastic IP. - 2. Terminate the previously created instance. - 3. Delete the previously created security group. - 4. Delete the previously created key pair. + Cleans up all the resources created during the scenario, including disassociating + and releasing the Elastic IP, terminating the instance, deleting the security + group, and deleting the key pair. """ - print("Let's clean everything up. This example created these resources:") - print(f"\tElastic IP: {self.eip_wrapper.elastic_ip.allocation_id}") - print(f"\tInstance: {self.inst_wrapper.instance.id}") - print(f"\tSecurity group: {self.sg_wrapper.security_group.id}") - print(f"\tKey pair: {self.key_wrapper.key_pair.name}") - if q.ask("Ready to delete these resources? (y/n) ", q.is_yesno): - self.eip_wrapper.disassociate() - print("Disassociated the Elastic IP from the instance.") - self.eip_wrapper.release() - print("Released the Elastic IP.") - print("Terminating the instance and waiting for it to terminate...") + console.print("\n**Step 6: Clean Up Resources**", style="bold cyan") + console.print("Cleaning up resources:") + + for elastic_ip in self.eip_wrapper.elastic_ips: + console.print(f"- **Elastic IP**: {elastic_ip.public_ip}") + + with alive_bar(1, title="Disassociating Elastic IP") as bar: + self.eip_wrapper.disassociate(elastic_ip.allocation_id) + time.sleep(2) + bar() + + console.print("\t- **Disassociated Elastic IP from the Instance**") + + with alive_bar(1, title="Releasing Elastic IP") as bar: + self.eip_wrapper.release(elastic_ip.allocation_id) + time.sleep(1) + bar() + + console.print("\t- **Released Elastic IP**") + + console.print(f"- **Instance**: {self.inst_wrapper.instances[0]['InstanceId']}") + + with alive_bar(1, title="Terminating Instance") as bar: self.inst_wrapper.terminate() - print("Instance terminated.") - self.sg_wrapper.delete() - print("Deleted security group.") - self.key_wrapper.delete() - print("Deleted key pair.") + time.sleep(380) + bar() + + console.print("\t- **Terminated Instance**") + + console.print(f"- **Security Group**: {self.sg_wrapper.security_group}") - def run_scenario(self): + with alive_bar(1, title="Deleting Security Group") as bar: + self.sg_wrapper.delete(self.sg_wrapper.security_group) + time.sleep(1) + bar() + + console.print("\t- **Deleted Security Group**") + + console.print(f"- **Key Pair**: {self.key_wrapper.key_pair['KeyName']}") + + with alive_bar(1, title="Deleting Key Pair") as bar: + self.key_wrapper.delete(self.key_wrapper.key_pair["KeyName"]) + time.sleep(0.4) + bar() + + console.print("\t- **Deleted Key Pair**") + + def run_scenario(self) -> None: + """ + Executes the entire EC2 instance scenario: creates key pairs, security groups, + launches an instance, associates an Elastic IP, and cleans up all resources. + """ logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") - print("-" * 88) - print( - "Welcome to the Amazon Elastic Compute Cloud (Amazon EC2) get started with instances demo." + console.print("-" * 88) + console.print( + "Welcome to the Amazon Elastic Compute Cloud (Amazon EC2) get started with instances demo.", + style="bold magenta", ) - print("-" * 88) + console.print("-" * 88) self.create_and_list_key_pairs() self.create_security_group() @@ -278,17 +393,17 @@ def run_scenario(self): self.stop_and_start_instance() self.cleanup() - print("\nThanks for watching!") - print("-" * 88) + console.print("\nThanks for watching!", style="bold green") + console.print("-" * 88) if __name__ == "__main__": try: - scenario = Ec2InstanceScenario( - InstanceWrapper.from_resource(), - KeyPairWrapper.from_resource(), - SecurityGroupWrapper.from_resource(), - ElasticIpWrapper.from_resource(), + scenario = EC2InstanceScenario( + EC2InstanceWrapper.from_client(), + KeyPairWrapper.from_client(), + SecurityGroupWrapper.from_client(), + ElasticIpWrapper.from_client(), boto3.client("ssm"), ) scenario.run_scenario() diff --git a/python/example_code/ec2/security_group.py b/python/example_code/ec2/security_group.py index 1ddca3438f7..67f422f61b8 100644 --- a/python/example_code/ec2/security_group.py +++ b/python/example_code/ec2/security_group.py @@ -1,10 +1,11 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 - import logging from pprint import pp +from typing import Any, Dict, Optional + import boto3 -from botocore.exceptions import ClientError +from botocore.exceptions import ClientError, WaiterError logger = logging.getLogger(__name__) @@ -14,45 +15,50 @@ class SecurityGroupWrapper: """Encapsulates Amazon Elastic Compute Cloud (Amazon EC2) security group actions.""" - def __init__(self, ec2_resource, security_group=None): + def __init__(self, ec2_client: boto3.client, security_group: Optional[str] = None): """ - :param ec2_resource: A Boto3 Amazon EC2 resource. This high-level resource - is used to create additional high-level objects - that wrap low-level Amazon EC2 service actions. - :param security_group: A Boto3 SecurityGroup object. This is a high-level object - that wraps security group actions. + Initializes the SecurityGroupWrapper with an EC2 client and an optional security group ID. + + :param ec2_client: A Boto3 Amazon EC2 client. This client provides low-level + access to AWS EC2 services. + :param security_group: The ID of a security group to manage. This is a high-level identifier + that represents the security group. """ - self.ec2_resource = ec2_resource + self.ec2_client = ec2_client self.security_group = security_group @classmethod - def from_resource(cls): - ec2_resource = boto3.resource("ec2") - return cls(ec2_resource) + def from_client(cls) -> "SecurityGroupWrapper": + """ + Creates a SecurityGroupWrapper instance with a default EC2 client. + + :return: An instance of SecurityGroupWrapper initialized with the default EC2 client. + """ + ec2_client = boto3.client("ec2") + return cls(ec2_client) # snippet-end:[python.example_code.ec2.SecurityGroupWrapper.decl] # snippet-start:[python.example_code.ec2.CreateSecurityGroup] - def create(self, group_name, group_description): + def create(self, group_name: str, group_description: str) -> str: """ - Creates a security group in the default virtual private cloud (VPC) of the - current account. + Creates a security group in the default virtual private cloud (VPC) of the current account. :param group_name: The name of the security group to create. :param group_description: The description of the security group to create. - :return: A Boto3 SecurityGroup object that represents the newly created security group. + :return: The ID of the newly created security group. + :raise Handles AWS SDK service-level ClientError, with special handling for ResourceAlreadyExists """ try: - self.security_group = self.ec2_resource.create_security_group( + response = self.ec2_client.create_security_group( GroupName=group_name, Description=group_description ) + self.security_group = response["GroupId"] except ClientError as err: - logger.error( - "Couldn't create security group %s. Here's why: %s: %s", - group_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + if err.response["Error"]["Code"] == "ResourceAlreadyExists": + logger.error( + f"Security group '{group_name}' already exists. Please choose a different name." + ) raise else: return self.security_group @@ -60,18 +66,19 @@ def create(self, group_name, group_description): # snippet-end:[python.example_code.ec2.CreateSecurityGroup] # snippet-start:[python.example_code.ec2.AuthorizeSecurityGroupIngress] - def authorize_ingress(self, ssh_ingress_ip): + def authorize_ingress(self, ssh_ingress_ip: str) -> Optional[Dict[str, Any]]: """ Adds a rule to the security group to allow access to SSH. :param ssh_ingress_ip: The IP address that is granted inbound access to connect to port 22 over TCP, used for SSH. :return: The response to the authorization request. The 'Return' field of the - response indicates whether the request succeeded or failed. + response indicates whether the request succeeded or failed, or None if no security group is set. + :raise Handles AWS SDK service-level ClientError, with special handling for ResourceAlreadyExists """ if self.security_group is None: logger.info("No security group to update.") - return + return None try: ip_permissions = [ @@ -83,16 +90,15 @@ def authorize_ingress(self, ssh_ingress_ip): "IpRanges": [{"CidrIp": f"{ssh_ingress_ip}/32"}], } ] - response = self.security_group.authorize_ingress( - IpPermissions=ip_permissions + response = self.ec2_client.authorize_security_group_ingress( + GroupId=self.security_group, IpPermissions=ip_permissions ) except ClientError as err: - logger.error( - "Couldn't authorize inbound rules for %s. Here's why: %s: %s", - self.security_group.id, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + if err.response["Error"]["Code"] == "InvalidPermission.Duplicate": + logger.error( + f"The SSH ingress rule for IP {ssh_ingress_ip} already exists" + f"in security group '{self.security_group}'." + ) raise else: return response @@ -100,51 +106,75 @@ def authorize_ingress(self, ssh_ingress_ip): # snippet-end:[python.example_code.ec2.AuthorizeSecurityGroupIngress] # snippet-start:[python.example_code.ec2.DescribeSecurityGroups] - def describe(self): - """ - Displays information about the security group. + def describe(self, security_group_id: Optional[str] = None) -> bool: """ - if self.security_group is None: - logger.info("No security group to describe.") - return + Displays information about the specified security group or all security groups if no ID is provided. + :param security_group_id: The ID of the security group to describe. + If None, an open search is performed to describe all security groups. + :returns: True if the description is successful. + :raises ClientError: If there is an error describing the security group(s), such as an invalid security group ID. + """ try: - print(f"Security group: {self.security_group.group_name}") - print(f"\tID: {self.security_group.id}") - print(f"\tVPC: {self.security_group.vpc_id}") - if self.security_group.ip_permissions: - print(f"Inbound permissions:") - pp(self.security_group.ip_permissions) + paginator = self.ec2_client.get_paginator("describe_security_groups") + + if security_group_id is None: + # If no ID is provided, return all security groups. + page_iterator = paginator.paginate() + else: + page_iterator = paginator.paginate(GroupIds=[security_group_id]) + + for page in page_iterator: + for security_group in page["SecurityGroups"]: + print(f"Security group: {security_group['GroupName']}") + print(f"\tID: {security_group['GroupId']}") + print(f"\tVPC: {security_group['VpcId']}") + if security_group["IpPermissions"]: + print("Inbound permissions:") + pp(security_group["IpPermissions"]) + + return True except ClientError as err: - logger.error( - "Couldn't get data for security group %s. Here's why: %s: %s", - self.security_group.id, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + logger.error("Failed to describe security group(s).") + if err.response["Error"]["Code"] == "InvalidGroup.NotFound": + logger.error( + f"Security group {security_group_id} does not exist " + f"because the specified security group ID was not found." + ) raise # snippet-end:[python.example_code.ec2.DescribeSecurityGroups] # snippet-start:[python.example_code.ec2.DeleteSecurityGroup] - def delete(self): - """ - Deletes the security group. + def delete(self, security_group_id: str) -> bool: """ - if self.security_group is None: - logger.info("No security group to delete.") - return + Deletes the specified security group. + + :param security_group_id: The ID of the security group to delete. Required. - group_id = self.security_group.id + :returns: True if the deletion is successful. + :raises ClientError: If the security group cannot be deleted due to an AWS service error. + """ try: - self.security_group.delete() + self.ec2_client.delete_security_group(GroupId=security_group_id) + logger.info(f"Successfully deleted security group '{security_group_id}'") + return True except ClientError as err: - logger.error( - "Couldn't delete security group %s. Here's why: %s: %s", - group_id, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + logger.error(f"Deletion failed for security group '{security_group_id}'") + error_code = err.response["Error"]["Code"] + + if error_code == "InvalidGroup.NotFound": + logger.error( + f"Security group '{security_group_id}' cannot be deleted because it does not exist." + ) + elif error_code == "DependencyViolation": + logger.error( + f"Security group '{security_group_id}' cannot be deleted because it is still in use." + " Verify that it is:" + "\n\t- Detached from resources" + "\n\t- Removed from references in other groups" + "\n\t- Removed from VPC's as a default group" + ) raise # snippet-end:[python.example_code.ec2.DeleteSecurityGroup] diff --git a/python/example_code/ec2/test/conftest.py b/python/example_code/ec2/test/conftest.py deleted file mode 100644 index f5b6a4b2eca..00000000000 --- a/python/example_code/ec2/test/conftest.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -""" -Contains common test fixtures used to run unit tests. -""" - -import sys -from unittest.mock import MagicMock -import boto3 -import pytest - -from elastic_ip import ElasticIpWrapper -from instance import InstanceWrapper -from key_pair import KeyPairWrapper -from security_group import SecurityGroupWrapper -import scenario_get_started_instances - -# This is needed so Python can find test_tools on the path. -sys.path.append("../..") -from test_tools.fixtures.common import * - - -class ScenarioData: - def __init__(self, resource, stubber, ssm_client, ssm_stubber): - self.resource = resource - self.stubber = stubber - self.ssm_client = ssm_client - self.ssm_stubber = ssm_stubber - self.scenario = scenario_get_started_instances.Ec2InstanceScenario( - InstanceWrapper(self.resource), - KeyPairWrapper(self.resource, MockDir()), - SecurityGroupWrapper(self.resource), - ElasticIpWrapper(self.resource), - ssm_client, - ) - - -class MockDir: - def __init__(self): - self.name = "" - - -@pytest.fixture -def mock_address(): - return MagicMock( - allocation_id="mock-allocation-id", - public_ip="1.2.3.4", - domain="vpc", - association_id="mock-association-id", - instance_id="mock-instance-id", - network_interface_id="mock-network-interface-id", - ) - - -@pytest.fixture -def scenario_data(make_stubber): - resource = boto3.resource("ec2") - stubber = make_stubber(resource.meta.client) - ssm_client = boto3.client("ssm") - ssm_stubber = make_stubber(ssm_client) - return ScenarioData(resource, stubber, ssm_client, ssm_stubber) diff --git a/python/example_code/ec2/test/test_associate_elastic_ip.py b/python/example_code/ec2/test/test_associate_elastic_ip.py deleted file mode 100644 index e8dc9b197d0..00000000000 --- a/python/example_code/ec2/test/test_associate_elastic_ip.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -from unittest.mock import MagicMock -from botocore.exceptions import ClientError -import pytest - - -class MockManager: - def __init__(self, stub_runner, scenario_data, input_mocker, mock_address): - self.scenario_data = scenario_data - self.mock_address = mock_address - self.scenario_data.scenario.inst_wrapper.instance = MagicMock(id="test-inst") - self.scenario_data.scenario.key_wrapper.key_file_path = "test-key-file" - answers = [""] - input_mocker.mock_answers(answers) - self.stub_runner = stub_runner - - def setup_stubs(self, error, stop_on, stubber): - with self.stub_runner(error, stop_on) as runner: - runner.add(stubber.stub_allocate_elastic_ip, self.mock_address) - runner.add(stubber.stub_describe_addresses, [self.mock_address]) - runner.add( - stubber.stub_associate_elastic_ip, - self.mock_address, - self.scenario_data.scenario.inst_wrapper.instance.id, - ) - runner.add(stubber.stub_describe_addresses, [self.mock_address]) - - -@pytest.fixture -def mock_mgr(stub_runner, scenario_data, input_mocker, mock_address): - return MockManager(stub_runner, scenario_data, input_mocker, mock_address) - - -def test_associate_elastic_ip(mock_mgr, capsys): - mock_mgr.setup_stubs(None, None, mock_mgr.scenario_data.stubber) - - mock_mgr.scenario_data.scenario.associate_elastic_ip() - - capt = capsys.readouterr() - assert f"ec2-user@{mock_mgr.mock_address.public_ip}" in capt.out - assert mock_mgr.scenario_data.scenario.key_wrapper.key_file_path in capt.out - - -@pytest.mark.parametrize( - "error, stop_on_index", - [ - ("TESTERROR-stub_allocate_elastic_ip", 0), - ("TESTERROR-stub_associate_elastic_ip", 2), - ], -) -def test_associate_elastic_ip_error(mock_mgr, caplog, error, stop_on_index): - mock_mgr.setup_stubs(error, stop_on_index, mock_mgr.scenario_data.stubber) - - with pytest.raises(ClientError) as exc_info: - mock_mgr.scenario_data.scenario.associate_elastic_ip() - assert exc_info.value.response["Error"]["Code"] == error - - assert error in caplog.text diff --git a/python/example_code/ec2/test/test_cleanup.py b/python/example_code/ec2/test/test_cleanup.py deleted file mode 100644 index 98fc44645b1..00000000000 --- a/python/example_code/ec2/test/test_cleanup.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -from unittest.mock import MagicMock -from botocore.exceptions import ClientError -import pytest - - -class MockManager: - def __init__(self, stub_runner, scenario_data, input_mocker, mock_address): - self.mock_address = mock_address - self.instance_id = "test-instance" - self.sg_id = "test-group" - self.key_name = "test-key" - scenario_data.scenario.eip_wrapper.elastic_ip = ( - scenario_data.resource.VpcAddress(self.mock_address.allocation_id) - ) - scenario_data.scenario.inst_wrapper.instance = scenario_data.resource.Instance( - self.instance_id - ) - scenario_data.scenario.sg_wrapper.security_group = ( - scenario_data.resource.SecurityGroup(self.sg_id) - ) - scenario_data.scenario.key_wrapper.key_pair = scenario_data.resource.KeyPair( - self.key_name - ) - self.scenario_data = scenario_data - answers = ["y"] - input_mocker.mock_answers(answers) - self.stub_runner = stub_runner - - def setup_stubs(self, error, stop_on, stubber): - with self.stub_runner(error, stop_on) as runner: - runner.add(stubber.stub_describe_addresses, [self.mock_address]) - runner.add( - stubber.stub_disassociate_elastic_ip, self.mock_address.association_id - ) - runner.add(stubber.stub_release_elastic_ip, self.mock_address.allocation_id) - runner.add(stubber.stub_terminate_instances, [self.instance_id]) - runner.add( - stubber.stub_describe_instances, - [MagicMock(id=self.instance_id, state={"Name": "terminated"})], - ) - runner.add(stubber.stub_delete_security_group, self.sg_id) - runner.add(stubber.stub_delete_key_pair, self.key_name) - - -@pytest.fixture -def mock_mgr(stub_runner, scenario_data, input_mocker, mock_address): - return MockManager(stub_runner, scenario_data, input_mocker, mock_address) - - -def test_cleanup(mock_mgr, capsys): - mock_mgr.setup_stubs(None, None, mock_mgr.scenario_data.stubber) - - mock_mgr.scenario_data.scenario.cleanup() - - capt = capsys.readouterr() - assert mock_mgr.mock_address.allocation_id in capt.out - assert mock_mgr.instance_id in capt.out - assert mock_mgr.sg_id in capt.out - assert mock_mgr.key_name in capt.out - - -@pytest.mark.parametrize( - "error, stop_on_index", - [ - ("TESTERROR-stub_YOUR_STUB", 0), - ("TESTERROR-stub_describe_addresses", 0), - ("TESTERROR-stub_disassociate_elastic_ip", 1), - ("TESTERROR-stub_release_elastic_ip", 2), - ("TESTERROR-stub_terminate_instances", 3), - ("TESTERROR-stub_delete_security_group", 5), - ("TESTERROR-stub_delete_key_pair", 6), - ], -) -def test_cleanup_error(mock_mgr, caplog, error, stop_on_index): - mock_mgr.setup_stubs(error, stop_on_index, mock_mgr.scenario_data.stubber) - - with pytest.raises(ClientError) as exc_info: - mock_mgr.scenario_data.scenario.cleanup() - assert exc_info.value.response["Error"]["Code"] == error - - assert error in caplog.text diff --git a/python/example_code/ec2/test/test_create_and_list_key_pairs.py b/python/example_code/ec2/test/test_create_and_list_key_pairs.py deleted file mode 100644 index bc9c4d1b30d..00000000000 --- a/python/example_code/ec2/test/test_create_and_list_key_pairs.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -from unittest.mock import patch, mock_open -from botocore.exceptions import ClientError -import pytest - - -class MockManager: - def __init__(self, stub_runner, scenario_data, input_mocker): - self.scenario_data = scenario_data - self.key_name = "test-key-name" - self.keys = [ - { - "KeyName": f"key-{ind}", - "KeyType": f"type-{ind}", - "KeyFingerprint": f"fingerprint-{ind}", - } - for ind in range(1, 4) - ] - answers = [self.key_name, "y"] - input_mocker.mock_answers(answers) - self.stub_runner = stub_runner - - def setup_stubs(self, error, stop_on, stubber): - with self.stub_runner(error, stop_on) as runner: - runner.add(stubber.stub_create_key_pair, self.key_name, None) - runner.add(stubber.stub_describe_key_pairs, self.keys) - - -@pytest.fixture -def mock_mgr(stub_runner, scenario_data, input_mocker): - return MockManager(stub_runner, scenario_data, input_mocker) - - -def test_create_and_list_key_pairs(mock_mgr, capsys): - mock_mgr.setup_stubs(None, None, mock_mgr.scenario_data.stubber) - - with patch("builtins.open", mock_open()) as mock_file: - mock_mgr.scenario_data.scenario.create_and_list_key_pairs() - mock_file.assert_called_with(f"{mock_mgr.key_name}.pem", "w") - - capt = capsys.readouterr() - assert mock_mgr.key_name in capt.out - for key in mock_mgr.keys: - assert key["KeyName"] in capt.out - assert key["KeyFingerprint"] in capt.out - - -@pytest.mark.parametrize( - "error, stop_on_index", - [ - ("TESTERROR-stub_create_key_pair", 0), - ("TESTERROR-stub_describe_key_pairs", 1), - ], -) -def test_create_and_list_key_pairs_error(mock_mgr, caplog, error, stop_on_index): - mock_mgr.setup_stubs(error, stop_on_index, mock_mgr.scenario_data.stubber) - - with patch("builtins.open", mock_open()) as mock_file: - with pytest.raises(ClientError) as exc_info: - mock_mgr.scenario_data.scenario.create_and_list_key_pairs() - assert exc_info.value.response["Error"]["Code"] == error - - assert error in caplog.text diff --git a/python/example_code/ec2/test/test_create_instance.py b/python/example_code/ec2/test/test_create_instance.py deleted file mode 100644 index 901e5ca46ef..00000000000 --- a/python/example_code/ec2/test/test_create_instance.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -from unittest.mock import MagicMock -from botocore.exceptions import ClientError -import pytest - - -class MockManager: - def __init__(self, stub_runner, scenario_data, input_mocker): - self.scenario_data = scenario_data - self.image_names = ["amzn2-image-1", "amzn2-image-2"] - self.images = [ - MagicMock( - id=f"test-id-{ind}", description=f"desc-{ind}", architecture="test-arch" - ) - for ind in range(1, 3) - ] - self.inst_types = [f"test-type-{ind}" for ind in range(1, 3)] - self.scenario_data.scenario.key_wrapper.key_pair = MagicMock() - self.scenario_data.scenario.key_wrapper.key_pair.name = "test-key" - self.scenario_data.scenario.sg_wrapper.security_group = MagicMock(id="test-sg") - self.instance = MagicMock( - id="test-instance", - image_id=self.images[0].id, - instance_type=self.inst_types[0], - key_name=self.scenario_data.scenario.key_wrapper.key_pair.name, - vpc_id="test-vpc", - public_ip_address="1.2.3.4", - state={"Name": "running"}, - ) - answers = [1, 1, ""] - input_mocker.mock_answers(answers) - self.stub_runner = stub_runner - - def setup_stubs(self, error, stop_on, stubber): - with self.stub_runner(error, stop_on) as runner: - runner.add( - self.scenario_data.ssm_stubber.stub_get_parameters_by_path, - self.image_names, - [i.id for i in self.images], - ) - runner.add(stubber.stub_describe_images, self.images) - runner.add(stubber.stub_describe_instance_types, self.inst_types) - runner.add( - stubber.stub_create_instances, - self.images[0].id, - self.inst_types[0], - self.scenario_data.scenario.key_wrapper.key_pair.name, - 1, - self.instance.id, - [self.scenario_data.scenario.sg_wrapper.security_group.id], - ) - runner.add(stubber.stub_describe_instances, [self.instance]) - runner.add(stubber.stub_describe_instances, [self.instance]) - - -@pytest.fixture -def mock_mgr(stub_runner, scenario_data, input_mocker): - return MockManager(stub_runner, scenario_data, input_mocker) - - -def test_create_instance(mock_mgr, capsys): - mock_mgr.setup_stubs(None, None, mock_mgr.scenario_data.stubber) - - mock_mgr.scenario_data.scenario.create_instance() - - capt = capsys.readouterr() - assert mock_mgr.images[0].description in capt.out - assert mock_mgr.inst_types[0] in capt.out - assert mock_mgr.instance.id in capt.out - - -@pytest.mark.parametrize( - "error, stop_on_index", - [ - ("TESTERROR-stub_describe_images", 1), - ("TESTERROR-stub_describe_instance_types", 2), - ("TESTERROR-stub_create_instances", 3), - ("TESTERROR-stub_describe_instances", 5), - ], -) -def test_create_instance_error(mock_mgr, caplog, error, stop_on_index): - mock_mgr.setup_stubs(error, stop_on_index, mock_mgr.scenario_data.stubber) - - with pytest.raises(ClientError) as exc_info: - mock_mgr.scenario_data.scenario.create_instance() - assert exc_info.value.response["Error"]["Code"] == error - - assert error in caplog.text diff --git a/python/example_code/ec2/test/test_create_security_group.py b/python/example_code/ec2/test/test_create_security_group.py deleted file mode 100644 index d50e1776219..00000000000 --- a/python/example_code/ec2/test/test_create_security_group.py +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -from io import BytesIO -import urllib.request -from botocore.exceptions import ClientError -from botocore.stub import ANY -import pytest - - -class MockManager: - def __init__(self, stub_runner, scenario_data, input_mocker): - self.scenario_data = scenario_data - self.group = { - "id": "test-group-id", - "group_name": "test_group_name", - "ip_permissions": [], - } - answers = [self.group["group_name"], ""] - input_mocker.mock_answers(answers) - self.stub_runner = stub_runner - - def setup_stubs(self, error, stop_on, stubber): - with self.stub_runner(error, stop_on) as runner: - runner.add( - stubber.stub_create_security_group, - self.group["group_name"], - self.group["id"], - ) - runner.add(stubber.stub_describe_security_groups, [self.group]) - runner.add( - stubber.stub_authorize_security_group_ingress, self.group["id"], ANY - ) - runner.add(stubber.stub_describe_security_groups, [self.group]) - - -@pytest.fixture -def mock_mgr(stub_runner, scenario_data, input_mocker): - return MockManager(stub_runner, scenario_data, input_mocker) - - -@pytest.fixture(autouse=True) -def patch_urlopen(monkeypatch): - monkeypatch.setattr(urllib.request, "urlopen", lambda x: BytesIO(b"1.2.3.4")) - - -def test_create_security_group(mock_mgr, capsys): - mock_mgr.setup_stubs(None, None, mock_mgr.scenario_data.stubber) - - mock_mgr.scenario_data.scenario.create_security_group() - - capt = capsys.readouterr() - assert mock_mgr.group["group_name"] in capt.out - assert mock_mgr.group["id"] in capt.out - - -@pytest.mark.parametrize( - "error, stop_on_index", - [ - ("TESTERROR-stub_create_security_group", 0), - ("TESTERROR-stub_authorize_security_group_ingress", 2), - ("TESTERROR-stub_describe_security_groups", 3), - ], -) -def test_create_security_group_error(mock_mgr, caplog, error, stop_on_index): - mock_mgr.setup_stubs(error, stop_on_index, mock_mgr.scenario_data.stubber) - - with pytest.raises(ClientError) as exc_info: - mock_mgr.scenario_data.scenario.create_security_group() - assert exc_info.value.response["Error"]["Code"] == error - - assert error in caplog.text diff --git a/python/example_code/ec2/test/test_scenario_get_started_instances.py b/python/example_code/ec2/test/test_scenario_get_started_instances.py new file mode 100644 index 00000000000..6c283548e53 --- /dev/null +++ b/python/example_code/ec2/test/test_scenario_get_started_instances.py @@ -0,0 +1,39 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +import os +import pytest +import sys + +import boto3 + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +from elastic_ip import ElasticIpWrapper +from instance import EC2InstanceWrapper +from key_pair import KeyPairWrapper +from scenario_get_started_instances import EC2InstanceScenario +from security_group import SecurityGroupWrapper + + +@pytest.mark.integ +def test_scenario_happy_path(capsys): + # Instantiate the wrappers + inst_wrapper = EC2InstanceWrapper.from_client() + key_wrapper = KeyPairWrapper.from_client() + sg_wrapper = SecurityGroupWrapper.from_client() + eip_wrapper = ElasticIpWrapper.from_client() + + # Create the scenario object + scenario = EC2InstanceScenario( + inst_wrapper=inst_wrapper, + key_wrapper=key_wrapper, + sg_wrapper=sg_wrapper, + eip_wrapper=eip_wrapper, + ssm_client=boto3.client("ssm"), + remote_exec=True, + ) + + # Run the scenario, exit 1 with error + scenario.run_scenario() + + capt = capsys.readouterr() + assert "Thanks for watching!" in capt.out diff --git a/python/example_code/ec2/test/test_scenario_get_started_instances_integ.py b/python/example_code/ec2/test/test_scenario_get_started_instances_integ.py deleted file mode 100644 index d7b78023978..00000000000 --- a/python/example_code/ec2/test/test_scenario_get_started_instances_integ.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -import boto3 -import pytest - -from elastic_ip import ElasticIpWrapper -from instance import InstanceWrapper -from key_pair import KeyPairWrapper -from security_group import SecurityGroupWrapper -from scenario_get_started_instances import Ec2InstanceScenario - - -@pytest.mark.integ -def test_run_cluster_scenario_integ(input_mocker, capsys): - scenario = Ec2InstanceScenario( - InstanceWrapper.from_resource(), - KeyPairWrapper.from_resource(), - SecurityGroupWrapper.from_resource(), - ElasticIpWrapper.from_resource(), - boto3.client("ssm"), - ) - - input_mocker.mock_answers( - [ - "doc-example-test-key", - "y", # create and list key pairs - "doc-example-test-group", - "", # create security group - 1, - 1, - "", # create instance - "", # stop and start instance - "", # associate elastic ip - "", # stop and start instance - "y", # cleanup - ] - ) - - scenario.run_scenario() - - capt = capsys.readouterr() - assert "Thanks for watching!" in capt.out diff --git a/python/example_code/ec2/test/test_stop_and_start_instance.py b/python/example_code/ec2/test/test_stop_and_start_instance.py deleted file mode 100644 index a1148943fc0..00000000000 --- a/python/example_code/ec2/test/test_stop_and_start_instance.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -from unittest.mock import MagicMock -from botocore.exceptions import ClientError -import pytest - - -class MockManager: - def __init__(self, stub_runner, scenario_data, input_mocker): - self.scenario_data = scenario_data - self.instance_id = "test-instance" - self.scenario_data.scenario.inst_wrapper.instance = ( - self.scenario_data.resource.Instance(self.instance_id) - ) - self.instance = MagicMock( - id="test-instance", - image_id="test-image", - instance_type="test-type", - key_name="test-key", - vpc_id="test-vpc", - public_ip_address="1.2.3.4", - state={"Name": "running"}, - ) - - self.scenario_data.scenario.eip_wrapper.elastic_ip = MagicMock( - public_ip="1.2.3.4" - ) - answers = [""] - input_mocker.mock_answers(answers) - self.stub_runner = stub_runner - - def setup_stubs(self, error, stop_on, stubber): - with self.stub_runner(error, stop_on) as runner: - runner.add(stubber.stub_stop_instances, [self.instance_id]) - runner.add( - stubber.stub_describe_instances, - [MagicMock(id=self.instance_id, state={"Name": "stopped"})], - ) - runner.add(stubber.stub_start_instances, [self.instance_id]) - runner.add( - stubber.stub_describe_instances, - [MagicMock(id=self.instance_id, state={"Name": "running"})], - ) - runner.add( - stubber.stub_describe_instances, - [MagicMock(id=self.instance_id, state={"Name": "running"})], - ) - - -@pytest.fixture -def mock_mgr(stub_runner, scenario_data, input_mocker): - return MockManager(stub_runner, scenario_data, input_mocker) - - -def test_stop_and_start_instance(mock_mgr, capsys): - mock_mgr.setup_stubs(None, None, mock_mgr.scenario_data.stubber) - - mock_mgr.scenario_data.scenario.stop_and_start_instance() - - capt = capsys.readouterr() - assert mock_mgr.instance_id in capt.out - assert mock_mgr.scenario_data.scenario.eip_wrapper.elastic_ip.public_ip in capt.out - - -@pytest.mark.parametrize( - "error, stop_on_index", - [ - ("TESTERROR-stub_stop_instances", 0), - ("TESTERROR-stub_start_instances", 2), - ("TESTERROR-stub_describe_instances", 4), - ], -) -def test_stop_and_start_instance_error(mock_mgr, caplog, error, stop_on_index): - mock_mgr.setup_stubs(error, stop_on_index, mock_mgr.scenario_data.stubber) - - with pytest.raises(ClientError) as exc_info: - mock_mgr.scenario_data.scenario.stop_and_start_instance() - assert exc_info.value.response["Error"]["Code"] == error - - assert error in caplog.text From 1bd30feba10eff7382aa975f8fda9efd70940e87 Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Thu, 5 Sep 2024 16:19:04 -0400 Subject: [PATCH 71/98] JavaScript (v3): Remove messaging app (#6815) The messaging app is used in the JS dev guide in the subset guidance section. The examples is using a deprecated version of jquery. It show how to push and pull from a queue, but doesn't set it up to happen more than once. The example is not showing anything that's more useful than the topics and queues workflow. --- .../cross-services/message-app/README.md | 25 -- .../cross-services/message-app/css/styles.css | 29 --- .../cross-services/message-app/images/av1.png | Bin 6343 -> 0 bytes .../cross-services/message-app/images/av2.png | Bin 10193 -> 0 bytes .../message-app/images/client.png | Bin 47518 -> 0 bytes .../message-app/images/client1a.png | Bin 53803 -> 0 bytes .../message-app/images/client2.png | Bin 45171 -> 0 bytes .../message-app/images/client2a.png | Bin 52198 -> 0 bytes .../message-app/images/client2b.png | Bin 58001 -> 0 bytes .../message-app/images/client2c.png | Bin 61519 -> 0 bytes .../message-app/images/client3.png | Bin 136343 -> 0 bytes .../message-app/images/client4.png | Bin 133771 -> 0 bytes .../message-app/images/client5.png | Bin 99735 -> 0 bytes .../message-app/images/client6.png | Bin 156109 -> 0 bytes .../cross-services/message-app/images/foo.txt | 1 - .../message-app/images/site-logo.png | Bin 4284 -> 0 bytes .../cross-services/message-app/index.html | 124 ---------- .../cross-services/message-app/js/index.js | 218 ------------------ .../message-app/js/libs/sqsClient.js | 35 --- .../cross-services/message-app/package.json | 26 --- .../cross-services/message-app/setup.yaml | 152 ------------ 21 files changed, 610 deletions(-) delete mode 100644 javascriptv3/example_code/cross-services/message-app/README.md delete mode 100644 javascriptv3/example_code/cross-services/message-app/css/styles.css delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/av1.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/av2.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/client.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/client1a.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/client2.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/client2a.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/client2b.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/client2c.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/client3.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/client4.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/client5.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/client6.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/foo.txt delete mode 100644 javascriptv3/example_code/cross-services/message-app/images/site-logo.png delete mode 100644 javascriptv3/example_code/cross-services/message-app/index.html delete mode 100644 javascriptv3/example_code/cross-services/message-app/js/index.js delete mode 100644 javascriptv3/example_code/cross-services/message-app/js/libs/sqsClient.js delete mode 100644 javascriptv3/example_code/cross-services/message-app/package.json delete mode 100644 javascriptv3/example_code/cross-services/message-app/setup.yaml diff --git a/javascriptv3/example_code/cross-services/message-app/README.md b/javascriptv3/example_code/cross-services/message-app/README.md deleted file mode 100644 index 4641f34d414..00000000000 --- a/javascriptv3/example_code/cross-services/message-app/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# JavaScript environment for tutorial building an Amazon Messaging app - -This is a workspace where you can find an AWS SDK for JavaScript version 3 (v3) tutorial demonstrating how to build an app -that sends and receives messages using Amazon Simple Queue Service (Amazon SQS). - -For instructions on implementing this example, see [Creating an example messaging application](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/messaging-app.html) in the _AWS SDK for JavaScript v3 Developer Guide_. - -# Getting started - -1. Clone the [AWS Code Examples Repository](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. - See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for - instructions. - -1. Install the dependencies listed in the [root]/javascriptv3/example_code/cross-services/message-app/package.json. - -**Note**: These include the AWS SDK for JavaScript v3 client modules for the AWS services required in this example, -which are _@aws-sdk/client-cognito-identity_, _@aws-sdk/credential-provider-cognito-identity_, and _@aws-sdk/client-sqs"_. - -They also include third-party Node.js modules, including webpack. - -``` -npm install node -g -cd javascriptv3/example_code/cross-services/message-app/ -npm install -``` diff --git a/javascriptv3/example_code/cross-services/message-app/css/styles.css b/javascriptv3/example_code/cross-services/message-app/css/styles.css deleted file mode 100644 index ffd74ad014d..00000000000 --- a/javascriptv3/example_code/cross-services/message-app/css/styles.css +++ /dev/null @@ -1,29 +0,0 @@ -body > header { - background: #000; - padding: 5px; -} - -body > header > a > img, -body > header a { - display: inline-block; - vertical-align: middle; - padding: 0px 5px; - font-size: 1.2em; -} - -body > footer { - background: #eee; - padding: 5px; - margin: 10px 0; - text-align: center; -} - -#logged-in-info { - float: right; - margin-top: 18px; -} - -#logged-in-info form { - display: inline-block; - margin-right: 10px; -} diff --git a/javascriptv3/example_code/cross-services/message-app/images/av1.png b/javascriptv3/example_code/cross-services/message-app/images/av1.png deleted file mode 100644 index f156d4f330e64ea4f949665af5d31a7aabec3d98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6343 zcmV;&7&zyNP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&7+gt2K~#8N)tzZn zQ`wfst*Y0<>i1Un>R#_-f9fy2di7hY`?asCM44oAK$#~elu2a>31O5OXHXoFIfNMm z6$Qb7f|j$EWtH`wQHoPw3<*O*f>NyCN~OrX=j{Ezd+)Q)y@1Pz zG>mj{NLMK7HYQA0sIrp-n4VCkkEfJ{F+*VluM+NP2dDQ{(A#H$f4k@Z-3{OS*L?3? z_4)Q2pQjH3+MewezYH3A$H8G_ke)(M?B@~;(iy7k;9yvdi3|dx!FMTNF`h9p{G&`Z z2$mUL4kc?k>E*&7W{gjyJju(TA8z9t`J zZ)YoiPwSv*r6PTF z_#vx^#>WeV2E{v8+#x=h2p<~YE?%6x;RnZ3CgUOm=Z^8D>`kGlSF)pw*bl#GXykuXG!0-`T#ayBY2d^InWbAYDSZ87Oe=98hVzS=C6y9#Kr%~W(Z;AJA zYbmZ^QUW#Dj{pwC!H^Os;yrY+{Bot~pI5lpnWx1&{CwA+jPo%U)61ptXcS!_ikL=< zVTyFo&|t)&WBt6I*TD@Hn-TNYU$3n%-fSFYObVpVwD?dijvqYy>%!LWtX#aWOdhzm?V!29LNZfJqa z1tAa=tht&#ED{JnOy^)_w$9wt*WJ44q}xwF?u1EnkuppaJr%)ZKpHmK!Ko?R9K6jA zHUXHpNI@|-s!3r0uE*}pHfM^w`rmTMK-i?I>Xz$_K8heT@G1*?{%~g!-`>gA99fN} z;ge{gj>-TS<7i_R%US>UzCXdj-?Knb^iTwIpkKOv(R-WoYFra_o0bY}9&K@0-EwZL z9If4gMA20drjs)&3p*?DTx&{uiccOFvjM{#ZOrXft*Xp&9~ngY=)E@Upa{FZN+rC! zG-q3rRcN1&!NJC4C3=cER`h%^+p?fr23RS-pQ7p?rdiUFeW;b_Y-Lv zFayX z_N%=eZ3A4_2D`5h_1eha;uz)ayl1;hoR3?AuUqU6*F-;$WIs=kybj=d*GW1 zzV7%m+S>)E;KW^S>wKJSH``m`l3-+vzv2B9bQ#vNX9@)M{>Tm8uY;LBT_a^KMKFrA zgL6E^$=;IoT{8lM5CZEgSFBrY;P%rN20R z;&pXK+u6)_HCbIX**zC>#I-ry=W`^rxqWpM33&g$w=S3cG`piF3#YuQ&UjvN>``&r z-Msx*PsG>mAC;GbkI<0ZAS+&-31zu+h8GO^;!t_|Oqg1t@)4dWjzV;jG3&riqS;0f$Ax?)v;+s!ra`NX!iL+wNdvYyK5< z@njQL3%YeI&vu79boJ5lRD)R*!RDjK0mJ;!WoSMBnkF^$7reCrpW}2z^ zUo4JXAG`J!fr{Sw+x*!Tk#O(d@Z0LN8Zn}=Nke(V+|k=zB{kXPb``l&qO2Dv>+?0N z{|G=D%*%)h$*n5H(UIV7R%TzK0IORI5m5Z&p zo0=l18g6UMtCG1B*UFgYQU(S!2s8}+$k3?4^=K-RU$3}yI10IgwQ0&=YO{@b#LhL{ zuMAT}A>sb@+W;RoYZqEaKFG0UgLPwC%xH57L8^ahE!0uv>3Bd-o021Nu=MXNUBcSS$^$cZGJMvk?G|crbrKWxPx;bYNM_BiV)8YT&m^<3ZNsD!`F!@Uk-=Ey6R$Tl9dpSc; zV6$_lIz7bO!sN@`R97M~P>~)kO3|?dNAnebxs@JEZd87f-K`yo23rYrK&T}hvTir`hkJ(jZ3bFEb$qC+HH zj5|P!3N=_H?5oRlx3kPnccwptGTp}+nNyK|-qHOVLOmS@nv0bSDk8K~Vj&BSF9SzF zrVm^x4tC#=dCZXv@`w)4v}RHS=g=RO;*bF-vhnb)t;5&KAN07*C4gKm z(l|gz7%cg!5wN9FNuzbl9LO)`!}xG2rQPXk_1vL| zZ*%qy*5#3_WoR+TC3>ey#}tOyFdi-(5A>8&q;%KB%D#&v5)Q%jo<)@Dir}Du5JfAm z^K|^1jO6b8eaCitH64tUx0KSAOl!UmsP1>-4J^K1Id-YwVebBns9m8u+;(np^4;VZ zyKBpET`sa($Ka>oaHaSM!9oAcj=Q!x2W)YQ4Dc#T=KWfhu4pdCeu6X=G4=WL-o%61 zF#htPsLbFk;=+Bc*~xECCci677=IZ?q#-kkGF_4WkkKdnH>Xm-TR~EHVME$WBa6eDqO%A)aIfwgtMh9$)*|{0--&UT`eWOSfX)dWt zi{7=xIezz+=m4)UANPPQju0q0*!xO)th6R)thrQ4Lq_vlb*O4riXUdB2*bR)3-`jQ zw*^V9nJKNA$-_VLX{4yT&!VP?gfse--gj0zu7VUeMG+*m z!N-Eck-vqLUQJQnDQEzq`%kh zt4446n(eOmy2X|dAD=+l_YWZg=|OYL0qVeDfoUK zLEBscw>m?z7vr`HAXUaelk;PP5QBl+Tw-=^ z!i@COSz-j=m)7P!IWpW?!>y-JjKRFwEu@#NUhpa}r7br>-8<@FF7Zfgcd+vFCgDkkOvpU=W|kh-Ch+OA~#Pj z>8jxR|Fgfi_f>_fequrhMRf<@ebszH7|><@f)zY}vAZ z`@`?$*UD){n10sW&<5wm>AS~bF~Vodmi_x5|CNecoiT)XK}*6OLvIV|P_41zNXk-Y zRwOfd;8qlao=sg5)Dfyk&a{-FN9U>(nI}f3pgqg=irNH@)&Kn0?>_$=Zs6Gz!Ak2X`Evijl_>p%ZDPX7YK zeZ~$*hg^0xW;eNWhEAt;{2a`sNLJF&gGib+@B7!u$~y8`RavJWt*0V#n0WtOs*fw| zh7WK+^@@0DtvH6A&WFYq&SRU?G@Z-S8c-S|x2uo%dq4sVLizl24ETqC{D)^nsidV; z_rf%*BCNlo&$KIR4@ch0Wmn&6iKDL~G>k77wVlsiv;0rElqxsi&tYFTg7sor2nfi{ zbDG?$AtH2flZUaR6?fO?uUq~n45Eq=q))0MQ} zLo-Yf70N3mznsZ99^mO@^1nN*S2phD4Y!nOt_biJ{%dgiJXJ*9RaDL9lGclPSwUNz zSNz#~waNK}5GlStd-pLTvnhh*l@<}T00FEbNFj9bZ@C?1@#=}QFh%Io`9`7qX4UAu zb7S|;G1q3go;oT*kEE~i+tuu7XO-Vn=(S*}m{AclU!9e46Rq4?x_Hn>H@*myw)gdQ zfr_vJkFqDP%LOxsx9*Ctph8X5<^rY8)l?mAMW~O0q~X8u>AjLE1z6M+0sSFEkHX&y z65F!rISW=~e)LqtK-3kXez63n?_oSfIg10BNV~X+ZZiAlc-D2sy825k%of4 z(}z1MVHPQ5rs&~diB@7&{xyQRf~=W;@1P$aRS|kqR{khyqMf6J z1Zc+Korb?^%%TXu$vq*YolmahkcQv3BJ}ln0_hE&F(@?9MUhPEH#@T7yJo{Tv+e6hwr)p^D)A-XQYu5UDF7BI7qs3jvC> zl=i1ay$jja$=xxSnan;0nlE>*oua7bup5dmo`Qq<;%6GJ-rz8&1{()1X5 zBTnA-9R_+R(aVAmmKzRB%q4CiqWxQ1@kF_QThVO{UfBdgk8q8rqm0OkP!*Tt4@p*rH&M*(bxG& z8xbBJ%1P-z6xkiUvm?x>gSVr5&+hT+lk*1%z=dqeBVAk_iwMv`5tNc&V##@9DAHI6 zPkQ2mx+46$A_H_K!kV~Nq}=W_()LNU2_gu0+xfPncF0Z2BQv1n8zn zCztdGl5bOKV`6wUfmhhz>V@t?Oo1GSC@@~*x=&*aDXn9 z`UD8jSrOD~F^6{a=+-pmUV^~L=4`r`(Wio_&{+|H@M{Yv*D{xSm^1((d7Pr-)=mR` z6af$g+Z>dVrFq9h1$OE;kCP7G0s;i+uL!2Oca$z{hL_mI0MUVBhaLp$qlWRip{F9W znuJjKujDMz+`*;7imUTZR~tPQQGpilbu_7GGgiZ(Pllw6lT4=tgSg0aE5=cd9%3l)q91$HiPLhr=dK*;3PCYR|5rA}k z5l2^k+N6A3|0i7 zmwgvTZXYML#q^5l{tFU@Ai{p4kXA9QEYQM8asXo}0uU*vwSV15MWHwD7deA4{)JMy z(|;L5%h^Jgl^HRTA}X7(KW>en6%LmUEXLZ5F%cR_mItYHQc2J>GmL?e6j6a)W^WLU zm*RjcWH1cW>9iJ|-M*0)rS{PfADNyQg4Pi8{=i|N1_2bG5^w+5A^8`Ts zWFI?d`p-g-nS7?JsLLHYcXGHgb+9yL;whi>Eut2buEkSi5?Ie6(qQ>x{y_fTq4I;H zRq5k38H&1Wrh)z4PoPqPRflO1C@<#8YqQ4AoftWNL{_?AT9_;?Na!y}kQT;IJPA|( z0ro{az5}s0VVr1yC@&9cSO_sPK@SRN-l^pE9O)?O!%U@hrI7UDwwgsuzdzAQt&=Tu!l0DojqJK7%3kv93Fb1 zl0znwEgO<`jt`5Nu|y)}(GEh4O^Q)L01k%8pNIG7Bw>A7FasqC6VLdQe=9>{iiLoU z7?&B1n;1DWEPEr94L}Rk*D~4Qz>rKbHgb!Rr;$Fs5*>tbp;;Ote;VGOiT=*~8GRX~(K7Pvu`(}zG-sKg~o z;}iSi6Qv0T0ITAXFqG!tdLr4AAWPWCoH#Z5=mGWpeX>k_v5HK74Gy=ymRD6VM~+Do zlKU_>d@v&LD$xLNy2gNdLN820vLf}UqNr%(m!Bt{*7%ai{vYtLgWPYveY5}o002ov JPDHLkV1mAAUH||9 diff --git a/javascriptv3/example_code/cross-services/message-app/images/av2.png b/javascriptv3/example_code/cross-services/message-app/images/av2.png deleted file mode 100644 index b33a05dbe7f471151aa436c636a120c7cdef851e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10193 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
    tH49Su8(&c-+gI*Jv!50CB*@%4$BJ()PN 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 NbT30M6=>bQ|1Ui-&tCul diff --git a/javascriptv3/example_code/cross-services/message-app/images/client1a.png b/javascriptv3/example_code/cross-services/message-app/images/client1a.png deleted file mode 100644 index f6a59f29d9cc1926cccd9b0febe8f6bcd0b1914d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53803 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 diff --git a/javascriptv3/example_code/cross-services/message-app/images/client2c.png b/javascriptv3/example_code/cross-services/message-app/images/client2c.png deleted file mode 100644 index d70544992dd0da2d55bc8fe13627e9cea0fd1ba4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61519 zcmd@5XH-*N*F6raD2NECAV{~;i%RcJK&AH%0@5J}0YXhw6r`*4-lX@EP(o39M|uem zdJmx!2!a3cy07PXe%>G7uW!a+FcKwapS90dNDb9GSJ`K09onZ1`GGjAZK@1Uwj|A z@;HO$p^`;~?A3s0#8#niZoT@F{6bBR-GYd<^ZutlBi`?4}*X7t} zv`ur7g@pk|a^a}uWB=I!%8ine-@0OGQR$Q&N?OvBXoeT*XybJ$*|C7ItM({LaPw(=7K6r2I&f{<(zg+w$ zJbzvTYepl2J3QL^ry0%+!r1AIj-Rq=5#dSCV6K)vQ;DkPHcqJMTC2s_EkOpvb}VH4NM@98KqqTDsm_7!#59kBVo`HXmKSZJh8zsWX&MgwGdV}Ww2`e zi|0yW6%|XlzfkA&ubB_-jkiaN%f9I($b8_ZXqO+Gr{5!B9;@n~i$q5mWsK z1Akr;S&o{%rFJ{Q*Bwz6+G*!3;fYTLEfn?=c~B6-&hQ7cT1r3C4Ks!jKW3qp^3!>I z4mqABYzpteqT`h0m> zfs2G9l>DX(R+QTdY0(oQNgR>(9AZ5sb~0JzQAu00c08B|p+}53Z#nfq@L>r8T+cj; zPYrh?Yu5LTA=~(z`~+tP*8-P>L}BcNak5|Y_a9-!;!v@7xZYZ_@qL$BB!EAI zwQ7)gH_~mZ6^q6aycc6Jp?W{U>7^UM*k6}br@W&OHQIl{0h66cKtHV*ejlkcV4hen zxtbJ}J3u4lXJBTgXJ|M-xjK+$j!eBcOl{C!iepXG9ilg=;-JY!*oPPoSXz1t8QRe#j3?<%WrdHcJ0ByMYtw+Cv z$0T(Kv5B9$nQ8Gh7neW=7xz0qJE&}xNhjlkGvMkcxdxY6EUkcn3W{ze<2!JtU>*SZdF}TD8si~!9iK=*g ztr|OxN`@D@?sE>&P<9*tA&x(<)IoS&!^m_FzW1bO--V{$Yd5nw-`PBS;Ze4AcHCZx zN=ju7=%phHga%D4w8XoPm#oIc#B}p;bz`O38O6QT7FSZ7lSEMs7afzeXfX(zw}yd; zTk`>s8S9AgDSSZuvo%F-vr8Y>4&{$Rt}m zRZ0@rpxBhtdTWOg$&%y$T4a?y@|cEOxz_jC%-cI*$Ix|m26?<+Vj_No%6DnJST8IV zm%i95jOG*aYlQBv6eUag!lc04%_+!Zcf$QtY1lac7#6=fjwlR+Y+v0G(ai>kaZHYL+JY28mU-CkuYIt_L*dUQJ}l117q^-Q6XqQRY|oI^_7b?R)9P2Ex2 zV_s|a%$mdH8rN`KBlE4>lk*L9q&+1j4Q581EpdAxdkYH-T;nBJX)h7rE@SLBX?T?r zngqPNx(`P9grIPq)s8fZR7qI=+)+yIK&qtosg55{E8~B*bvfzW9VWTSG}D0Y(3F(68^`$XqL~Rns# z_YSf$9~vj#uTO>XFYl8d%1!0*yN6sLwno^Vd0<+UBArrLfsiypE;9NDS?twi3UMRJ z3c;(qCKZ^mmC6NMakr+;gV`Y7afjP1MZ-0^TBmWq);mhWu|N6bmD=)A_4W=zbBlwb z<}h1!SQ=92l`~9}h zU$Tr@&1RU#3Q!EPN2IES*?-ahlyX3lB6$Q|wX3q{=~Ng;C2fPWdzIY=NnkZ(@;gj2 zeO)}<2(fu|-h4N|DMgI1@Y$axY-os9nhB@iH-^Z0^)j^IinXuKQ}W`oM@3jg#n9%7 zFo~bUl&Q*&qQ+7px$*WiG8g2MVREK^hWznkY21qK6lv(9u=TWF^|*Kv$wEEFc6ciY zRb%a22*DSiM(n3wo6NDql}-tH9c@j1vtnykO{JQu=t%;J*%@4k9_tf3*Z|n__F|5| zfS+802Ho4zkS#N zsI#R*t$5g={|=`o%J%opqYgC*@4Z%ps-fZf1Wptn%*i7g?JWeMNw@W~jcSD<=*TNN7yBNp%<9@#3MTdB(i|M#}|np4_wPMuub3_ECyY6kW| zEwOyAIa|W`?frTmOnc^Cd-CSDpLRXpg#tc%S;F-T$>-PcT6$)l`2LwmGQAfFnEJ7-#Y}s#bdt#M(63f0`_5mF zIs*NLx;!;ijXaDiT|+&m218*cX36o)Z@1@EYqCzC(*;eQ+p+MYh zT#YS4RS9-Z%g(H%T~=if3O7nUYm0Fdu9|P2O@q-f^3Ni;k`Coi0NvrVX01Icfvoh0 zJKOe;qgPF9S)tUvUZ)548?+4KM`tp}vaZi_a+qj&)%%cc@Ol&GmriMQHdgrUBZ=%+ zn;=JFn*wZsS)-4$^;BKpw-kqZ8K?g$?)a%=V!sMOas4FvY2?Kl-+tkoFA)gm4Iz-E z<#ZKQZhy2WwWU92sk>zUb(^isd%-Ph~;o^Lj5>;-WadJHLtQEV#Wo>P3DBiTa zKYxAZUR3qRBqapQ1*ospAhc#RHyyiLaNr zSLG3H=4SO?u6qZQP?qqak~1UeDop*8!tLpp{iK2<)3e3BkZ3qiYbkEJT--Qy@BFJ) znYWJA9E|`l$QQBeU?zfhwV}w3!xEno)^?+&ZVN0gFH^GI zwYFKMV5DIfD{urfiOaQW4I9qe<2bkBcQt=2UQ>Q^ms`7vZ+_Te{wU5DDCR!#BhVqp z+@eR#Khb0D?rfcLmQ4!%C%7)s{s**tFqZZ@8H?0e`?D1d&wIb!+v}}!2TaSH^~}r= z$E))4O6~T-j??w~HC^CV<`HKQx)x~x*85s3AF4J8>{wN}VlCw2*PgEVCjo2`!3iM9 z#oXS8i*$`XzHXqDOM2a>Z~zUPGR`0paFEs6fF_*Ve&vFt>Co=hWF=6^R{aQs5z$cO z5#3M~!S};F2K~HYB$Jc(Z_TPd{%3O#{zwoJkg)bE^~+s_<1SO*QyMl=Gw5^NA;cHl zcn;l+nC9b06dMu#XwVMTRDSSmg(>>%4H?-dUMmWV(hq4X(9N=CtZl!ly1{8qmsFc# zXx>`%fbc|YY6DJb_6Hr=#^nF;*eUo?z&MedjziRc?{d8glAs#}Dh42*%>cZ8Fpq%3omW3vb3E!$ z-yDP)M2*cv*SEMz3+nwvE2caEtxV-8H$988@h^w&M@lnEc&tnVJOV;D7~^&Z7ujwo zC@28mN;BOEUYnzQQbRkrHK->d%-T!5U*YFEEF#JxHU_=ts0O9K^miU3*Xe|wQ(KKe@X z6D5n}DHJ=9;zM45s)2j*&l~5g07!~RE0@{2*j?<{I5Ohm>{eDbpKgF)&)TGqSS0G7 zaM=Pn1gKST%qcXW48h0Z`FD;r92~yS@u08X7;*e+H*m4HxeF90^XSIBcMfMV=4FoCb3r1n~Xv$)lp4_J?RquM_Zec zzK^C3b@X-Cj|bVEtG@w)UM&^gi2#@Pk+fKnfo3?kxTvrpR7k^jj(veV7R7Z1EaNA! z`QE@zEZA~SR36)wFYkX}U3i2@apd9g-^J}No_#b{ib#3+`oirun^lXE=V-*o{11Qo zL>C?Y2+x_>fqudm;(MWkckNK={K@_*5P#pjrLILbK;L--JXE=`+V|SDaDzeDOhsc+rv2XlqRor zS&MlNd*j{7eGybDxiCST~+Mxn+28Dw1v9kBUz z?>Jm8emxS0V7oe}Yk`yp9F3tU+7G{YP80-_^f;Xc#G^vQqLf4{W3l+Ls)}irXU(k; zs}wPR&yi1bhjP(RGre`N-pcwj4UndKlgT+?sr#`-1uRpFeb4EIu@cVPcMf?hUcKr9 zY)_G`zwkzbta%Z-s4=_IcW!6UjL2#hG$AKhCEi91Y}(<;yVkSpLboQuZficju*=LC zuV10|*2&gqWwN+jA^RDEYM&Tqy|q<>3`!k+ zTl{t}bOvNGb&cp8q!yGeAgOtCicVI7S8s?7Jc1e?0%8yu%~33La==A zO9O#C3yf;hP`abR^Mvw-E|3I=gqX6?aB9_^G30CSimbSO4= zy4KgF=g1T&za#b|6&GIzJXfH(?KcLLQ&*w*7QDQ4>LdvRt({~!#12h9uy$O#2^ix-|#SJlJMJ_C6FK_ z$$ENvSnl3+o{fFfD7^b*&2u6Azfz1*%5!57tu~ps`w_@U^CE~iEO#tIQrdv9tdAJD zA=%0ZbO<2Zgu&P%Qy`agg=sEC+zwtKL0FOm@i0bd%1p^tRI5u!*dE-xh!a6SQ{e^hxu zu(Q=na><@RqhXy?xy2YV?u`9Awi}%OkMbtJ$E@?2O&~cX{7(;p{7I0TDWy0$wJ0BOb8(s0NC;NQ^Ubu+vi}9|k|98Hsi>GbCdJ4b9N>0^(b&yt z-!d^|E{Osj*89Vd4JvJgFWLc=ESi9;M8;?RM;ZF9b(VLiFHJ<*4x~Ewchd=4w68de zW{-V%KmtASn6TZgd%zC_kKBH6`6r*!=s+X8zw6;?_yB9~%X2?M?S9+{<&9&)Sgm! z-3HMYkEA)AQ#`lTEi^R;XVWM@!?#WcWM~V&*5AHIH&(D2Ta*lNZayk5wowE!uLZOj z|2PfIV}9RbUm~edf4zHew|A`Dg$}=1FIyjPOTRRa+XdPW!h2*Rl(BJf*(H+`jrdD5 zB>%`+VqpyK9(#o z_k*6>kvYwiO?&?T=`!Fde*>K#*YlyJg#}CaWj?>%g|@-P+`zD8gWPgdt?2CakeeX- zyW;j^jcG9Na}x?_O@E+f0*x*g6#N23Zkqe}P#)Ev*d&47)AhiIgt)mLv?#%lxDIO+ zS5H(EfS1VafM%d63(%Vnhx(+J(@{|kuCpB2U~^7CoJM`7O2Y1r#dO$7cv3?lKE1Cx z!1$_wJ?-0Vja<#b@djfGJ--*py+GNiQYCvx;eH`IUsbD|ShbylnqXKiF1QxP1g=sS zf5NOxmfhACd3QN7=5t3ZJkI!py3{J7yMx4Jg)zXhD>@*a=$|`IX9XI?vm)MOa>g## zM;(Rt^nVnQI*#fZM(IXfs|S&aYzR1v*0dqz71hpG@czdvBHRd0Zm5~x%2^xGP$qj0 zDf8FZ1T_BvJ#HN!JW=-t-bXs&%Fz*b_{>z|6X*68u>uY!zu3w<)RMJwSJ_M1VLAsj zYr9q+F_W}>uc6`|K072?U{Ho#YpIOlMh!GLD$ z7f(r`_5t0SVWAwwyZPI8N8+jH~m=} z*q^BiZ5GUn9{^DYRc}kZSzEI%l)5;qj`~c=5^GGOG6)c*4^UN4db9v;tK0w%IY&wtl`D;g*o*FjT*qU*QV`1&iyf8HyfOaRj=zh3$X zUocQlmAFl^F$T#)GIOQIR2R@Zb?g1+`C1fT5AR>pp0YKg#Zt4x^T3WC%(gMwMsNkI z?EXsF(`6uviO!nCJzM6z{Z|yk5AMb9odg0lKi}fRcc$pLP?mvYWZ5H#y5+`{Jva_% zZM->Zj^QwO>g_%`{W+f%S84`3TY6<^I0-ZqdCy%Z5i&)IR{(8$fWjUFy5|MZvhe88 z`oq{2x@qRMoJNJ+N>x&@^Rqvs{Q`DSH=O%vApoc=s2Xo1NbZ(}q4(sB?=fxhOUJSD z>Yzb(svOocpR*q#-2o(@^-E?%PEq-izQ?vUtADEDS$5a(3U_c)<9*QS**Z9mSN;5< z)nM8P|5Fc+ezX;Y0Zx;8IxN+TbWE4zPDZ>M&JjUSZVx(cf}e<_>c zK^)$^*)isbd^7UpT1SlOvj3>b`4-&(+tb%4sW+NfnC`hWoh=}3-B#8W8>`IAHdQiC zq4wo_%SDI0D+Ud7@gfI{M0Lql2geI#*F;0PAzcstEJ`zipa@)g5`NzZCAxfQhflbk zEOb505Vlo!==sHW>ELtIm~pN7l&I=K5H4t$*Z5e|%X{D>dk>LzjS?8n=bQQ;VDp8R zC}6^Wsb*PP<}!-!BJIxfbtVD=0D}iua?=Lr;&J6FOdN1(ZPI&WAW6T2Jlx6t-rnY>Avj7;aIiR;O+ch^N)@MYhq%FI2qVnt-p+cGU!0F%7tmW%NMu z1!l<}NaWSF&uEwit_YVPCZnk9$L6hHlI_=+Vc20d%U!dn^@s2s+89g2&lUTrG`$GD z3EH-AziRri^1KE;5a*lL^)xDSipnJ>Y3ra&zO6dhacx1{8xo_>$+bUL{hj4B$d0*? z+_Z<-mbXxKb%DRo+~G8AoQ6sJ$jHdcX0umzin~35Q(Y!plsC29&v>fvH`D_&+;4QG zWfX6V4*p2{tV7y{nL2GW+_-!?)CrQ7Eli zcK){k$MRUFSeil>X|QR77arb8-m1hcJmtyL)c< z;W=FX!$W8RLC2X|G$2D)`OY&i!}I;X;f8Hn+c;>+7IWsa))}mdY7&0i`Ux=61^e+K z5Ef~u-@7aG>ZKCTdpc zWO#y`xM5s(5P3vK!I{)a)MkKaO14)IHcRuKbG6=G40lElwNRJ6>Rl@i0-$_1y&K)p&Xg)+I%R1}<)KDv2PyBd%z7^UG-;Tb)0kb^SCFT z5Rr4aW||fVIFCkLa?ozN&o;Feb=(D90lV^9l{gJWoRjS^Gl>1=#OFQ8Q<9K2GBFk$sb8%4H z-ei5RUL8@_FOiPeN%#QMqQ4J~lb^a5)jCJkg&T)bHkNRw4n5y!pw!PUMH6Obfs^l>I4^g*o)Q;fr+JHr zo4a~IdFC}qJ#A4Zp*V9pn48Z6dbN{@4Zh7)-hi%K6B^_2lwt*q0lZkqLVb=K{&fIP z@}aoL+W(@uydP+~G6=(}eJ>&xa|X~g*7#kjCUnzVz20R{mZVjkdpuy`f zRFD*OqS~M{TVV7vQC3INF1t3nCm@t(6xTAOQQgj%`!-W`wgQ!^MWu$lybx z(Qnjajd$QbH~Wxk2H*Ch80jon92fgY^T^$TaEftKHFYY#9%e6NO?xvKsx7-Bc}w&^ zUZo|`Qv5BFTIOSVO_acm>U<^`(+1g(@Na^y%&kn7Wq5}$W@#Im7`z*^rlkEmp6C%C zk&u880uOxS9}^WBAqzu1mRF-}+1%vWjiCpRG<*MN!eHb|9gPRvZ+N8M;;jy-{J)L_XsOYOtzt#qgL@BK%ETZq}l25g;vx3 zW@4Y{Fkqp{6o1nmI8O^;#S}>7?S!Y>0DJTau{BkK!UOH3gRI+BtZGTsPNS;}uOZNe zRV2&t1u!Q7G{I-;tRQ=<46Fl20wOkk)s6BGQBAofGReFkJWTNYS85ug z1yW4Q*J?AC2!qC}fBw)cmF*v>|5OHs9>#x;6Ghj{3#=PAqE=_jSUj=9RmSKH-~{5P z<0xEhQSaiW6Q|H`{}+dcmv&<_w>>DQq%5_oKahB^P;Ut3X&q_J|*xJ1ymGV+dT`MIZD+)MCkhM(EvN61WXk$Sp_7}G<)daLT zq!$}$$fm+0h3I@B<5fJFp1>hWG6Do+qccTs<5N-FH6^zp8`zzh(gtf%8qBr2^}hLs zD|spVSO2;BJkfuLTt=@r7>^{yXVHVfI(#b{sGUg4yh`&a4I3CcPd}_`|ioAQFu3x`;&t$id@z| zU+yjvaka`;uiT~GWb6N(+!aC;8M?f6Psq$XqsXpsmbGUlU!t*j{`J!F`p#3Y0U)~oZd0PxNY_|1q8np^uWz^!ck34nI67$8 zSJb>2sF3X|E=>CZX0CEl|Bzk%5#IBjmQBN>*TS^vX!~;CZ^|Awo>RWo%ci{#I*O^; z*}QDvhrXWP_c5GoV=;!yA4_9XMAR^JHFIC~5}&wh&}zBHe>{NC#(vfrDN+g-Epeok z`PSl>%uL)TdbOh~Sg1(*YvaNHBrWm(26Qx7^n7<}&4t_hJ?^K6wOH4cY?dIqN}8n! zAC-~EE4U76;*z+{#)AF#W_nWh*>UZS&5o*Ggs9%o4d~say=P+q z?=C__ua+wCb&G=aov(%-IavJqc9>?jno(rf`{4TdTf%L8L1`OgV2RtUdfFcTkKixg z{OmwvB5NPZV!&dxS#8m_PwI6SeEo{Fp|1*JwCzLx3U_?2lXgnHyxRK4Q=8Vd4~#A^ z@`uB5O89HY{t5j-9$txk|3uG#aVfJ>Kc2DQxjU!jz3YknOtFw<-|l{X+oRapz?`%; z$D`1@z9LCN>BC8!eKx3aS{_Dxj`?le^CY>;+jL6j*+;&FqJ zu5EV_k%5JiZ;m`KQW$1^U@`BZ@|rpm6)XXTl`;dA$C`)W_44&<(VSPLoVcO{%+QLsIC*jDgO@ z#>Z3J6@kvP-jN3932|1!tO+ni^fRr)v4M6e89uPBX=w1yX|vZZhvGluJ23h2OwW9~ zb~Xxo5r|9+vvZ4_Tnn0F$Yn?PAnkJZt(eP9@^R!KoWIFjttj~onsH?1kJ*_ghub`d zOEcMrAf6J4kKWI({TYV=eRVT+e;-j|hJIlKx4w{{T08sIIiODRY z_UR7~l@$w9`9?-&KRbt?z_<7Jg5J5=1Y`{pQK*xPh&-8F?Fw073Cg{eoJ_aVQGZ%3 zxZ43-x`ZcBy59JujJzeqe}eUX>d#HsC)udlG@|Xy{pMIm4`B)PWzZUXOZUZ+;uiYA zPfc`rXq<~B;mv*(G+Zd`sq=Yn6)UTVx82UrFY;A#r^k(X`Th)TO2Ra1>nN`=e0b|7 zgHn8i3Rw*z{oK^C*VP(Ixc7e-Q~)lxp7i1N?UkL~26+k z^;etQ^Bw_xE?3VnKAvBcK@Joybdx{4U(|?7NC!KFg>R7?02#d*bS$$geXC1|D zhd_w$-MecP_itUHhG`gv-^mTs%iy`(0Ys}1^o_Usi#3`xpusHn-Z*emsoZ^mo9Bv52Tad;tlxK@7 zgM9q*FR(8;P@0C;y(VHv@U12@KC@_Ph`LhBR|JE+Y5?xq6!D3PE=y%!%I;4Hd5dGN z8P4LwRZ+V>GA{xGSA@Q)5-WaI3j;}91Sneh3WAs>mzbjNysc-V9xODS=r5NY=V=ga zJ&u*)uJPYzHG?Yr*Fi%OLy?NmZQ2uTD+=Og0I`DF|pmKr=QjHUQZ<5B5v%I|=u zD|sJ1q~C}27Q)^+{H*vzj)&ZI9(r6aE59!;+buxTy>(a37w>rD^Zq$qhw+Ek(^S(F z(-{g;Q+86C|*7F9ty3-~)7jx0?=V#>TKgYKnj=9(|qmjGc>@RN^E9H{h z+@v3R+FE#!#X6BdDu z@n=N2cfoGpcXy$u_IcBJiL0z8PtpiH%yt*(Q~xKMFZ~(U_3-c) zXU{Zzf$K1p9}2w2lA6OUT*%5K}Mo2=}DR#cmt zn>W2?MlPuQA890f1G3HQSjd6}LYgpE`mJVS+ErF5=bDL19t`}AVA<9bIbc@?{bcWT z{PiWc#>0{VT-eD9BuE_3e&o3n^4DG@JtsKMOEOmJucJm&BJ_0~y*KM)tlW+2i(#5M zR{U2$yhA}u%}Ah+dy~yZ2jDmoo4u9o1lcs5O3EwJc5QizmjYV?9^{|xjO`xL_0 z>d8Y+pV-EwlzT0Y3cM9cd6uqi0N-Q!J8t3rkDg{~ez6+};<-1nh7A7Ty&o;hh@h6) zG_|f6^05p++X@2I`et<^eZ=Ay|EX}uI?Yh7znxBKnayq0))D~6mT9HND|Tul`ap{Ac1zDZ_k5?zz*NVahy#`6Z4 zkjtHsOH}yOWM!(P2Y(f{0}yNQ=3Qem6}z(2s5h=2qc_}_{+hk!bJ4Kcf1mfecQB_C z9Bm@AemKX9{q61RN*J!BUkW2PI?`;>l$5Kh0^PBoaA9-+O-wM3bTa<_ZNfKUGX54S z{*sPkKlZ6c0*5>h%;q;cq7WK51k=_P0Do}4u zk}d!Gv}}%L@ybQ~YNmWhzxW@l7F=}H6Qet>scuuT%0U%y28@3ry zA-f&qgF5GezY85j&R~(5&_q!Yn`m zXq&5Nw`gm;qwPn32ZD)(=z;VEDE`#*`sScek#b>K1W)snkmC?%#jE`Px&$fn3GNLjW_|DQTrpo4u zvs3{UqTc85jw9oI`Q#AbSo1Q2;HU1ZIoin^K(X}+=x#N;=GDgYWnDIxG=ZtdW`b|rms((wI( zI<=7PHQokf)$HiWpHhE6LLBarCB-C{1QaJ?q^Wq0b0upJu`o3)lp_N=^mPtm9N1t+ zI8pi=ckoT)?yVp5Ou+3-J$Y>LCW|L6Awre16Cx;^f6S@vYoHivVw&#WSQD*r(L8;+ zx*{O*D0yb?V2ilP_?+w9-%~9B4BkvjD|C8@v49TAaj~j zY=P>Ud+7L>R|w+w8<1wmQZo`#27huFYOtsg6U_2j7f zRFUFq96Oh!!u9<|-u2kZl0>Mj%vYEW&B1mvNT; zMS}4`c-$IH6Z!WE@`by3^;H&^tBO~H;WKYbp(9nUx9UK(#0(A+PrB66bClG*F$y1=hw>VuN7kQyF@w+2}C>v z(jnuU!a71!4CBud+DOnhbXaBl6DDOYsQ-RqXD#UODE{d#{J)RCWU>5>ng92Zp?{^u z{|~?3>nlC^_s`xxxWDp0-w+_v`|s05mxw?7kEXtK^U5=lfB(n5tN-I3E*|SWNacRT_p{+zIn$xXz=s~w!HzJh*P9ohgolk?~!`rBKZ^iYUe<{4uSn6 z!&6d2F{B2sRU%F`48 zY&Gn8E8`ol*AxSl@TF@Rq(Rfd3!z7?U41Go)%t_|eJE-kVfZchX|i7n`4OfsRDCTg z_Io{sl*qXAc;@yL$m=vC4&;v(PnIfxA2GNpEd3NUTs>>@)#?0KAv-olp@JD5`_N zND{pHr5(T2ed`jiZR(IB_ogE(1%Br|zhYixn>nq~v|4c{Ib7FMUBD_Jw*KxLo`NHl zLo`L|H#bB_kjJv}tnq^m5~m6*WOm6J7Ln=V!9k*0lxX!Se$g#3F*h*L`U7o@k-`;x z?mlgZs07Xbvj#@v3rt>iXz?R034-_jw8LiS9dKrDU_|lx4Byn$s}?JT=~zU(iYr>I zm3vjskw2pI!)~ylulmvqFDGY}7iM~XhK@9Xz*na~3T_qr?7JX9r(}nmCrtuVruD~> zaMs5`{9t-o$?~~?n@W{CS#KgbrviIPg0k5m$!DL)6Ac90FFot1)iM0o#$(DI$_j3_ zxL^)c{3mPSWI&V{d@nGc(n6iI?|Gf>uk5ys$^07rc^Q@VTR!S&qRzf`+Y_zYD)lUA z5rjGPipn=`h8{a_X71CKA6?2MW*Ssh&9 zF+&cJM;+$X!xbFLl5c@~Im}-w{W6_yEHCWgKOoXT-U7e>R(^<%-FKb17+IemNJ@Mq zK*Jncx?ZM4{MsjzRQt|!@2UmbHqXk|%NIZ9{~}YCUoOKZ)YT3d?lrC|Qz@a^JOGP3 zXN2AYzg=c}UADqV5ggC8ZQYia)Q%B#!P30w-G#K7Np;>kFlv|CBwNqrNy0t(zpJ~t z-gdClGj+XKRrMVpgJ^zqz8X@ro?3anWn(y5(Smq}s_XnY+gNPbt{t5HooTYc+}*v& zV>C(PCo|ZqHYDhIzeH7vh{nMIFi*M~%FELK+Rfzh__UGXWyt=ygs{JiQyh0wVTCUn zf~}prayvuecTrCmXe)LxgWI(L0Waq{ zZVp8&S!+7Gem^pQi_*qyNKLKIyleIZnf3KOfRSL-;b-CR@XK}V{MNTejA*EJrCZoRrHx=^y-qVrN!bejoQTIO5RRxPG-J|cyQ>02&pA^|rG`KJ)XthX0 zyDmk17FFct<{?F2aW31PnPdw)Y#VQ`tSf4|!VUZKRAZd2=$0rq;hnBCSDZ*Iqpp;i z-kxw_u~83wmu@?w`hJDYRIbUORYYpzOrJYX1Q;$tHRbD5(vx7Bx?&wxNkZNKg2EWm zY|5=MoU6Przc>?J=|Rg5w7#S7rWjZmYK`3ew)lK+n(%P^ps2p}RD#_aCAukW#W1GR zw#E-=xTP20lf*$0W@nY5O4IsH5ZyLLU4m4d_s{M((NS4H+|u)%^&``aF-tO?aGlf0u|JX+_+?kWnP%}8Ve&Q zWr~J22UWhYi(6Wg@`t3ZN;mr|Ha#ug6ZXtTD^(F9kM69#Y%{Y)Ckjs2QNd9!s}5Zj zY2+3g8{(S$YdnIwS&Z6*#-!gEy)(MrK09rc2CqpvRsS$`p)kxL^TzWTT?lF=R_@g- zE2_(&%nZKBK|WBkbXvamo_D2eAYjveI^>Y@aN`Aks#Sz9o@xsnDEC%)m2Y~)fA-w> zG&ggpRSWZ4W{+2gU>&<`8$JXz-r#xXBUi^GH9u0~n~-&RAn*H9_Z?+d6BIW%R;RG`ja}RX*xHIbL9(W0x zu-%4D7nyHSQ;+ORY9*9lHstgIgmBpuNynx2Wy zj5$5!ld>qhio(AZ(eJ=efkgzQA1@e0cx-Eu(jfY(-c)otb#~%nSO^ep`F`ay7{| zv+bgK*YGtEKT>nzf|ya)y3NJ3kL?Xt1tNDF7B>Z$N)Mdv%?Y!$k)p5FSf^Uz zY2=6D1M%Bk?)NAS+#YrvMGQaUneCTOmg@D)IlaK%@?w7|(Z)DM@{?NZ>8oS$_-gZg zhWRtXT91nV30NIZ_Jl1HXoBN><$Eu;w_0B~2TNXd#jmQOe9ChkoJvbhq22N%QFUG- z#RFQ_QE+bQ9$hrF=lXsd9TJcbWBPDMmBDW>^oe91B9B8=4Wi%|?$B?vK|}5VkS4J( zNi9-U2@Z2@*Sw03x67N`5iRG}c+cIr>B*0rI(LaD86Mo2p%o8zxIK+Zdb25;l@vVY z%%I3WpuEOTyIQ2-K5+!u+9+u*j1(29T&)Af37AB!Qz+W~do#KY>-eM=>aImMjm9#H z3Vc_8+!Z%dy!A*b4>TuovE4AOxu+`(Cd4wD*)@)88*>X1j@ZI`bla<}Bi6uy!%sX{%Wptaj*)S;jQ&&@*dE)k2GeuuuRLO@!I zE>z$HWQND(_g^}mB5tBLR(3giD%I`2|7f}`7%I9aG|BRQ9bG3?f&hn3${Qx zN`oqo7C<=$c=iXwmd^4oP}6SG*MeD}xK1}Ag~DvAQ&~lRANc3Za@O}h3-T9;+EfzY z%Su}|MagH|=ZFcESCNtW8hx5b9kv&$Y!VqUO)7f}`#9tcwVQ4}ARPI<7@ie>Xg&lM zeN?9av6dSA!QJ=xI^VIoJ#<%6MJ6lQ#(^4KLvXBZc=yggWIcPJz(JrGLRntP^`&Y5-EHGm;r2;W8g-Y&u%w#!+7H@Wxiw)M@h=_F8i}@C~e($RA4(f zt;kSs$3~Wp;ljFJ>IvGjJrEBM-~;3VpenWs!9OJFDs07=R>Nki1aC54m^irzh>@$6 z5Abh%4Vx%ztHZU>^>E${-X%JeZ-ukZRHitLkLE6!&7Sv>me*O#Q?T#P*BbRbhN)}G z6+Ks!)H}2X{qb-^!+ya4Fd>wy{K4l^6z>wb%eiqb`{%cl+z5w%lE{EL8 z1*1Qz+M>FT#?L@d zCvAd2ye45JlCy;G1jN@O;%7lY;*JAi@PPs4G~F0GX5Vo~BNPg=%}mq>j3K+slp@)2DXOA-C?jLpZy^>j+ zF?AtkTI}i4g{h}P^3$Mb-QCmiRg$CjVm?29uwNWNt&25sPnhoZ5)G^C-|iRLsal&| zrm9V%?I5qf_Br>?XQrfEy71Hxh6=(&6>Ci%cZ4K8ftprZ2w;K=K$$DplTrKpx-+${ zMZIJn3xg!@#H+1<<#F-ywY#4`kz{bhnr%}ba9?X(t7^P3*h-*9pjCUs2bUZ+z36>h zu+LtbUXa@}E9OD(xblTiU2*y>2pS(o6E`r>lcuZdRqjv(aOUQk1{J&4S>NDe^ThAN zY)z0W;{euQM(?M8Pt?}adaP`!`g==9u~t&|8t@N<%Xxbcji@LG?Z^h(PK5R#6tjBhs7#88HZqQb#-pdHVz3^rM2tRWHOvwh z-=kyLzjX}F*JaC33-w21C|5yhD#=s~n0mDjcdMTTp%BTmhliY25uEfPM-=o^!{C{~ z!N=F#T(2HaS#i)7->TR?lW>Sr^*DkhEpsei?JuF#mxopq>P?-zX=!oNg`B^`=H7{C z%I^Q%WMR9Dzb1AjC%U*t@4x5E_KpBgds!uQv#uiBDB46E;ssI6+>%^cc%c98l*bdm zQ3)9@o@maEl$m6UG~y`99d97^Pb20{5I|vp4fGp=C2SAj1Gma?Wlnb|Hr7g#sE*#Y z>JcFbpQo)>9r#>L`hLZck%+0yU@bqWl*<-a(Py^QnFY+L2a6UsT-X`;Cl0@x2^39O z%OPL7{U-nuO;kbZwZP<(^O)FM=MpOl)xvx+5kHLe|Hs~2hef%5{o;FX0~G-Q0f7N5 zatP^$t%yi>mw+@3&CqN`>5%U3?ixzz9&*SbWnhRwy5T&i-}h|3$Nir3*LmOHxqi=I zUKh^&+_l#FthGLCJx8^1nQ95Xpa)Hm3q#eu>NLW&^#BzfJ%B81intve`Wz>jc})6c z^te^UVibg`Kdu8*X|0kp__RuA!7L+b6H9PHm*Lwba*%tUZF%|2HL?5WpfqZUiMus+T=eL9qr4jb6y~jO5wRI*iRUWc!+vN zJJ~<9uWxxibK6W9MaNq@(s-{hXuxrB(13uTFkia%#QlEFr5xOdhCce(y3{_i@g+bX zAQjD7T?1emHsH0J&AU8S(0pR&6s(Y12}M}*$L16g6ywfS_l?XwOHPP%bv0t}x)DMA zM!8{v)5OR#C-1rb@>jmKoa;WZ7kQtB)V)M{c*lhNA91)Wz_bRRS(oA#PG$L$C_A#O zu3bX+C5fWt5__a~X?11Z&W18pbsxi&*0ZXo{akk?xHkjWVnoW9%>)dR=;*tJtGUgQ zpyjWRM|N7N5on_X4THyyBfJ@b?47Edxo1faoEF-?OtuS4{M$?!C4qYZQ`I4hvjFy!(!c0fXhZ0(u*uJw;&zpG(G>R;>5Nbx;HSOS7Y2pe62hGI$&b=z@sos0GI{WA$t@S^nd$Kg>j=B2xH7^+S zgQJDO&~g4^XIwcB6Ov;GrWHAQ3v2ZmHidL-K!70I{{ZaS+@%BWEI~!=0=f z=9yd^dP$WAVnkkWOF{TzmaO7hLDKpA=<2SS)n}Ct;ygOf?j$a}#ihorP>Gh756G`h zTOU5F%B!kLScz3%7N`jD?>Ce#mmSHr6rbdOQ>VL1eKCceR6jq@h!L5V8JhD-v3ZwOw4!~$WAM#zB;WBmA zDMvCD2a-Gdqn2B@qg4wn<0o90Og#!;h}EJ6m7+}UYLyS1VBuya@S>-R5UoxG4OIvWPJ9Y#$Qk|i{7eXnK0DE{R?tE$x zbMbaHu;HS-2a%qYTz(@&5XNNUou(#tv%W@b%JfBM+vl2$f-|3p+AV)ZRI*S)9q$*L z8?6|a<9lus*Y|3-ECm@J863~?oImi;ZF6;;AK>D+T5s1a2H zyZW!{wJ)a#3;7h=$6a!6b7(&T>Ek~CIxy05FrApe3kg{yT*;s1KhSmU>UybZN(=;? z5Tp<>Rx@TdhLsF6(@FN*-c9!{bciYk9YFOx`|m;nz+HFjL!nk&MMBG zE<-+tmCMVmd=c>o+Tkq=3Ro16Xu~%1OX%==Zrgyvnk71Ec#i($FGljJ8!-aJS}>2t zRkP1GQg0x$HfACbW+oDAAVWAM{gKiGIHkN4j2rF0uw- zui!IIErLlGC0GJwS^NFOp18#U-4;%!n=~uulcwp6fS9}vpj@NM-|*bGPw4wf)COWz zKN_=j*ti2u9b~uD4$k=Yz>eF6d4=rLVB)NN*%V4>n#}*ViAC}g0GS-Gyc_H3(8E?M~piS_@rsC;v=Lf+7 zyb+qpK+tQytrXEjE9OW}79HV`*50QSS(aAcKziGN14-Iii5DO_T|^!$kCW%m3lwrq z@6zV6p-SY!JRgJUAtp^2M2F;&o%?!1;2CU?uKzx2W453O_E;Fbqzo3*GEjGDJC31; zmpdu#qiS&n8AlG$Wd;q>2*TiXAx21|K#qH(vK4J`ZeBy7!rqQzdb#bZ9Ra5}uVIQw zJvrN%JK5OvPyzF;2W#5qgYG77`Usn9<0U}Gtr{J(XT`Suau(8D($gX29+~NT8R1$A zB&*;PczR7F%vo8?bx<`opi76Q0e$iNo7uC^_f~>MxNNye3cahZ`y*O-&`+q${sfWJN5u8PE(H4(5KMz0QWM2b+U702lxM;e!hGC=ifce zF-y3rS&S59)z4b`1fJZ9du}#LuBak%x>I2PJ>~q@yGty&_@~|4W}n~7wYv`?+0_Hg z#cQ^Gag!aw@NWF?KE|_qKsx3P$OLlMK+h`xpQLUc(bf(Zl^jGf_G!=}hv7YA?tz|3 zkx#y7ZQeWt65F472Bwee6l;uOEqBtp71##P?sJ0g+$B@(Q<{e3=jvZ6{o zqDxvzgNB9_pAUfKnoUklPL0D_6rx+w5kjdrAfm*iqFQt>z|kO@k$8ezPx;z6qE)>VX&Nvo>l(8;K0T3 zN{Nd9Lp${64`F3xNzt_Vo4*MGi2Uw*MovH8@2@?RRad7){Wc5uBR8K%0ddRk?>Wyd zC?K@^YZJKEUJoUu^?$tLLQw_b$NPQZ&p&0-uwp$1p0o>k@LDTq&J}>J4?7jYW3FAU zX7C~+5};;&16qK*x%W0#y!YMZxGSFB-F&QAhXBTWcB>4i!1(iW=DWg%hKVuP-0%Rc zeqG&+!0zGYxW~z5Wiq|LHv$2H|LfC5TlR*MTCv5_81gloYwkbYYHzj39!pf(e@16h zJlvGOxOJ`8?+FP+*>gIcyF8`~ z)W2<9j=LYPz#+0MiAJ#_wzi|N7z9_=F=b~TYs9(SJOaDV`9IIuToA?6$Zdz3%gI_0 z4X<6CJB*kP-)53!?MTJB&ALkGU4m-RCty418l#wIlb^_a36gII)oPNo?Q#S}ztGqR zC7bXkq`6yvfK+!E-J~&m+EH;A-)c`YEWbV{(ARH+TBmfKfktofk)~q3OWy2gySq6J zZrQrD8=f6IM{Mw+KY=$d)r!gFv!w!$3W%e%L*Tf+Tp3eGsl~mzE!DM~Tul7yWAaA? zt<3SzK~Vo*B&<$MBjjx`AysTl;TeI4Hvf#{;x_Q+JvE*t@wa7FU%@m+2cxbyVE${YDwQ*)7it;%2;v)jr1y5V@5uljj7P2nzf^` z^<7#ah?D1$drNzeAK{4~3OfEdLokZM?2MP2-B6!9+;rtMD3;tdB#%{0?X|Cf*7o%I zg2|&r?#_8UABCIo(vOhd^mUP5Pb}(`$u1r}(xVV#QIC%;GueP_EzInu8Y!wp$9(wO zi$gw4=km5*_>b2TD5#w}q#vf3Houx` za_y_O*O9Bd8~mxR(*7X& zFXqwC?Qs3NvbA1oxxQ@B^`w>bDOKSDLmr9Ux+a&Lo3&gR>hx0YgvMOcxy)t*I!C=Q zCVjaCt(d(Mh^C*B(=3^#-eZkDmQ}CQGsu#byug+Wp8_hEc_lB%|KZDG&(*viwa#u5oai;7B@uSH{Oi4<(W0tAZlLNZB z%dT&yr1GY3P1O+fJS3CsS7=jqqOb#XB_b8Oct9N`mpU*_?(h26$P!nh)MC;9Q|^LS zcO8&p$^5-QmV=Q6W;UeCdL#FYsE1NZKla*-*~4nL0qVG1)_TNIU0H)Z?Pf%^Q~ zd(=H8AA}@kaex}Qu%>Z>d)j3wdxxRvvqr{{*E(FBjyZhdJ}!S8gZJD*EaKIXLgj@H z)Be<-$f{J(H!r70YNzHB`r)p`)5S}LW}o_Z6Vay;!mDLzAn$xI+77~;2-N`oo8yv7 zPtr!s>h<|k!Ev43#}7;3TeS`nzNY#p8_Ak`T+~x+Ntqk#7JbEG)PvXIO#%jVYvN@5}#Jg%|5u0*$IqM-7h|-Wk=9dY)i;GnfX%E9 zhX$W(^)uzYy{_lwgIgw3Wb@e0B_>xDo^)KPU8uqKv2pUFDI>oM&;l=#UPr3Ep*bRPAF(N2@jJikJU4lWp4PK>+uV|Un`%=5bBGAaquBTQU z71bB-xXx|lTx2vZ>R^9f1kxP@(PbFIw2x4|J;b9B+XiZc9p z3Hxd5R0j-Qui>KIWE{-JBO8LYg_+lUhbLi_#S34HmKK?2>$g?(G2%-czTa_K{uSwx z1}b|`Ps~Wg7F{~;Uat1|^%Yas3R;<1tnG2h3n=7i_;@KALjMlcU^{P6Wx0xsc5yYj zaU_?j(mnm}mlVKw_RC)?)8pf$q+Q!RO_N10Z!*4a&=r&M|AWT=XE5%6cSwFgsl!vb zIh4yp5=@)O$FmbHSUPJ#US^J6cB zaxF(hm%iakl5@wy&jmH|Fs0_~eUmZ!0aqqsDc6IshH`lFsVG#aGVRJ>EC#_;(RgJa zaG4(fP8nn|?)4APlhfv4pNVQ8GgK(O5u&hVF@}(Kt*|;4zfhSV_trUfkH!?}=v>jM zI_)6DJj0geI*Y~$l*fL>dS!P$;;$MHRbk@x`%SHAqCT5T1&OcBT_B@EL+a4|P$y_% zKyZ?KW46*+;l-F_HoN`ue%KYit-z>vzI4-@Ez+B?>WKgC=3OyH{M$clu*&R+VSs(D z7nW;Im10nVgrNbFQeeDRx%GY5rp~E*5azD#t1I)H>F=8d>8%(q@kH>*xr@9aKzw^a z;jl2W*AnN_IsM@|_|goh;e-?S*&##HgV-cZ#<=jcHN@;KDN=Eb&=W#sswbT@6meou zicZI2jT6&<)aUL|zZG4&1`@FxkyW%0ww zz<1 z4o%v4TxtAxeKZyA&#TRxG@Ze}Oh)(joi3jQ=If(J|07JZVh6RHN+Zu75<$Njw7`@! z`VeGmBg;;os|+m`D9e_IB^%R5V_wrw#WFC?#%9H&tIdC0jf#?`ry@C_?~?I|s$8{E z89K8B?{G19C2~XF+GiJ8KDPfZv=0zXqm9~|xs1i)O+8hN-=Bd!M;uha;HPMTimr2 z++bmB*497Loxm}hdy@(d^*n!Lt}qny1-N*-W>!?~fLdz(v=TLIeBfzs+5Az_$9`Ft z=?d6)8H;b>0y>%tc6_1{4ZwfbTnI09+S2IIKv_BqP z)fk9r5Tc96f+rgfp+n9P?4@PDIk|%$5SQ3P3FJK`?da}Kx$cIbg4H5A3%_D&9?#8jhJi`pcw9Nv!*Uz(@uhF1U1X^gqCcRz?^ zv>}L1-|(e<_U!O-)aeANkD0T~GMsxW5rL&C!GSdGS$9mOto z*NT9IX9Z{IGcS9f0rG-|z3Q_16>IZT;S>wimudCg(wPo)c3KMm>WqX{Tf!i=y*t_- z9QvY_0<;_LD5B*0F`I>KivDwfoUiTKRey;nYXx9d1+JKkf31CJhZawDhBDRYdM394 zrS6&iUK$2D#f5Bg>kdFBs~&corgQZ`vu373*{sx>#9R0i1P@c~dLI>uYK3CR1b=z@ zL+`Oks{&JYje3XIl8ZDE+9H z&>+fR;Uo`qxcQF7@6XYFF$?6$kk@W3S*jyvmg47J`l56)xjg(!CvD-V;5A!JG@fJv z3U$vPJfxkD^{d-+VM`!C1J$2xXxBdZL~orlk-r?#&Me^ zw>(4S3kwA1%lly_L^Jg7uI*1Od%hgBqs~TF!&#s9#;I#`Uex#%L}QZMefkq^ z-B1ry3ExhM&hC9y)Vh>=nfqvAAGipjwavj_J6-qng~bjd{}D>HXQxR+C89F#t(e(_ zOtC`9@&vsxf=Md*^cb$e|!rV!rKa3fZ40A%KYj|cnZ}dWT5^ag6ivN zkvVTpm2x9GEd5WO8Slp|XrnPMc1r6~%J<3L&YZXUBe2(qQOpT30yg8PaG_Hpc`X}9 ziAZ)AUmOW&CI!&3+V-@grvs-ifzVaop}D0%*|1KyxKq0jqkDiK&r+sXWXRYP!?AuC zHg29Q3#)Tq2wzO^*#;;fHrg<-!>@7{yTZxKvW4}6^{1$B3&Y7o776y84%?$&yQUU| zh3bJzrY-RxHQ>RACH_bZxhTH^(Z~8zXzPj$WV=LeaDMbxs5No=ACM?s@oqFDMpoaw5qqv)cs%wGft2I2KCj!@Ar-$**EFIUAn)nTSM4`Jwb%n<65>DPW{18kre?)ugQmSD$S7pv2` znPDM!VbkUgeiA93I>$x=Dc_*PvfIXOMsR4B&P2&u_)wQ=xV{k%6_4I)`*okqTs@!h z9dC3x#E21$3|%<=VmuY@DVbmk5uL7#pdTwFb|ckwJ1*ajXG7Jv?3*L^U{@^N&pg&~ z>;*`SaEJ zEbBbd_o9uDo{>t1@LR5R$WWSWX zj<#raUCiREk*|xzd$&0Fm;PKBDS@6J zZC)TR4vQ}qo6g`DTf)1+7H(iW(Ie(1?b@XSa&Xh^TPXavJHdX65(3c?+VP^iIPnDj z=dmz@YYypVyh9Fq&C#iucBrnNU?wfJ^7Wiy@yd-VW`BA4gV{3 z6-UX0F#D&fEU0@?n^H`DGQ?4}>mTKndmr7Waw`>7SHp+`Ek!JQZKQdZ>AAV3Tx{*_ zYYn&MITzmy-1%RIRsZsU6Q7Rd!TISz=Sf}1tQI#~L&ELLDk=4psxzsbQYtVt93_L` z(+V`VLe})5+xA8wVKRtZ+tK|)S-XEF7)$Zf`=;lAr!K4*H`b6EW8Ywa;ITCDZFdzL zU@#!h&3sdqvNJ)HQ(W!t{&6m}s$KBZbbSXqJ))EW;Q`8Hq{BYH`FHw3TJq6)`&~x@(cF!evbezaV7E$#OJ)=1S3C6A^w$E=5i@AwrnVPh0hg{Rc1+wI0cddkKD zw&sv~B^>vIII{a4$pqYFY^Q5@y3gz&L9FwU2=I){!`nQ;tszNS-(D9A@MW`kM)<^t zXeDA?w14R*!IzH|9ngR2pLcd&!!|QW8(38j4L@GUU&31s@vPuze7hKS2akf!R*}Io zUf$U*W9JWW-v0)-V&A%t{Yr^4-VoSGbWP+o1-)!o)-2`8;D(Ke|5$JFcxc+xXAI_R z_i%XRjy<8B@7j=dF8?plz4M}56!Sy5dd{@%>8FzITY37yiMhZk1ICzYxGh@?$ML9o zNfjHlNnvTTQVyzSOWfj-B(w~qK0szoD;gsKdV=px+$0)>Au1>@q9b|{p6Y(GJx9U-o6KkSSz}Lnyl+H`E)N$LT+aKK@ z%dAs?{t8eu?RHfk;wWV+&Svt5(kv`{yHhpAvwv(E{f8ydP^wbb# zcg`VvyX&_iT?xQYl_rsn{*f{u>J?@*oy@y>9+;QFn`aHN7#un@&L@t_ zS%Ug?hgC1!by#Mkm_PF+x|(PEd0$njbkvLRupvQmuReleHOtYw3_#GxN|qT3E3?;B zh>Wt7WSDKtd(2;}FBX|7rT{KiRi#YScBX9y8rl|#LLHKRWmCU<8moz={3a2QD>FEM`HekPfKNs;e$&z{Kv#pDYa4<=kj{U z&N&ppA${A=z&AByfmDt>9$fuxG@h!+XM0f1%p{+ zl-O{&wRu}(*Zv`-H0z2!I3uclg(kRuDKnnQ8b^KIafK`=3JfjED)eGdVJ*>wavnQm zrPHr=>lEy?w(v^ZHzh}Eh&6BfYlZ4e_LIu(c!sR6_x$Y;{~n$D0nA&Qd_`4B)@-kv zp67HcMrDYghqok}gRKY+g@dP9kHbqD`cwBC9(nuL4N-t_%KA-=?d zHFKja{7!O+4*m&=7%yS*TQDY@f@qokpGR=0ci{qhgN`#jP(SK8>~@!oP&R_{wh^*y z7Adt+MJem}Dh4lk6!^;}WMg{s^M4_yr;^S)%|_Z;b8~xxkzy!@a4%E_LIaNLAgoKP zN*Sl>Y*|5I?bOTDO1j!#d-E5E*4h+T&EgIiwG6Z0LWT3Tr!%^}b|NSE95d_JEhy>~ zBF{i-YR+6Uz_(h5p98DO`uAx3&uGxa`g$3w7WPRGr_2gNMqWjPOWo`;Zxdpqlj~%th7JZ^Zeg2ys#01vAdD} zLftRuA{bC;Ii?3X&c=rUPYkF$S$ELhwQZ!>l2wdM$f`6BbHiBcI(<_WeKdlII#x2E zN#oGo{l#EhY=}_u@iX`Bbcb-AQ=z;U>(8rYY0V9Va0`FoOK%mgkCxXKsm4~SKdax? zk?NWsZyxEw8(zd7Uceq+q$)}}HQBqbH@KP`!sxI1wa#=4Z@8_AD4;Q6ci{jo&;eRl zVQDJzFaOohESQgqO#(2O8c?a*0NB6aK<5~m7VIEkhz~H54HZ&5-$noQwf=0CU&Y0| zOXgm@Qh#2+>@7Fa4w8rtG6OzTcdvs$Y$Q>H=~vb}XaR`gQ)V9#dUK+$gk57D5qox#ZbD|C_9rbZbjY~a|`0l?_*Boh{2{TX@mcoiR^#rm4 zzVy6&uf&=2NbLkPgwbuW@+Uc3|~(k{#okfR|x<{jND^ze6j@L@JM zZ>cI!8kO25GE)fyYQ=oYb@Ob#<J{+9gR^J3z@0ek%OhxUesf-JHs zv%kAt@uvPu$=v_P_xk@f_k4IN#=vUmw{X+X+akwfIP+0{G{c`WsF*H*k5D}fKLIOO zakN>Lo;y9`N0)!Fn5wIMv*8K%A;6j}?$2IrOwic=y8j`SqE8>5RpJ-hv^slc9xEtb z8?15R4^YMjKmD85xrg9Dl{~#g=*OEON#A#OVD*vh4J4U8%#g|+y9oQ9z)SnLRApw&;@6_DhhMbgeCP{#6o-S)+8Jl< z)ZBZvzlf9L8TNuk*k0C~Vo2jF);cE^XEQ_4xfWCiw}IXupWrFz(%k&?uJ|>kI?e-v zlj+R2_x4p5zO3(xd!@%QbZ|gHpyV*uq5bEB^|PPu4d>U|cK+n8Ps|e3NtaOwK03+Z zLLEA6IBnsx=;Ky)G00ENpK$d@>b`ir!|b&T88^R3QQ5PuD_DNRCWez_Dkyk%U~!~B z%1W+Z?uTB;FK=|P@7UhLFw3O}@;bg{4nXIwi&#o?4 zb9YTNS2Z*g^aNtAw&NjbTd5mN_M0JtuJ2Nd43=O-XiAdI>z;S|$*~JP_UHXf{1vP~ z-9Uhsf8VswO-}cH4{)GzOzAGu2A#(H2iph zigxNr*E3og`X|_7(e4Pv3VIRm!m7KhC2l1K9XVOwc|rfyO4@41LhlB8}3K)wVa zMAvD}6tX7grlWb}j%=)79D4_m6VmPzG7Xiy6L%d!8o`x?#tnDFDx;8GR2;9TX1@%% zziEEe)08+;@ihc986)((LIaCsx`fqk>|J@2QF}G($6c~oM$sbzVqD^mTcl0T2}#G5 z9EWJ~(rc%lE$t2g)ObQ^Oj5u;{U)CqoVHpjkiZqqW|2B>Eb$_+rnTf9I%-ECf^FR5 zj{LzJS4o|e^r+THPoMTqTMcaoEm*Uk#I?Z}x$<;Jx(eCb2A3Mj-MSVaZC3KKC!OuA zh)vxivTVA8{t+7tZckEV{=K@59Je6)00hSI(3TNvgRW@Mb^vI04Z<_4W!_7P>LJmD zxxhU7`=&oVQ(Ct-dC&81T~JI5G%{=;w`0uW8dmeoZ({%YOP~`vM_8m7tosQpgqKlQ zQa8H#Hel!EuOy-RCVhErm!YOJHu_cWE}c(e7hev`QuOH^rF6~wQGKdBJ>vM@Vk=27 zw5}k&i-T^$87`)H(>!h(G14;msXuYzRh{O1(vhHaR#HzRQQzX*K`sPnp}HJv3~+3! zIm)%yRRl$V#wdr;Zgp`{^>Q2K53vgAtV}gZI_yXs*~O$IO9Q;35=~^`WmJ3DD`t0~ zJrUR%6&;9ip?XI*MM;vIl29+59VT~DrI2O+AWPo&Dn0$u4aAdNQBYdNi9%c7Ppsx4 zd=<+gZ&77ddxybBnRp-F)~d^A8Jwfs+H8rC70W3{wj*A+8b-4BBIf=)D+)G-TN>OU zt#C`;OEFuWN1<)&DP*wrb|2KYmO~v+daJVTO$Di(9Nv}YeR!_DhoA4uYavSp7^XDZ zD=_=m2!bnV$LyF+;HD-tZd{w0|6a6`H9-&fxU^L)p%&%{D2PZC1-_rQ-*#71M8lLJ zzP-S~WK?q~2!d@FlI17ss9vSH6J?R;uUK}fK4VjjyNJ(73u3E0X7!=|!U#f_XW9uGzRxzo4U1K;CQE zllWqP!53qI+jIM_6qLRG*5z%v;*RxA2Jp&IPS+Xt0OcsRw^&yr2+b5H&|Wfq28LnS zB(7B)?hamJj5}T$LiwgvQ<2j8k^vex>gyWu6Hz;ZoQjd&)rES+7IS=B_xO_P4U?;J)E<3Rm!1F3Nsc;w5O3Og=k6`R4p0)MSG3dq{YWjTV9nB}5ZilEBw`hb zg=vf6?%OrKX_v)HiC0XBI+(R1X*50Z_MPjf9Ei4euy_oAJK{-7yR>xAU+-0cj`%tw zeKRzwFxL?}RLS8Qv=(5JYZ@C=_7N?l40ESAi|#n^S{aSjz&$r)^BpIBrm$JiFfGPhbYF2Ii;grBWqT;b?8m@0c=MwmFTb5gX%N-~Ali zeZ+&CJFw!k9hFrVud=pvjhxo^39hE=0GcV=>dzg2)S4};iJ{f;L%Wd=l|GDiQZ<6& zVgU7BB7drO5TYEL+{|I(QRR-pbs#0H9K@g*1Sm(^Qi$+mqk(drVS{f3@T5F~ips=T zOXmcO+*lH^h%+H2_G};1{tKXL%szzUQedu9R1hzE^-O)u>a;;{?QzBWj4E66nUN7V zQC@$r=~+R1>_dL$Y3ley=B$SlsTIN@9ztxbBQ!!SFiqa_T#@+c!eH9sAl`jyoB*>t znc0U(_NE@mHc-FfCyYE_Io%f@!#fJ4v6jTL4v&@XSV*KzWc|Ece7OkOHzXS{hRW2!nM`_OiwgQs_6b;~!( zqNuM|Yb`UeH)dSL_56}HrgMcPQqJXKS3p5S)`aq4A2k%C#Wf?q!UbxPg}z#YmWN?RhOqTQ)vX8En8s$4|m7McY;Dr3!x=~PTd-{(pb0z z%Wnidd!px@zHbHOircLYwzC8EOOvI`@RJSI_srFr+lFW$7ArV#b&G)dw({Dsm?c*P zkH`KS$IGIJv@Mny3|;U^B9|gh#iK`As&<1Yj*pz1oJR6hj*$LES9aq(Dh>b!#l}8% z)C`YVT%TY6=*8$GM?!t(Xj$)|68tGju!Gjj+ttJYl0T(8=&4N$rS8D1>OIZXYTFjv zhmbT;beHI))c9Z4IF58Z*>#Zteb^VtskZWRkLgVfjJ2H{%%V8)+x*tiAYpaGp;ld1 zRetZer7Nx}uQlXV)=74LUW~}fKC2TtMr31yfH)q_0}trH+U!hf9oJ!Mv%GCO1LiUv z!(Rf*mw}t1=6=OKxRBc&`VSpxSbP=EXK# zmX@8zX8FM(NcObH#o9q?IGB|_E?3#oE_hsLi!f4LgfXCSMMn%E5$-lz37DMKa{CxU zZaLh?cZXO>JQK=B|sI-T0ZgVr!JXE0R*@myDpAB;h^D^UMmd zqx5b}bu~5FjHYApSvq+-L`Oog&4Dm%6_q2nH=w?vN)V$x^Us+){b`d7>~Yl~;h6 z^p7e6Hu_d88yD=$=+zc{zd82|&nj^ABYvX_NFJmLrK!A15&n@nIt_4LTv*OL;9Fty zRZZt9;(=k@%tWu~f*(}ML)HEBQB&B;{3y8pIaGzE`0pFgrxD0oF!lN-qwv$&?!fAL zpzM4zwe?+;=N%d&^BIMh2y_WIpc`Jk3`r6`>RF6$vG)_faW_#ufQ|XH=ORUoujopI zN^fcpkJ8(r)GoG)yAN_sI#XI3j*)>jOI6Pp*- z(={ph$=7ko(|FiuthYa;w6@_uEg){YZ^na!o0Df0h0@#*b@d_%kv!bU353+u83=Rx zRBd`2^y*2nR!J%8mTXAhq}sP(zJwLNMGc21A;4uFS;EFB@f!-%8aBEJoh}Qe=7PzC z$q7feVb4z-_a4V1a7?wh$CbFBmB_sLGx4v#_@2LWc<;65?LA^itj>}ra)vj97ei(> zSy8mLC87sq_92;7am<`*DqooXMRug1GNxsz^S)0^ix7=yJE+Xg=hKhw2n}1)UAoE0 z)nZ9vEe-hx^0s4c7iNbO26|KM#SRHZU@(Ni1N#qM6AKe(u z|5Enxi?ADo%aQ%zVmxa5IR zn985u0#ZFg+b8(4ROmx{>9VrA~3y6Ncp5bxEhx+DXv*_i)587WZQs+%LDG^C1{CDDgpIJMoC?>{| zy!5g0Y{~i0VxG#cd)R9Zyzk42KH|$__mX&8v6;Hby?iMcE>3g5@^yoY0~vSGRHout zuXK==F7Cl}wn#!bhM`{d-!}-6@B(N$aVZCg_sg=B9yZkh%r6Jj&mS(FEAPx$i5Ljo zR^qog^o7pI!yGCg>Q-%GbCTI{0(FLt)wlsX#x^LJ`PNm+5+DdXQt;FaqDd2=0mG&4 z(Cx+=qXF`fiDvCv$f8dk?qr9|a{~(1ki=I(tNk(he69su;qj1g++U0a6d`@Tzn)>L zaKqKIYl%yEkCTvo5FJGlfsg>AS};Y8#9$2Z&G?GbOh(;9hUpJmUQoU+NgSZ=PfYUk17As5QMlpuDNT! zO{oL~Ket71vHkjJcV6l5IIE+@s^JYIg{rh{Wf<6K5Js0Z8abAnA*b~b1IxPt=>C-r z&rc!=Eu;&q*%NabD)SB^8+Bi%FpRrv9O3su`gdg`l5U?_=WO%*PL=u8y@sUbkt)@# zt(!Qj_7=Jqt%EcnJAKSz#Y#|{e_**c9{DjdmZ(2+dr*2%H^97!@I0|3<>ncF_Uz3h z&|*_c`L2m`2SGR^6|c$hC!t4Qp09>*XMb6E3N zoef>Zj~^>mKy**PxJ9d!E(hOiGdD5 zlv+5&PIHgZ_f#|LUg7+?-L9O=He5C4O`_YP}%>B2?#-WF7viU>+m6zL!!9fE>@bdXLc(mM#DR~tnTkS<+% z4IKi6BGRPy7D@ypbYkc&$^9YteV_aI?epAw?s?Ar^Gr|=Lv|=`x z98$3Kn{x!`9~2Y4%LT)F-jkm3L6CWDhJ9af?Vb;n38!Zg^$SdIr3k2M|^ARB92yCM3wzp;|&Z223+<^1Lo+o0G0DLuN z?FrU$JSyqpoGa&tD)aVlb)8w%@`*k+!v%wu5KbQudINDzvq9I%du{-1!0wxzv|%K@ z9Jv~GI1#aKQdnDI+R|MVgB&a0LijUi*6T*WTpIm)7m^ecHo+YQcUaA-W#S#ygWWYp zIQ1!Za|IRy7dgDs5pT{CNWK}xf5o0BBzskqMC$7^Q6LKW@8BA-&7Ref^Jn>3X&+yk zPk`B4QD4(qSaY3zYcctJoe@o^m>dnWn*k&d`=YZA(5=P`w}Jo;)NF&GWge$X7HBH@ z==ouuuy#H`3~)qkx|6~fqQS`Mb$Mr~Hx&l0hGAYREWZ>yiv%cblM^)?vj;7A(&2B; zCQN&*BuNpktm8pj{muYji>Xk~HFN!!)9PtZiCb8!WvF@auwwR6b2=3YnsAfg95Yv2 zo2XEd0S~?9af9 z2&w}_tE+X8aSG4?{D|#P&bkuPPXM^${s(44y`VhBzl^s&E#pe2RCxvSFTU?>h60<%Z9)m-EbcT){FAZ>X5m%7IPjP|HuxQQUJigOb;mZ z`R%7D5jB=`=-6hl@t6$4n`!_hYlEL-9B#7F7(HljqoY$UTK#}gJx(?~FY)twp_6)v z_dbA@O3LMQ$q?yP-_8ubPk8&g9^;yuZ3XDU$iu8?nuURTc~GWP)`d<%B_KkXeCE#L`3cg zFhVWNm(y3H0)UNTuN~gt(B4u(sF>A@74^0Qh#=JyG+Fgy;RkaA?fpsdxbl3<8D2=s z>p=&d%|p|5x`TFllPmiSzNNXtlXfF_1J!O=FCC4t%L1gX~e3@RJKi!Y6lqhTo=Ed z&`MlW?lTsN^oY4$UcgiiAani!px+;&QmOo~qTu6vWaJcK{lRMMvWzrE=)O_cSGpKQ zW++Qp&RCq;4V#E#NPaDkg0{8B+uM12LuG624TXs%Zp{RQ(nLCZ2kGB1P4$6v^_Ga7 zg7Fe$SITpfmU2ez{K;LEvQa2JK{KP3M0?w^VX(7}+)EJGxcgdP*ILzq^J(4ne?VaZ zXP#$-0&nJB6GX9fE6^ek9KiH@bVSVsx0<#3dbnd}O99m4!i1(C*3odit9OSjes6!Q zu{|BM=hL_+4c7F)JsS@l%GSSnZwqh*EJqfo z!ztu-1u}Nga*UHtk{stYs|durls(E!Td-NPj{n3SsGd-ug49+`qt*+ z%;RA$BjHS8J2KTi8r^K|rWx8itS(`gh|H(n-w+X=|F-;QUm~rSEyeAQdgA6cDocRd zPzUybyPKwJ|923oe88{?U3^ONvIk_UY9*$SdbWW=qZME2xXi@EGsEAM3kMhnqK$x38`I z9_bT1%E_{6)F%sA6o4_rJr|%S8wA@z6+12N85v>xa)Jo1%r5^|Xg>n(C=$rjfZUp1 zPaRdA4~({Mk1WboXn+|SR;yNh9hhCq=O~Cn@=k6caSQm323#!OJROEZ+b@K9);ecS zeqG^>_T&RV$tnlkI`b__xtYRG*X`wQ4whl5@N2&0DISOTBP1w{#>*BvyRc57)vpr{ zSfiv`U))${d!)UV;-N>7z}jARHk@e?A`$UwbwH zem8*lXO9=~R1VwoN#e;S@-1d4v5~gQM38-(;AGuBhTf|lOdWF&Fd6^}SX&W+wuC&D z^1ko=5VlR`KRH?TP11$jSiL+3V2VX?W8;DA3ZP;eP>v4=+y(!;9$s2XE=~DUAWG}+ z#oAe%hh8g4#yE9y>lJ)$3`#8DNGvxOewwoSgt_9#!dLUHVCAAQ$qHOH`(2Wy68lQO zkXHvGK%)eW6@QgNJOFovH@J9VB+o-%hyi5^|6TWQ(R?}kmgvMj>Y!x#S_W^RpvV#z z%I(JSHz&*QBX2@^PWh=tmZC2g$5tB$s$(*CaF!0Q8UctJb(~~&Oc02Cj{(ojOk;iKId&FWrr10G0AL4_ zP2~XnVbx{Rd_j0>8n*<XGP$D zr+~QccG!SF8J5lZ3{voeK|(_dim1iU@2cmQpE7eU!B$vy?KC1tTDmL9j|q^hd=;{RX<0rzT0c#gUjS$^cxyb10OR^0Nfyi-EIFdqTH%A?@} zGzFQ3)V(mq6tM70m;pirenT7cQ2UXFC;2~YHdN9$wEJAS#x*Gs=D;ea;?8|evJQQ2 z)b|i_LCdhpduux1$JGdL2`O_hZRn=<>h!(#~1uINKXl~CmB3nlpvKga&99NBT{(G#ac+x+`RAN&Ky{RNR<1zhJ?rzUpw^YI^p+o10^{WTd z)+M35Yj>Z9N4huz&!L||5|TpkgUOc{9b3CdcR5?Btn@WVrtHXT~}aB}t@)&;W{b`s+}*OTI$N8>$5fd3Y74vrB%iQYALrlsEAqa=G`bnE=vdjnP(OD`@z zx^mWF?;%i_f-UGX)7vN4=Jim9LWp};-*H*I+p|DkxYtYoav#C2=_RC%T~jgy;|>l- zV7kf`)?#_ZBhyI4A&lV>e&p_til}KYkNquzLiw*l?*)@RHrgptFjFN0HPw?s-}B|D zjb=*|cdp7!B(IL>Q6&)a#KW@rDKcQ!>?|gdGWFY^THR2avnVR&^ZHQDJqzt`P)YXM zkO_;Eun9I?InY3AGeSOnkwE<+)7QY;{v+qK*fMSH)~SB!jepneJ%Hr59P(lzk3V~o zwS;InktCKzhu*=;&FWT=AFj%J?ywz_j7{q0^u`& zd&HqS4>nI;v~MW7~tq#biTu?^AQy* z%0x0oV{3p!sz!nzs`n}`&NZiPNB?t6MY{)?epoXSOhT`H)Oh1d16##vgBYH22ch#8 za6a0$9#hDfwvhc%1AN|LkW(kMQ8)1f_rvWZXKsRbA|@p7&tk!mCwW?Zbgpp#*e7ww z6?Hj~pqcD8rwH8B-KME9g#FHC;bx+QPRAZpwrO+MB}#r&tWvIV=*{P*p(y}+U|Fle z5PUwTzDyDIB0Qk$&xnt{))7By%3&P(+#%!jJON)X+9r~SrDPALn|tA>TcrWXy9% z_mA8u=pN3^P_iMesa;GI(_G|(85(+sr;$U}9T=jfp2}Hk_q-=qwcvzRM$JEnw!ztT zE_aQ=QUG;PRRWEJ=PnEIw1rD_60L|a{ca}0!eGlNqPvg_&5;d9Evg`Vo;=|eGJ?|G zaRmW49U<|Y{@Am+m{VS%j#RTx4W__!2oSaXenC<;tNUFppzN4$!cg;z{S zDBZtM-@14JyBGH(H%mun9p;Ul^W!Io5KIiT^ugvE9EA7?xqYrWH^@lAp5SRVfe`jA zB^FEvSQyp(L3}i2gbt^uTdf(f27*4{tefIVHN4G}y8gUF z8h7UIzqanI@%++Uisq`1q?xJG{Bg9+0f6T+U#(i1Xt6^!{<|tyqj5ddy`D_2FIJ5sFtPd(e&L7|x5U#V zMEdA={m!8iF zIAW>*j-5u7e$$wy#|$}xpSllp#kOL1U=3LFIWLdh=-A{5e7m%N1x@^Kc2aX&Uwl)F zZTm$PKJHNpiPr<_b z->Oye2<>4Wj`PYW=K)D87r){@atyRJFBurR2Tm{2T`M)tUUR`yL z+zs=S`D+W-?+ga5qZGPyl>{Xp@2dEagB`1pm1M8sSU?G&HF84PQM0FBI zlZ%;{s}0}YN&StvP?75Ot}MFEiAJSK`YUohreM$O?H1i_XY|i} zm-w62f9wv$qP|Fanl{DMQn6}I>y$6X+}7V(*q-mCDi|R&HLZ}Y=j(FM_}yCLoZWVM z2{@u-M&=jzZ4g_=2t-N@XG6UkCL|++s=fX5irn>JX&+sXd%7a`YZ4|1*K#5K?dm zH1J!84O7-XJ-$A=g1N%t(w}s=Y?Q5s^d_L>IyPY2+uJ=wJvZq_;qBJ`uyJ6*LAY;suO?0>XGN=!_AFv|FYkl=R1 z$W;&NKtL%2bU{i(LlZ^vH@v=nnwOsW$Dc)5n(eB` z1Q&G3?~`%=d*BmyU;cP1;P|r<5076z`SDNY7UcA&7kA$uKk9M(@8Q)i z)F(gvaqFVVN$-FB@&4?8Yj)%Npcqc+$4$5w+mP$*pZ-+b1Ycgyc#{2?xjGGRM%rgp zfXpJ4_5446)o(rgfB$2fCqlUq`vbFZ+TvYc7AC&extF5AC;h(}q0JXm^^EBH(@Y$Q zqjHLh_`U3J)*Jrl78Ab6Msxgau@iaj>Q+5({9b3dXLnq*>~XWS(OSt(Zh{Zz0k4s| zu$wglKOt1mMVpY^CkCPwU^bGWqys$j>zF$r*2K8Cv&d9$8y!^w{TKYQe)X#1n zhY}~gIc-!H^~c~XAaZ(tQt!V`f5?4JgithR|>k%-5TPJn+ zJ)r;FL@<0GXAC^PA{m#gZR(|4!NMx9a#hw-1SH_fz!Vfwp5HciaMV;P#t*{1r)8BP zCjCxMs4m5L&D+*%glcsq1Y7%TSUk8bES)aQ$Fes_abjxDf%G~9bH}>^Y+*{YpX3x{ z-zxUC#PI~*mOGt>qha$Oht_N7BNV>ybQ1Bb1-g*cw`It(YX z8zz4`S2J84)OU>0ZEN~-bKyVc(c$df(}j@YfKW4+-R*YNC!VDeU~SZJALGp|w(_(x z`BJ4a+ulDXPOlnF;shENg;0M;H2?5vhDUETLekNLJS zx#=olnK-QPmMXT@`{Wl)V8^2M8163cVa9o%!GxGOuwdG{rKA&GP;hs=_79BLJ#_;bq>D8>a63zXF$@RW$6@JU7V8tG>8T=5!-PA!pB?-%|vC&@T1{1Av~{ zCyql$e=S7yWFFS%a!keCyz)Rte#x?;p_sx}iI}33P>CI(uUv!v-kzRf)~l?^D>D4_ zTm0I)t}{ApebCCuG)i zQMaaBeKhM6jG7=Yr7$MR{{8X^*yuh-bw1%Bvda-JVv@@%IbmX!I^2!1_U z=+KV~BC?g8p2xAi|KbmWwJ9=RmfN#QakQeEU4oJ}=?u0pZu2>NYY1d?C8%SuT}FFi zD4Tw$q56|wj~MM5+GUFg`CgK*1f(r#6q)Zh^y>PxRNR$i-?T!p&+9?tKKe)O4e%a8 z)2f;%0dLCK`s;`V{9oH^@wcYw7cN<#U#H3IyMBbE9{VH3Q!Di5N;|c*oTh>@$*yiBIBpWm`pu>lRt0sA)>mk8Z4YL1?PBjW7vK6ZB5^& z7k`+F2kCk4j2$`zad+;tz|_IBf3>+#J^l8{1EcRW@xIV~#LHSKu5Zl^UUN&PHjb7% zAn#C;)w`&+-;M$rm31xz;+wDJqjw7w-UDkUc2Qr;9u7hEIdRvnKDd5F?XqcT|{U4y`XV9ci|yd_MyYaolUjfrp`ihQ8qm) z^KyJws-D@^a=VnnvpuiX*Qi5i3DTBTdyAOVeKqnMhgPXeEWH2P{!|~!FFPTHrCH=s zI`qELHy6y2k zv*bX4#7^>)ck=RqlV_>`pGK2%LtJ`Fw5z9bnK??pWADqt&cND4sVdo)q3RaJ&KGK- zKjmEEG)-`t%&@NPbObQS^Lb=$ZpcY}J1@HOeYd+^Baj#GmIuoDD`t4FIS)mAQ47{H zcnP97-V(d8&b_FWE63IgSjY>2OK%kB39zr4e>h)rS@NP&GOOW-)}|S|(L0D?`g^7% zw%W^gGJ~Zp8EJB|)pACab4JVLwbZi|Mx5V^SWRZg4APVFu_ZG2EM;DB6L1`f;VzAv zduUfK#P{Zz%|qqBg1w=ry<4M%!|Ka1f~`HJ-f8-?GdB$%53ezKn}BGBX(1zg&jaJq zCvNVnlz3-WZaXBUmkR}qEkaVgah%V6;qR2HX^)}CfJb|K99l@-g=~4$)O&bM0K4L% zWf_D@(HNEUMQXqI<1&PshvBZmcpYJer|>3?dpN#az&Xv@1L zm~XGrd;3Y)n*OyMrrU+Dy~+Wc6va5)3g>|nh6T6AGCA!*Y=ta)wa zp$^ysCj4$yU5V(%mzPfV>25t!X;MMSgwFN1(?6ScKle+R3YKDyl(@&5zU6L({&4t5 zjC2EApt{n9Md*c9Ibvlxha~jZ+E{7)u_Ey=CkrN`s}BXPMCaO}KP+@Pl%k&Z|AoOg z6)yk5(w2c z4HNtlCwQQHY!-gRAp-aR!6+@kf!UD?Ym5u zmOt}$>RVJvFE>WuNHY!_Qf**ObCmuafTuJB;wqKG-k;U$N=qJqrk?}0w8R`$K#Xt5q%*#(c~ zaS~DSBStm7n6M_H_DQ?-G`vk|ihQ5CF!xhJ0|Z@7Lvi*@6Tm>lKC48g@#pxat;`M+ z2G`&oPeD7btA<_*(#pVb*>~&aO}A7+bRz<4QrUh4xrebo*D7d8lElG~8BAEy{7%MK9NSQhKg&+9yH4iH@dZE!Zxg%A4*+bP)) z6|qqwR;5TKu5mBm=BeMDyKt3mWSVpM1-DS)lc}I-o&YUh_CIqdR*3{4ISnM+gG*fI zFkodMywucshpzw446zvdY+P(BjYgYG)npr zrc;0T85Z5*X*14?p%o!fc^Re;q5-yXv;NOB!rd`;k*chFy; zr~6LF$3cQSr$>idbK}$ocEOaH?~VbWCO-5kGZEk6OD@ zNdvBA5UZrVBfel@Q9`%OMGRs&Z4X$!A4ic}<|k*7sGnc^|G-h>{}~^I$UcR&%Lk|9HMHeF|SNK zIpo8RZdcdEi{YGXN^Z=a3VrLl;`PN1&a>Yq36b_9c<(sFR!f~w{!5*6DCiA{OyHYjH5^EJTz zHe+5oRnL5~sNwWJ&9A54%&i0oIxx@GY=RI%_kMK6TjSS$>ypOzgJP9@3|FZ*Mae+h z)zNQXrmQA=;NV+jNN+Q(*(ZOKjXTU2JDJ7Hf4GEHy`8CoQ--38$t{$k2&i3S2M`8U4&8v*IZ-Td8|I%E#Fgn{3Os(nW8+ z5e$-S*!euhZ$J~9bg(>5=I8J1`Q)c>Of?M!^-d`V3@pC1J|e-czFW6=`{pFa@p`nz zFez1dYsOlUQD}Qb$=Rrh`rv!?LTiD7&wiIHnAm#n{?9P^&)%2N<=LoSFWht3G~rj@;BV{=TY-_%y>7DwOe`TppKd2N1a)x8CXVBH&* zv@u&%EJH@0eU{?`Z6dd@lkLzJaS0DQW(Ir}zvts<(ikB~#}UFI>+b5>0iQ+A&X+K- z8U<^1vFn3I_nX$|(d#VJS4xOO6H5#8H)O}RJ0dRyC-kY z=uwM%g$z3P66sslQd}t!`O{H*p`IfqENMh}0uqw$d~kv9WK6t1NheXi2Uc(0;ZX<) z8CD;&OYDw`bGKLQh!cZ5Z69&+bLM;7Z_lr-6nTHxH&z+h7EQ3f4vv>)gULbGV^EW< zWkPiZcHYW%bq4+W64l$u#Saz~EfrOB=cO>HlpPa%v95UaCJ zZeOpLh#gE;ShzGYq1hWo;=MF{(U|CDFJe#-0v4nYzHX`*_4;ROjZz-v)hK^Z*mz5ct*If|+ee)~q)H*gX!dv6LvdCIz%f_WSb^mR; zsGl*z#~##kV$S6&3xYRWZ$E)cUiLqEJ0XBq*jE2Np3)q3A^yIZ)z`94vjAFT#KFgb z5zxlVrc93->FNq7JuG*!#&zx0VqdJTW>H|pCEvMm?7aPS-9}G0;nFYta0g6Wq!GQJ zSZ|miJ-X<>vi07sXjojPSNb^qz!Z%l?2$@=9*york?mwyaeXf{$>yO*G_=~l&K9jg zFJGKa4}(s6q`N`d^Qy%B&jQ+~BQzAOktOO{ya9!4PFvasS_!B=8w+~*Grb3F8w(eb z)|oVO??n;oCYjw}U7}u>?JEkfxE1r~TV7|6v#59$QOMC(11tInBYh{c(DxL{abyPr zqcKsaOJM10u7@8irTw6|Ci%`I81e!&KAw+bN!T8=J3qa&Ti(?_eHpR?f9-F3plV6y{5!?ZlhO(LwC=n66 zp#UwR&p!0sE=d-o9!;~;`*Po=^N*jw+er#?Ps=U0a`utlw@h@CDvIE|l5&yOv9PX{ z>fK>A4g$7CU+TbC+7$a5UxIr9+t0(;h5w#Ch}L_%+Q%KBT+m<`e4hT){GX(Vo7+Ca zV>Lx`f(wMV1EMbi?0hI5j|xx{@%g$-T6lb^&Pp^fT=X{yCxaPx zg?Jvx>3!SYyb{-G;Ewe(*Lc(5V6EgLo!Q-YlQxxReq^T(914D_pRfqKHS0%4U{2Ws z)bqFHve85S^bV)k14n!PFHU@~V)DcJIgk2Fg_!pCOZMBtNm=R^gUGXiYjjN)yQ8_4 zKQE$d-8O=6bZbsKoFmCL0uzBpVSf{BT(vEaW)vkr^=M`I%LE0o9ZW%ebTsxlE?8&B zZs~g{Mp~~j7EIOYs39#621@d`OYi{Di4u0BV4{h!fWJ3(Fz8n()#t&xu|Ds*!7rbD zb8ppecW?+JUB?Cq+^*I$W0w!rIa-&iQ0Ga2hjq`W*@PQX9lrl1jid(&#TAtP;cy6*HlA1u0$qsi7CGY&l@l%;S^Akhzvu z+pco#YiC#~jN&~rWAf?DM!c(1bKM}2xC*G(!{NC{mOZ=smX+UNic$EI+s?`^4AY$5ORkSexgJ@Yu7@X*C(PpC3yRfRnCdF% zFL%#&+j_#B#x@f-`D>d^BT+*iko@b2vFSPW^DXkUYKTj!(;>dXPK^_)v&iHKYA)xd z+HrDgGLG65pRxxFk0kBD)x&dfG`6OKA(Gmjv28;IDZX5c`;O~rHBcFTJoTuDrJ{6Q z^6w?i&JLx~C{njnrjni-`6d@535ZLIsupp+xcqPu8D8>b-Z5dE4i3&or1y5@doX3RtMaLQ)|oQ zCC>h9+dpIE(|a`Z)@*wn&9(}=?^|4nQ{#N%x6TpCShjWwenvW7(cKM#6$Iv_+N%lg#7g_If1tU^zv*ngdKofZ{{Uq*<3CcGn9NzLX|&I0t+LkIEGHPu;i`l8 z8NiaED-DKu+FBy%Zd8t@|83_F9`Fbwin^+?>NZoAcg>lfC--5x56+2sRW&|m2`H{$ zThMqrk8SBM;gPs%))0PG(0lV$plI$UDLBRe5$*stfyjlCJv`8mpVSHWEMm*{F-Miu zs_&Ga1v`GrTP$w=&OdAB9~fsanLItq40#YcpIE{!24`*;g7rzk9Y~8 zbX3H5wcdL%ySCTOt^)8i=+*fV0*06@(Q#OC89G`gUJkkoM5Jn{VRG9%U9R25)|Oos zTT$u3#cqQ6k-5rfc;uZTud10HY4CciHh|4)wn1OBudk3!^0iNYU#a zdl1W2Z*xj&pL=_y7muRAui=k+@khRR1F_Y1yP|S;8?y5gols3s*E@IT&%RhO+)OSW z6Sg#y+E!V(pUc)JSR;)z_Y1tZzS>n~1zy%!1FEDAZK>;eN<^iDmZzglf3qLT_Z??n zBR=?lZeGv4RsE=&dfeND#86t&PBqtbq827Ch7rSK8xF^j*luK?FMbB?i^Bv}v(q(< z>W|$!Mb*owK5`#-n`qVfY>7 zQ9=rS6^-k}@6eHCFqHdj>5sm+8SPF2Pngw&395mgwqg%1V#G0yGkDytSjuJxWHhMM zV_L7}nSI<`5c~c*>_C#$cDv+vGm(C~X8UvE3SDo55tS^e3LL*_Ix^d@bku-fN8@(P zeGmEZ-_gFH7W9&TTF6@Ta@j#t3b_Diq91sGjGCNpl)7-eOMV|~4Ukr_O}#jcq^3wb zmJZe$z@OU`>QY}zA!-&1*vD<*t8|H>Dm-l!Ouw~ILk{eDb#^^T_9*@CQG2HRmREn8 zk{AMLyS0JDGupvq;`)g~)8oFrd{TB|@Q($QWthsN$+a{+QXvUQ@6N%oGa zoyJ)@7slzM&02zN;~{Hxq29UY9mJ-M6aR)~^b6Oyn#OrjEarqQSKSg0s{qX4^n-8|l!{Fqk07aX;DN)om+h zHNXt7v;G&?K%wMg^5jf>cxZ4*XfGd0@8t}M;>kQ~x7q}aHqG2nR`gD|VDrfDyq#(r z3Dv+0vkZ@zX52ek(?%lU4(M9ub&P$$UPaMuk%G`WtTfJCfQ9gXKeR>#~(5hgleXL-i)NXBKkZOsZKl>Vhcm09T zIUT+J%J$~C|HF?uVr`giM|Q{uk11JC?VhC7%u!UGw=Hh<5IpJ>HBWhO(Xpt-fnHm$ zSD!mzjH4-L2SA_xCupZ=yCc^~;+C@Qhq)ZR9A1(#Zs44qKItLmYdaSqNbJBdWlCsewGwV4eYz~! zr@ib~;!|Rz_?x?HVlMaBiUN4?bXZsT+@5Ndhwumen*qwd3xt213MB6Iah~6Y)TDQr z$rGI^tLsA4ief_$~(vqT;-~C08r<#sQgqwf5RP!5Z7VECG2g{Npv0b5^b_ zm0yZOynoG#_9sBa^en!dJ!rYbD;MC^FT1j?z(2}SbzSUG$E#|`KBdR^5K#;BeX`fI zt?sZ}nNb<5b5NaNV;TwovO()5^uKL$xDdP)PIMC`(9D+sdgcv2G^i>R?S_FZrYjGF+|I2Tq+Zf&7uJ|%dj!ASCN!gkiV-yWnS zyot)u^rP12EuRq-0yK{yW@IWsXV+xc8o=N0M0C?+#)OvoDAAS($!=0hYY6xRuChY{ ze|wVTOrEq3JeRi(q0T0w@#H7P`moNAytHyNq+74ZX-dDTF|1I+?hjo7|Ehb_=&4Rt z;<|_18@g?&70blB#L$^=OJ}dL+AtNt=HDKvH5H>NBVJm0m(QuC30?Q+;uoREmp3~2 z=+m9z^?zokPEJ0v#xp<{M8gm3kg|H^a|z_j-3ml4jV7HC8amT_e&6bw(86d#QQnpV zs!EGnzZxPhwpul?;RS*k3S$~yMSd58P0{iZ2d=_hs)EOFxA|@QAO1`wpJq9#+*ZW> zQ)zNWdL0rI(0e9>eQosKPgtR$O8kO7cXLA0V^sy4t6x~Et>=M`%@1_GZf!Rf^XIRzABL-RM*ih(`kcJiPR#|EGH zlKiC$6c!D^4p$)NK_5smX(eva5S{<;23~bTS-Fg~+X~ zweXK*ez}XlU^cceMLLD|Zd$#vYNDjoApKr{FCYYnY{wJwqcFHosKo`x_-xB40Bln{x6RKuizTff+%=C&bgb0mM% zIX&|iIl&G?98T0a>7gSkaht{I&T2Zt`(AM}M z%{PgoQxk|GTd6X=-LBLI1Gw>;Y7Qw$Psr*@uahfs&s#pSmV@<-aCE)kQu zjN79wcaqET1CaAyO_j>M6(x$w;kFyxZ}L1*%1YyuZ;t&TTgl@lA)>z>9~m~cFnKEr zWyAoggQx8xX`BR`BwJ_k*37RaAuTFd7&G2Y7^kQHIZm*iHo5CIiVbD|KVEbh;T>lm z&Q(v29Jui+>4w>WuI9%CKQapi)3Mp?gR;_Z%XUe3DRd1MM}_~IZkaWBy@0o|2Us^H zKot%3_Sf6lA^FR4Hbx}=?(u)q)CLwMUrdYNMky;@Ewb2sGtAO*RI{K8xLoP}W|BQ? zetgR(!kTqOHE4+#a$ogV`}uzo_WD2E!cuVP-ap0)YaJ)2uVBKpJPZ6!Q*tLT;^PWM z^l77c=(aON{HM@vs(&Mzcjx{WfzPLy>;DBL_Gt_MZv(vlXU#rTjPIdi)4f4)^INvS z4La)ND0Q#$!fJ(+2Lt~2;~M~t9_Uw#q?^fR@-dXrZaK`i?&0Ut%Yzn{QWU=1*j4w+ zVw=*;R=RM~Qv?8fuC4+{(q`;Qj^!0CkvgU4R=UX)&r+$&FP(hk{S^R?{TQt0@GeYA z-a(H}Gpn3eJ^LI>cuU9u`s5?GNP#s9$WprM{nubVdbxp5V|;d~M9}NV*k(ASn?RFA z_MIM-ihtEX_T$J!izpGSshVtC*b-QBET`^dJly^i^C4pa#*)P#sL#3_b{QH@oYEmjh8`b8FVAQMeWK_ z?`~o#PP;h=bR)h=k=s!&zD5+%I{QR2PJa>9WnnB6m3DW1WtH|P?w%P)#NN%h-6U9S zFGpsTu0RzABuS z7=_7fz3Cs17X0xC_c5s4;^3~z#q!~x6ol1)H+jnNaCZ+Qb!bfl6P@JSyuQzEnX^m= zDLGenS#?etKL)zrB8zHwR3z-y@Dbzk4p$ z!uSB*s{Ziwd-s6v5idtGzr3OI*}^(+{3eBnzDjEV!+L>b4cItgJ)0@WKsgcGfi=2* zI*dyIbwFaXq~IBY0QR}Bad71@dE4Gz^Vmh&lMfv0MsA<~%=h34063c^X7sUo{n^1a zItHdXR3YwEfu5X+J7bcLDQ5SoP1`$=hIVmI8|dk&>v^VW9C;Ss72|D1N@Ff6FoUG$ zPP+xv>B|%FV0GSXLB{vKTh32Nh#S6I&b%FO;dLewJ9)z57W>ad`6n{OeWmMLYd@Zl z_~XT+V-CXmToPrWlWzP^;2$S{{o{lma4NtLGQr8u06pX1yo_Ti!svrOE!D&;6hi&d zDj34hCtXEWLn$7V@m9gA8`fI})S=eHl|+ZnyEOeyIUe_aPzjO;AL=sNf zYHpgz;GbL91T0XNc8XEpgP6z6vNf!bArmH96RuOD$k+a3k-tZskI&aUWU5zbaXvt^ z*eVQLz6`pm;U?qz%;G0ar1mnPaIdlf(WsYlL5ZA1>RwmHmb|KkY@{vbMq0BY z%dLFa8`7#!(K{S&wJz0i%DM;BkRHgxp`01|xfeB2ifOVUtM&(+=_jj|e)d_-mK4Y&jjJeBnPQ`EC zlEe_paSCebnf5AOARjzuo}=#N-rpoQ)v2k=tI6td<9*j+ zq;k!)BZ}F7;I5jH|URkC4*f6V`Ig;gPA~6o&!b=;idi z44?ktdp&CxHVI|L#xfYLW=@>rTmW5w=&f;o57y8XY^rl|^XfbI%Sb#F&e(Q4O9z)l zd`=oozHpS4ecd$~sS>%CzLzyxRrqu%ZRC0m6Dz5UF#nvtsG^FvYa*E#iIokB#L)et zJf&~H&dd3T^YIDGR=X%hMU^6uj2L3|`2&QpM<*HYQj%m7@%AGIi4dySG_Qt4ZL55~ zj|rSTRo)k=#}_T(#f5iYTCO&>8_Nln7$eq|9`5>+PRxBBJB$(W`(5eY#1@ z`Am;;2>=@|U+#`!LIo z`xYL>9wC8Y_;<})s|5wCTg^9c%SoEA2CNfdy8ZS{RMfCxeLd&m`wT1w@cTyB&WikW#nv?iBS z$nlwR!r8yA@AfI7>SPM!EnobyC4U-_lbqAZb_YK3Z-))c+rKzlfbAsRGG1^`(20dRXR1b2CTHOUnaZ_oT*2_%+M{b5&wpuaF(2 zYQ9)TEZ0%Au5;^T+(dr?LwUsmi5eQ#IRiI<4d~V(+8EQb3Nu(C59rGL4p@AyECJC+ z{w_tf^d7V9^8*#A(}U3r0u~TY%=L9>VPWY)+j-U?C9CKIwM~`nxZ)^rPr!6cA5{U? zMFHx93g7fIlwBaoU-e@)1kIXWJd7`AY$0sXP3%R$?)e{_CkP&OF$-<2bMOgLvJkI_ zRK8X9x`xb|6OJ`Y?^! zI@Gz?TSH<@dPz^DZCO2%E%M1(zmcixj#dkpZ};&8)Og5_5!h*GttHlY%=k28E>8t1^;fuheD~qn>J(KYt2S z^)_4Ti5G(9t9VF&b(bG;g{c}jM-6dKE@)_qz}OLu*hNb2d!3>M%Qlr~Uvo{WV)Vyy!9Sx*) zK8#W9r&T_BmF?FG?Sesvlt?Xc^c4+VsZjEhc10cl?)%&>K<l}-08Yn(Tn4cso*nG%ADq(e#oZ-H+f!=5|^MZ?${<*oCG;-T! zVs?ndmFDkkr#gHbioEhfJ=ceEPnm&p&!TcQ3ocCdBq#^mQU@Ygxc`_%p(5c{+y{^1 zb`{NVN)b?xkA$!I^Yz!t?2w^xvR7Et1l%z|NGO*FGL*9rkfFX3M%b)sbfu?doAT9= zJNWwU?I$h0dc8nsCC%c)GiiVQlq7oQ6);zQq7aKw=!L&*v$qH)IZ6A`&fK8MO3k`d z8x8TCuvs$oG(9cHZrb_$J$acf7Qo#)7Yhh0$}iOp${I^XePDZVyVIQt!M3em)~Maq z%mc*9Uf2Gw9o4^+wSL_yV2sI`UOb+^C;s}QRY6Df&q<$>yR*~e%Jt*!-qPnv*J=xH z7WIya(n#CA-QeoqciZk{vVy}T!2s02=9%ei-R`tE$@TwT3obWcDN&WP!EC{b{{K@f zqC=l^vrgw*R^E5&p|PRP)+N_UU*FvI_vPHhML&L=_t3SwTA6qJZt+p=xrh6*if`Ai z^L(pgw=(qCRgK>E+(Jia(QFVdQ&MBb@0GUxBz5oCK diff --git a/javascriptv3/example_code/cross-services/message-app/images/client3.png b/javascriptv3/example_code/cross-services/message-app/images/client3.png deleted file mode 100644 index 718fa146dfefaa0441ac9b6cd4c355542af390bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136343 zcmb5VWl&^Ww=4=x5d=E$`o739R>VX$F9KtSLnB}9}!K)z>#fPgYUef#<(!6G&M>kZUdNn8k| zW)k=K>*Bk)psXMWNL?)Kn<4nuHME0-rZWf#vdcd&&)Aq-3PrRExW5_{PA>k5`WnrV*8Nx0KWOa^H-}F*e76m4 zi6cMLeITmlm4u8={z>yo9+9XSRs zfBqZvcwY@R1835z9=Z>11fV6FUIAd||Bq)0LgOP%EDT|-cg=KDj7kiZpfD3gb`1ibu>j$4RSv5(eS`DSGC53J5^HvM0e#ZJ{Fi?*-y_QGq? zna?pop*qA99CvQ?PaBtw@{=Z~u3DPDqw53q3KY5Ytr^P72IfqT5}){CGEgZTik@rj z#+!(n5dN%_CCJKSq-8?n^p30C53a<1{l_6rIZ_`+D+n=@5+kFci22vv0f3bzOra1Tr>N}<^(uv0CRF!HMU!c9iTGM);!qEi ztnM*==B@Vn4Y+(7O0}YX_|8+IJ&||lRkBzRQi-2-r*ePA+)c)m#?C99Yj4^yG*edMW(sJ+2qgt@pNM$%K zy-)py0_)^-TMwXH+Zxz%x|MrdEA*ZM@I6P|tfbEAS~125jFi+o)V{{cf!ix+=D3ca=&$R3~D4gJvkrDm>{pTBmY*)aqsZTRS>AHVHaNP|A z6;cvPrHPRm&2SQ{BpdUZJ=H#L@}sKx7;ltbc71-Zcgfe%27N#C=}J_7K}d5tid(p_ z?ec5eAYJV98EH1Om*vP@A{Ic2_2E3bweRG{$}#8N&t~8Bdrifv^tEEB)~V>7<{1KG z?!@N0yRSo+W6LCadl*?wq%&m}MJ`7b)k=`}l|Fu7md~8p)ZmMoJ#AV5-jaG1tCY_j zXv)9W{0L^>EbaU}ON`}vxe5k^#dgO3_(lbk$V9QTd%tdM;(vMyZqk3XJgt5bqYQKGbB}#K zp8LV~cC;HC?pwE1F4t=<#liP+?#}o0v>VIsa~K0SBygb;WF&>rrj2gYxO%N^+VC@9 zS;$+B>iW2Gme3ClLMN&&2C8>H9JCR1JuX`BvTGGjGsLVlYvTv>7!{lCUp>7+;yc5L z?W>M~mxGzZT5es7de~dCihtLGj4y>v^Mw1p7E6uVrsDW$I`e2Yvzzg3V0+#YAu4ed ze+gWtmTbi4wivDi_}vYSN>dsIOG_@Kaoi3jFcNgVtYq4EeVpKEuW5esQIGV1+a%$y zYQJ!Gy4wN`4u{L_Vy}xw^K#lY2iy^GI6SmOFySBZ$8-NmSxftTZX%ycVha6MjP`1m zeLchlAp6<((7f=skc`{Rm(im;PmtQ~09LD){r&El+rIsN##|iPv@H5xo{{iL5Ri%Z z#tIPLw{p~dT7C}h3HNe2{W$K0MM_qxmI|X%X-(=Q=$gqCI=&wzoTdT;gWtuB*EwA0 z?{4Dr^?J-x(9`!Izgj#%B2b_pIQwD0Rfv@N(j&9()x`w$f#u=-h8;^Lqq}3rv<+{p za{1xwk1t;Wt4K*@K#uzvID31JWS(fL$!^{$bj<1#>RTfLP$^@Oo6ecJ6k2Iv zW2Mo&`vAV)KQF&c#?w=DY&?I+lov4GOpKgMNv9U(mrFMuN1li`1sF%01Tzj zJmllza;-m<9|i5@_$>dN>W)(LPqrw>T8?%gysfKI%{4V42tQqa#_V5MuYWJZe^(XCZ>}q0z)j})tgu5l@fMia)!6xBBZ^&>pn3uQmkE50Mk{X>EwRa zK~;C*pD?Ac-y2@6C88>ajm~#%%n#zK4seeQ-zaiZEN;dsZ?iL5vaAllP&zf80g6#G zJM@zuWkW~j?#$%{Fr~8mJ}h}dKib}%$4+q)$Nli$Hnt^-l_dWohkZiA$%Wtk1i(hf zd2#$SMU&tnQMS;U1K409Sk1)D;t}j}d?=_;{^*;HMbv8=44p7j5yySOO*+mdklj5Q zYkzo$8i9ye@}-X(H7b^p3DoFM)sF(E zc>ln4joCh>WNNxp4LI+b1KbN0I{D&-F!GV<7JQK`rnvPr4-HlhOe&uNL8Np%*t5}= zNmjfh7Mnlpl__%1A`8PVJe>t{J8|ADDarH|UVIte8vG|mW>80K(=igir|DHvJL|K( z2y4L5x%0N&>-d$1(xP79j{6tfdG7Xs*==WT7Q($a*0^J_9&K5SLPlM1tk|SIp>?g~YXgm#U!Ft%3DbpAUNJ-bo`xmP><@gS5 zRBW+}qy^A*zVAYGp{wf7?~7iUF4f~mR;QiJ__|fIXlc3quA2KJV_H@eN#3dz^rMz1 zZNg#)x(8?=8gz2)_yvVPspU9`_L?Np2C8oR2JYmkDg)Tdwphe=JK;~DJ9xfQx=hV{ zMCE%dZ7$CQmHyDxa=X*1U8xZgUxN~r`Y4qx8N%}3*j|(e%c?5C#{#)>!D60EZMK?~ z*p%G2{w z)+NlD7SRvWqkDvp>m#8%_N%K)SFHfbq#uX4zwCNhs2X$7ymEo}=L>%}^T1}LIEA!g^7iuej=(mpv(IT#m$H@hX2({23ndVY8SUxR`hA4E6?`X}Z_NdM87$#4G{Swq19b_zbbtVEiK01|q_@{n5~s2j4M zQ0$bur^uC?b=FS3x*o2}Ysu^p+labo*xD@E$}eAGt6-SA+w>p-+=+`i=XE#Lf$Nk> z8(?8uaQM?*Q?Hv-o#?7Z%~%9$k<1>Wex*J+=zraZ2>PP&yx0BfWUTjLNR6~Y=MLnF z3N8Z#gI{*>vNmfvG56hHrvMa5?CQ;E4S7_J?JtW@A06KJc-G1iu}p!)MR!Nb{?nBJ z1S}p8g)aQ0&Bf)C2J8!ZZ^V2B4Fx4NO=aM7c^XW4Q9xi8Wq;^IMSvv6mit7{@5ail z0ATt7!&(K06eSE%A{oO-&ybZKwIQpMsMtOeAv#e`CWK6zqG@xRLd85|f~_o2zHt~3 zxz6WxaU<;rw+l0}SJAvKJfvmr7^;)e_d?`+$!3x4RGgCIa(eY5IfR`5rW(e}>K!Xf z4(J>BJ=NUweRO}Ff70Aoi_KZlanRPMVwi#BbEe(D{8#oVL6m1gKRd_y& zcTH{pzn|0Fv5!~Pv$_3Ufsbv@q$|JZ{j8t~? z%!Mm-OFZP@WAPofF}}jDUhJl3`sX`Un0@LiE|LDuCJ^*zM1oIGwgSD<8H?H-=|cWf z@#nKCPX5Q^b@QEl;`9h@Uw7!@%>edNd3;gN^H|oJ`!qG8Jtj^a&<_O!yf8Ekzgs>& z6{k?<%xqXap!HF>T6wP%pqfDG1Mi!=QL`aZ0UMaUs<@?PWQloYS=X;o;wjd zJ8gNb{uvn>>n%r`JSZ_T4%)`-$DWr^;5ZRv>?wozw+#*VH=@5cs7JObA4)sI&KGZg zvL02GlwtOlC-e13UoXxW6S?rVfZ29UtWmc_L!?%=w1{L!s7Z4xspa!KT;hZPD1V8G z8kNB_Os)?fJB$uFqC}hxXsEHn#_wlOou99{fVxVR3RIZ?tjMf%Cr@@Kw%61a(bPq@ zu|%>l6`0x-F-Aw)q@&MSoyo^jve0VcW4Kqf=O}3_>S+@A+FjTK0`tb3HHM`aKF?$s z(gE&XsHg{ITsA(jLZ0_ylozt~#E-mFd#<@t4deE7?X?HoFvX8gy6ncIIEnP*p9WAg z2d5~MG9edCuzU|kkBj8`KG&RA1F5* z{coKa&SZ)Ktj{!zUkmFLT=n$gZhsd}xp{d@PenH>D|OB5N-7t4lUV`tOR56rxcp&N zyl*g?12tY9sG)1-A!54T!3x&;cyhb3(Y*wgtLWABetOMdW;&i+ZESGfrQuk^KyS9| zLGhOeb_%j6RV^&z_t9!%P;4K~?qYM*rC`2`|7oTx``oD&b;4zHGo(mTB>^K0iVIz7 zUfJKeO$h3eF4!#ymdB*5e; zE<7w?enUBGZ@M2mV!>&?x04ZBydbNf+_4;k(SwbwH?8KN-z|t_{Ix)e&_#wPV0WFIhs|NyY&c! z_pCl|AppQ-y0U5ha%9eS_Z7@<|2)hehA_f4n}%3B-B`xi=oao<3|IRtB zN4T?HQu%|L+^{uy!SChHY%+fyBfsh0s4xG8L&hWUq=%(JTX25~T#KCIV584`d6qlP12=c`BDhMD*K zsZKtuf$iIy-+r>k&nK@#$_#jwM;D7zhAZs1KS-|_s#aV_2!tt<^ySG_U>Nk$MxNwf zkgTEZK97LZ@D{G!ow?CSwHxnYG#y#Ja-D2De?SK*U`&rv3u}t6l<4J13%ojK{iibl zf^@m`^%A0S9COdPSo&qa_iTE8%=r#)Kxbi%suYsg!E^fM4!-5ysjFHYP4p4&DaeD8 zv9z_9Th6sNj*?0*O5~-AgPZv*QPJF0eq&s7L}c1l$xtnYK^4UHgYo{>w(b@IyUQU0)toR=q0Wv#Ur#BZh zFWY_9`7#}~BS4>7bLA=2vDy@es0C|`jZsAGcDmR8$6XnnTdWY^Kh)(#2;M{2wq)TZ zb}{}EKtl9?!n2&{4YIp~j*a$p8!_fW28J>it>Hpf zC6w3O@G?(A&;d%Sb3xJ{q9n6WV?&LFdj?0b4NTdrIp$A5g`>hn?> zOpz3?eglKsB%8xwI!JsAm6Cu-6fwGBVO!8Ka+cerZ;YnYKV8P!3X=;zb`VX#Zg&&v zQ6~{yphVO*@cC4RL{bV^H&3OXr&35qE+p6GuQ%FDyM79j!R0sWaBh*vkBj`C{9Bt$ zCbwz4T%s_M878>u;H~zmR+b45riSt2?gG3EZgW3llOm3K9+Q6FWpaKbkxV{=!*8)y zRxdfNnX?L}Uw3NanrE4g8veuS4`4jOvdVsY$CHN1}!_&;rz5|~wSqDc?jIn`;< z%o&ZsOm#>Py?4=ON+DAVwtt@sPMEv&SaR#vHr&-~n#3R~IdQdW@7PSy11OFZ8!_et>R5Y- zHeyey)UXyU43io`7tMELWJA=WDpE5Qf^~oe^${DbJ;c85p~09A^SmOa%BjSot zt5)dYd4j!5>U~*jt|jd1-kPqBXglq~UJ4d^Hc^I}$g`*5Xf#B}?NEyZAmMK!H0#(3 z8>WC~N^( z$;Fg}paqY6^#XkJ=KpqlW-T>Zd1@a#!BP246f0@4J-rB5%KWcea&u!~V}qg>&JT5? zSY~2@eQ&AvXt777JKGtne<_(y<803BAiwwr%q;Y$?nY48{p9dz*SMxd>Il-tBWi3a z90Tv)&A*bDIP6#+_Pwn!dc`-8-uw7qX`WJQblE*De*RDt+{6uF1OyRh5sW^5Aa#h2 znw$pX#V~!h43hu4S0AcSOy>)4BumAJEf>c?&;lx|>1k+(yc<6_`wMvVonKWl+I7GG=U`~R29vYrnkO5> zqo@Ej)tGUrH;2@2-6C&4&=li4|3=HpX%s0V377SA8r#0ayQN2*$%+dee!;DSrsvec z1tRtlSo}gc%<7e$&>kN1KRPpH&p$vBHRsGV08W&ZNyXdWW8`&254}i z+y7Uf{?owT!2gSt_n$xA)`pMHo& zM@RF_C@Co!{m6-)$My~n=PVk+!ou3y+rK4rK~t#yW3wcrLJOUMteqm~iYX}}dt?g` z#*LUL{g(lg;E#_gI$%^Ml&_HZCTqch-TWJ+>oVaVx3L}fUx)IBSjcOA6XCyyMNjar zC)pkmr}x+-{9omuk+FaL$N%#k^3Qwh%)8buy#FRtdVF6~koYeU^jr>T)uKQphPuhE zX^;fGt`hy1xZm3k{vY=e$tv`@c=lcAx(p)J;}^6GgIA zGU(IQjs$8Iba0P_rKRU@)gZ4A@bZ&?8unBJ2rEXyB~ui6#1$e_T1Ar+c_IZ+eftp7 z1!Yw`6zETUb8blHkxF^%0{K#P0*b=hIOI5AD)5QB1EE9^XD6MIHU4XnyP!01pCDqy zsK0`Of`W>wqOuYNCUn{*EMp?=$TKhl{l*_tqkwT>F2L1;4-hOGP>4)*&)>w|oDi?~ z_&Dnd2qpuIz}5d*zW+-qO@a}n+yK_{8)E}$_nm~q$Dsfk5h9_2D9c|3YwQf`RUuzx zYGPDul=wHWEz(%1{JqTbyNs8ThXjDNO`wM{aY7eZLCroaB7UsCE>Lk^;f#h&-6l=y z%SF9v^2Cz~LW%6znNB~WgMi2+L5`Gc{30IDKR{ja(&TMzZ6zdzv$@^r^x8c(x*M&5 zYwPRG%*;sNK_Qt-{OG!WjE#*|UO*aUWM;-t<_z9?;$f=z`ub{UqyYf-Iy$(qL$8|^ zy1)*(LN#mFFo#bdB;n2{|C}fwv5*2&7ajh(dVjroYbmK7kXmn_{AazQMN#(6t42cb zVJ-emKJZs$-!58;`Zah^NOXJNQqoql3Y1`7Inqcv4FZPM4`Zc-E;I^H{9Jt%#fj}3 zCFiJb#tD%L;fN`5lLmDoL7!~_K_LpOOFF7RD427M*v1C*B<|OmEiL7ayB+L@mTy0-`9r@@5imaP*{wt z?Ck2QD!E)fcqNh2xlbtop336&^>r$}e&+^+PZ+qWy1F~#s`(Aq5^;eY(5mtH_?TQS zi-DDu*Zl%_4@3_9Iu1I1OTQ#a53+=+WCFHu;t`Qkzu8L9o_;{*X+gwK($K)m4+jXzjgCG-$C60l3mM2D zXO9p|e_Vc(s&CC_q+#sHt7=V`x`m6eq_+apF4doK&Fr?*kxqA|C#6e>Ju~o6GgAIQxJWdu970^3X#WZ@oD<|DyF(#X@YdFVPbBmINJr$P5kxL_jx!%*W>4b&UonU zNGzUCLN-<$t=134NW?c{6yaTEf^*l}g)hjv?>e>#GnOfy*@CQR+-X4?Qwd9{yFLx( zsSkk%|71_%ArP#OlFDxo-ksCHwR3U<#bi~yK@2iV_-a6;F)zH)uX)ttrxEIJ`9`US ztTvd3KXSC}e$TMoRuuUwA-^u-z0c!|UxtSdL6|_xVI!qOgJ^5YEK6p4_E(}-xOpxl z^_pxyC_jt(e+Ksymxy!Zux_^9MC+?*{SrJ0p!3odW@aU0#Tl=UBBJ9>9W>!zI*W@y z0gPuex{ek}q721k*G=}<$pl*N>n53chj^2kvjF;vg?3LP8J|8YZS2K)V@83OJUKTAtfh zoTsO!$WO-ma)Hqr54<{5d3kwA$nb~=C~6@aiu}bH*fg zCW1dzBaJ0dJ<{{|Gj~$ge#-3DtV*FWnC7I#N-QTJ@ShF8_VeKACDg{?KsI%7O zHrWmyg-)B+^`t~h?DOG9LzNhn3CnY-*Nn6ZWt)6}N*XVP) zZ#v4bkW#5Y$nWLTrc=-Wp$%d7`W`Y^#1OI4+o!j1>6`&0oGyNhIOro6F+WDdn=Kp~ zw$iW6NvuWSYB*G|KFN6>6z&J5|RwzT)gICEX|u>_p8jH_q3T45c#8%lVqL9*Ser7t7w4Wdq{d-zc&tz ztm0zQx6o=Z%23QF*jz(uLVUhlZugq}{OuOj`{#g%9_6q5oD`jlrG~IUIWjf*UKQ|9 zHTYI(a$UcFj)irlh@SO%o}q-|5`+45DvVYOn$Y{DW+U|NJajU?*!Hnn2Q{F$?~S^x;+)?ax!=a!Na;iVkGc zb!L;NAm1ShczT|{;bLtqa*AQtJm1@yFx!~HGIfBar*v$014t1v$oab|q$}xUI*s_8 z66I1^RL(=-<~F%S={kssYI-FP#P@|X=R^YHIL3g?H2gbSR4e?K9>^Nm#(Q|m^e;K5FpLO> zgP@nKu9Km!Gl~I)PZwSTmd@Td8&MEem_4w~`gb;`=k(?7gxw+{z6b2JgX=6-_E311 zd8O^N^~AL?hSrl54Gy6zi+0i!>J}fx>8KaGCS=sa93#1LHvI<+clT+KOqbs2V$gP> ziO^=v$c1C74qHRpxLDp7F^L*m3TOYut~jKV4m) zb;d&x2wYd}I5?RN4GmvP>gwu>*?dyqCy27(m6Eb@ZrtiFq1sb9rt;{Fl0MCT`oXr9dr6w|VCs$OC}subtU$BYWZ|#NQ^1_Xy;rqb zA$TH_L+-7sh;dv+wR3cuXeGPcj3vBc*p%1$`)JwBG0`MPArVrJ7W}dh0t0;R0K@uI zF)bqv+x8aD?$jaQnJWa#7iDP6D{HL*{RNd0DXlA~C#(#cmcuwA%+qt42Oktc3QhZM z>|2TA$td_MZ^6e}tNjR4FttZ{e;c6e(@AR*@w(lq9H!&!U%s8zlK6!Yv+bkSW^#R?Y#uko+LZ`k#+Dq51N@GMr53Yx$#X|YHO zP&O8I2ikEQ>WZ>^=pI&+z35!=f}2YHWVf*{%{G*QZa9Z0_FOfJpr@#qw)#UCt?k(n zK%Rhe5Bk^|X2Tw3i^EIJi1#sUV!WL%g_q**J6a)q?9#brfKc0Jkl<(;wzi5Pd&Ym& zdUrdgzFOo&aKnYG(rZx1>9~vNpiYKsf=={Ls>Ei?63W^{UaVK)>0d;PP^wcW5*7k)9gh5r;mv^ zAF8FMsw`EFo6Rr`5+OLLsitRWRo5aVyo1Nv?8(YQK~0(MFcr=HanZE=b*tv4eFqLQ zF0u?FDl$4giagvH%a_OlU1j40lDHZea2iuMnvS< z62OKC6`P!_s-dCb>gp;h3y+DHIYG7tW~FM;$->UwSJc|tnw6C$ol4iz-0bompAZ*4 zw%^+xcbga}8c^FK6ywYXQ>NZFs}Bjg@4)d@?iXQSU#L`%tdUrvNJGWJk%k-l-ZM5n z?sJ1o0Kt?$V0QNKvAj-0d)xg47I^vYz$#DBAxZdqUs;X{B2*cr(jT`3Fo04pxa- z%8LC-GP9o|R3_FpmyYAmX)kqy*X!ZU?P8;d zECU#LeED#;kxb%iA~>sC%PFTEdyczW(Xt0F=-iAdGiTkXF9VoI=o z8av6M{2Bv&_xY32a$j)OCQyxXKsGVcs>%4cD86v0C!`NF#^W#vYNV^f>~5*fSWGsp zYmzE32G&)&{+$x`_6pn9Iq#S_Q98Ym2b|@ssNSjxPq~R}p;yg8+jxrpV?FM(LfG92 z9J?C5@`iQQf8(UT6?`b0IpeusL57ih&}ipZ6diDJq9e!~k4inV0tIlH^RYTS~=toE8QL@0$G^^=QLm_D#9YbU|^rAce}TtU-rXA>%1r6W)_m3JJ7i&b+YJUo7>$Qwav5ARor7h5 zH>j;KzB^YsW99r2BB8lqUH6?PE0Lp>YTRfx*ePS&9gM;H^P)yc(DTO|wU!`1GB+a` zR%~WXN_KR(rlLArEXnc48PpRdw4gl!rfc}AJME`&gq)TAnb1)^aHOBLCX?(p!4GXF z!@>I99-5Bd%E+!KTUM2|5CuFfBfv!)K0KARUlsH48?WXvfepKZG8vsmT47p5sg+Bi z+fDLzT{)Bi2NglLzGxc`;~@EQT?xRU0q>&FgL~63KxbV{CcB;L2IX z%PD==Tl<5Q38Q$m!WTn^EB>CDo0F)orMMteTx_zRqz-%&%?<7=eGd+_xc5%$Oe z3XZ5hXI!*xX-vbJO5QHBzq)8luFED4#o+O~PIl(0flDOH|+>#^NzK4Bp2x7Ib7~GVKi);ko|LyRn;o@18NLD#b;M#=y?i$tE}YbXKH? z1&=WeeCo@GoA~a#{ne~dSE_}%c7%XaKTA_tEjK&rWC*(KboK5Xo|BD9^P=QQs9&-d z6enp#0k6`plzL6?Lz@V%KTFBTNsEh2#ai)KIqdsisOz%vOKxQJfa3?AKv=sJXM1%X zuB9aBzRcVM*P0luWTA2~Yh;_>b~-o`1EcLSY`^iGr%Br~$P+7BXgj_AKJ8M~NrVZJ zoh;H*VEr;Y7-9d0s-n6abgzw3Do`2)&1a6OU$$kdkf>B7rKgI2)J`=eM-@mchJy3Q z@FXHEu(ehEoTIOT>eDLteZkIomO{cXzaI;xhBiJiI0%8wReE_iU#>hkIjJBrSoBqZ zr^iqj5*HQK)Y3xERtH&<^YY@-fRqXCQlVPt=>a{9NP{Ucv9^ZYc?_}o!#s^UH8Iin z_pja5r(-wqSA{jwFn2JW;2W9ibqi&!jsjqJD3*ZNYkqY#^T;*C;|W&H?RrPF>|!#T z8xn(x*cT(PIt*6N!GVD>?RMk~in>D&wu6E~`Ib+i*ue}}bNjgB#$YUvsZ^c{>2X3m ze&9>smFdQSTnZ*v&I?WuKf&l7s*!hd-7oeG6ud3o$wMl3@*>WT1{bGj%lq6{`_AO4 zTG=J{oosex`~CUmuNBU5dXPasRP8dp-Ae7~-77tE)5ATxwY zi{<9*|Lj$6jaS5I0_bD-=`a*)?9K^{sxxcj1juqI|5T(1fm>}!>e07>+c&Iu@rdHr zFTNva+-#JH%x4TAZ0Ea`&?>}q@~8)bYE=uK-@xoD&*EfgCv5@b_eS)@F(S^WIr?{% z=u%)GT1DwtxxHyxw}dFCww!EE|Gu6=0oqi?rEC~s;B$hN#w0sBY$xdxWjmxZnu!@3 zY6-EEp)^KP)u&c2=c?kUk3}~Q+SKu2Ee7^l5W+v+9QXVV8_*-!URT~6r6O=MGmTNNG7g`_|Q*={ZTsPMy z5LhwAqPjfyj)=OLNY!@#nk5#y>m`2YhdsHd#<9j9LAyP^#!&mT+}VUd5E*l4UhTM0 zQJ}8+F+9onYEha9tDgJ2$|!(ZLPTPz?i%NEk5pfu`A`ZS*Q_9;h#Ha&uQ_va!JEc;aTmWq_kksX&3o$^Mb$ zFx?hUTIQm|?AGDjDA8+C5qS+~p@!KZ7qbA7v*z5()u{z%u9$d&yEQ|e3zESj(2phOKi5RtR^Fn%{Y$8UxJaDz>sO@?U z=7*4=5=Fl}p-7ih)zc4rC#5??xU7{FY;dr;Hkz#BbK$Mh3TS-7OXGSF5MU0Dg-WA6 zHcyq+@!`ez#Y2B|vfX$%_gyO(NSdqZxI|VTQLQAUTt!~fnjmO;6H^%C2(YHRT4p|Z z_4KwCT*2v^s?lk9a1*Njx*^&`C%yAUNQgJ)M~n+7(Ec)(r1bKKrD6oO6Yh`b*R#iB zavdkc4#NAF2g*~qA@y2Tt@p$Zgn$I|`lVw|&v@vOeN|R}#Zpj}pkE?8JEPcLL#aF= z)6FV<-U#?qp73hho#vIHx^^fPiweB%GT6_r_1vK}bbkhXH;0d3-!Q#sOIcp_R*t>x zO6#|^w9(vr&Yxmabcd_9%jPS%;#wQoVU~E1a#i>3xI8x&gk(0-oG!Ok;QuZwdB(q9 z$hHB*l3-(e4+cM4;|qZ;D#U9kquktL6a46dL0nyw&o7aEkmqw8PAWCMQrS&1pS}sE zCZs6wNt{&#oJR9|)itijg3^+;BfVJKx>DN>UKPL|WXHzJvao{5;R*9UoC;5amQz2Z zOc{cWl)r6z_{m(w$WQ>v*|U@e3&I*nyF2VYquG%6**}TwWus5 z_}D&2Fh6;!q52$btx;1_gt2;DY?wKXlK_(Y@@BBkW>?2L`7j0c8H3&ZIoG(97Z%CM z6RB7{LyFE8^Z0{0IO^*epAT;hkfzhL0Yk0m@L=fIIU zX$7jPsUhn@F8}q$vr)9Rwr&FoW}c;=uuH(Hw@ptgP%!R#@#7Ekb89OiF77hNPxf3nn37X6eeC9XBfH)hZe2X!@dBf`N*6x6(_9fq zY0$F=O`6PJvRT)Su|WFGNijcbEq z0c(~Q%Dpp)BrOIg13?sXievWs4YQUkT!~sq2L3*CT2oxn$v&sUGkt!d(@tfMOSR9@ z=5(?JDGMAm`2NItga+&{7X)oR<qZw=9K zBZX9~ntXypD*|#HT<^1}IWY$(uDfdOlSNfXVr5JJc)))QVc<0*ZLT3U`j7e@_EMqy zsr7tpEez@FvyV|}Ldo9$b~ID67-X`jhC^WA@H#meE3ei;LiTmJ^J?;0!9QJhoER zA@`3DE`170+Te zOz#$|uc}4#XS;p+c6SDvlxw!sjaVix_%G1)Bi9M^lYb-jyXxBwQdpZQ^ziq`KE#dnaasBwnd(u9MaL;zbv=S;E!~WIbrktkHC&70nB#0v%~@ z-M{h#$b=!x?d#-r9ym$C`Y}X-<8Jm9n(2+sQ*6r|?15)*)b;;t0R0Sws=V1~-ED9d z>yQaI<(W9m+v_QtbG|W7P#UAE{5XM{(lz=?xFXCDfjV1GD5sU8E>;ItO37&vex&RTXrOOUdcGFryxMXOHGHb`-{v zzfKf`%m$+KZq;%*HG54~Jr9lssa==(6~uwf}p zzF5ABG3n!??6SG?EKLBj0L^cHHmhh=9{A`l}Z%%OZ##>GW_-oUO~&aJfx6R>*0^qM}Ku*AU%lx73&8dyG~xPi3U zRu`G8j=}3)C$7kb(;uBeH)@23=t|}od`x6|?iDvL z-D*mtQJ>nGTGA9xjhTFuK`>B~Fx%;L0~vRISK)qc)Y^xAa;`?pt9&_;j(_F0 zY#+$I@RqRjOWM^*7)DI9DGUy46?#vN%7|~j`5+!7GtpJ31Xf0(RV0RbM4KX!1LMZi zLVHes(Z^<39%xMTY&t?RDoHLq^vvO&K7}5pcHG{Azs2Ku2=O-L=&IK&In$JZ_rXm0 za6gL>>Xt29EhrgYr3f-#G-8Lz5u@3aUOaO3WhJwVcLHODG!MxkZfC6azh&$W0#n)q zE3vl7ba~rNFP?Ejx3xV}+Y!{}DO{gL;U{Qu@%c#rwGWn7k0ty1ioc0(NFZbeMVa{33Yem%{XO|1$oP|U-7;oF7e zvbjLEh&m1ao;{V--fCgyR_3%U99dAm;p9!uP8qh z(m5XXF8!m^IjU**`y-{@)5IGMWO`3wLTgJabl9r@IsgntDlV(D9k{eY2w6VCejNCp zsi8w!_jg=qnN@ac*| z?ry|e0@#BCd=_sqtc!qM(}oj?ybg%U_A+bs2>MqIrzN(S(`WO z_b-xzXkm`rNz4@v>nvW+k!IA;_&TMQXfxS%UEoqoQRJv(vo?o&hEy|n%k@CUDn|2$ z9Hya3%k2>wVEg#Ru+rRW*z{}srDlaFPF>+mk!(7v(@LOH7h{*+6D}xVSRG%0lD@dC zG5Y790wa^%e5h=VAKksU(B{HH0Ww!=hyLYEK^p7Qpf+qhhsmxTZO@6yy=RI5m6^i5 zVB11f2_yS1FdQzDQw@%~TwrfHtJ&J)kxX=mJxgTPnbV5pP={_Q&Hgoh-55)fVa30L z+ZtH@lcWBq0_C(=?K20XQJ^BQgndsC#MgE#1pvpMnV2jauGbE=V53G*`FoPNE=SDyGn;)cjTWkbI_h%{vXx8<3WqpaW2oD`uOk zb&#Q_%f086_x`B}H!88zlQda1prHqU*?U3rlsA;z?r^oAs_i3D9Di}@bgnZ*f@ChS z1t09OUTCaxAKb*sb`IQVoU8oWr>{V&cI*m=gOdS}sX{Ys0T;^=3OQe6_W21ojqZ)y zs9QNP`<2O#F(C`EJgmDEXEd9#-4Vs$ak#IC(a`u@^2!^hE?f(tNZS91^v(wN^iHK+?CY5j8QcA_ z0m0o8jB#1C6-^u;9cl-i8vdWhe6(p_rJsu|YURKpZ z)FVk)j${8AI-3s>Ie$3&WF2vx2pm-#x_8JU7{h_Tb$nkn0O#fhg3W4bS24O)4-`kl zkpR>wGN}u|HlHpG^gkwsKSK;OQ9q=;R;)Bf8D2-Jd)XRM zxMuE$_`sVrSPuA|KE#_jbYCX9_Z5^Mz8`|vwCY#I4!@s8k`A2`98aG=n7#zIzhcS! z9U&bJ&g-dL*MX4$t9xB0sNog-pt5Xl@?6-M%ViG$%dw*5IJvH~zl5|S&!J5z&KRba z&6|udZ?-?bVP|946s?~mx7Ly-^_(DE0sp+o0$^>M*G{2d4|ofeOXtj=pubZzXaRUh=trZU$|VQyqyTMIpolT#&$YK+jGtPZ1kG&QI!J9Sw80nKIrXV8$-sz*c`I zuE4WvyegDM*r?i;lZL$I(d`;$-rZfE0D+p;*@hT0UKbovDhA0~KZwI8a-9NSK8f zgA1d;7D7m{0iaSIq_TUlm(+90Ycd}aoY;If4@ruR-ge;C9Ihw|TSUoju0+*NM znB=5`w5MZjANqsmHthUx#!<2r47%MDH=wk#J*blC0vnWzH6z_Tee~#)l7lyOHR#c| zyM$R%Pxm5EuglU8F%W6#@~_iR5h|yOiPk(!E5mLEPlATzgU?soy!O+Uyfo~ibthT9 zxHU~rQ7Y{WxQtsj@nW+-U2(+0n_&^dQjtVr!^wzN5o`I-ij}C0s^Kz^81Cm~i_zh&CMjM=TswYfa+uai%Fy5_gqFqpOYyMsVI$A7HnP7+)u zk^HFrBHNA}ge$g-I|7%iL6Lg6cHX;>H5M@*#;p6&Vz5Gl>$dfH*%`eS53N`}=|BA% z0>D|Ee5Z+w<~OZKi-CI>kaH}3UT%+`!htMSeR=A52ulEgqDppJ#wON+StIO4uIgLe z6^;^fa?|wzy?bwy#fNj`F13a(k{gq#~8l$zF#F}WfANBq@|@V#|GxowII*d52vl2)8k`v zYiod_;wLPe%sWLCQzN6))YP?3uMAf-p8D!E*`lnhtinR$KNK6ioRhDo-R+LN0yH$= z0^#X0O-JF;T?)I9YbPcqf*7HFK1Y1^37GorG89b|(AD4JkBX8#l`Vv#{lcu_sCU)s zo{Lz3?5~&P8%CF_RIXfpp?*d7Rh%h}ObP#-d(2oy__+JFD(R*lUak0?w~t#k1MVVH z>z{r&uJJgR_znI?PFA5eQs!XZ?ypD-c_a8jQ#@`ll=y_R``7hdJ1KU|+{%Eq zpaCe!WyM)DWira~+mNO*jSQPJ_#&J2L{*Upn!ZFSSJYaDD73M&W#Z(wTB2tD*t3%< zD3vMQfidZ`oES@azr#x+Ov;WyR<2ShrhVGH34Yl?nHLg3gBnUwu3oqP&s(iNr#pM- z06N5NQ?>US-#WT@Ke!O~l}?-v5$vX}f)LP`Qf+Rb^?392Ltx!*L4hFi`1|;ZJJhLd zWZc=`TJL-d>BbvBG3@9x{!nEER!h!EEmzK{Q49`J-Kg#pR%aanH{T8fvcO9xf7_GYr;hjR)Jo>XU!sbFWz7>3Q$wLF5{ zh%i}WhNkH0XqiB$;VYXCzCu4KIp~W!w;?AY?3$%=Rd{1YMZkaqV##(XzQ4WlC6c+H z`uHJ;B&KN_a?y zBb)6dRz*-HSJ`6To_1DuJ(MQVUf%B{OpKbz^<^d9iqA5oC$U`Vr!l|)Nscs`gMaX3 z)+UvRe=9Wrr5XIL1`4oHvC{ifCIV@U!mucAg(_-lY6BE?;YTGCKkEEEvIx@czRgEx zH~XCADeZf&`hyr&8$9dhj-G0o)I|#Bf82G(I&X=9WMri$#+j>VnCTgrh9T{&u}N7O zDR*m-h2ahV@fYw|GuJ2yQB|^?SURMeANtW5ld@5Ma_VH>@qNyE3@B!*Qi6-gL`aSl zXF@N@$h)_9aCWl0?QFKWqSoYqDqG%{odFFOg=;W8DlBTIyyQjDJgwnC@g0el!x{$(|=9smH`03Z}FNMNYLf7g&uYo?{#`^ z?q)cS0^(VR@d%9Q|J<;T;hP9C=cmG#6QQDRZEr&?WEbb>$YbUgIRT6?<&hB)4vvn2 zGQ!}LcNeIP*Ds*YNl>OTrqa%)Y!60kdMBtn^`rIpRAtS|gR3chD;X0N5|<%G!nM9X z_k@uxe30iF*ipy*;a&%ha7jZv8QIsweg4s<_q8)0(R$0bsb%_2^1M2O8o&=}AUB z7UM1t1BdYCdS)EGsBIb+v*W6VjVuRHAP9B(yu#fINU;G2jZ^+u?g4%^i=*Z8q;I=_ zDG-o|Eu}!qt{~uhFnUw?o<1@Zbo|+^R_O- zp?-xhQ{ok0SISyr=G^efycV_EaiH0uyrypRKSFG5bVB?CTic0QqWc!|Tulb)mKMA1 z#0Cut@?NnHo6Xve!?-ZRzoQKkFN}oO|C(h>wcEilsXnv;Oyb5`4~r8(mu?<@28QXE z$)hL=6A=FaB%rnMoHn`QO4{rj)>KmMbK$Pr4L~ z9?RUTW9)Ss;{irpOyrmAZ7PCH5pb&8kyk_}_YDYB&Pn1F8Xk`5P{Z#YOe? zmqef37@W2G!{S`9xLT2h@P%!4XiCTQKnE_Uj|q;q=5gu_TSK6)uTPXHn#hU4_&P}H zAYh&atc3Wuri7 zk(-k?r?NownC;y1$zcBZ#&3Z&OF0)kxh36l#d~&;;|G8LVe)eAh|qWwtxqBt?#s8V z9!ye{&Xmj^BN2+F$2YBidrq)mplY&;Uhdnp(ZNqkPlf1su z=ol9b_wdx}!E|!gLoJMZQX+uZywhs{yRMC;2FgX=I_-L3He!a7(6&oDW?@%d^m%%X zS9>(gY_syxutd8qYXS_iryXLKE|iaTGkXgc(8xdT`EmTpDGzX4Tc-F?EHZ5RLip+w zV3CinEB9Dd zSntp)4`VjahkFa^d-)`>LCeNxpH0K3^ls$lIyKF*v`-^$A%cHFZ*1QQ;OHq zZVV6;iCrGHg5@N8(|<%_dwK4bd2uDU-BxGi7iGXCIvB~_(|fZZQM57M%)g-# zB8rW6$e(Jp47>u&4a$X8EZaPT3MC6?PV(eJm}@}(Q>>Itg71T!JSMrp>D$MCVlN#C z;wW8R$e#>MYL^Gm;J@aS^!(f6_L=m+zj$cPl7TFdtna#-=gq#zQ+L#{ zxr$3(l^(!h4*V#qML&2uY~+i&Ng|IW{mun5qRvJ#YF508I zw&a;qdf@QPtyo_S$^A=>r4e^=S~7X6?H7)nEYvG`iF9e%*YYbAN3S7bp%#)|hTPPX z`mcKYtai%Pm)Gb41o`GYPWY`zR;H&gVfE^31sV*9D?bIXP#G>91_1k>ke7hgte=vEbgLpuKO}zVD%|r<`!Qgf>rhr#?iI6r zC$;2765N|DhH6oPgq8+i7btF-Yb89Jv~5A!vEoAscy&KM;q>f`UtQP@eHZNNoeNH zQV)?TITE>7_r`LM#P+xe&$5v+n19k6vfiInsst1d;kR>vI8n@%a$gfY_^b;laEWQl zLa&{h(bYlh?V^78F2}VR<{0`B23SD8sUR?hUNlMoiVUmw>8BV^@%lJw4$0EeLcNXUqonXQF{3BTl-M-Ymw(8+G+zB|D*4d$%PKFV1IcEpNlit0G5u zaaF{4m5Pn^mf7^tK({;oK8Fj%F#il|pX=d)Y7>4RrQls)miYVOc|SOGfi+Aw!VbP2 zM7UYw0Ink9tMI2!74^K$D_UALx~LLpb2(e{*%AF6rdX`bCX*-7vCeiP;X0`tRK&9V zdQ`rhWEq#ckGL#D+3Ogx&gZiAl%csPR}$nLP{h&K*TbCWPc=Bjq9zxrCQSRjh4EL{ zA)?Pl4-uq3k{efo(SYfyzt-qAbgsABMC=d=GNxyL^`u6a^J>e`z#sT`q zd=gdUjpUw$$eFA|_}js-Ef>`}6OL{dPRY(1S_4?#(H&D+*PJS)2a`L9@A8?{CWSEY{V1}sfa}k#z zWbd8Jr;VshKHg&L{F@md4m)waANr#~l_8m~A@86)Ct{V$X3dd_ly-1xS%|6&h+?Hd zDKvI8zun=1%xmgUPHtI2Slhy?E+^gH!Dlw{NROV_d;HBqr>TTISd&bH!tLC2;{JTi zfmwxS%hWBaGi6lK7eM36p=AJc&czZfBxC?lu5a`RmBv%4mC}n<*hnNJ5K|!g*o?T` zw=&`+E9kL)WqyiEIJ8W4CI2l6IX~%6o`q#W(#BvvI?Pi{4;heUGOCYQORN^QiNhjo zNTp)we#J57%b!(e%g=uv#zOD9PH@y###5w}Xg*e^6GAR`Hai}wTV#m+mB&1*h?=4* z;>>&ETVUR~nAajptcM?3JlTGLBz#%X&*Yylzg;?L^x8}!wA;<(#}=!W6;=kJHOX;R z3Y}#xlNM1e?XMMOBQOw^Z7djB02iRgyVYK2brz- zS!>IE!D`JTb;#xR$PvoO=bF4lytc3$_D#D-PlwJ5O+qXnCf5-Da)dXhritWt9{br6 z{my3y%~R7KTr+|2vF6UhN&m*P;Sj5(xH2zoV_=t&no0eIF5`azs@G~T6kQgvkJ~R( z#Zu_1YHh5<3YM?~Ds@k^$%bqa#gtmMTP+LTl6F~9h5uv% z%7ZZQ?xFW$4vWAvE6V?2Rq!LKYVq*!G&VNoI6y+Ym)j8E?Qi${`}<;r?5|J|3bxy| z%r_vsrn;pigOPVz6akktH!m;5rQyt?^J@{3zz)wUSrs{(otsn0{Ve$BdMxA_j2oIFa7*>6k6=Nk+9 z)escIr}C)DbGNSCBHd0d!3h{gNTsVJUDsTfs-Vv~P-2q(+flFdl$K-ARGNg_u9yFb z1Q(|342$!wtDAn&ZiRPxDPMt#%Iok7$di8k$?};uO8ILTC97vlj~WrqXO^;07XxQd z3Tw_$izn=Kl%0RDrXvR(LJX5+kl1i%X${OCZ*GW_gv8P7a5cWI4K=gE_r3SdoCuGS znXcXcRx9Y|n;$T&uDMSl^Syr$II&sM=3wVQgzKOF>Ng&$rPv}3dxO!EJ6&dFW8Ymt zBR+DKvOw^os*}*B2e;EgEqI)gweV^-!6qi~Q-Mm>GfFJ5S`)oo-0Z|JR+7y0IWVF&@z;^{{` zY$X=r%+)QhlB70qok`o?W2LfyEG4Dq6w_@<@fEPR>9%Qt8u>Fn*{9UywN7ya`UlY^uaIY!9K*LqS{C51nq3A#$siCt(6gy zTtOG;R3v}Dt>bxFB#o?G^=PD6*vn;~J4JMAI&uk6%sYes!3|N!#0yl&TV}Pc(o)|n zZ#a;qa5YXVJA|_$NZUt@X5-J^$jsVD9F0>8l(mfw@1cu0l->As=rmU8Svymt^zKa> zEM17N!XIUN-Rj((17Qv1HpYa8e(LeC&-!5g&&{xvhrs(Kw&hQqN%U@s z>aEifC69CU>MMiH!KIW$NILElyk96~kgUPq&zm*j9(9pcDubOWJy)gsluhvIPdhIg zR>IdHGHjejEiFx4K$HDx>QQ5U3i%ieDZ=20f*75OEdg7=1(3Vl?nWK5mAKlg3ZBjV9{rTN~#dXc`Oja`N{Mw|H9Udw!-VuIiIL zgy`@&M~YsO61t`!jJeDZfquDHyDF9zb4;;aEN0Iqu$lZhdY!2I{N9Rsb6EMy3ZLGE zv~VH3w}n#s17xlKsv@1XBe}tTOAZYHk6N^6`K-`6foHnqhD5otr#5`(tV2pSzm65? z9kM~~sYU;gb+oT&7I&!y0eF2d-}m@Sp#4uGEM4LZ5? zfzYLRcT==(~mcqpj2b(Wi&t~OTo&wV5TSELZ#nL~O^{f9%+xGtW6 zr07KQY+X`??l;!2?{`XMGUV8JnaD$zYl(^V-EG*#j8i~93%Akd<8|N1irYO?FJh|y zu<1t-p#KqO$=g_4Q*}fauuUC9h?&gaa-8i|b7KW{V&lxOxIR%b`{ex2#{Z4IyY_u5 zP?aiIfc;<==?5lk^S=4KKK_&&s__ zHTM@6e}@=9|2Ko<+6Ed>tT874qVZu4H%rHMOMwE`!9~+<4|03JVMWGu6W<4dP&e%J3Gf_l9_Y98X?93{&lh-w#B5QG8hV zV{dMP?2@0D;+_g6o*-45MN3Nd#4PsTX&X=TP=8{c{l*}njPI~3R(hP?y->xc(cpN3 z3sAz?en0@bJ*&)@Ll}%u4f8MnD@i>RF>BV+G#R%?;aF|6zk!2D6ALDwY3+2e^%YP31 z>HwM7ay{$ov3}Rr1kGlDePes=;7~go&nH84iQ<-}T^aYw*icpaOPFfa+)?D*e=GQX z69Py2{}0O5w0Uc>Y(^B*d4jx&*Xw=AYgS*#Kk(GW0_2P^m zp`np$^o7F}qW>A+M1Xh{3h_I1DY1HBE9I-yaGk@U!Z6j$j1?!fvBL3pf&Sl;N}TLF z0MSQAbS+D%SPT+ObI1GAaPK0;DHcX&2yO6yJ8L2_kq||twz|dh5`Tt&T;QC2F4g1nxwI@8O z7AJj#LM4Z5&|Jtwf$Q zeJxEiIe4*#W?-hH+-qZTD}){Q1uKG%{!BjPbc3jKj$wl=C>)X!h*OM|KBh=eAP&8w z-RJBtBxVU~M<4Tz^6>jqn$MNPsgtPA8UGW;KZPArP>s+DiTSnQ7;?4e?3sw7>lOZR z8trMP1#5k2tVSj4Epu4GGIK6!7G?Ts#Gu{ku-1y9warmEaDGJX5`4B!Qqv_s7|MQS zjTsIT+3wGFmT(_@_Cw}wIFDkMv%woTPLp9rt*}r#6M40b&-3Bx@5#~%uXtcvrnoXj zy6x+4&)<|FCc5Q4#Y8!1mG5VlydqkWtIJkC(Re)8izAmm(Re~5_k_NlJH5O=R!f2& zya|M?U%7ve52MvBUUZ?wrhOlW) zhc<5Xz!XkI|^Qw@4=LhBsq>0$-+$YCLp4ZNa^eR>+=ob)x^pik89R zcP{=e7zYL`pT91>aAsWtTS0QFQkK!6kqAfOQ|XvA$i!@wNrAVaqJbelCwkMnL)rf1 zMw)KPki#>%X|IS1-$lcoBm37SuH)-Udwsih?s3Z$Nr!e%$#BV@V4`2RURnx1(dQF1 z0t}5&MT_iQ+bdAT=q{@!EyKWpuX~vQF6e7We5swQ%+pBeX9Z2EZ@te zap?)3n?9cun(&gNUo}fa_h58&vHRLbit@Z)-BzO}%f5>@phcirdrt!OK}flTIa}LH z1SEXfx7L4?bL^A&Paf|cT6L_y8JlRX;Z6^E24kF%pcZ!d;$ki03`;6jPYu#u--agA zyecm*qPcGC$6%0M`{Z4Y*|ectcv%+d{W-8|ntCQ7_U?=e{|3W|cSAe$)eDWVTtW%1 z%(}{6(>eM&c&>Dw_2P~bq;#)L6GEGqk2#74zfW4Yn!7P(FM$roYPxuF7fh z`8YNM=;MUAkyV!WTrOV}s0eRB%BW~bKpmz+sqB4eanWlbs0ZE*ilOm|7$O!*ZcF>i z{vZONk{PYk&q|N!lP%FCAP|_6^3WY>)B(_kDAx(f%E|@Gq5xn&MF+B|uw%Tw(az@{ zE^;zyDRZ5~m>0i(4WbOBe8rwdYsYUneiDd*MV^*2h5Zyv2n9@gS1xYkqNhnmK>BgP}}n zXyD-BSTLJOv;5OQv%5eI`?T*6YV+mz`8()eySkLess>19v40sB=R@v~!(Eh=_cjmG zS06V&;j!M+KXhS>A8a`(n2(zgR<5l}wB-~R&4n!UgV_1nqtZ@Y=a`v8W;&!z>{RTW z8BB8&4a>Q4SCspY=Vet@QVPs&J7(h((RVE_eV{;kpAwc8wRu+cqAm;kvrfeR`P!v_ zshR$>t=c(Mj18ztLIL-~+(=Fhj$!XD%-!aJz+D3mX70xNj@B8Kx^{v5v8CBY*?r2M zCTqSSj)pLzQJM%81iFLY(&}oSj*ceYQdtIP2K!IaufF9GEnahzlr4AfNO4LsyZqL! zlwkY!1N{jAK5*cqA04llii4I)u&t4GVwIAi{Hbf(X{S}SoVKqsqjt6O87;(*6I`+B zD^xXapbVGSgW7=|=T}W8s>(EP5UPz_=`3C@mMAS=Ect_xJcS_s2n{ckR8lqFzm;zk zd3-_H-Mon}6sC;Y9kPH>A+xnp9l4a)$_f1$@=x^Nns;Q+PS%Is%lwIK#~BIx(PLxw>WbF92kM0R#%Ww9Zgb>#6p%Gtj3;UIK0!3c4x zz+XwwNNg%f1#CbGlTP}GO5)v2O!sZ)#% zPTpq}FC9f>yDwRfzs-%lNK*NT)`SMVCa*=1aO} zspNmTt#oN!=S`Z*b#p~LHf^BQy}f0;3O)1CLcCYQyhJdw(4V%&l(!2;y3N=RA)TjQI@o^GU2P(p6PFyRY z+(gQ-XPqo@gY4<(n!#9*o>p=q=7EVZ{>U%bQjgc09}DIU<>lomDL9V=;rJPAq)yYJ zaNoY!IygAk+6tp`pJn&%wx7pA#Y<3`+C7QxjtlSaPr=^hI$pH=Gc>ffx0g;0$+%0d zdm0SW6D}9lmZ?LaJJvdjYB(f)SR0RdR@(4-*afb)-DNw)$k$IMz4{~U(k22oWgABO zy0~0VGp@^e20PdG)k5@l#u&PAS0Y%)`Ncx}&(9=tZ#_=x){%Meat4Ui7r~ajZki)e z1N!&gXIT%hw>h^P_|r5Ltk%vzj+__jY%kGV#7F1e32pv!2?<3aBJ^bKwaCVg{z7#4 zNLaLBGjX|rFu0Zqd1H{ZEDT(M({bxG?Fo8T-x%7L!sCN#{0w`kR5GE=QSm-q3tM5Kh zo~6xw;c$o;MMJtV}KHK}%G zuR14?RelwqB%{=@ZKoIocYkh8T-9SdsLVxbJ}h_H=|TU!33%H&bSVp`Hh?`b)wcl46n4arE6$Ke6S%CASS|Qx$ZRljaa_0PmJWvoOH_o? z-5}+lDK4Eh0b&Oj?UNDt63I!PgfKTr%N0EnNt~a?s^c}NGdnD)Ds7+?>p7vB6clhe zPJCCt$w8q`f1dOWMwBd@#AnoC4R^?HH+1XAwM#JvwY|eri6~|9^Wz80<#RN5Iy>X( zn23qWX&T~}dj#^F1{19M`NIQiT=&x~T7@g#xGx6kMhr!%D9^M@dIi0z<6l-iHapz{ zuUp5iO4QQ;N-nEceE{dfGM*h$P|uru#kXVBLP-jB@>9*_?W6RoKODQ%e`T$68IZ^& zf+i&X#ibojn6R!AjJEVObWLh#iAVeuMaAWp*&UI~4k?yu7Ab~z|~=8$s!b>UMp_kM||yS)ZR_o6Ub z(|g7ZTcx-kv$vS~d%k^}2pu^##wq0C7pLm&=pff?b&ft*wP_GS0!QMN6ss9# zz7k~v^F6W9`*6zVm6H&WDK2?GVrUM1e$aDiV(CHz<0XTB5Io9fEU19=>JRwBsfHGC zDXXlK1CK5DfcbIZEFCRfiVQty!>v5!?GBr1=V+zr;|K}OaHJ0a-syaMdHAU%-l%Wj zlu2Gb>4OY_wJL4aIdtl*T z7s8=wsd7*i;ZRCYvO6JGdgX!rVpOTzU0vN>ABPSJU^`B0UH~DjhQ4vj*2Y# z3D7UNF$;59`@1mN%9KCxgZ{XEx_)MA(@W}!Lyv_E-&D^mD#4@LtQ{Tg?fhPS3E|8A zc|me+c2Gdz1^@_@O7i4JrrQ;P<^I^ul~&wF0bpPPK#YAy01IgX*Moo`2LLZ$Dia0?ESAq-3O&efcsofW*1W zs)3JIO0hWq2my56I5}$52o&pmwQPSncFK{cODi}im;@{F?Y9pfTZU5Xu!6DN@Mp_P zstc5(6ZJ9olGhlxq*LW7K~qtqm6HEj$j%i{q3k5&1|8HjGt#x?app~eU`1G-AE_5{ zk&!wGOXZN^tP*5}Rnt&$)0Bf83BP{5ZCz}izU5^B(X92&jm-(M=A+9q3J;ZzGL+Cx z$VA?_gjL3sq!q@EVDV=GxpB$EOWOT^EUCS-;3e61V+^M|?D`8BfIP&L70ctrZnRei zOOK6SkH2T9;>R@$vT<@&)|`R0wA9*de*Ns|w~b3tmEe&`#2i?=nc%7j(4J4lA<0}U z8Q60w?TLdkZiiJTzMywTl%JIr@iTE=R(j^}|BFP%Pa4lS(#=373F-P_FcIl%6#?6y`V^n>5p?2Rbk%wPAV?4{8LyrcKGDti`^##A>r3q@y zbrA@bdf1#D*`jHLf6rb(^uRh<<{a}?U^iv`qRr7emTX0A5LwWk+nT_HiN52ycXXc5U-0G&04PZ<4Z5m@GE9P|zgvAY+73n${9+K&GoFi&DM3I>CQ ztbn#||9n+2NA2ME4}PX-r+>w2P_COxKWPb#T}%h6Ysj-rKK|`j4n!+Yy{)VwsEJaH z7i-v+Q!GL*m5H15K{{Df5c*qUryP@=Sk>Zs2&~0g7ZBwu@k$nHeR2tOCsNK1I)9bh zY-(cx&T0r23g+gdNXLdW7!lQ-AB_hq!9U477qpu}wza=SDV4XV&LiN!UyLY*r zy=0$xza9*lI`mc*u`IB9W``9jCutYWpo-9OoJ!XG8Xl$R<9l0_1nJ`4Pee7ntc>fX zWv$X-=03X7{%uYZ=Fo`{|?ja<`dqw>7IYJ1y+Og06W>jZ=f&tw`1 zG#>K(i5?UMQE+J8~q_UEdZ}Z6M=sC`ml$3sc zewQ4qtnm{jeX3qK-ufTq0I(&Oxvjn@|BlCI^cvReL0r7(l-FbEkjB@}*$=GUr9lAw zy7^XZdd6gN?FvUQ$E-8?r<4hHqEkSj{?5%C5PL&0?{lZ$nlo!=L znCwpEBt)6!B65j{aRFyD^~LVuD8q#@?UEyib=w_{q`dw5C>D_TR8^wRC@XYN2K0!5 z%9dNPWh}1TV%O5Z@fLNn7;DLA>++5e)j|u5AUeBG^a}{7Xm&tRttN5R`#jH%PwomARj1&2v(2XN5!d!^W$J@j`xAc@t zC$CB<7i=BF5Yl(nvt^Ki{`%mpPW$$<6z0Q`-@Y8h=2kXvAj!%8&8n55=-YuO zz=N(4S54YFNRnDOt~Ym1Zqiefb%y(_mIG~WW-o4JQYjqFnV8g6z5OpvUA%=_O)62` zs#3!tBEP-&8W$ZdVntgIfMP*uHUbY9Ia+EceWi1Pa4c@m_*2Hk$q|0s3X7Br!;X;7XbvT890J=G)VVLH$b`}vPDnK}B{I1^r z?^GKT%fN(gO$AlY1ZBG~3UP@_gUO@YKDv8A{=SmMXn5H&dTF9gGU`7xy>2e{mnRsJ zNm{wb;}Rn^DQgx9L~UZX}n|4-R({U|}(t zocC!(42+428}lfI)^30r(jC=uWwy5~E4Vry8k>R2*x}^$>6xTmTZC&Kcei<|wh9-` z@#nHd!D;{V$aP^b}}?a66`WY4WaqBG4{S&Odue9n=CDa|6WocI5+eL zw33ZVZYEJE-qWCTlho*qe{xz5t1)A=S^(Db_ONwo{-#mT=4J3_tc-LHFY`xeS05h^ zzY1gOYfzG+kG^hv_*Hh`GN0nxNj5@TAG;8LaFVqq{;N7(EiFA$F*chdArsKo%cZsu ze?*e08-;_~%NXr^N55sDEv4cd=wnGM8LWJAjGw-2UqHt~PE{99l^9-bkFdnrK#Y+> zY04oMfVDkMpXb@WQ+BzHE)DQfF0m065zwbgYQ&UyW?wuzA4*j_pi%IqBvkV znWOOfQ$~Uxc$;@QJ|zeBeHLf)L^WQtoaMqtV2wfgyD-V!i_a4z?K3GDpQ@rRIpl(@ zt1MwCE}g_}wICYc@$a|5K2cOyv3Q}Rrom|T=3p>WEY-StCkyHcr^@+uF7Ber#}iA~ z&vynuNK;%;JN)hCuhWUEQN^-P79vdwvns)*p0yHm9gpKE&l{NQJ-?NllDMbD1cCk? zPaUk8^s&7Rb9O$s{L*gp+L%t#HwMh730X9u^269(AY#pn&G}+o%CLpJ6?~Q~glAGr zdkG|tonykIa~9swa`QICT*Yv%t)QB4t{4B7(o+fvtbzE@x=|b2rPV)4J+dM_0{hHw zKSt@(kq*B9D69vTg!=x_g7dj(V3f}1i>(3IazXUFo$qmUZv3XP{(P~CFEo^ z65W<@)L8(i_f*70JBu=p1utI-J}aoW1Myn8UdQoMTxe1>xK*1<$aIDYnZ#mCHK`K# z52`?%d%RZ-SFPTd>zpojT1n09nw$~-NYBFiL#XVgzi_%>?5hZxVB}=PK(YZwEBR!G zK;#kLVxkq;7yBaqANs1Q-Ry# z;7)+x?jg7Z8Qh)2f9|>UGB5k<+C96wOS)<;s8nX#njz%CEiY1wsAtQnQHCX|mqm5dAO8u5ODYG2CB?j-bQCkLt25Lj-xB(^#-mI}p z+K)%j;pkFNIfnR;utPZ^k!FuTkNmIM5ex3}oJ{F>Th}>{X9wuQo%dt(E5c6$XO@H^ zQDIb-Nk$qTpj}w`{Dsg>!5e_=BZm{1CQH|bfL!sEeGuL+P)xIHCHm$x{q5<^C%Z(O zNXN8-^+INZwIx&0d#??8huuC`?)rmd9jyL|2)!qsJM~XVm@swesyP*n>}ee*sqOO$ z{*#A5Rp7JN{SgBbv)@!`&`sf!Hz*h`-3}dcP7YHpGiTZm-r+6C!QXdBeZEJgPb~jU z@Wqj}88KD}{S`(nf4UW=dgRZ}CmrE@y!g|OE=iFBpSOc3pZo))*)$H)CtwTkyyxzd ziWV#~lWtO_IZ;Ysol4HvVYL7{);8*fe!mX|aWcgUL7e~bJo1&L zHQ{)omwiOYUHVV1x+mb-b$qcCy>NVs$SNV$R!&^xuMIx!GcdtV``3MkJs$bZV9$?z z(m!83(@Y23>23||&mf|YyPeA|Z+Mlq+D@a^`Eb5kzEvNqGP1*ZS5vJZQmk5Lc-_-{ zny$l`+R{rRHP~}ie;erg&A58abRA6hcaFnlJbXxkVME5D>sy%VP}^aEP>^`0l}aMl zhp{!ed|O&CNnOy)9%4yGPNutuVAP*>9<&4f%%nkVxhq5F&vML1L1A)C3d-!~Pt^~1 z8a7B(YfQS?g+}o`YC(uM>#cF;DupOnp1f)d>|EpzYJB7HzEI2rP{|j=0jY*>!rU`l z_E&FF;9Wmzb?_Se0;pi6Dh&zOFaY3UrmU{0?vVXQXc>%?5u=laM`RGimvi^q4vm)Q z>ND?Fi?ugnQ{=~yju)>zG=1%v!1krN=r-aN8`VL(N4xq<^LnWk<~bq{RuQ{)z4-xL zdl@HcKBd_o!npZAmq~G!X1SmdqXU#S)BNqH|86S_+m)(;MUIzd2tUNg66=htP)IpU z4$!Kx7decw?S4@2uT(@vWj+4d*6&OUVx-)hzJGvfv>EOd&28n~?C0qS#*kHHu9}HK zif4ojHNlmFm$7V(i93K3U}l)v1~GkJz-Z98q~|FANlL@`ZczR!6_t?_F|$S7%+=p4 zrdmSKi}YQp97BhueMFnkC+g{rG5RO}lmqE_x46hdhI+T4-f<`HYu10SU#+3 zX;`9DAqGZaPUJ0#eEGW7@-SolgNP5mdz!NbM~$L%?%V~{tE7aHk5;(H@K+s)L5gUzthp&YY z@t-hkXSs_I-)5Lp5@W~h0-KSk*=HG<$cfS}IR|+-(j_Jf)32*i#Kp%2R%+O>*sE9i z34gKN7`$w58{xMTRY$%g!PUI&^DS^VuFXaE9g0R3aJ3_iz58JotGa)0E5@~zEEGK| z9KVP-(f%3*6CKkAXBwLmrdZ|fi2fECIrmxFU@gN8vzzoiYjdOdn}HZuK=vCMaB6P-<=amzewL5k0W)X{GvOPbg-WNkO2?XPE6K`)SYG_1g5La zuGvJ(hL0&U9N6eh^kqTW8wRx>S3YcuJra?oynN5rWbGV8IWFwqAVyqLp~;|uuxfGi zPR=>bao1vB@(0ng`zPJJDO=Hkf^tCZg`AoIFB0ZYg0#_t2UxxtyA zwfm0$wT=N)A1Ed6LZ6R?b1N=cFcB}k$xbXCVlz%70MZWB+0#QCYE`L+`hU@UVa+dK z$b2>$7$h$te=Yt9`pm=jSaprXGGTD-*7gLRcs#ZYMJIz0Hj^JY&J0&DJWO{c`P;4q z^eJ;ITe5Hd!C$bqf5LYP2ua3gD^L<3Om1M#f|)UxmLBXv3|S?l+!I^i7>jP7tV=9- zn<$Mxba2M&*GQNzu{H240Ot-3-92hhsOKOd-`h=GshpohNcF6_J?BCk9X;n>vC1Uf zyG?~S<84;RvoXwj3>(kALR)0`+Cuc;`^HaJboOn~Wg20(^;IPo{3iL3G~?#)c@ z0+mEVXf#^lMx93W8KnZ%&8(jDQ_zHs&}OD@m+s&_@NENP+zS32m~k^FI?ngQn?a4| z=$445o^sig>nCM>!UmbRR_dlcq#@tEz4p(w^O*=$hU#wQdc~8K!0kd^#w8m_uMJO) zizWG3HdZfW%i|@_UrB}asARMF7sc6bvHIs69~=Eb3_>rxTt~Huc)mL`Q#d$X_I~N& z$II0^iH;XjLMJ*ZU&Wh`odylh9>%wIj7a~$U*r@vmUMHkm$?XctP{KkVVRygO)wneI3vM$D4_hN5-k8W#_3n zk%T^cBL6$@k3E50ruo(fQ^3)1DJ7Krzc;2g`#VraeDCGr^{vMbVLB|a=EIM}Yo$!k zcsH-Y-3O0kp!6ej)N3=m;-a+2#xEP)t`M2198=XBV$22x8;RHSHKeVN>w>*miV$lt zbcQ>mR0i3uJD_s44Y4ow^8&V_3-?lg50~Ta zZ8*cs$H&`DVdQp4Po9^v1HB zlCV^!2DlO$7MfZpo9v<$URppzDv?Kzyezvs5~oixrqH=l+$#k7hyZ8W+^0+Atk^|A$m+ui<RXcm)QuOQM|*4%?RwPA z7Dmfvr%)ukLPQ?vyZKq9J^xduu>FO#e29`2uvd6L2Ye1Z zn(}$Djgk+F!>D46irvQ?OsK|~P@OKrirFp7q3^?AyuH(X=b0&yBD1IyGoj9@MTqZ)wlAj)nvX2E1$n$=M01H;x_`*qPbHHM z;G3mLyhRB@GPNtM&yg7iMy_6JMF$}|Yb_NKFsuMUJt9l-7lQ~xZsXNq`!A2!!eHg* zJWR@L#v6KWc(vJir!z$`}Qxk1Ip7{*L2wgM1NUk@e)GOoZKX;;o%~~J`&V&?(x=x{l~lH*M;wl_}{1ZM>!(GymFAyn6#{ZJG}hvoSAX-JQhsC$3RvFUG*kT zGB|Dg-JV!Hf}wTX`Tk6LBE-2~tXTk~fbD z(m!IWEXZCa!?;NnrxuV7?}CX2v~MD3e|5Ti?@SmF;er0F4l>8g_kxQ5kGW@Mok0f2 z)kLajm+!OT+c*Tu_n?j3&XZp@OLyRh<(~_2VW@f9-J4L}9RGv&fe#yR@z*^hBO099 z>d8K?@@^l84tj}79L>_-GcVVwZAPz7`!58cM(4IDzMI_C@6R)zX$P;w3+FN!|E_sCT{=(A4|prJ z+M@L3a&NSZM62)mN}h8uSo-7VZvk}o28CuxyC5H{bAeEJ)YG-xd9$MtV!ta)>t>d& zgM1KpwM&H$>7Yd_U168h@&m;}^yyAAMmMv;O*B8xA3jqW+wftS+;{L&y09PIiEW7Q zBt&%ap5s~_6M6w>4PeGSX%((|ndQ0}2r)ydI4Y*|C@@Yh85+U;f&yD$ql}IsTXjm{ zU%tX6WYtxXNxD`Kit_kX)wY<7lf(;6^u7VS$T|iMgkbJc^ z%3@DYtmmMF^W%p*(+T}A5`(4+)@R>V$G}*mWCtL>(3PQ$LlC4li9}z5GA+!{Sh~ES z8e=WGj?t&6mTSo`}!7?Pg8^&MP&;@&(>ufrwOWe2tb0es;F6 z8(&4Qgw2HDuUu`! zX(y|#I>G6Ld(Ry4dE&o@i2c(y=+lmtcwwD1gq^4@^0vxRR_Yc&ePd&v1?qt9v=!;D zCoA=lNHw zqns9x<63(-RiW9%5 zK?w||4-H~QXNe^qi{Tl{12|ITE2__6Jb~zBlGVnUpN4%*LNOSIFq=kgaNTTZpZH#m z?JH9kg&&U$F}(5#iFRE&;{?qw219Z5w|@zr9|X~>`-n@(xd>itzOzI|hy-g;$zUbe zY!L*3%8fTVO&)tpgzmO#(&ulXFugXs;;xJP!REvE5S&aXYo!+pgGrmtTcoA=j+2n7 zk%&k_2WI^Mz%o+Exp75QXcU|BZ=Z)F91&5z!&I1ln9SDp6(ykrZNlzzuWx~*UK`I} z>Td;J#+g4){8-bsiId+nn`S-AzYlpgJjzs+)fvheQ#B%-?SEy6b_qgOz*Z&U>TW&x z1@VWwnnp*O$QH`d>@<$oeH9yb+)(ih?da_9=4Gza;kM~~R=z<~rA;xZeR|aDMv13g zkoeey(rZGigs&%#^5>Pv``zC&ZPQ~JRM?kLDvc8zlejt1i9Li+*!Lc}ph`%EJJ;xa z;emtSYZOr_h!j?V#Pg)Ol^t~vad%P-U;pBh(~X0j`aDXHa-1=Q;rvr%k`uA)VVppO}xH&iKa?^dD}97UWIzdZ&)7 zaYzK{31b>O?W(l|O#*~Uw!kLKZM>LvD*2Kw_nP;ZG*paD+RtSZrZl_Z&v6+4j-%+ zP=o6aC=JliZDc+8rCF(Rua3`N?>|}B8G%+LD`N7Yefda55d~xt(=;haVm;8M;LQ#5 zEot7D90ORkTcfvPUjR1!V|W|6u#F=wL)a-AUhI?wC*gg*sA~S)L_L18YfWtr^e}B2 z9hlXclS?kAQ79V;{wv9x9L*VI5y||&h?-?(3Z4J z32PIh(N~y9=<6ANpRKg74Dpw#>xiv9XuWmol)A8JDc^a=7xr_h=lv1sO^eVxVv%5 zAVu-FsQa8c4JI7d$`fgMOW}j;N=(=qmimH8?Im@^4&Ar4>>wa6K2FleHjjmjQ1ti( z$(`MD#~V6OM|!HF6kghjuVN*aY4wRx8FE!HTzozmf1jvGxG_u~<56asITqbFOS2F# z5m}_xgQiiIdJ_`@gvzfSOued7-!okx3Np5t3W%KAAX@nLyvDPZ}|qrvUv zkkV#k06Ii0k-fr>9NAF|&IQPf*Q+GDfbP-cb3y4sp!*pJL><}B#rXxWVqzM1JKIn(psmW{%-Mq0q@~dzuO`)8?3)E( z)zl_@a_O&(UzF<5Wb*xi)<`?H#9t>(qr#)~QORvz6tkfJIs;vxg{K*3}vr!+bmP7DOG3Zx+!Cj&CfsKF`!ZoV@TTq#5 zihGrSE|E9m>Z-oeq;Z3VE zlaupy3rRE*r*w^TR)$ge?ua9S}zdzGru`JHrm`&?S zC#dQP1cg5XdMw})=XfbL7WY>1#iE|1`UlYIlZEIMYV#=klK*M_V@UWdh;>F%9An$= zdTBjWRqRzA5}CR;OwK4{kMXj9MLYBPC6Hr&7BhSdMly~lr;s%a-w-tDja?=Nzp)O#AQmk`~sA$j${;R8>lwcr5dTxW|RiY zbrU^_dKNMyh*jD$EX}B^cN}V9C|1|dovODFQ03!a%97nrJ6(D(;m2tp!`$DXY(T0MQ5f9iO(?M zCBk@g`x(V_3&(Yp%!G;fmayW1bCpKc@)_qCV}M|oJ&{)VLOnqf{~c!Nxw_q8lKzjZ zT*2jcPz+>fssudaKSyl1v?{z7D!&>ifg8w!r`)l518 zpo)Nvf%3c|H0`S1!>VB3(8yKAj8AKHkmLH}UpKaJj2xkNIo`%+_Q*z3A-!&o8zzE{ z$lW(Bz+_@#Q}00#0j-HChU~1f$$2)dP{ILjviai|S9wD;v)3y4aH$imK3cHLW44n# zmnrYNlix?^g}<{9c3}TS!lxDa$^a}^b7DV4J?@P7*P8SP=VLT1sN(lIoIxI42_(=8 zIPmSM*~K5GcmglnV*vz!?Z(bq1Sry6PB3ndqudx6Fe!I(I3@w|^8BAsNO>TB zx7}_R$IO?D)WZICTAwkTnQo&N5Ny3YFWhh%O;pj^LRwdkyr`g73-S_lrj_DB`7s34 z{i2+9lE%vqHJ%EreAsg_S_ixW1C@@C(PoJSagI8J$und;lFXOW61QM23JN37XWgps z`MWWScn>P8-E>Vfh>wU(2>$(`EomE-s&doN1cZr?RZqz)u&R+Wu-i?b-5@AcI~@i& z8D(hT9AAH}!+T8K={`vU4aP8RQ`!z+>CdhUTS0+vn1ym z?!_5dp57*$Pu7ohsHKUDZ|Vk6jXa&oQK?cLlA4w922hrc;_ix!#F`#rUb5zvxY)yU z_q*0khwzC_qBAwA(RNsZLOr{72qYFfi%Z&Es_K7#d@OE>w8R1UVC_Z`uU)%|mCx#- zcUw4z)+WC6#sK)j*EBOR3CVQEAU(CXEyATsbv#Zw8&zfc?BnaG$HuWK%Y zerevl^mvyh_trf~d?6NS-$pA{$raq~%wG;}OS2rd_@pHRkB*JAG1-ZUJ;a;VuI?BL z%b}WPs#jJ-|Ma}}%F#w0Myq+Ae}uR=Leko4-j9$f|KU+PXkW%utyBx<>Ld!qau|(4 z@R6Uo=wD(C$P>%dni52j&^lcHGos0igVaqqx5jhw#0PcFjOE`m=*kWDDviI|On5kd z`scP3UXQc4^vOW!aA|6A-pH~Gl^vNIx-6I0Bs zX9ux_XOY5WX&j?U94D3m$x zJc5n9;rL+Bfj@)0G>q`J*~EJZtP{6Tveb4nt$s$aANgfM;`UXn(T+c66$(YgZ`+Y9 zJ*fwqHmI%>Lf<_LGmTC}9Dg9g4E{EK<;Sj?o>2`g2t&Y+t$1hv!E>`=I_r4T8P*!U z(`(iWO$e|+`4E)R#EDA!!_kWMG$t0nIHY^P=pZt!5Ml3Xu2ye|Rjcw}OI5AB*@$+& z-XP|vAXF@+68%dhu3W%a=hg0{dLEt&e@kQWSPi?acV0`gMR?`P&9MxR zK(@T9*7+AAcN3XYZdQ{yR||VoclN3~cky;VSb;7=+0W3AHHoc$f%5}1Djmxy^L~-B zYg^ujU~n=D2Y@CePWW&8Q4f0#6Rfd0n>G5Q$+oW?uro;qiJ`-T!76AFUt{>|ID7iUcso+gEyR($n_oqxEpiRzHP zNlYte_nyQKCN2@5XPcg(Ib}R;h783XPUpESc0l=E{SdGR_POp*{TfIkZvDCxVj?K8 za#eoZbQrt_VdTr+rKJiEz**(%+v@e3_Psa*IZbxAS}t9u**R+1;J4riuQxgG6qWk2 zWvw>@deo7LUc((~Y=sJ`hD>LMEpG7H^t-Lc=0SW$Z^NRrO%!a4Gi!&O;Z7*+<OkBduV;ZC!&Ll zeKiSD+|$L!S(Omj3zu`C!bsC>#K8(;yeyI_8WP(szGn! z*-a^OU1g$me#48%)q-EMQ>j?_lPMX87M;kL8nX5)L{CVOaRS~~f$VG-2@SO@oOG>m z0K_JNkgAf|B!e<_@zkL%p{eQ#^qbr3>uVGRMsSYnHeQ6#6dR*_6v90;>^X798oy4t z*sMVk38_Y0%602*Dt*CYrKXp!Z#f6dq5^5qQLUUa+L#qiq^}w~148taWrdw)f0gV6 zQ{4rCAx{e@Z}urKbpH4BZ~@KVajujgUhOoIE|8@1^dBAyiefzJaxfiXg0rc6yX>SX^{)bFb474E3D@%hRJjtZ=cgEY-8Z*dhn zN9#kyDwMMdX2m*fJ}>?*0Bu*$C!K59M3MNbSS%baMv^8nnHu3{mP}eiTX~?SH0#p! zPE{O3pekH}`^{g?KGfuptltn@Bf`CqD&LuPp z+}eGkggs893%O1tMqP~iU%C0ef4DdYl0HQB7pP*?+WFT@-ILpWF^ZGbV{)IIcI<2u z*FD#71_&W#0dEw*;ves>+g1Bfe{QEAa^8fZs*7_%V&AEa4zL2uo;9|b%kYmIL?Xo# zJcCSZiX$SPpS96mWAN82A6AAmJ)%dfoMZFC%2GYg>R(vB6iocg&7+?ovbPFgI@vZE zYxZ?~u4kwj5FX;H_A9v`0|{)TOhqMyC2FBRq-HynQES20n|KIl)QXFHdFFdQPu(5Y z9c~BtXP6_Ys$T}{zXaYVMl6H4KL{Cs=~_Kb7cLFX*8hRA?xR`-CAr=-FQn z+ugqMe1D1%%|?!y$nu(*N$oa~{A`(^oguZpW|t0W)BJb9`+9Ju&RDDrhluK1wIgRO z>*uJo5;L+zg}*0-nUH+I?j^hWBo-V^o4fXA7#0N7)7G3@etV6wf&l8^zHzi)vX2(S zoLN_~*4NZjRn=80$D_ru*nY5+In!ZZXWkv)Qe^YA@aSC?sx+O<*7f*)5LpAu|C_H9 zb}Bp8U;%0hjRg`cD0MmzQGaFb)vCZf_il%p4o#(^SRD&%Z}9CR%dp*eha@dCFF7wS zL$+u7y!Hs7SjE9;K7(9obX`(7VF|Nb>fY`3XC=CVe{JSAmK}vmxblrTU{z;yjj9HX z{Q2r~XE3t&F{6rokyT-&|d zIFx@=-N0at?s4$jOd685g^wKA=n@>#(8EQ~&jq0SM7RSmm1Vq<3+*ZnII+sbMyXqT z;bLlw2Jqi(!PkNpXFC%j{!NL20a+g?sdZhKb0Z^8ku9gvjYQe4nQjQ)b0n??(_}VqPJD-rhU;xplWVHL8N{T zrBvWOX>I+UYwd&IQkVTg;$}Ie+jH^zEq^jjd*T1oon09%fldl({(EcGseGA*t_sjb zeD(51Lt}FT=pISHp`b72a|Zv36Z+@Zp8Zd{iIgsimO&!IvT_OvXUfVR%Thk1bpJcV zxA6aan!8^5zrldU?f)iI*|@m4rt?Mm{GMF@Z;Wo%&(lNVKe@5x?upf3QFE&E&D-BM z_x1IqID372+gkQT3!s;$U7eq%|J7GLcgtoAEXQ=4 zfetgUx377=$^NWH^VML$$r5?TpomD#Dca81XG4xrmY-$|QhRow`EM#8j_*Nr&_X%? zf;diYultB`q}JBfCMG7ppK@{%R8d`7sTQcJp{8~v4ul`D749K4CQBUr=h6{)ZlFZ) z&&B&xgm8>G*xQfyn;A*n@D=K>y~{r&RmrM^yT1fMKa4Y=*E?R*Es{pUjda5(1Q|B^ zT6HVF>QR8$qtZtH{rostdt-*YgN@lexVu9SUehw-uohW7R0i97+5Xa+ebr3=x;{cUd|Soe^JH%JYafyphEhmAG87qe z0u$#62}sC@+X+o6{Rs)UlFL^PZft7WSYN-sxuM019zN!QBsF*SpqzExV5Q)qg>#Nmc(hzy-u9%6v4OCrMZ9hjZkmuvK|R>$jd>?JDpD; z;L^pFOb&y{3PK!X>gwTj<<7&?*ttDWse^(FQDAz}g3J9SJqfN1!T$%|tnNvSvLY{O zF9(xS@E+01M`D4v*f-J3Mw5u*fJs)<>npz7%U6Dk)ETA;0l{ha)4%N`>T$UHgpSQ& z6xeBm@!p5Mncp0sBcIVk`A^Lc%Y8S$L{OMjln=EFVP2νFqGMsIvMXW^c>uq2A5 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

      XU^Bv!r%mb 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%0Ah5Kzkyq;1_EwxCvzdd(Uxx;O1^+` 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

      ~0wJ0Z@n4fz2@|yAA zzTAuO-l~}=Q){d!s@BII^;$sqZriP0u`&m$Hr2_5z6S<;zj)-9vlXpSHS5T=9g7Gf zoGzqQ+EJB$X~LFo2+zOz`qwKi9}O%{Pfsr_@o+!!$Am6#{5FOae)PeBr3aJKqVj3EnQ57s{-^ew-@o0HE|JSDEpK1N z^#s%bszR%iK+X<{M>|a+L*L7A@8utzl$rNPsEUqF*EAwoRJRqs5U>ugyY$(#!y!Jk z2C+idh!hoI^Qyi^AiVm~!1??4Oc?Z0^L+fDyfgIhjXD9t++eke4CZL}IitS8Rt#Kn z>1bvvRIR>r{O6BfN7sD#-6nq@6jhT#S5Fv+1%CI}gL^1;RHal!te%YZ_H}+``udpK zObudDa||VyF3cZ}4xdH!e)pb#UWh$)aPJgs`lWuOmYqIJ%ewK$!0G6KPB_X%Gma#d zn@wty5q*g*6bcc^>yQ2u?ERzP9h!H$+-%eXs@m98iT7_KKWOH_p<5n zO$LLxL90>G&X3*Tn0~)!-(jov=O{`QmIkywg~Xxdhi(0XK)5q+ffG z21L%xyM19a_Aaj1Kbdulm&`^GJ2S*Er%n51%XM)0Q5v)fSo zz(t=OpmJm?oAq9#3iN4^%N2zs<+Q@$Dn{+Se)YBs4XjXP(266IDM7I*P$Jrtk%uxA zH)ujg9ipniYE={~bM~(qIiL@L(4$8WfcRd6#*92jjxUtGbyQu=l0Hn(0Kr2bxD(t7 z?(TMQcXtUMAV6?;cR0Aa2MfX7A-KESZzu1aJ9lQ*`qujXJGOUs?^9j!)YDap^QqYp z4DYnL^jGeP5&c!(H;hDr?OC8ia%0a~MrD_nW5=KGPrg;?w7Pm!(-;iO2lqY$T@s+a zeG6>UGS8ejv^vyizRJy=MCcIsk|pxBOTj{AhM6#b@=j~%vDXk_peC^03V}=)L9h4U zPUo_;K9Y1R%osMj0mI@GGQZruk&eQ&lu}d?g+n57FM7UtmBV&)*836zZ82^6etDe^ z%f~xU8s#do@sftn?W6nMQ}v83_-LK0)P9gt%ggCkhP4RR1})Ju6Zz1?5@Id>I7o+OW*zo8N5+szHz*l}QG8dL#6Ew8W<}gpAMXvBRgn zwD+ZlO;#~8PmkHu>&OD~lJ4YWYVMd&QnPD$mWrIqLzQMva zD&cJ2w#)s_V=}Kd#l2|&*RSln-UFl424%y5;sB;psyKEnX+95(5?n^v&mfgxM(y2p zX2T^EICM)!mG;Nvleb_Z0zCnmPlZ@XkX44{g~!{rXhC5A>F~BHk;y+AI{L0T&;&o1 z+GCchU6s73nU<3yXdDqIfqv|IFGvpV{NT=|R_Abm8kgVoaC@!Am9WlwG-cW`PqN_i zXSM_u#Pr#YNu#@>&atMEikOdA3!`XOd|tOMb>2s-m!KXqEj8=q%p;znxndiPn|`LF zVjQRWO}C!8w3P<&Vc;k+gv#~mlHJwQ2CjS(?nk=fRQEFk*5qEfOzHA?qvBMzhr@tj zzL$%xCca(^ShE?4b*NZ7$l zSQ%~>HCccmXRE)4456)2ZQ;~9V=NB!VO+dRpR5z1EIKTb%i=Pc+n*|;&*a?1Qlm9a zMI%Ch_SC}6J}8Cw9MGw;k>T0PHaM_rhTf7&$g?sE)K3Jo!dC*F4wo$acf>5 z2g`?l47GZp!<1c(rwL*qXYzTTCtFFWAS=U~A&AcSR47==YSyP}rF;RJ^=?d=jS-$v z1Wja=HZSNGy!3&9Jdgx<7{$K&^=qyWfekj0IMy zXlHZPPAnIjngx<`5^}rU{GysKnzA@!S|dBv&J-)JUiN(OjZp2yc>77Cxz8j4z2r)_ z(_;xHP_#q|G*h!zkf5NREmB8Ciefwe!ElhF+Y=}_ z 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

      W5+u-(MrSVJG$l_y>2EX_c4r&L>h9KH zWuJap*fad)et~uSeQyt1T(rs=fbgXFNgSXd)@s>UTNe*c8hh_9c&T7UDYRSo^kaC-@l4~EAATy`U$CC@i0njF6M$N#c9Y-Y zbe-=N$CX{GC6J*610b7mY!)FtV}b_eZXpa`Dc-veJ3lgvY?Ilp6JC1jBplAn7PQ>i zQcr(b7^d#OSfA5BIDO+)7kK~*ncAjQ@IGsu5KFspn$NsBt#6Fw!Bz(r`rm#4rce-D z&;sZzfXq*8Yb(IJd-UiLz?GxT1FNX;lCw6 z$!@M@pbEq7g~R>71cufcS~l4|HYpA7YFw*K>4bBXGP_y5=_IZY-Q2ln?l)?+gXwn6 zVJr-p&cXdzXE7aO>=x;-BNY6`N(@+$5o1 zSSz%Dr<7jeD^-(cm1uN%0p>a zYlfOK5eiuQX69bhE1penZOI7Rl7Qlvb!vhmrN}ncN$}Kq$E_Fc#<83#6hQ-K}6EWe(kO+y&kG>b|fjEGL%g>I6l4*Spl|=3_a!)L1C$uXVfL zvAK@@uqMZoR?ky}6}3r6lBJyYeed2N8?dv&Nvs1sK_XLl*v057K+AkPEnZ(CbiU*9|aQvg}383BPgPfH}| zfG24)=|T-bR2>mHj3MJN|S2CAIvA0(>F?_J79?yQKvLkG%H$i zXkx}gl&16JIGpMAULbqOzLQOay84(^~~>C-QId# zQ~l~S>v(sTpvndJJsGMqjf~YF9F(mRr#}!jZ9dw|qIA(J{!GUg4&f5am3lUJ*d6_K zWj%E@AefAo@VxhzS`+ou10Gql;ABtr`s;}|1 zm@!jyHqX?59&nQtE>5FXHBt`p|JG&!sPj;+l@3%HUEdTdWJUQ>%ot==VS#Vm8 zsS5q6XjtQPOuRk)0&mHiiIb5ae_oQo{lVW2WV9#Ooon8rk&^f+9Z7eaVWP`}1WEAC}qKaOPaOuprRfvB_;J3rT%s&x1f3Szg(SRjHOtGr` zwL@R?#Iu%zaK3~c(rrCj8s*44-kqFB6uu{&9q#BR1F3?h>#i+>8i#Yo-!BB10%P=p z3u_qTIbGU{)S)IrmnV5dcS%<(vvQ_c73dsp-D>N^)xRz0s!N5gU5-~HH~Ld}JtxL6??^+^*n-P1jppqRgyi=%AuYK8|g zths4|tc{Cy^8D+daYcHD7v`FBjK_^_fA)5$!xDM+&m!0RQ-n+hcPVIw60Q)_FJ2-G zM_Y~(1O-?l+^0`&gs+Yer5j8aj_3Wn>@+v5mTN2|pQJ!0{n0k*OzN!G=LjHN>Udtn z3-yh^>OL(9b@5>B$RT6-aIan=fb_6m=12gxyiPvEKVv=_(9EST6AI9?R8>^Z>;0W! zlqi%ke9xu9&k&k1Y+(~~c9;*rgR;2ydpQR2)1>$FjtP;PmPqyRoF0!I`5~}L-#e`S zd2^HIaS1hVaaYYL;F>iGUr>gzB0c+l-C z>3~_Gl6l@<3kq0=NfnVwIOa&~lrdU>wsE2jSMSHo9hq@_=k%k`zrdOjDg*vwY2qmr{)-?0JyE)-rc5HL=+G7yyEc z;QL9dre!e(E3XDE4}kci-?Dttj9O2A&`wHc0&I#^k$6TeSFEG){c)krubJj;M`ves zYEX=$1@I80FV#Rl<^Pjiq8Qr&vpZK+;sOs>yA*}^bB0{M*ciLN1j!lzth@eDq>D9n z4>iPp?&r&diD>c;7^KCDS4#6}{TI#opb5ah$&8>HMbyROrK~$fCMk_kBhtkZZuh8l zq;$vsX<~5$A^7`mkernNpZMyGJeQj=CfuS<30Cs=gWvFK@_ldvX)zVp#gc<*K&x@z z*^Wa;PeRy^Q(_WylQmT|bhLvW7xq}W$fMm~X@?E)Kd>3_L7&~t-*eb-#Q51937ZWH z8<=Z>9qRKdBy3sv^6rUwNVOAyV1zV&s5mVypne1hu>LV(i`p8zMN4DB?Ph-^7JT}{ zP2*X;H3*QG{r;4iovx`eQ#y~E$MpVYq}sguyCt&TQ&V>Vs#LFEBklQLU3nD3wn<%4 z0kPnyNhu&&#ftM}uDb9u&J%I9XmG%?G-gPl#H;!`5uz}O&^4@*`w1NBck#FU>6p(d z;h~`?hlhX|Jr7TO_sZOGrN>Hs2pVQ&cG(JH<5L%<$23GOdqtm$KB934q@^m;#PAc$ zwXI+KLb>j0t*cAaG43C>ZwaUq{F<_oS5Sxy2{}GHJ3Bwe!p7b>xpW3pO#mej@wlsQ z;IZLo!FkA?ihc&AnvdQ`|8Vno%wGpgWObY4{TfBTBqAuuG5Z;nNg5bkE$L+g%1drB zSR@i4g^yVueuU-zM_?8)eQUsq19;#7J&?96bB2EcXYpPGBYI_#Av_JNP2%p@zdy;8EAclC61MBba2ZWvg?*62}wx=pto^x!BO*+)zw@w&vhvu0`X7XZoc^Q?Z~#}azBej z_R?^x7qsDr6~(YRojZu>{}LnZ2?>|gbff#q)fvK-0?TBaP$M%>{9CZWto)v4i_Kgt z)6BRn&l)lHC)={#9|v3rx{y?%Jf!{s>-%=3HF#R0CQ%$FZO zevC6cdWRG2=%iYUu2@B_ABi~dSA0TF{eqn8)a^7_5+Hsf98c#}ev(E)P^1)Za|&dd z2}Rv@duTj_j%f9Nr+?KQI{QP-$&$;VpcVAT;)8Yf&4;uLgbGEJ3UK#AzJGrPFx8OwzkXOGoxs}{ zRpHzLL2yiR7OvG>ZjM&-5G8+KA;X-haGvM#V1cq%_9$CKy*G|Vagtboh zb#0%K}r7iGj}U}VG)2LaA4kOlzwmm9Sub~V$G#PVG-O>oKH zjpOIcaUrBU`lC7Ttg=fSEc3&|rYg3fGF zCinXVbCDcX@hswVfr&+hU{S*Raud206Uvjb6$#x@Kc`0Xk&>=o_xPob# zeV5doe>QUpL>dT77{APm22SToaU@V>X8 zv$NCK*qAmibJBt>!N(^BWE@WpqGS$(n(R?>zl^B6>Y`a^aog+c3>|6wa_ep1Bg5kB zm0m9Hhg=?AnkG6^v3Yap+jOwczada(zLuDalG_#gJomr#<%0P&WRThn)kA+COp~AH09N;OWw3`B-uAW@8sgf ztfAzcaj}*=;j-f-sJJqJ4)vQe`WKZ-m9z}ed%Y*AZx5^gdF50#Wo13M`VB*{A zY_M$-?4H;WQLJj$z1$V|)wZ8=7}2YKcsHcq@9vET;JVBz0WNl6APRFFf^rT{A;z0c zRc`VIG9D%Y`$?2#(eX7{*yCWn`_67Vgz0S+BN05{kUU4Lv6P-5#STS(KRFI9vE9dS z=G8Iw4rhO{trZLHDq$IGmuF3mQ}+p;&QTc+J|~IuSn?%7Q zsu8T25PS>FpCbC`nCnEkxdGLp^S7OC$ay$}d^a728_W$pGBxv29c8t0@{I1cy9gGV zWV=Ck(-hD7I@46A`A!1ubEPRTAK%r>euuK-8w3mDY-%I*D9>?F=&TWauwi+Mi2{Z> zNtrOH+@#3hKG7aGbV;@Z_pRH!TR-r~l8@7Q;I<=u!2b>rHk9b+3f3Ap*k6*-kf?FY>#K({%vhYz~!!YudfiLsChRjN2~v=lS26DGzxuvNcZsc zRit3UDvT3`hBEJI^*Hp*Wy1E(=r$@e)#vIt$96zYVd2>6bG!kmexc8B_5EJSRP~G5 zCuv-}%W6={f6Y1aLFI<%Rm8`p+b=Ua2o~oI1*gNut!h@%+&2p-e3}))WRKkra38L{ zqj~}I?Mh#XNtXM2{aWW?y|sJ#=s&LwiAVH*qNYfs8UNErMT+?RpFS%Rk|gba;|}Qy zWi$l~1cmKE&JTF@m-dzJ?~r;Ym8zu!hPH37pFMos+-?aKK`gi~S2tpWCLOF#{(b$7 z92l7*FP;LQR?0C7PDmoF)zka`0UvCI?~s3YFTSMz2zvNV zi?sWH-_Q8x^Mw+Z;VKD71)2x^_sD}6ncG(8(#SDVuV^xIs5thXV>)XIQf}eq;Uo?d zkJG*SuX^mBW0Igstk_E7b0#;L5#}&wJPD$Oj|DSXm1OE${C|JMzZNdBkmjo|o3!IA z7BxirSL1_o+DJ%2^qZf5X`((oxpMEFoO&g$peZ`^z1jvNt{IP6?Ip8^;V-jKTM)tn zy^#(gCSiMrfAzIPiCoSPSx%SA0mL(NI5Yx8TMs>A626W~-@+p#V6ov#IJls=pimu( znis)sJ3C7uu9-!1Juh86aIgb;TR@WaY;Ma+A08g&t4`jjh{rV7zrwk{&{B}TxKmwi zP?x+8FC6{9+WN|{HrnUw3Y6j$w?c~*cPZZD?!n#NJxFnPcL@@LyF+nz_u}sE|FqBV zdOyASm}_?XU?4CR9xMr@2VtykTNkl)@5X~xlnUAV%GL)6v(D<{WWrOg{%*3kK*ri+V}o*r&FT`Tj!)8qUH56JMmSsY>A8aD*m zL+!;b`Aq;%IQV1){*kxi*HFX5dl@3nrUfV(T2Cl#^}KJ3rI*Jo?<6F6cZWru%OgBlt@1L@D$FzB(8+JKBXZw}F{X7J$PnVg(EEX)NxWFhg*{=4eh zK>j@CYi?n?y1Nmv=ZA(8X5Pz6u(=qAu9Lxg0(EvifxD$eWFw9}Z`LG>j<~+CNDg3T&KF>hbcgA2 zNmU)i8Ofqs-{mSVMd`Jf#rgeF zn!H%9lH0h42uj4V=bDK94%*5*y&7@w*Oc*|%|&^q^X{$YGpd#!1^oVG_-XWv_$0`t zqaoe%HSQjm__5P{6Hk3Rzogd5ztNM&u!fIz2L?PczCdYcs;*BhV>DPRKZku2+06cn z&yLe$d18QkFkwg!E0@-{G_9aq^8)f84lJwazYhWVSyi1wPcAR4@-w@0tQUOk<^$=9 zV_eUeou{LGyDj`Wc5{L%o|=LOqQGWi2Q2JzudA3L`nHoS@8*ZoByG>3mATefjVV&u zInP|S>4w@F>EfN^@|Bu6^*YbdTGR~St#{_);?4qrx;UoZ66L>K2Ez5m4WLML5;6913$#8UztQNUcyI=?FU)DK;bA@ICG6}OCQzZk& zk44j=sj2UcjG9BkT%e2pz;=zRCU@iF#o3ctE`%f7Vt?8F^6)m(bG@+;KDssVK8-M$b+!xbkUp_q5@p{5AFRG|f88<+}E@=^+YdneBCGnPSS8CuG)kezJM< z&;ovpKK=2};x)sn?T}Uy|9N*Fk26`s=!ZciZ94nlO_se5JW4-3lXSP?0i37n)OM}MtsJ%PxfH@Vw&;Am~gB&CPEn;d&UqF+uFF z&1aWI&l1{AeU*iLeeL zg^HuPN^`RtwGhhE*=fQ*mub23BV*qn_>*ItoRvA!TcwEb95#2c6A8bw3~<*NCJKpSba7RN0#DqI8d;JsDgD%urnoVIH!EIGE3a;M9i{Qw{EOzSbg3qA zZZo7bqmN5dK*|V_8d?{1X)&*}L(!;q-IHT)^)-mgKBMJt6RMHc^*|%UHE$iu5Z%fv zl1@{q3~uZ;*B%{ZB_{E=HJWs@mp3~zW5nLOvlO1*57KaVW^bYZK7Uh&EA9*WA_QNN z%5PLbG-zl2H zrn?GG2LC3f0hi5dDLGfv{h3M}J83w%3E1VYuBQn`Z|qp82c9l(5@|i$3}Gtr`0N;W zF_H&vpLkyseUsI$X!o|IB+!nDX^<^hcuEq@Y(5P~Rd=#x_1D8Laewj;+tqr#O6w60 z*alh*x+JL_m02&G_ejq1xZthFd_E>$gh^D;%jMwHxF0@uv4rfOhHQl4YW%mHcM$JP z5Ch`GTjz?=Kc>=9-~3%`=vDw4z+YWv73%rb^?|R4;MC7XC`@ZqUi;}f#NM=e;ZvtC zk2G$vj!I5f$Ez&2^GPbD&#GIfy%StZm4*z)i&s6*W5b-c5%yt|!E=koJ3Hd;TvnV8 zneNB;Q)@P}_fpBtn!vM@_H-`+=ejt~^>`Md zMefYTKljfY@bcFQGlzUJFq85#Apt$fw)YnGydJ%7#Y3N|mt2*c3V8%fIx;Sk7)C_^ zqU+-)K-rh$(xjF4BN_#3w-ukJgXfuk>Zj@u)vwbx8k38?XJDrF2U?4K9416sl1>AI0t8vP6EL*;V`w(%*0!V>{Mc0lon`4u0 zx!T%4t>0@Ap_MD3@;G?fB=RtoPQlD_gX!W13j{LKrdrp8&Q3)N1Cq}o##Y^L?zr1a zj!#3Nc;mlR(|$%72{GN@IkA>-yU!#(ZhK9B4Fji^0-W;4cl;%rQD~bJ7`=~uK2YsQ zZIHK$OE!DmM%1re&%2F%{w}0cYaq^P{9=D8=(6nk@J#HmU3I6bbRAUs`N>7LY4dz( zOmnH=GW#p0;v)fSy6Z^SnB{OiXX^moZO;3!d=T|C=2aEyFYa=F*H03irO#vnJ$t^)R@+Zm}wlI5GDxjceS`GVYNI=#G#^%s>Kx&gl=M$ zf%BNy&hyp&D~;F2K+SJ|6}7kfNzj=vLZGs;(C41l7W?!uDnxX~Kl78>JKl5noujfL3hk^4zG zj^;&{sB%lvl(O7Pv?%Rbbo2Uzn@XlY!$~E7xy@v=TrTprP6@%4O^Y2ZkAWhN)|$s+ zt-OuiCQoVUEUTxjE)MNADrTzAWH?DA-NjNk9nUjg3~TMHZ4(`bMRlNi%h#*xFV(dF zV!ea-&%~?hj4TNeAkO`RcCq>cI}yjX+1MAkurrATv6XOW=>FzlBzdxbr0dhPqxG>J zH1h9p14w+{0a>&)p1-uevOh|_WDzyLETAUPArh-!4K^a)7!$ndcR5aR7@n-3^NKG8 zj0~f39!+9yt$I&Nd-uyoH=NufuJVnyUhm}F&~ZMuihL#l$V-S=Y_P?sZ1YKczjRsf z4d!2Fe(iX&&JfL_H~3xA)^@OcSWcGi)B9|+I#6uUEc#*cy2C)@?Z5E5YvnlrQLiHD zPD_1%jA1S0;k9$JXes2PFa1Gvd6rPXkA*DG!oa(`-#meP?X=GcM+sO$fFMZTX{j?T z)^zyiWQuaiX*Pgr9HCTgmi#yzyQwBaB!#5@2p3{*-vWH&UFX}X1ZxZZr%0aESzqWx zzAul+O60~yMt;vy7#GZSMoGtr37z-lfJNIzlq+*7Mf7T3kj25`jOw$r`~-(Sz~RRf#pH;r;-1v+AS4`{*4L6k9pH9pMa5n z6OdIy3*o=J5QiY|>l^jbz>({f$V=wOq|ecHQJ*04S5 zP3K|fA`Mc;>mA-N(Uitxf88t8F#t)Us-bI4P9PrVI=qC;H`N0KNh&kO;uwLEPcrAN~`KhtT^7%*BTP-!{Vc&+Qd-2hNovw|Be5^z?k1GRpSv zJZN19_h=vlu;PMz7)SaCv_KKYiu?0i2>*Y!WYF#Vcb@<69v}06K-HVypAh~>H-7Wy zBkcbafZo{pL;FaaIr;!-xELf#tj_(!V4y^ z42k>iaHwn|^zd*P153$h1NdCoHabJ3-qy-Ime}zR8_X*HCdkf<0_HZ;7}8{-7-p0) zRY4f)-cs8k5*eQ=NlVWAm-ufsymoB}8V(T+jI~QCl<$ zv7DDY0_LVzlc34UqKUS6T=lE=&gUHR`n6KTZhZqldAshrrqRsYBxhyCA;XEIFaJKl z>+KJv3~6*KspE)56t}hG&aOSErTl3~Ny^u~pkcIlp^5Ste4FixThfqYsKj%0m7My#cyl~{*86~f_#lINEx0^ zXDEa6PNod-Ooa3Mbfv|q<_~H+SVpV6hBFUwSb%$JLJc~>37zrf4#EN$%tmW>XUmI| zk)#ZgI6MYf`lvcD%ax~$ zcZLZN+7jbdDwA`Rc;-m$-kmg`rp;$cMiR>C&?AZxCXekuK4wK%qyAh0;z##LJ!&C+ zy96bHr-+Nt3}!QvQH#ze;rV@R?&A816O@?Qk|BidGBC0#9w*wRT^c&O`jY~Ez!9NV z()yy2#lV>4(@hgViivPDyF2ymiWDQT+hM{e(g~Et9tmkN!rgU>C zS%TzOqtfIkeWa@#PIu>K(B61MAZ;iLb!~He@28Wt_{6UpK~07ivq{?zW(vlzU*YxrRTw_jFbUPfR#+6y;ub%j95Z zEV>e9eMt-`QFSv2!Cfz^C`(zaWRQmb=OxVuojKU@P=U+Ohsq5|%|x4Xk{_>pI%pMp zAJqFY_`b^-_S5lpZp+5x}_Rs z$p~tm;#@OYsPoTGxr?`Ar)fe8>H^P#4U$9}!~qdywt`D5`IdW@@YD6xWq#g;eNFdd z?1t}!?{frZiZdhAu}81Co_2!xtb(Gda=MPDx~9BGMG7sUT)<{b3dbP9ML+k2xoOSn zYLWa5@%e4VrGuo)3Ad`Rjg6U?yqle;M!AvhQ}bUU03!<;z$8wN#OcSjJBKH+cfxp; z%JzYCpx^lsIi@fG0xt}ZE#7Tx4Mk;DTX2}bkP~=>R#Hn3aL^T(-))Ape?^PrerYgx zJym_TzLUUldXP0=@m9nCFN4?nn~fBiwq;+6%(SX%vo5GnjpTmr>--0w?pf zZwlVuz{?5hQ1i4QJ*@3GGA5Hsj%VKl!7fP$K8o*Jf6uN*dAtGzj$J#(Pi{f3M-iqkmOBrfv% ztDCn$T~VWfV&kVVwNB#$Zt0)WP{(oy{0*YDXMd6?JZ{du3A}gg;L~?vYJ_NItimgY z$xG*7rAcLyC58%hw(*(cfVRI#7CITD1c(lmZr4mJ#>ae$_jcNp*1_0$Wvg+ zpNSqb!G;HregKlBg!f>~5`|{heo2~TkoC6tj#*^NSYmFZbi9zJF-wBFch+wI^h0Bd zRZsA(_<yNl^BZUMqNs)e{x!2VCPWaOT z%QL^fhb%$P2cx zB6V_>+>X4}G`)IlMUvVKEjpi~rj^C=Z&!&C0oo7j{uFX5W+IIVm@w)11th~An-0yD z%wZ$6nSErbg+NzlCw-bOLfds5X+js)j@rPwD=xX-5uusRx3Y!>eXj}4yQR$;XF=_2 zz`j^izWEx@se%z5o7b}ytjk?($DUG~<44utTnTqbG%xMK{fw{ZNyEcxA>Yc~$*k2< z+w$FvN-;K{`<#^v|Fva~f9aSpuJnEG@$Dy>*QL#R{&wrj$Wk5aXZNmLPDyLN`zP+q z=JN$q<(9{NoGhEwN{22{i^OHmLC)8f*AbH?>DfP9FtHygSjpj%R_!*$lX&F6SpG=5 zQ6eN*tUk>MqHnz_`{p9ALF<~3cr}HXxN6@S^6GluWnENqBMAy^Y^75k-xz3 zup6tXo!#Xokx?EsrC8LEB`0m^_iKJ{B01tBPK&7M~H% z3uQ{e&ajF&WsTvbVxz1eXc2=_q^xMcmf!5VPfkk!!b9h(mfB%XS3u>#sFY+Sgyux9 zJ#ncNTr74fv*Q|t(CIL@^RMu86lV zIw6s{Tp~bO;x?y`7M=a2MaGISi_lnJwgSrHh+>ny1BPC9o*Bv`^ORM z2-hGPQp8&EoGq*MVSM!GZ-1HRIFMqFa6YB+zH<3Cs^K(*t!6v`tzYfKgD6sQNdAV`gw`gPTj~H=ehrz$HR|c$ zz!jOG730eXfl4zoMs&o3rh~NamS*0VY0g96LjoQj$Xi0W_8Fn71a>Utjrn1VoXoSB z%mHp}!{{iLjh?s;QZ`@k_BkkBx7pD1sgk=rk|Wk+urgg}Sg zyXo1)2kxb;#y+YO*UZ)0D>z)Pez+0qX0Eepdz)4T^2y7sXYZdEK0f%3<`tOR+53|| zC{^~*Np!N*K>lj-8u895pv6mePb1eHD48@Jm9J<@nL>!2Frz>KL&6Zc>Rc@FV?m?G zvb-2HWuN-UT1U03(M|VNeBrwGBC{@6M43+GYDL}&Uz~pjtJ>^IBy=$)`QjbtRmSgZ zQ zp6Yd@RO6)OJk&^M$iR5m9Q#PkVdI)+m3Dwls?Ga=Tmn&f$(Nv!}V;*&$r62D-=tSft~sq+3Wc z5%fA%=_%?f)r>>Cztycv2ef*r@uqRGK^_8Ocq5iB9Bxim>tFx)JhcMFrmb574)aRl zYJ{ye>bU47!PioF0b=A#&Dn)vtx>s5_pz$Ogv7ZCQ|`gcqIGYy$*i%Jf|Kc3>2}h+ z5Z9>iVwrEFKfoQ^(XMybTzv@4D;wgn`^hd2iq{tYEU|932km!KdDd*O8&N(#e?0!6 zr32Jh>M+h^((i$qkUmwY4Pvp?o<&Tw5k;nI{{Y-i$zw%aM2Ynug?fZigF95%A{QDm zJgiXwhv_eG2u82K_)^_)0Y*;85gE`fLhaT0;_ciSoDre;H#6_|I>)$pYwYn)PLoZ> zBJag@iE~xz$1S+pL`x4?&u+ekvn#9M&9REIle;ppyuYe7Z z64c$1;jEHR7(F_@rg%cohx1GA!>wzaAUY3thajUz7cog1l_&e5aFQNUx{2aqUP%1c zgh>}2TG}F8e3xPRz&>~c#o=WvNu$C~{avYhSm9i*IM)b{-~K5kf(tENn80Pg-!{tT+kt{s)0&?o zI=jlPjhqXH3?Fa!jX+w;%fs%A_LKpHOAm?zRJ# zoTGGKhVwZOdb0-mfE4P2>!gjPB`z%nO_YdZD9+M#i$mZwK zg}|OJ zI~W(k;*GT~QldTDnpLTfj2h?otKfq!bG z9IGg7&WQvWqlC|WE{GLxZvpg@a|{T&9?saIt15ByXETXuE(W8vHxe_#y5p-iwvzSa z+5cpd9ps z1kOM*r>S1U?67>ViRDBK+30>JvV_(i_p>mrh!sCVLchY$uQl^-`td;R3_M6v1p3sx zokFldWg#bMMQLW0OMQJOD8pWzKGoKqSXg<5T&#qg@6__P%Mn490HEWnrrk7xv_G;ExJo4;IK*m=LMtdT^9j8%EX32bt@L zdhrHzqoWpyU7@%qshf?Yb98{)qf`{sRpitJjcca%px8vr@CiGdv3c5GU_c7W?<>i< z?wgEyT~bD*BMv?BgCn}K!5>)_>uuLgwF5E+V?Nv4LpohN*~c5WW$-1XNERk}FW@yQuRk)ziZ)8496d=U@p-|q1v~tuq5b$C!V>}JLQ3JF0cz5h zb7;W~;M!B;eo*+uV0fb*F~^hx1ksC9vQT3HELc}7N8c7?-x;s&kSDEGNlW9UyV{B1 zXu6;H$QoGLg){lu8Iuc8Ti`MXtMADLD#vhHqSeOb1IlguGR8RuN#UsFX3_D z@WMtZAv zIevUcfl$UN4q(D|EI1x&BYwbo7jgF@cv)-S3=>Xh9<{>nB}yD4(F+I8*y>Gpuk1WR zjxfS(|GFq!q}xAmac-C;L1CFoZ6_-EIPR)31Cqw-B232mZKu? z8ojT3dNZEwma&-XJ^a(xOS~UuwAf)Hov!5{nbOiJEUEe}_R!5WDfOfm)z^M$tjLQg zI_GEQ3c!3=Fn51z^(D9G))FZUj7h8SDG$|d%SSEH*VE~wOPENxCV!V;(_06jgir?n z$P>6-PR9l~lO1%|PGXk{A;0$o7Fb$sEhr#W3G{;0so|7&2@zW#a(I4W?>M12GNUR@ z<|lTz5=tUF&At8x6}veP|k>LpCzZ>@Y#dN7r*1{)&x` zCk@!>=nuC7cz(4(t^Z!WSKR3l|LZyCe3n0%fqC)$ulbZSA@pR2-*lu&IPw~Ig2q>c zF?4^s48w1PX4C{XkZhok_24iMGl26bV;&RgOqzR^>Sl-l6&2^+EBN(o#f+zk8E!*7 zkg5XeGy)N0#kdGw+eM`=5B96ay%k1Z{? zKHu|W5V`6hhGo(F5w9Mh+P^nAjPnPoloXK{FvO8=hutu6DJiYEfWcf-Y^xc#IVawZ z=ZCi=o;MkAWo<7J+XQ>9MZ>(?m0Jl9)=iq7>7Ez2UyfOpPH{QVUR7pE&rUYX$x5pVakz$wh~s$?^A0#PLy1 zXf0`Naxdm-DdL2!!C(enRdrd*hc^B<$@Dk$C zy?x8I6iEV<9`_s#KA4@K@nDzj$3})At%}2WZhVStAbl@n%-x#EXNnXNalQwGsqFcA z4wrrGOn3z6;>sRjC^gg~ZNJ4iP{63OJ;G1~x`xt~wz|~7y>aRMYB^M7Wqzof4bGzf zJIgf;wPaQEvp{Z3^0Fr;pMdt6HpG785{{)tiaikoIOKnM?oL2EUDY`lbZ!i#_wUs$ z5#JrELH-d30uNRP3QV1L7vRmi%r&EC3ApYZTGhmyqdVs~jFHyAI<04&(B^GWN%5&R zzw9eA038QTtTyKJ>ain~E}ZFG&%<3-*XZ_SQOA=$izxM^9g)9RZnYOHbZKCL?-9o< z@o+m?C{`(1{>F?&_xN~?`n;RLmhnmJLE%Xe$|30Bn_f`rL5B)ATCtJJlvdG2(H#g5 ze9$p+sQ)Q6uzLU;*}Pse7>2@B-&W(yZClFeYX}~&2(2Y^bbk}{s?ZZjA&lT~2zbnt28ZO#t*J2PVe?(-! zasQ@P(fo%GfoFR#?7O#79I+Qsly|-lxlMzUu}}zlV;HrIFgDgBwV(TyCFO3T_s zBF&%2%ddZvn17Aw^o#7zVKbG68J3#(jA>;jOX3LMS*p)~b9F#7)B#neN@QMv@BW8D zeZ0cb0NE})tufD$s2o&eKm@RMHIgpCyrJxTWm{zB`Ev;gjwdEK=smp+V`$Fn9S}d+ zQoeYazw-8j3UO_a(sUV$5%4NisIHVcZ4}c2C>|ih1uA4flg=vlF@30{rWRf#5D3Cv z54+#~98kN(ZZ~%8F@_DD4P(H9w)5UJjSHcRhfYK(7*jyJ$STh*zmDy3%Yz1{vr)ax zsi&f5mNF8Tz3TbUhOP_)=({Ck^BntG5*_D4OIq)&=2P(cfm?oQA7MJ}I9k@!laI;Q ztg$TBU*S6WcUoQzLq?KD8?@Q-%|5LkV7z*r&^6{M?Ys*)8>r)NxtV1tSMTXR98`WV z^|DnOA;q7_*FN5`c7NGu&Qi0_9`@;}@Ne^)scUR+y-BzjOO~fKW;^lTo9QEddNxQX zbzO^bMST;S#SGE^l+{>Rt?$jPvyve#Nip`NTu;X$NXe$t8#!6Hq%2W6l8I*%F~&F) zV)`16goJVllXyhas4(H`P2jf}$$y;rVvLTeG1L8lNQ2DLDAP*RXhT&jU%5Y3P2J=M zzLu&R{gZ*L22+BVQ5w^ev*%>w{$8z9xcV&Gs-l@?KO?1;Arjta7Uk$%U30)BwVAZE z)cYL?Vvpf|bBltcSgctg^FZMbK~L=YNLWNmyUGKMg~s0SL8bQoQ)`(Y7LY_>0hS@E zpdv#uOq3wBbz3s@2o3jrW_!NIzA{Js0U_MWP;x_aqnvF1cwAnK&kyt;u63RIqE+|> zVYg~*twr9vL9h`Q`l)2v4k_Iydc)l8OnCL^4-P$5V(m6mV$!%Fq@9n^m>Aq#Qrt&b z5ZDJViWM1yz+4V2K}@lH!!(=l+gJ3LU)$a{wayaB$dig1;vxwv(&uCswH64Jh#T7= zX4m2y#w=YDa0c4mRQ?t>bbkZRVS3ogv^5Owu`wT^I#mc5e~F@ahd{4g9C}+ETJE}x zOJK^dw5BPkcrd;`G7L>zZ<68vh8sfqj$Dhxrl*#!_JWyO2Z#5Us=<}b=Ubq`fQ*JI zXgX3PC%q{gs&a7#Bf^jj#+}1oEc)$tB;kYS=|x+KEM>~W2s`ug$j;~dbbrft{bx#Y zRr6wFqeoKP>;B{sN@1%(%u=t*ST&Q?SvWV{t2lSrYJC{*OtWq~4!|LDv)h*p%hIU2 z%LyU^ns*$gIW!SAO;|kYb|`XZaoyM)CO5v9eeFQ8BR za!Xm6M!h&#qvhrbYfSTX%&N)Sfr2kb_LIfqAgsT4OQXs>7j~NEvg&bXn2qQ2qzXO@ z@0*5zd*m^+os#*Mypu;!04-4^*M}vyt!{2_WsNayz4jzLjX=p1P%v#$E?_CJ=s$s$aIEYvPo>|C!PH`*Wf)i zLv~pssia=31R2s%;?c|91v|m@tD!q`z+c4DTSES$g7szIE!c@ z%4hGf-lLvJ^!;H%*pC>#VXx6STZqvJCPROrsny5`oMcEk3O4$&V9h!!b=q7$(M7&~@(}l=__F#BL&!E|XnH8psehIPniI-o^KYbiZ;%y$L;ieV~s=| zw4`eI86Ml+f|pNocmk+ndf~| zGW^%m?d>&>@0FbmKL`#zCY-J@dY3mSGu6p~3>u6toe52;P|5lPke4_LA*PWK8V97`J92-aPbod64lmb+CpI-tAU z%X#tb%Ja;F@K}P{bmTDMM4^I0o7D=|m}TkyX1La?R@HaU6$8n7o)=h}6{Sy?*K90v zIxh!F0a?t(5_~~0rGC;~g>v@x5}~2?_S6>YFuZM!*BYHkRran@UMyOhp;4ZN$wJf{ zs1WeR36Y35W%{$W&zNmqP!Cin5jxICIm|#?)L)F_f^4MmL-%WjY?r0^@y_*zOLBF! zbT1Q7mcP9*FR#Hgz0Sx_kJ;T(o<;X=xwkT~$ZOs1 zVTDc00vZ#pjN9}|PN^`lgJ1|{JcEX@on*qi_@w91+A}!_r=#e;=!c@P;6sM&FA>HE zv9`9^9Iu?43tFu7!gYC=X{~b4l3NGyti3^NpJ%<8>SIap?envgBvG$ZJP_;=brzUj zHlD<&^G`v}AJqq1yPg(jWzZc=1GOz#gj$n*#z529Qu86fE$J5r#+ltQNV-1Jf)i@O z2S>BWChGBlPF_wxfExUw_?~x6z&-4UuaEX=PHaB^5dqpv?7fGR_fCR=c7))hoQAsG z(1vYbt#9uK1$n&(Ov>Rg8ir!yVA>e*^7Ox1-x!MR(Eh6O|CTs@2Vz!f_*OcIfh@cC zKp88h)@hgjjl>}ksMQ~A)=8=ePUplFjmw6gAbePk(etKd&EL&~r)*29-|rc+SzMeW zsWspWTd-vRT7pu|5Q-g7$11{ud%Zx1-GcOhW99@`Fg;Jvxf(sUg8(J3&?Jaa2zaFp z?IH)nf#!CU(8KPZ`LaenOSlN($%?!uN}Jk52GvG9SP>O=9Yjj)ftWuby0>75brHz8 zd`Sz1BlOA|!jh124RYtfz5tfedsFhgEM6HRg}G)}w>w-RUlh51->7bS{<&6j%jbzR zAjFCeZ~QT!bAcnI*OMKCBWZ<7@3107mQwoNGjBI3)Jhkf81W_8kOW(p1u0^b1vj!s zq!|@?ujzx@J!Xnlj90v8x*;tQa*#+N9yunGaIUGW2_pH~4QPQABrlJdQ#~Zzi^25t z!NVQGG+w?g#>4489CufcyI%#$t?cfe$rPYY2p6snnDQrCujD9PCqthw#XK(CLTZ)H zN59+2-q^&*CdP;f(FmsaZ1u{Vfysy1a_ECQSjAFm$c!gi93&EToPI?z{u0s)+Puek zjt=gN6|etVmZQk^SQPp@Cn=?KoFeBlYr>V9Pu7-cR`-O!MC6dQihBr#3%B}1_}E;2 zhb)cONinU6011YU>Z40Sg7&f`u*GOkI=a-snZ23-Uw4h8zP^xqdF`0Gna#~4t`IWTN<{G*CsX_-IAOW`Wm`y0i(L@But79 z#TXg4>HL_5i;%>tSY1xF^F)DWGYIVe*pa<(hosNm43=Qr z;252y9(yPtPH>Ho@sbYGTw>cM==6p=0z!ukN#8<;FZnUKU!U(0ab6E4Va;?~2I23% zHh4H=m8Y*2*L*joi^(?7n{<-o1mv!#aAUxF(F(AGA_b48G@J~qN}(v`FA(hCi)<}f z&sUr+7xSH390!5jUCGWhT02aSK2`!Bcd zyLwzRl-1`h2P8SVOi>`X=t=ma@_M6V(9E3xE>1z{V6 RyXx;L;=(dQWdgds{|8b<&i4QS diff --git a/javascriptv3/example_code/cross-services/message-app/images/client5.png b/javascriptv3/example_code/cross-services/message-app/images/client5.png deleted file mode 100644 index 80ae7f4d8f575c48f950d43b646892977f5bb036..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99735 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 diff --git a/javascriptv3/example_code/cross-services/message-app/images/client6.png b/javascriptv3/example_code/cross-services/message-app/images/client6.png deleted file mode 100644 index 58111193360ebcce8a6d8407ad40adba48c4d69e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156109 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󲓪+*b@z5r8T7}l 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 e2x?V?w*Ld}C=EQ8y{sSr0000 - - - - - - - - - - - - - - - - - -

      - - - diff --git a/javascriptv3/example_code/cross-services/message-app/js/index.js b/javascriptv3/example_code/cross-services/message-app/js/index.js deleted file mode 100644 index c717c706cdf..00000000000 --- a/javascriptv3/example_code/cross-services/message-app/js/index.js +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/messaging-app.html. -Purpose: -index.js is browser script for a tutorial demonstrating how to build an app that sends and receives messages using -Amazon Simple Queue Service (Amazon SQS). - -Inputs (replace in code): -- IDENTITY_POOL_ID -- SQS_QUEUE_NAME. For this example, it must be a First In First Out (FIFO) queue, which ends in .fifo. For example, -'my_queue.fifo' - -Running the code: -For more information, see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/messaging-app.html. - -*/ -// snippet-start:[sqs.JavaScript.messaging-app.complete] -// snippet-start:[sqs.JavaScript.messaging-app.config] - -import { - GetQueueUrlCommand, - SendMessageCommand, - ReceiveMessageCommand, - PurgeQueueCommand, -} from "@aws-sdk/client-sqs"; -import { sqsClient } from "./libs/sqsClient.js"; - -const QueueName = "SQS_QUEUE_NAME"; // The Amazon SQS queue name, which must end in .fifo for this example. - -// snippet-end:[sqs.JavaScript.messaging-app.config] -// snippet-start:[sqs.JavaScript.messaging-app.onload] -// Populates the messages on the GUI onload. -$(function () { - populateChat(); -}); - -const populateChat = async () => { - try { - // Set the Amazon SQS Queue parameters. - const queueParams = { - QueueName: QueueName, - Attributes: { - DelaySeconds: "60", - MessageRetentionPeriod: "86400", - }, - }; - // Get the Amazon SQS Queue URL. - const data = await sqsClient.send(new GetQueueUrlCommand(queueParams)); - console.log("Success. The URL of the SQS Queue is: ", data.QueueUrl); - // Set the parameters for retrieving the messages in the Amazon SQS Queue. - var getMessageParams = { - QueueUrl: data.QueueUrl, - MaxNumberOfMessages: 10, - MessageAttributeNames: ["All"], - VisibilityTimeout: 20, - WaitTimeSeconds: 20, - }; - try { - // Retrieve the messages from the Amazon SQS Queue. - const data = await sqsClient.send( - new ReceiveMessageCommand(getMessageParams) - ); - console.log("Successfully retrieved messages", data.Messages); - - // Loop through messages for user and message body. - var i; - for (i = 0; i < data.Messages.length; i++) { - const name = data.Messages[i].MessageAttributes.Name.StringValue; - const body = data.Messages[i].Body; - // Create the HTML for the message. - var userText = body + "

      " + name; - var myTextNode = $("#base").clone(); - myTextNode.text(userText); - var image_url; - var n = name.localeCompare("Scott"); - if (n == 0) image_url = "./images/av1.png"; - else image_url = "./images/av2.png"; - var images_div = - 'Avatar'; - myTextNode.html(userText); - myTextNode.append(images_div); - - // Add the message to the GUI. - $("#messages").append(myTextNode); - } - } catch (err) { - console.log("Error loading messages: ", err); - } - } catch (err) { - console.log("Error retrieving SQS queue URL: ", err); - } -}; -// snippet-end:[sqs.JavaScript.messaging-app.onload] - -// snippet-start:[sqs.JavaScript.messaging-app.pushmessage] -const pushMessage = async () => { - // Get and convert user and message input. - var user = $("#username").val(); - var message = $("#textarea").val(); - - // Create random deduplication ID. - var dt = new Date().getTime(); - var uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace( - /[xy]/g, - function (c) { - var r = (dt + Math.random() * 16) % 16 | 0; - dt = Math.floor(dt / 16); - return (c == "x" ? r : (r & 0x3) | 0x8).toString(16); - } - ); - - try { - // Set the Amazon SQS Queue parameters. - const queueParams = { - QueueName: QueueName, - Attributes: { - DelaySeconds: "60", - MessageRetentionPeriod: "86400", - }, - }; - const data = await sqsClient.send(new GetQueueUrlCommand(queueParams)); - console.log("Success. The URL of the SQS Queue is: ", data.QueueUrl); - // Set the parameters for the message. - var messageParams = { - MessageAttributes: { - Name: { - DataType: "String", - StringValue: user, - }, - }, - MessageBody: message, - MessageDeduplicationId: uuid, - MessageGroupId: "GroupA", - QueueUrl: data.QueueUrl, - }; - const result = await sqsClient.send(new SendMessageCommand(messageParams)); - console.log("Success", result.MessageId); - - // Set the parameters for retrieving all messages in the SQS queue. - var getMessageParams = { - QueueUrl: data.QueueUrl, - MaxNumberOfMessages: 10, - MessageAttributeNames: ["All"], - VisibilityTimeout: 20, - WaitTimeSeconds: 20, - }; - - // Retrieve messages from SQS Queue. - const final = await sqsClient.send( - new ReceiveMessageCommand(getMessageParams) - ); - console.log("Successfully retrieved", final.Messages); - $("#messages").empty(); - // Loop through messages for user and message body. - var i; - for (i = 0; i < final.Messages.length; i++) { - const name = final.Messages[i].MessageAttributes.Name.StringValue; - const body = final.Messages[i].Body; - // Create the HTML for the message. - var userText = body + "

      " + name; - var myTextNode = $("#base").clone(); - myTextNode.text(userText); - var image_url; - var n = name.localeCompare("Scott"); - if (n == 0) image_url = "./images/av1.png"; - else image_url = "./images/av2.png"; - var images_div = - 'Avatar'; - myTextNode.html(userText); - myTextNode.append(images_div); - // Add the HTML to the GUI. - $("#messages").append(myTextNode); - } - } catch (err) { - console.log("Error", err); - } -}; -// Make the function available to the browser window. -window.pushMessage = pushMessage; -// snippet-end:[sqs.JavaScript.messaging-app.pushmessage] - -// snippet-start:[sqs.JavaScript.messaging-app.purge] -// Delete the message from the Amazon SQS queue. -const purge = async () => { - try { - // Set the Amazon SQS Queue parameters. - const queueParams = { - QueueName: QueueName, - Attributes: { - DelaySeconds: "60", - MessageRetentionPeriod: "86400", - }, - }; - // Get the Amazon SQS Queue URL. - const data = await sqsClient.send(new GetQueueUrlCommand(queueParams)); - cons("Success", data.QueueUrl); - // Delete all the messages in the Amazon SQS Queue. - await sqsClient.send(new PurgeQueueCommand({ QueueUrl: data.QueueUrl })); - // Delete all the messages from the GUI. - $("#messages").empty(); - console.log("Success. All messages deleted.", data); - } catch (err) { - console.log("Error", err); - } -}; - -// Make the function available to the browser window. -window.purge = purge; -// snippet-end:[sqs.JavaScript.messaging-app.purge] -// snippet-end:[sqs.JavaScript.messaging-app.complete] diff --git a/javascriptv3/example_code/cross-services/message-app/js/libs/sqsClient.js b/javascriptv3/example_code/cross-services/message-app/js/libs/sqsClient.js deleted file mode 100644 index 9833d9b6fdf..00000000000 --- a/javascriptv3/example_code/cross-services/message-app/js/libs/sqsClient.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. The example is available here -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/messaging-app.html. - -Purpose: -sqsClient.js is a helper function that creates the Amazon Simple -Query Service (Amazon SQS) clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[messageapp.JavaScript.sqsClient] -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { SQSClient } from "@aws-sdk/client-sqs"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon SQS client object. -const sqsClient = new SQSClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { sqsClient }; -// snippet-end:[messageapp.JavaScript.sqsClient] diff --git a/javascriptv3/example_code/cross-services/message-app/package.json b/javascriptv3/example_code/cross-services/message-app/package.json deleted file mode 100644 index d5805980741..00000000000 --- a/javascriptv3/example_code/cross-services/message-app/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "@aws-doc-sdk-examples/messaging-app-example", - "version": "1.0.0", - "description": "Using the AWS SDK for JavaScript V3 to build an app that sends and receives messages using Amazon Simple Queue Service (Amazon SQS).", - "main": "index.js", - "repository": "git@github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/cross-services/messaging-app.git", - "author": "brmur", - "license": "Apache 2.0", - "scripts": { - "build": "webpack index.js --mode development --libraryTarget commonjs2 --target web --devtool false -o main.js", - "build-cdk": "aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM", - "test": "exit 0" - }, - "dependencies": { - "@aws-sdk/client-cognito-identity": "^3.32.0", - "@aws-sdk/credential-provider-cognito-identity": "^3.32.0", - "@aws-sdk/client-sqs": "^3.32.0" - }, - "devDependencies": { - "webpack": "^4.42.0", - "webpack-cli": "^3.3.11", - "@types/node": "^14.0.23", - "typescript": "^4.0.2" - }, - "type": "module" -} diff --git a/javascriptv3/example_code/cross-services/message-app/setup.yaml b/javascriptv3/example_code/cross-services/message-app/setup.yaml deleted file mode 100644 index a8c67cc36bf..00000000000 --- a/javascriptv3/example_code/cross-services/message-app/setup.yaml +++ /dev/null @@ -1,152 +0,0 @@ -Resources: - MyNewQueue486005E3: - Type: AWS::SQS::Queue - Properties: - FifoQueue: true - UpdateReplacePolicy: Delete - DeletionPolicy: Delete - Metadata: - aws:cdk:path: SetupStack/MyNewQueue/Resource - ExampleIdentityPool: - Type: AWS::Cognito::IdentityPool - Properties: - AllowUnauthenticatedIdentities: true - Metadata: - aws:cdk:path: SetupStack/ExampleIdentityPool - CognitoDefaultUnauthenticatedRoleABBF7267: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRoleWithWebIdentity - Condition: - StringEquals: - cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPool - ForAnyValue:StringLike: - cognito-identity.amazonaws.com:amr: unauthenticated - Effect: Allow - Principal: - Federated: cognito-identity.amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: SetupStack/CognitoDefaultUnauthenticatedRole/Resource - CognitoDefaultUnauthenticatedRoleDefaultPolicy2B700C08: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: - - mobileanalytics:PutEvents - - cognito-sync:* - Effect: Allow - Resource: "*" - - Action: sqs:* - Effect: Allow - Resource: "*" - Version: "2012-10-17" - PolicyName: CognitoDefaultUnauthenticatedRoleDefaultPolicy2B700C08 - Roles: - - Ref: CognitoDefaultUnauthenticatedRoleABBF7267 - Metadata: - aws:cdk:path: SetupStack/CognitoDefaultUnauthenticatedRole/DefaultPolicy/Resource - DefaultValid: - Type: AWS::Cognito::IdentityPoolRoleAttachment - Properties: - IdentityPoolId: - Ref: ExampleIdentityPool - Roles: - unauthenticated: - Fn::GetAtt: - - CognitoDefaultUnauthenticatedRoleABBF7267 - - Arn - Metadata: - aws:cdk:path: SetupStack/DefaultValid - CDKMetadata: - Type: AWS::CDK::Metadata - Properties: - Analytics: v2:deflate64:H4sIAAAAAAAACl2NzQ7CIBCEn6V3uhVjYrxpevJkrU/QACr9YRUWTUN4d6G9eZqZb5IZDoc9bIpj93WlkEMVBFoF4UadGFh9NxdPL0+sRuPIekGZtcqht0JlnwqpSaOJLE8E93YQrl75pV1MZAIfRhNCSOgslSFNc4M4sr/c4qhOlK6fU4KR6W6CkOHymrXBUYs5x9XFGJlBqaB31Ydvge+AF73TurQ+zU4K2lV/6MhiuegAAAA= - Metadata: - aws:cdk:path: SetupStack/CDKMetadata/Default - Condition: CDKMetadataAvailable -Outputs: - Identitypoolid: - Value: - Ref: ExampleIdentityPool - SQSqueuename: - Value: - Fn::GetAtt: - - MyNewQueue486005E3 - - QueueName -Conditions: - CDKMetadataAvailable: - Fn::Or: - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - af-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-east-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ap-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ca-central-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-north-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-northwest-1 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - eu-central-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-north-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-south-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-2 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-3 - - Fn::Equals: - - Ref: AWS::Region - - me-south-1 - - Fn::Equals: - - Ref: AWS::Region - - sa-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-2 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - us-west-1 - - Fn::Equals: - - Ref: AWS::Region - - us-west-2 From 97e1273f01adb2b1e12d9432445bb68de55f77d8 Mon Sep 17 00:00:00 2001 From: David Souther Date: Thu, 5 Sep 2024 16:47:50 -0400 Subject: [PATCH 72/98] Rust: S3 examples audit (#6804) * S3 hello world * Large refactor of Rust s3 audit work. * All operations return Result<_, S3ExampleError>. * Update most example snippet tags. * Updates for delete bucket error handling * Updated snippets for multipart upload. * Add test for delete_bucket NoSuchBucket * Use paginator for list-buckets --- .doc_gen/metadata/s3_metadata.yaml | 76 ++-- rustv1/examples/s3/Cargo.toml | 10 +- rustv1/examples/s3/README.md | 35 +- rustv1/examples/s3/src/bin/client.rs | 32 -- rustv1/examples/s3/src/bin/copy-object.rs | 93 ++--- rustv1/examples/s3/src/bin/create-bucket.rs | 64 +--- rustv1/examples/s3/src/bin/delete-bucket.rs | 65 ++++ rustv1/examples/s3/src/bin/delete-object.rs | 21 +- rustv1/examples/s3/src/bin/delete-objects.rs | 40 +-- .../s3/src/bin/get-object-presigned.rs | 4 +- rustv1/examples/s3/src/bin/get-object.rs | 19 +- .../examples/s3/src/bin/if-modified-since.rs | 69 ++-- rustv1/examples/s3/src/bin/list-buckets.rs | 52 +-- .../s3/src/bin/put-object-presigned.rs | 28 +- .../s3/src/bin/put-object-progress.rs | 8 +- .../examples/s3/src/bin/s3-getting-started.rs | 82 ++--- rustv1/examples/s3/src/bin/s3-helloworld.rs | 120 ++++--- .../s3/src/bin/s3-multipart-upload.rs | 54 +-- .../s3/src/bin/select-object-content.rs | 16 +- rustv1/examples/s3/src/error.rs | 60 ++-- .../s3/src/{s3-service-lib.rs => lib.rs} | 335 +++++++++++------- .../s3/tests/test-s3-getting-started.rs | 18 +- 22 files changed, 691 insertions(+), 610 deletions(-) delete mode 100644 rustv1/examples/s3/src/bin/client.rs create mode 100644 rustv1/examples/s3/src/bin/delete-bucket.rs rename rustv1/examples/s3/src/{s3-service-lib.rs => lib.rs} (57%) diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index a6d6ac9586a..8237e2e8487 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -67,6 +67,16 @@ s3_Hello: - description: snippet_tags: - ruby.hello_s3 + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/s3 + excerpts: + - snippet_tags: + - s3.rust.s3-helloworld + - description: S3ExampleError utilities + - snippet_tags: + - s3.rust.s3-example-error services: s3: {ListBuckets} s3_CreateBucket: @@ -172,7 +182,7 @@ s3_CreateBucket: excerpts: - description: snippet_tags: - - rust.example_code.s3.basics.create_bucket + - s3.rust.create_bucket SAP ABAP: versions: - sdk_version: 1 @@ -301,7 +311,7 @@ s3_CopyObject: excerpts: - description: snippet_tags: - - rust.example_code.s3.basics.copy_object + - s3.rust.copy_object SAP ABAP: versions: - sdk_version: 1 @@ -449,7 +459,7 @@ s3_DeleteObject: excerpts: - description: snippet_tags: - - s3.rust.delete-object + - s3.rust.delete_object JavaScript: versions: - sdk_version: 3 @@ -588,7 +598,7 @@ s3_DeleteObjects: excerpts: - description: snippet_tags: - - rust.example_code.s3.basics.delete_objects + - s3.rust.delete_objects Swift: versions: - sdk_version: 1 @@ -1212,9 +1222,12 @@ s3_CompleteMultipartUpload: - sdk_version: 1 github: rustv1/examples/s3 excerpts: - - description: - snippet_tags: - - rust.example_code.s3.complete_multipart_upload + - snippet_tags: + - s3.rust.complete_multipart_upload + - snippet_tags: + - s3.rust.create_multipart_upload + - snippet_tags: + - s3.rust.upload_part C++: versions: - sdk_version: 1 @@ -1232,9 +1245,12 @@ s3_CreateMultipartUpload: - sdk_version: 1 github: rustv1/examples/s3 excerpts: - - description: - snippet_tags: - - rust.example_code.s3.create_multipart_upload + - snippet_tags: + - s3.rust.create_multipart_upload + - snippet_tags: + - s3.rust.upload_part + - snippet_tags: + - s3.rust.complete_multipart_upload C++: versions: - sdk_version: 1 @@ -1336,7 +1352,7 @@ s3_ListObjectsV2: excerpts: - description: snippet_tags: - - rust.example_code.s3.basics.list_objects + - s3.rust.list_objects JavaScript: versions: - sdk_version: 3 @@ -1511,7 +1527,7 @@ s3_PutObject: excerpts: - description: snippet_tags: - - rust.example_code.s3.basics.put_object + - s3.rust.upload_object JavaScript: versions: - sdk_version: 3 @@ -1668,7 +1684,7 @@ s3_DeleteBucket: excerpts: - description: snippet_tags: - - rust.example_code.s3.basics.delete_bucket + - s3.rust.delete_bucket SAP ABAP: versions: - sdk_version: 1 @@ -2147,7 +2163,7 @@ s3_ListBuckets: excerpts: - description: snippet_tags: - - s3.rust.list-buckets + - s3.rust.list_buckets JavaScript: versions: - sdk_version: 3 @@ -2366,10 +2382,12 @@ s3_UploadPart: - sdk_version: 1 github: rustv1/examples/s3 excerpts: - - description: - snippet_tags: - - rust.example_code.s3.upload_part - - rust.example_code.s3.upload_part.CompletedMultipartUpload + - snippet_tags: + - s3.rust.upload_part + - snippet_tags: + - s3.rust.create_multipart_upload + - snippet_tags: + - s3.rust.complete_multipart_upload C++: versions: - sdk_version: 1 @@ -2747,9 +2765,11 @@ s3_Scenario_PresignedUrl: - sdk_version: 1 github: rustv1/examples/s3 excerpts: - - description: Create presigning requests to GET and PUT S3 objects. + - description: Create presigning requests to GET S3 objects. snippet_tags: - s3.rust.get-object-presigned + - description: Create presigning requests to PUT S3 objects. + snippet_tags: - s3.rust.put-object-presigned C++: versions: @@ -2814,7 +2834,7 @@ s3_GetBucketLocation: excerpts: - description: snippet_tags: - - s3.rust.list-buckets + - s3.rust.list_buckets services: s3: {GetBucketLocation} s3_Scenario_GettingStarted: @@ -2942,11 +2962,17 @@ s3_Scenario_GettingStarted: github: rustv1/examples/s3 excerpts: - description: Code for the binary crate which runs the scenario. - snippet_tags: - - rust.example_code.s3.scenario_getting_started.bin - - description: A library crate with common actions called by the binary. - snippet_tags: - - rust.example_code.s3.scenario_getting_started.lib + snippet_files: + - rustv1/examples/s3/src/bin/s3-getting-started.rs + - description: Common actions used by the scenario. + snippet_tags: + - s3.rust.create_bucket + - s3.rust.upload_object + - s3.rust.download_object + - s3.rust.copy_object + - s3.rust.list_objects + - s3.rust.clear_bucket + - s3.rust.delete_bucket C++: versions: - sdk_version: 1 diff --git a/rustv1/examples/s3/Cargo.toml b/rustv1/examples/s3/Cargo.toml index def731b8109..4b5da8363bf 100644 --- a/rustv1/examples/s3/Cargo.toml +++ b/rustv1/examples/s3/Cargo.toml @@ -4,17 +4,10 @@ version = "0.1.0" authors = [ "Russell Cohen ", "Doug Schwartz ", + "David Souther " ] edition = "2021" -[lib] -name = "s3_service" -path = "src/s3-service-lib.rs" - -[[bin]] -name = "s3_getting_started" -path = "src/bin/s3-getting-started.rs" - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dev-dependencies] assert_cmd = "2.0" @@ -47,3 +40,4 @@ uuid = { version = "1.3.1", features = ["serde", "v4"] } serde_json = "1" serde = { version = "1", features = ["derive"]} +chrono = "0.4.38" diff --git a/rustv1/examples/s3/README.md b/rustv1/examples/s3/README.md index c2896147456..59d7eded3da 100644 --- a/rustv1/examples/s3/README.md +++ b/rustv1/examples/s3/README.md @@ -29,6 +29,11 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `rustv +### Get started + +- [Hello Amazon S3](src/bin/s3-helloworld.rs#L35) (`ListBuckets`) + + ### Basics Code examples that show you how to perform the essential operations within a service. @@ -40,27 +45,27 @@ Code examples that show you how to perform the essential operations within a ser Code excerpts that show you how to call individual service functions. -- [CompleteMultipartUpload](src/bin/s3-multipart-upload.rs#L136) -- [CopyObject](src/s3-service-lib.rs#L99) -- [CreateBucket](src/s3-service-lib.rs#L156) +- [CompleteMultipartUpload](src/bin/s3-multipart-upload.rs#L139) +- [CopyObject](src/lib.rs#L7) +- [CreateBucket](src/lib.rs#L192) - [CreateMultipartUpload](src/bin/s3-multipart-upload.rs#L48) -- [DeleteBucket](src/s3-service-lib.rs#L23) -- [DeleteObject](src/bin/delete-object.rs#L30) -- [DeleteObjects](src/s3-service-lib.rs#L31) -- [GetBucketLocation](src/bin/list-buckets.rs#L26) -- [GetObject](src/bin/get-object.rs#L20) -- [ListBuckets](src/bin/list-buckets.rs#L26) +- [DeleteBucket](src/lib.rs#L224) +- [DeleteObject](src/lib.rs#L37) +- [DeleteObjects](src/lib.rs#L156) +- [GetBucketLocation](src/bin/list-buckets.rs#L27) +- [GetObject](src/bin/get-object.rs#L21) +- [ListBuckets](src/bin/list-buckets.rs#L27) - [ListObjectVersions](src/bin/list-object-versions.rs#L26) -- [ListObjectsV2](src/s3-service-lib.rs#L73) -- [PutObject](src/s3-service-lib.rs#L137) -- [UploadPart](src/bin/s3-multipart-upload.rs#L112) +- [ListObjectsV2](src/lib.rs#L92) +- [PutObject](src/lib.rs#L73) +- [UploadPart](src/bin/s3-multipart-upload.rs#L101) ### Scenarios Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. -- [Create a presigned URL](src/bin/put-object-presigned.rs) +- [Create a presigned URL](src/bin/get-object-presigned.rs) - [Get an object from a bucket if it has been modified](src/bin/if-modified-since.rs) - [Unit and integration test with an SDK](Cargo.toml) - [Upload or download large files](src/bin/s3-multipart-upload.rs) @@ -77,6 +82,10 @@ functions within the same service. +#### Hello Amazon S3 + +This example shows you how to get started using Amazon S3. + #### Learn the basics diff --git a/rustv1/examples/s3/src/bin/client.rs b/rustv1/examples/s3/src/bin/client.rs deleted file mode 100644 index 8bf59585a2b..00000000000 --- a/rustv1/examples/s3/src/bin/client.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -#![allow(clippy::result_large_err)] - -// snippet-start:[s3.rust.client-use] -use aws_config::meta::region::RegionProviderChain; -use aws_sdk_s3::Client; -// snippet-end:[s3.rust.client-use] - -/// Lists your buckets. -#[tokio::main] -async fn main() -> Result<(), aws_sdk_s3::Error> { - // snippet-start:[s3.rust.client-client] - let region_provider = RegionProviderChain::default_provider().or_else("us-east-1"); - let config = aws_config::from_env().region(region_provider).load().await; - let client = Client::new(&config); - // snippet-end:[s3.rust.client-client] - - let resp = client.list_buckets().send().await?; - let buckets = resp.buckets(); - let num_buckets = buckets.len(); - - for bucket in buckets { - println!("{}", bucket.name().unwrap_or_default()); - } - - println!(); - println!("Found {} buckets.", num_buckets); - - Ok(()) -} diff --git a/rustv1/examples/s3/src/bin/copy-object.rs b/rustv1/examples/s3/src/bin/copy-object.rs index ceeee992a51..05566d59e56 100644 --- a/rustv1/examples/s3/src/bin/copy-object.rs +++ b/rustv1/examples/s3/src/bin/copy-object.rs @@ -4,14 +4,9 @@ #![allow(clippy::result_large_err)] use aws_config::meta::region::RegionProviderChain; -use aws_sdk_s3::{ - config::Region, - error::SdkError, - meta::PKG_VERSION, - operation::copy_object::{CopyObjectError, CopyObjectOutput}, - Client, Error, -}; +use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client}; use clap::Parser; +use s3_code_examples::{copy_object, error::S3ExampleError}; #[derive(Debug, Parser)] struct Opt { @@ -40,59 +35,6 @@ struct Opt { verbose: bool, } -// Copy an object from one bucket to another. -// snippet-start:[bin.rust.copy-object] -async fn cp_object( - client: &Client, - source_bucket: &str, - destination_bucket: &str, - source_object: &str, - destination_object: &str, -) -> Result> { - // Create source of object: - // source-bucket-name/source-object-name - let mut source_bucket_and_object: String = "".to_owned(); - source_bucket_and_object.push_str(source_bucket); - source_bucket_and_object.push('/'); - source_bucket_and_object.push_str(source_object); - - client - .copy_object() - .copy_source(source_bucket_and_object) - .bucket(destination_bucket) - .key(destination_object) - .send() - .await -} -// snippet-end:[bin.rust.copy-object] - -#[cfg(test)] -mod test_cp_object { - use sdk_examples_test_utils::single_shot_client; - - use crate::cp_object; - - #[tokio::test] - async fn test_cp_object() { - let client = single_shot_client! { - sdk: aws_sdk_s3, - status: 200, - response: r#""# - }; - - let response = cp_object( - &client, - "source_bucket", - "destination_bucket", - "source_object", - "destination_object", - ) - .await; - - assert!(response.is_ok(), "{response:?}"); - } -} - /// Copies an object from one Amazon S3 bucket to another. /// # Arguments /// @@ -106,7 +48,7 @@ mod test_cp_object { /// If the environment variable is not set, defaults to **us-west-2**. /// * `[-v]` - Whether to display additional information. #[tokio::main] -async fn main() -> Result<(), Error> { +async fn main() -> Result<(), S3ExampleError> { tracing_subscriber::fmt::init(); let Opt { @@ -142,9 +84,36 @@ async fn main() -> Result<(), Error> { let shared_config = aws_config::from_env().region(region_provider).load().await; let client = Client::new(&shared_config); - cp_object(&client, &source, &destination, &key, &new_name).await?; + copy_object(&client, &source, &destination, &key, &new_name).await?; println!("Object copied."); Ok(()) } + +#[cfg(test)] +mod test_cp_object { + use sdk_examples_test_utils::single_shot_client; + + use crate::copy_object; + + #[tokio::test] + async fn test_cp_object() { + let client = single_shot_client! { + sdk: aws_sdk_s3, + status: 200, + response: r#""# + }; + + let response = copy_object( + &client, + "source_bucket", + "destination_bucket", + "source_object", + "destination_object", + ) + .await; + + assert!(response.is_ok(), "{response:?}"); + } +} diff --git a/rustv1/examples/s3/src/bin/create-bucket.rs b/rustv1/examples/s3/src/bin/create-bucket.rs index bce8eae793b..7ac1352531d 100644 --- a/rustv1/examples/s3/src/bin/create-bucket.rs +++ b/rustv1/examples/s3/src/bin/create-bucket.rs @@ -4,11 +4,9 @@ #![allow(clippy::result_large_err)] use aws_config::meta::region::RegionProviderChain; -use aws_sdk_s3::error::SdkError; -use aws_sdk_s3::operation::create_bucket::{CreateBucketError, CreateBucketOutput}; -use aws_sdk_s3::types::{BucketLocationConstraint, CreateBucketConfiguration}; -use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client, Error}; +use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client}; use clap::Parser; +use s3_code_examples::{create_bucket, error::S3ExampleError}; #[derive(Debug, Parser)] struct Opt { @@ -25,50 +23,6 @@ struct Opt { verbose: bool, } -// Creates a bucket. -// snippet-start:[s3.rust.create-bucket] -async fn make_bucket( - client: &Client, - bucket: &str, - region: &str, -) -> Result> { - let constraint = BucketLocationConstraint::from(region); - let cfg = CreateBucketConfiguration::builder() - .location_constraint(constraint) - .build(); - - client - .create_bucket() - .create_bucket_configuration(cfg) - .bucket(bucket) - .send() - .await -} -// snippet-end:[s3.rust.create-bucket] - -#[cfg(test)] -mod test_make_bucket { - use sdk_examples_test_utils::single_shot_client; - - use crate::make_bucket; - - #[tokio::test] - async fn test_make_bucket() { - let client = single_shot_client! { - sdk: aws_sdk_s3, - status: 200, - headers: vec![("Location", "/test_bucket")], - response: r#""# - }; - - let res = make_bucket(&client, "bucket", "region").await; - - assert!(res.is_ok(), "{res:?}"); - - assert_eq!(res.unwrap().location(), Some("/test_bucket")) - } -} - /// Creates an Amazon S3 bucket in the Region. /// # Arguments /// @@ -78,7 +32,7 @@ mod test_make_bucket { /// If the environment variable is not set, defaults to **us-west-2**. /// * `[-v]` - Whether to display additional information. #[tokio::main] -async fn main() -> Result<(), Error> { +async fn main() -> Result<(), S3ExampleError> { tracing_subscriber::fmt::init(); let Opt { @@ -91,17 +45,11 @@ async fn main() -> Result<(), Error> { .or_default_provider() .or_else(Region::new("us-west-2")); - println!(); - - let r_rgr = region_provider.region().await.unwrap(); - let r_str = r_rgr.as_ref(); + let region = region_provider.region().await.unwrap(); if verbose { println!("S3 client version: {}", PKG_VERSION); - println!( - "Region: {}", - region_provider.region().await.unwrap().as_ref() - ); + println!("Region: {}", region); println!("Bucket: {}", &bucket); println!(); } @@ -109,7 +57,7 @@ async fn main() -> Result<(), Error> { let shared_config = aws_config::from_env().region(region_provider).load().await; let client = Client::new(&shared_config); - make_bucket(&client, &bucket, r_str).await?; + create_bucket(&client, &bucket, ®ion).await?; println!("Created bucket."); Ok(()) diff --git a/rustv1/examples/s3/src/bin/delete-bucket.rs b/rustv1/examples/s3/src/bin/delete-bucket.rs new file mode 100644 index 00000000000..98b757f05a1 --- /dev/null +++ b/rustv1/examples/s3/src/bin/delete-bucket.rs @@ -0,0 +1,65 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +#![allow(clippy::result_large_err)] + +use aws_config::meta::region::RegionProviderChain; +use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client}; +use clap::Parser; +use s3_code_examples::{delete_bucket, error::S3ExampleError}; + +#[derive(Debug, Parser)] +struct Opt { + /// The AWS Region. + #[structopt(short, long)] + region: Option, + + /// The name of the bucket. + #[structopt(short, long)] + bucket: String, + + /// Whether to display additional information. + #[structopt(short, long)] + verbose: bool, +} + +/// Deletes an Amazon S3 bucket. +/// +/// # Arguments +/// +/// * `-b BUCKET` - The name of the bucket. +/// * `[-r REGION]` - The Region in which the client is created. +/// If not supplied, uses the value of the **AWS_REGION** environment variable. +/// If the environment variable is not set, defaults to **us-west-2**. +/// * `[-v]` - Whether to display additional information. +#[tokio::main] +async fn main() -> Result<(), S3ExampleError> { + tracing_subscriber::fmt::init(); + + let Opt { + region, + bucket, + verbose, + } = Opt::parse(); + + let region_provider = RegionProviderChain::first_try(region.map(Region::new)) + .or_default_provider() + .or_else(Region::new("us-west-2")); + + println!(); + + if verbose { + println!("S3 client version: {}", PKG_VERSION); + println!( + "Region: {}", + region_provider.region().await.unwrap().as_ref() + ); + println!("Bucket: {}", &bucket); + println!(); + } + + let shared_config = aws_config::from_env().region(region_provider).load().await; + let client = Client::new(&shared_config); + + delete_bucket(&client, &bucket).await +} diff --git a/rustv1/examples/s3/src/bin/delete-object.rs b/rustv1/examples/s3/src/bin/delete-object.rs index 7765ded37c4..699c675725d 100644 --- a/rustv1/examples/s3/src/bin/delete-object.rs +++ b/rustv1/examples/s3/src/bin/delete-object.rs @@ -4,8 +4,9 @@ #![allow(clippy::result_large_err)] use aws_config::meta::region::RegionProviderChain; -use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client, Error}; +use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client}; use clap::Parser; +use s3_code_examples::{error::S3ExampleError, remove_object}; #[derive(Debug, Parser)] struct Opt { @@ -26,22 +27,6 @@ struct Opt { verbose: bool, } -// Delete an object from a bucket. -// snippet-start:[s3.rust.delete-object] -async fn remove_object(client: &Client, bucket: &str, key: &str) -> Result<(), Error> { - client - .delete_object() - .bucket(bucket) - .key(key) - .send() - .await?; - - println!("Object deleted."); - - Ok(()) -} -// snippet-end:[s3.rust.delete-object] - /// Deletes an object in an Amazon S3 bucket. /// # Arguments /// @@ -52,7 +37,7 @@ async fn remove_object(client: &Client, bucket: &str, key: &str) -> Result<(), E /// If the environment variable is not set, defaults to **us-west-2**. /// * `[-v]` - Whether to display additional information. #[tokio::main] -async fn main() -> Result<(), Error> { +async fn main() -> Result<(), S3ExampleError> { tracing_subscriber::fmt::init(); let Opt { diff --git a/rustv1/examples/s3/src/bin/delete-objects.rs b/rustv1/examples/s3/src/bin/delete-objects.rs index dc90fd74d78..4f96e802c71 100644 --- a/rustv1/examples/s3/src/bin/delete-objects.rs +++ b/rustv1/examples/s3/src/bin/delete-objects.rs @@ -4,9 +4,9 @@ #![allow(clippy::result_large_err)] use aws_config::meta::region::RegionProviderChain; -use aws_sdk_s3::types::{Delete, ObjectIdentifier}; -use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client, Error}; +use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client}; use clap::Parser; +use s3_code_examples::{delete_objects, error::S3ExampleError}; #[derive(Debug, Parser)] struct Opt { @@ -27,38 +27,8 @@ struct Opt { verbose: bool, } -// Deletes objects from a bucket. -// snippet-start:[s3.rust.delete-objects] -async fn remove_objects(client: &Client, bucket: &str, objects: Vec) -> Result<(), Error> { - let mut delete_objects: Vec = vec![]; - - for obj in objects { - let obj_id = ObjectIdentifier::builder() - .set_key(Some(obj)) - .build() - .expect("building ObjectIdentifier"); - delete_objects.push(obj_id); - } - - let delete = Delete::builder() - .set_objects(Some(delete_objects)) - .build() - .expect("building Delete"); - - client - .delete_objects() - .bucket(bucket) - .delete(delete) - .send() - .await?; - - println!("Objects deleted."); - - Ok(()) -} -// snippet-end:[s3.rust.delete-objects] - /// Removes objects from an Amazon S3 bucket. +/// /// # Arguments /// /// * `-b BUCKET` - The name of the bucket. @@ -68,7 +38,7 @@ async fn remove_objects(client: &Client, bucket: &str, objects: Vec) -> /// If the environment variable is not set, defaults to **us-west-2**. /// * `[-v]` - Whether to display additional information. #[tokio::main] -async fn main() -> Result<(), Error> { +async fn main() -> Result<(), S3ExampleError> { tracing_subscriber::fmt::init(); let Opt { @@ -98,5 +68,5 @@ async fn main() -> Result<(), Error> { let shared_config = aws_config::from_env().region(region_provider).load().await; let client = Client::new(&shared_config); - remove_objects(&client, &bucket, objects).await + delete_objects(&client, &bucket, objects).await } diff --git a/rustv1/examples/s3/src/bin/get-object-presigned.rs b/rustv1/examples/s3/src/bin/get-object-presigned.rs index 5852f111a3a..8d86a59f22a 100644 --- a/rustv1/examples/s3/src/bin/get-object-presigned.rs +++ b/rustv1/examples/s3/src/bin/get-object-presigned.rs @@ -33,8 +33,8 @@ struct Opt { verbose: bool, } -// Get object using presigned request. // snippet-start:[s3.rust.get-object-presigned] +/// Generate a URL for a presigned GET request. async fn get_object( client: &Client, bucket: &str, @@ -50,6 +50,8 @@ async fn get_object( .await?; println!("Object URI: {}", presigned_request.uri()); + let valid_until = chrono::offset::Local::now() + expires_in; + println!("Valid until: {valid_until}"); Ok(()) } diff --git a/rustv1/examples/s3/src/bin/get-object.rs b/rustv1/examples/s3/src/bin/get-object.rs index 3f3f8c6bdc5..ca912a888fe 100644 --- a/rustv1/examples/s3/src/bin/get-object.rs +++ b/rustv1/examples/s3/src/bin/get-object.rs @@ -1,6 +1,7 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 use aws_config::meta::region::RegionProviderChain; +use s3_code_examples::error::S3ExampleError; use std::{fs::File, io::Write, path::PathBuf, process::exit}; use aws_sdk_s3::Client; @@ -18,12 +19,16 @@ struct Opt { } // snippet-start:[s3.rust.get_object] -async fn get_object(client: Client, opt: Opt) -> Result { +async fn get_object(client: Client, opt: Opt) -> Result { trace!("bucket: {}", opt.bucket); trace!("object: {}", opt.object); trace!("destination: {}", opt.destination.display()); - let mut file = File::create(opt.destination.clone())?; + let mut file = File::create(opt.destination.clone()).map_err(|err| { + S3ExampleError::new(format!( + "Failed to initialize file for saving S3 download: {err:?}" + )) + })?; let mut object = client .get_object() @@ -33,9 +38,15 @@ async fn get_object(client: Client, opt: Opt) -> Result { .await?; let mut byte_count = 0_usize; - while let Some(bytes) = object.body.try_next().await? { + while let Some(bytes) = object.body.try_next().await.map_err(|err| { + S3ExampleError::new(format!("Failed to read from S3 download stream: {err:?}")) + })? { let bytes_len = bytes.len(); - file.write_all(&bytes)?; + file.write_all(&bytes).map_err(|err| { + S3ExampleError::new(format!( + "Failed to write from S3 download stream to local file: {err:?}" + )) + })?; trace!("Intermediate write of {bytes_len}"); byte_count += bytes_len; } diff --git a/rustv1/examples/s3/src/bin/if-modified-since.rs b/rustv1/examples/s3/src/bin/if-modified-since.rs index a39d132947c..632636be58d 100644 --- a/rustv1/examples/s3/src/bin/if-modified-since.rs +++ b/rustv1/examples/s3/src/bin/if-modified-since.rs @@ -6,10 +6,10 @@ // snippet-start:[s3.rust.if-modified-since] use aws_sdk_s3::{ error::SdkError, - operation::head_object::HeadObjectError, primitives::{ByteStream, DateTime, DateTimeFormat}, - Client, Error, + Client, }; +use s3_code_examples::error::S3ExampleError; use tracing::{error, warn}; const KEY: &str = "key"; @@ -25,7 +25,7 @@ const BODY: &str = "Hello, world!"; /// - Get the bucket headers again but only if modified. /// - Delete the bucket. #[tokio::main] -async fn main() -> Result<(), Error> { +async fn main() -> Result<(), S3ExampleError> { tracing_subscriber::fmt::init(); // Get a new UUID to use when creating a unique bucket name. @@ -122,39 +122,38 @@ async fn main() -> Result<(), Error> { // `SdkError::ServiceError`. // snippet-start:[s3.rust.if-modified-since.result-handler] - let (last_modified, e_tag_2): (Result>, String) = - match head_object_output { - Ok(head_object) => ( - Ok(head_object.last_modified().cloned().unwrap()), - head_object.e_tag.unwrap(), - ), - Err(err) => match err { - SdkError::ServiceError(err) => { - // Get the raw HTTP response. If its status is 304, the - // object has not changed. This is the expected code path. - let http = err.raw(); - match http.status().as_u16() { - // If the HTTP status is 304: Not Modified, return a - // tuple containing the values of the HTTP - // `last-modified` and `etag` headers. - 304 => ( - Ok(DateTime::from_str( - http.headers().get("last-modified").unwrap(), - DateTimeFormat::HttpDate, - ) - .unwrap()), - http.headers().get("etag").map(|t| t.into()).unwrap(), - ), - // Any other HTTP status code is returned as an - // `SdkError::ServiceError`. - _ => (Err(SdkError::ServiceError(err)), String::new()), - } + let (last_modified, e_tag_2) = match head_object_output { + Ok(head_object) => ( + Ok(head_object.last_modified().cloned().unwrap()), + head_object.e_tag.unwrap(), + ), + Err(err) => match err { + SdkError::ServiceError(err) => { + // Get the raw HTTP response. If its status is 304, the + // object has not changed. This is the expected code path. + let http = err.raw(); + match http.status().as_u16() { + // If the HTTP status is 304: Not Modified, return a + // tuple containing the values of the HTTP + // `last-modified` and `etag` headers. + 304 => ( + Ok(DateTime::from_str( + http.headers().get("last-modified").unwrap(), + DateTimeFormat::HttpDate, + ) + .unwrap()), + http.headers().get("etag").map(|t| t.into()).unwrap(), + ), + // Any other HTTP status code is returned as an + // `SdkError::ServiceError`. + _ => (Err(SdkError::ServiceError(err)), String::new()), } - // Any other kind of error is returned in a tuple containing the - // error and an empty string. - _ => (Err(err), String::new()), - }, - }; + } + // Any other kind of error is returned in a tuple containing the + // error and an empty string. + _ => (Err(err), String::new()), + }, + }; // snippet-end:[s3.rust.if-modified-since.result-handler] warn!("last modified: {last_modified:?}"); diff --git a/rustv1/examples/s3/src/bin/list-buckets.rs b/rustv1/examples/s3/src/bin/list-buckets.rs index d24a7f5d075..20749e1b50c 100644 --- a/rustv1/examples/s3/src/bin/list-buckets.rs +++ b/rustv1/examples/s3/src/bin/list-buckets.rs @@ -4,8 +4,9 @@ #![allow(clippy::result_large_err)] use aws_config::meta::region::RegionProviderChain; -use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client, Error}; +use aws_sdk_s3::{config::Region, meta::PKG_VERSION, types::BucketLocationConstraint, Client}; use clap::Parser; +use s3_code_examples::error::S3ExampleError; #[derive(Debug, Parser)] struct Opt { @@ -23,28 +24,34 @@ struct Opt { } // Shows your buckets, or those just in the region. -// snippet-start:[s3.rust.list-buckets] -async fn show_buckets(strict: bool, client: &Client, region: &str) -> Result<(), Error> { - let resp = client.list_buckets().send().await?; - let buckets = resp.buckets(); - let num_buckets = buckets.len(); +// snippet-start:[s3.rust.list_buckets] +async fn show_buckets( + strict: bool, + client: &Client, + region: BucketLocationConstraint, +) -> Result<(), S3ExampleError> { + let mut buckets = client.list_buckets().into_paginator().send(); + let mut num_buckets = 0; let mut in_region = 0; - for bucket in buckets { - if strict { - let r = client - .get_bucket_location() - .bucket(bucket.name().unwrap_or_default()) - .send() - .await?; - - if r.location_constraint().unwrap().as_ref() == region { + while let Some(Ok(output)) = buckets.next().await { + for bucket in output.buckets() { + num_buckets += 1; + if strict { + let r = client + .get_bucket_location() + .bucket(bucket.name().unwrap_or_default()) + .send() + .await?; + + if r.location_constraint() == Some(®ion) { + println!("{}", bucket.name().unwrap_or_default()); + in_region += 1; + } + } else { println!("{}", bucket.name().unwrap_or_default()); - in_region += 1; } - } else { - println!("{}", bucket.name().unwrap_or_default()); } } @@ -60,7 +67,7 @@ async fn show_buckets(strict: bool, client: &Client, region: &str) -> Result<(), Ok(()) } -// snippet-end:[s3.rust.list-buckets] +// snippet-end:[s3.rust.list_buckets] /// Lists your Amazon S3 buckets, or just the buckets in the Region. /// # Arguments @@ -71,7 +78,7 @@ async fn show_buckets(strict: bool, client: &Client, region: &str) -> Result<(), /// If the environment variable is not set, defaults to **us-west-2**. /// * `[-v]` - Whether to display additional information. #[tokio::main] -async fn main() -> Result<(), Error> { +async fn main() -> Result<(), S3ExampleError> { tracing_subscriber::fmt::init(); let Opt { @@ -108,5 +115,8 @@ async fn main() -> Result<(), Error> { let shared_config = aws_config::from_env().region(region_provider).load().await; let client = Client::new(&shared_config); - show_buckets(strict, &client, ®ion_str).await + let region = BucketLocationConstraint::try_parse(®ion_str) + .map_err(|e| S3ExampleError::new(format!("{e:?}")))?; + + show_buckets(strict, &client, region).await } diff --git a/rustv1/examples/s3/src/bin/put-object-presigned.rs b/rustv1/examples/s3/src/bin/put-object-presigned.rs index 916f6b1579d..debd9079204 100644 --- a/rustv1/examples/s3/src/bin/put-object-presigned.rs +++ b/rustv1/examples/s3/src/bin/put-object-presigned.rs @@ -7,8 +7,7 @@ use aws_config::meta::region::RegionProviderChain; use aws_sdk_s3::presigning::PresigningConfig; use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client}; use clap::Parser; -use std::error::Error; -use std::time::Duration; +use s3_code_examples::error::S3ExampleError; #[derive(Debug, Parser)] struct Opt { @@ -40,19 +39,22 @@ async fn put_object( bucket: &str, object: &str, expires_in: u64, -) -> Result<(), Box> { - let expires_in = Duration::from_secs(expires_in); - +) -> Result { + let expires_in: std::time::Duration = std::time::Duration::from_secs(expires_in); + let expires_in: aws_sdk_s3::presigning::PresigningConfig = + PresigningConfig::expires_in(expires_in).map_err(|err| { + S3ExampleError::new(format!( + "Failed to convert expiration to PresigningConfig: {err:?}" + )) + })?; let presigned_request = client .put_object() .bucket(bucket) .key(object) - .presigned(PresigningConfig::expires_in(expires_in)?) + .presigned(expires_in) .await?; - println!("Object URI: {}", presigned_request.uri()); - - Ok(()) + Ok(presigned_request.uri().into()) } // snippet-end:[s3.rust.put-object-presigned] @@ -68,7 +70,7 @@ async fn put_object( /// If not given, this defaults to 15 minutes. /// * `[-v]` - Whether to display additional information. #[tokio::main] -async fn main() -> Result<(), Box> { +async fn main() -> Result<(), S3ExampleError> { tracing_subscriber::fmt::init(); let Opt { @@ -96,5 +98,9 @@ async fn main() -> Result<(), Box> { println!(); } - put_object(&client, &bucket, &object, expires_in.unwrap_or(900)).await + let uri = put_object(&client, &bucket, &object, expires_in.unwrap_or(900)).await?; + + println!("Presigned PUT URI: {}", uri); + + Ok(()) } diff --git a/rustv1/examples/s3/src/bin/put-object-progress.rs b/rustv1/examples/s3/src/bin/put-object-progress.rs index 4428b64d6a4..7b11cbe536c 100644 --- a/rustv1/examples/s3/src/bin/put-object-progress.rs +++ b/rustv1/examples/s3/src/bin/put-object-progress.rs @@ -17,6 +17,7 @@ use aws_smithy_runtime_api::http::Request; use bytes::Bytes; use clap::Parser; use http_body::{Body, SizeHint}; +use s3_code_examples::error::S3ExampleError; use tracing::{debug, info}; #[derive(Debug, Parser)] @@ -29,6 +30,7 @@ struct Opt { source: PathBuf, } +// snippet-start:[s3.rust.ProgressTracker] // ProgressTracker prints information as the upload progresses. struct ProgressTracker { bytes_written: u64, @@ -42,6 +44,7 @@ impl ProgressTracker { info!("Read {} bytes, progress: {:.2}%", len, progress * 100.0); } } +// snippet-end:[s3.rust.ProgressTracker] // snippet-start:[s3.rust.put-object-progress-body] // A ProgressBody to wrap any http::Body with upload progress information. @@ -132,7 +135,7 @@ where // Uploads a local file to a bucket using a ProgressBody wrapper. ProgressBody // overrides SdkBody::poll_data to print additional debug information while // uploading the object. -async fn put_object(client: &Client, opts: &Opt) -> Result<(), anyhow::Error> { +async fn put_object(client: &Client, opts: &Opt) -> Result<(), S3ExampleError> { debug!("bucket: {}", opts.bucket); debug!("object: {}", opts.object); debug!("source: {}", opts.source.display()); @@ -143,7 +146,8 @@ async fn put_object(client: &Client, opts: &Opt) -> Result<(), anyhow::Error> { // progress steps. .buffer_size(2048) .build() - .await?; + .await + .map_err(|err| S3ExampleError::new(format!("Failed to start file read stream: {err:?}")))?; let request = client .put_object() diff --git a/rustv1/examples/s3/src/bin/s3-getting-started.rs b/rustv1/examples/s3/src/bin/s3-getting-started.rs index c9032189c51..0f7c756998f 100644 --- a/rustv1/examples/s3/src/bin/s3-getting-started.rs +++ b/rustv1/examples/s3/src/bin/s3-getting-started.rs @@ -3,62 +3,39 @@ #![allow(clippy::result_large_err)] -/* -Purpose - -Shows how to use the AWS SDK for Rust to get started using -Amazon Simple Storage Service (Amazon S3). Create a bucket, move objects into and out of it, -and delete all resources at the end of the demo. - -This example follows the steps in "Getting started with Amazon S3" in the Amazon S3 -user guide. - - https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html -*/ - -// snippet-start:[rust.example_code.s3.scenario_getting_started.bin] - -// snippet-start:[rust.example_code.s3.basics.imports] +//! Purpose +//! Shows how to use the AWS SDK for Rust to get started using +//! Amazon Simple Storage Service (Amazon S3). Create a bucket, move objects into and out of it, +//! and delete all resources at the end of the demo. +//! +//! This example follows the steps in "Getting started with Amazon S3" in the Amazon S3 +//! user guide. +//! - https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html use aws_config::meta::region::RegionProviderChain; use aws_sdk_s3::{config::Region, Client}; -use s3_service::error::Error; +use s3_code_examples::error::S3ExampleError; use uuid::Uuid; -// snippet-end:[rust.example_code.s3.basics.imports] - -// snippet-start:[rust.example_code.s3.basics.main] #[tokio::main] -async fn main() -> Result<(), Error> { - let (region, client, bucket_name, file_name, key, target_key) = initialize_variables().await; - - if let Err(e) = run_s3_operations(region, client, bucket_name, file_name, key, target_key).await - { - println!("{:?}", e); - }; - - Ok(()) -} -// snippet-end:[rust.example_code.s3.basics.main] - -// snippet-start:[rust.example_code.s3.basics.initialize_variables] -async fn initialize_variables() -> (Region, Client, String, String, String, String) { +async fn main() -> Result<(), S3ExampleError> { let region_provider = RegionProviderChain::first_try(Region::new("us-west-2")); let region = region_provider.region().await.unwrap(); - let shared_config = aws_config::from_env().region(region_provider).load().await; let client = Client::new(&shared_config); - let bucket_name = format!("doc-example-bucket-{}", Uuid::new_v4()); - let file_name = "s3/testfile.txt".to_string(); let key = "test file key name".to_string(); let target_key = "target_key".to_string(); - (region, client, bucket_name, file_name, key, target_key) + if let Err(e) = run_s3_operations(region, client, bucket_name, file_name, key, target_key).await + { + eprintln!("{:?}", e); + }; + + Ok(()) } -// snippet-end:[rust.example_code.s3.basics.initialize_variables] -// snippet-start:[rust.example_code.s3.basics.run_s3_operations] async fn run_s3_operations( region: Region, client: Client, @@ -66,17 +43,22 @@ async fn run_s3_operations( file_name: String, key: String, target_key: String, -) -> Result<(), Error> { - s3_service::create_bucket(&client, &bucket_name, region.as_ref()).await?; - s3_service::upload_object(&client, &bucket_name, &file_name, &key).await?; - let _object = s3_service::download_object(&client, &bucket_name, &key).await; - s3_service::copy_object(&client, &bucket_name, &key, &target_key).await?; - s3_service::list_objects(&client, &bucket_name).await?; - s3_service::delete_objects(&client, &bucket_name).await?; - s3_service::delete_bucket(&client, &bucket_name).await?; +) -> Result<(), S3ExampleError> { + s3_code_examples::create_bucket(&client, &bucket_name, ®ion).await?; + let run_example: Result<(), S3ExampleError> = (async { + s3_code_examples::upload_object(&client, &bucket_name, &file_name, &key).await?; + let _object = s3_code_examples::download_object(&client, &bucket_name, &key).await; + s3_code_examples::copy_object(&client, &bucket_name, &bucket_name, &key, &target_key) + .await?; + s3_code_examples::list_objects(&client, &bucket_name).await?; + s3_code_examples::clear_bucket(&client, &bucket_name).await?; + Ok(()) + }) + .await; + if let Err(err) = run_example { + eprintln!("Failed to complete getting-started example: {err:?}"); + } + s3_code_examples::delete_bucket(&client, &bucket_name).await?; Ok(()) } -// snippet-end:[rust.example_code.s3.basics.run_s3_operations] - -// snippet-end:[rust.example_code.s3.scenario_getting_started.bin] diff --git a/rustv1/examples/s3/src/bin/s3-helloworld.rs b/rustv1/examples/s3/src/bin/s3-helloworld.rs index 78648529b35..d7293de6fc0 100644 --- a/rustv1/examples/s3/src/bin/s3-helloworld.rs +++ b/rustv1/examples/s3/src/bin/s3-helloworld.rs @@ -4,11 +4,10 @@ #![allow(clippy::result_large_err)] use aws_config::meta::region::RegionProviderChain; -use aws_sdk_s3::primitives::ByteStream; -use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client, Error}; +use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client}; use clap::Parser; -use std::path::Path; -use std::process; +use s3_code_examples::error::S3ExampleError; +use std::path::{Path, PathBuf}; #[derive(Debug, Parser)] struct Opt { @@ -33,47 +32,77 @@ struct Opt { verbose: bool, } -// Upload a file to a bucket. // snippet-start:[s3.rust.s3-helloworld] -async fn upload_object( - client: &Client, +/// S3 Hello World Example using the AWS SDK for Rust. +/// +/// This example lists the objects in a bucket, uploads an object to that bucket, +/// and then retrieves the object and prints some S3 information about the object. +/// This shows a number of S3 features, including how to use built-in paginators +/// for large data sets. +/// +/// # Arguments +/// +/// * `client` - an S3 client configured appropriately for the environment. +/// * `bucket` - the bucket name that the object will be uploaded to. Must be present in the region the `client` is configured to use. +/// * `filename` - a reference to a path that will be read and uploaded to S3. +/// * `key` - the string key that the object will be uploaded as inside the bucket. +async fn list_bucket_and_upload_object( + client: &aws_sdk_s3::Client, bucket: &str, - filename: &str, + filepath: &Path, key: &str, -) -> Result<(), Error> { - let resp = client.list_buckets().send().await?; - - for bucket in resp.buckets() { - println!("bucket: {:?}", bucket.name().unwrap_or_default()) - } - - println!(); - - let body = ByteStream::from_path(Path::new(filename)).await; - - match body { - Ok(b) => { - let resp = client - .put_object() - .bucket(bucket) - .key(key) - .body(b) - .send() - .await?; - - println!("Upload success. Version: {:?}", resp.version_id); - - let resp = client.get_object().bucket(bucket).key(key).send().await?; - let data = resp.body.collect().await; - println!("data: {:?}", data.unwrap().into_bytes()); - } - Err(e) => { - println!("Got an error uploading object:"); - println!("{}", e); - process::exit(1); +) -> Result<(), S3ExampleError> { + // List the buckets in this account + let mut objects = client + .list_objects_v2() + .bucket(bucket) + .into_paginator() + .send(); + + println!("key\tetag\tlast_modified\tstorage_class"); + while let Some(Ok(object)) = objects.next().await { + for item in object.contents() { + println!( + "{}\t{}\t{}\t{}", + item.key().unwrap_or_default(), + item.e_tag().unwrap_or_default(), + item.last_modified() + .map(|lm| format!("{lm}")) + .unwrap_or_default(), + item.storage_class() + .map(|sc| format!("{sc}")) + .unwrap_or_default() + ); } } + // Prepare a ByteStream around the file, and upload the object using that ByteStream. + let body = aws_sdk_s3::primitives::ByteStream::from_path(filepath) + .await + .map_err(|err| { + S3ExampleError::new(format!( + "Failed to create bytestream for {filepath:?} ({err:?})" + )) + })?; + let resp = client + .put_object() + .bucket(bucket) + .key(key) + .body(body) + .send() + .await?; + + println!( + "Upload success. Version: {:?}", + resp.version_id() + .expect("S3 Object upload missing version ID") + ); + + // Retrieve the just-uploaded object. + let resp = client.get_object().bucket(bucket).key(key).send().await?; + println!("etag: {}", resp.e_tag().unwrap_or("(missing)")); + println!("version: {}", resp.version_id().unwrap_or("(missing)")); + Ok(()) } // snippet-end:[s3.rust.s3-helloworld] @@ -88,7 +117,7 @@ async fn upload_object( /// If the environment variable is not set, defaults to **us-west-2**. /// * `[-v]` - Whether to display additional information. #[tokio::main] -async fn main() -> Result<(), Error> { +async fn main() -> Result<(), S3ExampleError> { tracing_subscriber::fmt::init(); let Opt { @@ -99,12 +128,15 @@ async fn main() -> Result<(), Error> { verbose, } = Opt::parse(); + let filename = PathBuf::from(filename); + if !filename.exists() { + eprintln!("Cannot find {} for upload!", filename.display()); + } + let region_provider = RegionProviderChain::first_try(region.map(Region::new)) .or_default_provider() .or_else(Region::new("us-west-2")); - println!(); - if verbose { println!("S3 client version: {}", PKG_VERSION); println!( @@ -112,7 +144,7 @@ async fn main() -> Result<(), Error> { region_provider.region().await.unwrap().as_ref() ); println!("Bucket: {}", &bucket); - println!("Filename: {}", &filename); + println!("Filename: {:?}", &filename); println!("Key: {}", &key); println!(); } @@ -120,5 +152,5 @@ async fn main() -> Result<(), Error> { let shared_config = aws_config::from_env().region(region_provider).load().await; let client = Client::new(&shared_config); - upload_object(&client, &bucket, &filename, &key).await + list_bucket_and_upload_object(&client, &bucket, &filename, &key).await } diff --git a/rustv1/examples/s3/src/bin/s3-multipart-upload.rs b/rustv1/examples/s3/src/bin/s3-multipart-upload.rs index 2a12111ab36..ef6b97aacb2 100644 --- a/rustv1/examples/s3/src/bin/s3-multipart-upload.rs +++ b/rustv1/examples/s3/src/bin/s3-multipart-upload.rs @@ -19,7 +19,7 @@ use aws_sdk_s3::{config::Region, Client as S3Client}; use aws_smithy_types::byte_stream::{ByteStream, Length}; use rand::distributions::Alphanumeric; use rand::{thread_rng, Rng}; -use s3_service::error::Error; +use s3_code_examples::error::S3ExampleError; use std::process; use uuid::Uuid; @@ -35,26 +35,30 @@ pub async fn main() { } } -async fn run_example() -> Result<(), Error> { +async fn run_example() -> Result<(), S3ExampleError> { let shared_config = aws_config::load_from_env().await; let client = S3Client::new(&shared_config); let bucket_name = format!("doc-example-bucket-{}", Uuid::new_v4()); let region_provider = RegionProviderChain::first_try(Region::new("us-west-2")); let region = region_provider.region().await.unwrap(); - s3_service::create_bucket(&client, &bucket_name, region.as_ref()).await?; + s3_code_examples::create_bucket(&client, &bucket_name, ®ion).await?; let key = "sample.txt".to_string(); - // snippet-start:[rust.example_code.s3.create_multipart_upload] + // snippet-start:[s3.rust.create_multipart_upload] + // Create a multipart upload. Use UploadPart and CompleteMultipartUpload to + // upload the file. let multipart_upload_res: CreateMultipartUploadOutput = client .create_multipart_upload() .bucket(&bucket_name) .key(&key) .send() - .await - .unwrap(); - // snippet-end:[rust.example_code.s3.create_multipart_upload] - let upload_id = multipart_upload_res.upload_id().unwrap(); + .await?; + + let upload_id = multipart_upload_res.upload_id().ok_or(S3ExampleError::new( + "Missing upload_id after CreateMultipartUpload", + ))?; + // snippet-end:[s3.rust.create_multipart_upload] //Create a file of random characters for the upload. let mut file = File::create(&key).expect("Could not create sample file."); @@ -86,13 +90,16 @@ async fn run_example() -> Result<(), Error> { } if file_size == 0 { - panic!("Bad file size."); + return Err(S3ExampleError::new("Bad file size.")); } if chunk_count > MAX_CHUNKS { - panic!("Too many chunks! Try increasing your chunk size.") + return Err(S3ExampleError::new( + "Too many chunks! Try increasing your chunk size.", + )); } - let mut upload_parts: Vec = Vec::new(); + // snippet-start:[s3.rust.upload_part] + let mut upload_parts: Vec = Vec::new(); for chunk_index in 0..chunk_count { let this_chunk = if chunk_count - 1 == chunk_index { @@ -107,9 +114,9 @@ async fn run_example() -> Result<(), Error> { .build() .await .unwrap(); - //Chunk index needs to start at 0, but part numbers start at 1. + + // Chunk index needs to start at 0, but part numbers start at 1. let part_number = (chunk_index as i32) + 1; - // snippet-start:[rust.example_code.s3.upload_part] let upload_part_res = client .upload_part() .key(&key) @@ -119,21 +126,22 @@ async fn run_example() -> Result<(), Error> { .part_number(part_number) .send() .await?; + upload_parts.push( CompletedPart::builder() .e_tag(upload_part_res.e_tag.unwrap_or_default()) .part_number(part_number) .build(), ); - // snippet-end:[rust.example_code.s3.upload_part] } - // snippet-start:[rust.example_code.s3.upload_part.CompletedMultipartUpload] + // snippet-end:[s3.rust.upload_part] + + // snippet-start:[s3.rust.complete_multipart_upload] + // upload_parts: Vec let completed_multipart_upload: CompletedMultipartUpload = CompletedMultipartUpload::builder() .set_parts(Some(upload_parts)) .build(); - // snippet-end:[rust.example_code.s3.upload_part.CompletedMultipartUpload] - // snippet-start:[rust.example_code.s3.complete_multipart_upload] let _complete_multipart_upload_res = client .complete_multipart_upload() .bucket(&bucket_name) @@ -141,11 +149,11 @@ async fn run_example() -> Result<(), Error> { .multipart_upload(completed_multipart_upload) .upload_id(upload_id) .send() - .await - .unwrap(); - // snippet-end:[rust.example_code.s3.complete_multipart_upload] + .await?; + // snippet-end:[s3.rust.complete_multipart_upload] - let data: GetObjectOutput = s3_service::download_object(&client, &bucket_name, &key).await?; + let data: GetObjectOutput = + s3_code_examples::download_object(&client, &bucket_name, &key).await?; let data_length: u64 = data .content_length() .unwrap_or_default() @@ -157,10 +165,10 @@ async fn run_example() -> Result<(), Error> { println!("The data was not the same size!"); } - s3_service::delete_objects(&client, &bucket_name) + s3_code_examples::clear_bucket(&client, &bucket_name) .await .expect("Error emptying bucket."); - s3_service::delete_bucket(&client, &bucket_name) + s3_code_examples::delete_bucket(&client, &bucket_name) .await .expect("Error deleting bucket."); diff --git a/rustv1/examples/s3/src/bin/select-object-content.rs b/rustv1/examples/s3/src/bin/select-object-content.rs index c29289a992a..8c79d5bf607 100644 --- a/rustv1/examples/s3/src/bin/select-object-content.rs +++ b/rustv1/examples/s3/src/bin/select-object-content.rs @@ -10,6 +10,7 @@ use aws_sdk_s3::types::{ }; use aws_sdk_s3::{config::Region, meta::PKG_VERSION, Client}; use clap::Parser; +use s3_code_examples::error::S3ExampleError; use serde::de::IgnoredAny; use serde::Deserialize; @@ -62,7 +63,7 @@ async fn get_content( bucket: &str, object: &str, name: &str, -) -> Result<(), anyhow::Error> { +) -> Result<(), S3ExampleError> { // To escape a single quote, use two single quotes. let name = name.replace('\'', "''"); let person: String = format!("SELECT * FROM s3object s where s.Name like '{name}%'"); @@ -128,15 +129,18 @@ async fn get_content( } /// Parse a new line &str, potentially using content from the previous line -fn parse_line_buffered(buf: &mut String, line: &str) -> Result, anyhow::Error> { +fn parse_line_buffered(buf: &mut String, line: &str) -> Result, S3ExampleError> { if buf.is_empty() && is_valid_json(line) { - Ok(Some(serde_json::from_str(line)?)) + Ok(Some(serde_json::from_str(line).map_err(|err| { + S3ExampleError::new(format!("Failed to parse JSON: {err:?}")) + })?)) } else { buf.push_str(line); if is_valid_json(buf) { - let result = serde_json::from_str(buf.as_str()); + let result = serde_json::from_str(buf) + .map_err(|err| S3ExampleError::new(format!("Failed to parse JSON: {err:?}")))?; buf.clear(); - Ok(Some(result?)) + Ok(Some(result)) } else { Ok(None) } @@ -153,7 +157,7 @@ fn parse_line_buffered(buf: &mut String, line: &str) -> Result, a /// If the environment variable is not set, defaults to **us-west-2**. /// * `[-v]` - Whether to display additional information. #[tokio::main] -async fn main() -> Result<(), anyhow::Error> { +async fn main() -> Result<(), S3ExampleError> { tracing_subscriber::fmt::init(); let Opt { diff --git a/rustv1/examples/s3/src/error.rs b/rustv1/examples/s3/src/error.rs index 4ed6bd8d4a2..bb815afeb07 100644 --- a/rustv1/examples/s3/src/error.rs +++ b/rustv1/examples/s3/src/error.rs @@ -1,42 +1,44 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -use std::error::Error as StdError; - -use aws_smithy_types::error::operation::BuildError; - -#[derive(thiserror::Error, Debug)] -#[error("unhandled error")] -pub struct Error { - #[from] - source: Box, -} - -impl Error { - pub fn unhandled(source: impl Into>) -> Self { - Self { - source: source.into(), - } +// snippet-start:[s3.rust.s3-example-error] +/// S3ExampleError provides a From impl to extract +/// client-specific error details. This serves as a consistent backup to handling +/// specific service errors, depending on what is needed by the scenario. +/// It is used throughout the code examples for the AWS SDK for Rust. +#[derive(Debug)] +pub struct S3ExampleError(String); +impl S3ExampleError { + pub fn new(value: impl Into) -> Self { + S3ExampleError(value.into()) } -} -impl From for Error { - fn from(source: aws_sdk_s3::Error) -> Self { - Self::unhandled(source) + pub fn add_message(self, message: impl Into) -> Self { + S3ExampleError(format!("{}: {}", message.into(), self.0)) } } -impl From for Error { - fn from(source: BuildError) -> Self { - Self::unhandled(source) +impl From for S3ExampleError { + fn from(value: T) -> Self { + S3ExampleError(format!( + "{}: {}", + value + .code() + .map(String::from) + .unwrap_or("unknown code".into()), + value + .message() + .map(String::from) + .unwrap_or("missing reason".into()), + )) } } -impl From> for Error -where - T: StdError + Send + Sync + 'static, -{ - fn from(source: aws_sdk_s3::error::SdkError) -> Self { - Self::unhandled(source) +impl std::error::Error for S3ExampleError {} + +impl std::fmt::Display for S3ExampleError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) } } +// snippet-end:[s3.rust.s3-example-error] diff --git a/rustv1/examples/s3/src/s3-service-lib.rs b/rustv1/examples/s3/src/lib.rs similarity index 57% rename from rustv1/examples/s3/src/s3-service-lib.rs rename to rustv1/examples/s3/src/lib.rs index dc084e35402..0ae67dd9640 100644 --- a/rustv1/examples/s3/src/s3-service-lib.rs +++ b/rustv1/examples/s3/src/lib.rs @@ -1,77 +1,96 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -// snippet-start:[rust.example_code.s3.scenario_getting_started.lib] - -use aws_sdk_s3::operation::{ - copy_object::{CopyObjectError, CopyObjectOutput}, - create_bucket::{CreateBucketError, CreateBucketOutput}, - get_object::{GetObjectError, GetObjectOutput}, - list_objects_v2::ListObjectsV2Output, - put_object::{PutObjectError, PutObjectOutput}, -}; -use aws_sdk_s3::types::{ - BucketLocationConstraint, CreateBucketConfiguration, Delete, ObjectIdentifier, -}; -use aws_sdk_s3::{error::SdkError, primitives::ByteStream, Client}; -use error::Error; -use std::path::Path; -use std::str; - +use error::S3ExampleError; pub mod error; -// snippet-start:[rust.example_code.s3.basics.delete_bucket] -pub async fn delete_bucket(client: &Client, bucket_name: &str) -> Result<(), Error> { - client.delete_bucket().bucket(bucket_name).send().await?; - println!("Bucket deleted"); +// snippet-start:[s3.rust.copy_object] +/// Copy an object from one bucket to another. +pub async fn copy_object( + client: &aws_sdk_s3::Client, + source_bucket: &str, + destination_bucket: &str, + source_object: &str, + destination_object: &str, +) -> Result<(), S3ExampleError> { + let source_key = format!("{source_bucket}/{source_object}"); + let response = client + .copy_object() + .copy_source(&source_key) + .bucket(destination_bucket) + .key(destination_object) + .send() + .await?; + + println!( + "Copied from {source_key} to {destination_bucket}/{destination_object} with etag {}", + response + .copy_object_result + .unwrap_or_else(|| aws_sdk_s3::types::CopyObjectResult::builder().build()) + .e_tag() + .unwrap_or("missing") + ); Ok(()) } -// snippet-end:[rust.example_code.s3.basics.delete_bucket] +// snippet-end:[s3.rust.copy_object] -// snippet-start:[rust.example_code.s3.basics.delete_objects] -pub async fn delete_objects(client: &Client, bucket_name: &str) -> Result, Error> { - let objects = client.list_objects_v2().bucket(bucket_name).send().await?; - - let mut delete_objects: Vec = vec![]; - for obj in objects.contents() { - let obj_id = ObjectIdentifier::builder() - .set_key(Some(obj.key().unwrap().to_string())) - .build() - .map_err(Error::from)?; - delete_objects.push(obj_id); - } +// snippet-start:[s3.rust.delete_object] +/// Delete an object from a bucket. +pub async fn remove_object( + client: &aws_sdk_s3::Client, + bucket: &str, + key: &str, +) -> Result<(), S3ExampleError> { + client + .delete_object() + .bucket(bucket) + .key(key) + .send() + .await?; - let return_keys = delete_objects.iter().map(|o| o.key.clone()).collect(); - - if !delete_objects.is_empty() { - client - .delete_objects() - .bucket(bucket_name) - .delete( - Delete::builder() - .set_objects(Some(delete_objects)) - .build() - .map_err(Error::from)?, - ) - .send() - .await?; - } + // There are no modeled errors to handle when deleting an object. - let objects: ListObjectsV2Output = client.list_objects_v2().bucket(bucket_name).send().await?; + Ok(()) +} +// snippet-end:[s3.rust.delete_object] - eprintln!("{objects:?}"); +// snippet-start:[s3.rust.download_object] +pub async fn download_object( + client: &aws_sdk_s3::Client, + bucket_name: &str, + key: &str, +) -> Result { + client + .get_object() + .bucket(bucket_name) + .key(key) + .send() + .await + .map_err(S3ExampleError::from) +} +// snippet-end:[s3.rust.download_object] - match objects.key_count { - Some(0) => Ok(return_keys), - _ => Err(Error::unhandled( - "There were still objects left in the bucket.", - )), - } +// snippet-start:[s3.rust.upload_object] +pub async fn upload_object( + client: &aws_sdk_s3::Client, + bucket_name: &str, + file_name: &str, + key: &str, +) -> Result { + let body = aws_sdk_s3::primitives::ByteStream::from_path(std::path::Path::new(file_name)).await; + client + .put_object() + .bucket(bucket_name) + .key(key) + .body(body.unwrap()) + .send() + .await + .map_err(S3ExampleError::from) } -// snippet-end:[rust.example_code.s3.basics.delete_objects] +// snippet-end:[s3.rust.upload_object] -// snippet-start:[rust.example_code.s3.basics.list_objects] -pub async fn list_objects(client: &Client, bucket: &str) -> Result<(), Error> { +// snippet-start:[s3.rust.list_objects] +pub async fn list_objects(client: &aws_sdk_s3::Client, bucket: &str) -> Result<(), S3ExampleError> { let mut response = client .list_objects_v2() .bucket(bucket.to_owned()) @@ -94,96 +113,149 @@ pub async fn list_objects(client: &Client, bucket: &str) -> Result<(), Error> { Ok(()) } -// snippet-end:[rust.example_code.s3.basics.list_objects] +// snippet-end:[s3.rust.list_objects] -// snippet-start:[rust.example_code.s3.basics.copy_object] -pub async fn copy_object( - client: &Client, +// snippet-start:[s3.rust.clear_bucket] +/// Given a bucket, remove all objects in the bucket, and then ensure no objects +/// remain in the bucket. +pub async fn clear_bucket( + client: &aws_sdk_s3::Client, bucket_name: &str, - object_key: &str, - target_key: &str, -) -> Result> { - let mut source_bucket_and_object: String = "".to_owned(); - source_bucket_and_object.push_str(bucket_name); - source_bucket_and_object.push('/'); - source_bucket_and_object.push_str(object_key); +) -> Result, S3ExampleError> { + let objects = client.list_objects_v2().bucket(bucket_name).send().await?; - client - .copy_object() - .copy_source(source_bucket_and_object) - .bucket(bucket_name) - .key(target_key) - .send() - .await -} -// snippet-end:[rust.example_code.s3.basics.copy_object] + // delete_objects no longer needs to be mutable. + let objects_to_delete: Vec = objects + .contents() + .iter() + .filter_map(|obj| obj.key()) + .map(String::from) + .collect(); -// snippet-start:[rust.example_code.s3.basics.download_object] -pub async fn download_object( - client: &Client, - bucket_name: &str, - key: &str, -) -> Result> { - client - .get_object() - .bucket(bucket_name) - .key(key) - .send() - .await + if objects_to_delete.is_empty() { + return Ok(vec![]); + } + + let return_keys = objects_to_delete.clone(); + + delete_objects(client, bucket_name, objects_to_delete).await?; + + let objects = client.list_objects_v2().bucket(bucket_name).send().await?; + + eprintln!("{objects:?}"); + + match objects.key_count { + Some(0) => Ok(return_keys), + _ => Err(S3ExampleError::new( + "There were still objects left in the bucket.", + )), + } } -// snippet-end:[rust.example_code.s3.basics.download_object] +// snippet-end:[s3.rust.clear_bucket] -// snippet-start:[rust.example_code.s3.basics.upload_object] -// snippet-start:[rust.example_code.s3.basics.put_object] -pub async fn upload_object( - client: &Client, +// snippet-start:[s3.rust.delete_objects] +/// Delete the objects in a bucket. +pub async fn delete_objects( + client: &aws_sdk_s3::Client, bucket_name: &str, - file_name: &str, - key: &str, -) -> Result> { - let body = ByteStream::from_path(Path::new(file_name)).await; + objects_to_delete: Vec, +) -> Result<(), S3ExampleError> { + // Push into a mut vector to use `?` early return errors while building object keys. + let mut delete_object_ids: Vec = vec![]; + for obj in objects_to_delete { + let obj_id = aws_sdk_s3::types::ObjectIdentifier::builder() + .key(obj) + .build() + .map_err(|err| { + S3ExampleError::new(format!("Failed to build key for delete_object: {err:?}")) + })?; + delete_object_ids.push(obj_id); + } + client - .put_object() + .delete_objects() .bucket(bucket_name) - .key(key) - .body(body.unwrap()) + .delete( + aws_sdk_s3::types::Delete::builder() + .set_objects(Some(delete_object_ids)) + .build() + .map_err(|err| { + S3ExampleError::new(format!("Failed to build delete_object input {err:?}")) + })?, + ) .send() - .await + .await?; + Ok(()) } -// snippet-end:[rust.example_code.s3.basics.put_object] -// snippet-end:[rust.example_code.s3.basics.upload_object] +// snippet-end:[s3.rust.delete_objects] -// snippet-start:[rust.example_code.s3.basics.create_bucket] +// snippet-start:[s3.rust.create_bucket] pub async fn create_bucket( - client: &Client, + client: &aws_sdk_s3::Client, bucket_name: &str, - region: &str, -) -> Result> { - let constraint = BucketLocationConstraint::from(region); - let cfg = CreateBucketConfiguration::builder() + region: &aws_config::Region, +) -> Result, S3ExampleError> { + let constraint = aws_sdk_s3::types::BucketLocationConstraint::from(region.to_string().as_str()); + let cfg = aws_sdk_s3::types::CreateBucketConfiguration::builder() .location_constraint(constraint) .build(); - client + let create = client .create_bucket() .create_bucket_configuration(cfg) .bucket(bucket_name) .send() - .await + .await; + + // BucketAlreadyExists and BucketAlreadyOwnedByYou are not problems for this task. + create.map(Some).or_else(|err| { + if err + .as_service_error() + .map(|se| se.is_bucket_already_exists() || se.is_bucket_already_owned_by_you()) + == Some(true) + { + Ok(None) + } else { + Err(S3ExampleError::from(err)) + } + }) } -// snippet-end:[rust.example_code.s3.basics.create_bucket] -// snippet-end:[rust.example_code.s3.scenario_getting_started.lib] +// snippet-end:[s3.rust.create_bucket] + +// snippet-start:[s3.rust.delete_bucket] +pub async fn delete_bucket( + client: &aws_sdk_s3::Client, + bucket_name: &str, +) -> Result<(), S3ExampleError> { + let resp = client.delete_bucket().bucket(bucket_name).send().await; + match resp { + Ok(_) => Ok(()), + Err(err) => { + if err + .as_service_error() + .and_then(aws_sdk_s3::error::ProvideErrorMetadata::code) + == Some("NoSuchBucket") + { + Ok(()) + } else { + Err(S3ExampleError::from(err)) + } + } + } +} +// snippet-end:[s3.rust.delete_bucket] #[cfg(test)] mod test { use std::env::temp_dir; + use aws_config::Region; use aws_smithy_runtime::client::http::test_util::StaticReplayClient; use sdk_examples_test_utils::{client_config, single_shot_client, test_event}; use tokio::{fs::File, io::AsyncWriteExt}; use uuid::Uuid; use crate::{ - copy_object, create_bucket, delete_bucket, delete_objects, download_object, list_objects, + clear_bucket, copy_object, create_bucket, delete_bucket, download_object, list_objects, upload_object, }; @@ -200,6 +272,19 @@ mod test { assert!(resp.is_ok(), "{resp:?}"); } + #[tokio::test] + async fn test_delete_missing_bucket() { + let client = single_shot_client!( + sdk: aws_sdk_s3, + status: 404, + response: r#"NoSuchBucketThe specified bucket does not existbucket_nameREQUESTHOSTID="# + ); + + let resp = delete_bucket(&client, "bucket_name").await; + + assert!(resp.is_ok(), "{resp:?}"); + } + #[tokio::test] async fn test_delete_objects() { let client = aws_sdk_s3::Client::from_conf( @@ -245,10 +330,9 @@ mod test { .build(), ); - let resp = delete_objects(&client, "bucket_name").await; + let resp = clear_bucket(&client, "bucket_name").await; assert!(resp.is_ok(), "{resp:?}"); - assert_eq!(resp.as_ref().unwrap(), &vec!["obj1", "obj2"], "{resp:?}"); } #[tokio::test] @@ -304,7 +388,7 @@ mod test { .build(), ); - let resp = delete_objects(&client, "bucket_name").await; + let resp = clear_bucket(&client, "bucket_name").await; assert!(resp.is_err(), "{resp:?}"); } @@ -332,7 +416,8 @@ mod test { response: r#""# ); - let resp = copy_object(&client, "bucket_name", "object_key", "target_key").await; + let bucket = "bucket_name"; + let resp = copy_object(&client, bucket, bucket, "object_key", "target_key").await; assert!(resp.is_ok(), "{resp:?}"); } @@ -385,8 +470,10 @@ mod test { response: r#""# ); - let resp = create_bucket(&client, "bucket_name", "region").await; + let resp = create_bucket(&client, "bucket_name", &Region::from_static("us-esst-1")).await; assert!(resp.is_ok(), "{resp:?}"); - assert_eq!(resp.unwrap().location(), Some("test_location")); + let output = resp.unwrap(); + assert!(output.is_some()); + assert_eq!(output.unwrap().location(), Some("test_location")); } } diff --git a/rustv1/examples/s3/tests/test-s3-getting-started.rs b/rustv1/examples/s3/tests/test-s3-getting-started.rs index 8e4f584840d..879ab73d9e5 100644 --- a/rustv1/examples/s3/tests/test-s3-getting-started.rs +++ b/rustv1/examples/s3/tests/test-s3-getting-started.rs @@ -3,7 +3,7 @@ use aws_config::meta::region::RegionProviderChain; use aws_sdk_s3::{config::Region, Client}; -use s3_service::error::Error; +use s3_code_examples::error::S3ExampleError; use uuid::Uuid; #[ignore] @@ -21,14 +21,14 @@ async fn run_s3_operations( file_name: String, key: String, target_key: String, -) -> Result<(), Error> { - s3_service::create_bucket(&client, &bucket_name, region.as_ref()).await?; - s3_service::upload_object(&client, &bucket_name, &file_name, &key).await?; - s3_service::download_object(&client, &bucket_name, &key).await?; - s3_service::copy_object(&client, &bucket_name, &key, &target_key).await?; - s3_service::list_objects(&client, &bucket_name).await?; - s3_service::delete_objects(&client, &bucket_name).await?; - s3_service::delete_bucket(&client, &bucket_name).await?; +) -> Result<(), S3ExampleError> { + s3_code_examples::create_bucket(&client, &bucket_name, ®ion).await?; + s3_code_examples::upload_object(&client, &bucket_name, &file_name, &key).await?; + s3_code_examples::download_object(&client, &bucket_name, &key).await?; + s3_code_examples::copy_object(&client, &bucket_name, &bucket_name, &key, &target_key).await?; + s3_code_examples::list_objects(&client, &bucket_name).await?; + s3_code_examples::clear_bucket(&client, &bucket_name).await?; + s3_code_examples::delete_bucket(&client, &bucket_name).await?; Ok(()) } From 65d302e12a715f03356f935d84e6721628a825c4 Mon Sep 17 00:00:00 2001 From: David Souther Date: Thu, 5 Sep 2024 16:57:40 -0400 Subject: [PATCH 73/98] Python: Bedrock Runtime async streaming example. (#6726) * Python: Bedrock Runtime async streaming example. --- .../models/anthropic_claude/converse_async.py | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 python/example_code/bedrock-runtime/models/anthropic_claude/converse_async.py diff --git a/python/example_code/bedrock-runtime/models/anthropic_claude/converse_async.py b/python/example_code/bedrock-runtime/models/anthropic_claude/converse_async.py new file mode 100644 index 00000000000..fea88342c0f --- /dev/null +++ b/python/example_code/bedrock-runtime/models/anthropic_claude/converse_async.py @@ -0,0 +1,102 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +# snippet-start:[python.example_code.bedrock-runtime.async.Converse_AnthropicClaude] +""" +Use the Conversation API to send a text message to Anthropic Claude. Streaming the +responses allows running the requests in parallel, speeding overall throughput for +several requests. +""" + +import asyncio +import logging +import time +from collections.abc import AsyncIterator +from os import environ + +import boto3 +from botocore.exceptions import ClientError + +logging.basicConfig(level=environ.get("LOG_LEVEL", "WARN").upper(), force=True) + +# Create a Bedrock Runtime client in the AWS Region you want to use. +client = boto3.client("bedrock-runtime", region_name="us-east-1") + +# Set the model ID, e.g., Claude 3 Haiku. +model_id = "anthropic.claude-3-haiku-20240307-v1:0" + + +async def converse_stream(user_message: str) -> AsyncIterator[str]: + """Call Bedrock Runtime streaming. Yield each text item in the stream. Add a sleep(0) to unblock the asyncio loop.""" + conversation = [ + { + "role": "user", + "content": [{"text": user_message}], + } + ] + + try: + yield f""""{user_message}":\n""" + + # Send the message to the model, using a basic inference configuration. + response = client.converse_stream( + modelId=model_id, + messages=conversation, + inferenceConfig={"maxTokens": 512, "temperature": 0.5, "topP": 0.9}, + ) + + for chunk in response["stream"]: + if "contentBlockDelta" in chunk: + text = chunk["contentBlockDelta"]["delta"]["text"] + print(f"In converse_stream {user_message} {text}") + yield text + # This await sleep(0) is necessary to allow the asyncio runtime an + # opportunity to jump to other tasks in the block. + await asyncio.sleep(0) + + except (ClientError, Exception) as e: + print(f"ERROR: Can't invoke '{model_id}'. Reason: {e}") + raise e + + +async def gather_stream(iterator: AsyncIterator[str]) -> str: + return "".join([item async for item in iterator]) + + +def make_tasks(): + prompts = [f"Count to {i * 10} in prime numbers" for i in range(2, 10)] + return [converse_stream(prompt) for prompt in prompts] + + +async def main(): + start_parallel = time.time() + parallel_results = await asyncio.gather( + *[gather_stream(task) for task in make_tasks()] + ) + end_parallel = time.time() + + start_sequential = time.time() + sequential_results = [await gather_stream(task) for task in make_tasks()] + end_sequential = time.time() + + logging.info("Parallel results: \n%s", parallel_results) + logging.info("Sequential results:\n%s", sequential_results) + + print(f"Parallel took {end_parallel - start_parallel}s") # EG 2.7 seconds + print(f"Sequential took {end_sequential - start_sequential}s") # EG 5.6 seconds + + print( + "\n" + "If you review the output of this program, you should see two sets of streaming log statements.\n" + 'The first should intermix "Count to 20", "Count to 30", etc. The second set should not mix,\n' + 'and be "Count to 20", "Count to 20", ... "Count to 90", " Count to 90".\n' + "\n" + "This shows the parallel nature of the first set of requests, and the sequential nature of the second set." + ) + + +if __name__ == "__main__": + asyncio.run(main()) + + +# snippet-end:[python.example_code.bedrock-runtime.async.Converse_AnthropicClaude] From 7ee6fa1977dc582fa8dec263d6aaf94f4dd290e9 Mon Sep 17 00:00:00 2001 From: Laren-AWS <57545972+Laren-AWS@users.noreply.github.com> Date: Fri, 6 Sep 2024 07:29:13 -0700 Subject: [PATCH 74/98] Go: Remove obsolete Go App Runner CDK example. (#6816) Remove obsolete Go App Runner CDK example. --- resources/cdk/go-apprunner/README.md | 95 ---------------------- resources/cdk/go-apprunner/app/Dockerfile | 26 ------ resources/cdk/go-apprunner/app/go.mod | 5 -- resources/cdk/go-apprunner/app/go.sum | 24 ------ resources/cdk/go-apprunner/app/main.go | 25 ------ resources/cdk/go-apprunner/cdk.json | 17 ---- resources/cdk/go-apprunner/go-arcdk.go | 99 ----------------------- resources/cdk/go-apprunner/go.mod | 13 --- resources/cdk/go-apprunner/go.sum | 19 ----- 9 files changed, 323 deletions(-) delete mode 100644 resources/cdk/go-apprunner/README.md delete mode 100644 resources/cdk/go-apprunner/app/Dockerfile delete mode 100644 resources/cdk/go-apprunner/app/go.mod delete mode 100644 resources/cdk/go-apprunner/app/go.sum delete mode 100644 resources/cdk/go-apprunner/app/main.go delete mode 100644 resources/cdk/go-apprunner/cdk.json delete mode 100644 resources/cdk/go-apprunner/go-arcdk.go delete mode 100644 resources/cdk/go-apprunner/go.mod delete mode 100644 resources/cdk/go-apprunner/go.sum diff --git a/resources/cdk/go-apprunner/README.md b/resources/cdk/go-apprunner/README.md deleted file mode 100644 index c7e341f3920..00000000000 --- a/resources/cdk/go-apprunner/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# Golang: AWS App Runner with ECR via CDK - -This is an example of building Golang applications on top of AWS AppRunner. - -AppRunner does not natively support Go, however it is possible to automate the deployment of a Go application using the -Elastic Container Registry. Here, a simple application written in Go, is packaged into a Docker container. - -* The docker container is built in two passes: The first builds the Golang application for the target linux-amd64 environment. - The second stage assembles the final container used by the application: A barebones Go application and supporting environment. -* This application is built using [fiber](://gofiber.io/) however any HTTP framework will do. -* App Runner automatically procures HTTPS certificates for both the default certificate and any custom domains you may associate with your service. - - -## ⚠️ Important - -* While this sample has been tested in multiple AWS Regions, you will need to verify that AppRunner and the Elastic Container Registry are available in the Regions you wish to deploy to. -* Running the sample may incur charges upon your account. Unless you clean up the AppRunner instance, it will continue to incur charges. To avoid future charges, use `cdk destroy` to clean up any resources that were created as a part of this example. - -## Running the example - -To run this example, make sure you have the AWS Clould Development Kit (AWS CDK) installed. - -If you have not already done so, you will need to bootstrap the AWS CDK: -``` -cdk bootstrap -``` - -Next, use `cdk deploy` to deploy the application: -``` -$ cdk deploy - -This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening). -Please confirm you intend to make the following modifications: - -IAM Statement Changes -┌───┬────────────────────────────────────────┬────────┬────────────────────────────────────────┬──────────────────────────────────────────┬───────────┐ -│ │ Resource │ Effect │ Action │ Principal │ Condition │ -├───┼────────────────────────────────────────┼────────┼────────────────────────────────────────┼──────────────────────────────────────────┼───────────┤ -│ + │ ${AppRunnerInstanceRole.Arn} │ Allow │ sts:AssumeRole │ Service:tasks.apprunner.amazonaws.com │ │ -├───┼────────────────────────────────────────┼────────┼────────────────────────────────────────┼──────────────────────────────────────────┼───────────┤ -│ + │ ${AppRunnerRole.Arn} │ Allow │ sts:AssumeRole │ Service:build.apprunner.amazonaws.com │ │ -├───┼────────────────────────────────────────┼────────┼────────────────────────────────────────┼──────────────────────────────────────────┼───────────┤ -│ + │ * │ Allow │ ecr:GetAuthorizationToken │ AWS:${AppRunnerRole} │ │ -├───┼────────────────────────────────────────┼────────┼────────────────────────────────────────┼──────────────────────────────────────────┼───────────┤ -│ + │ arn:${AWS::Partition}:ecr:${AWS::Regio │ Allow │ ecr:BatchCheckLayerAvailability │ AWS:${AppRunnerRole} │ │ -│ │ n}:${AWS::AccountId}:repository/aws-cd │ │ ecr:BatchGetImage │ │ │ -│ │ k/assets │ │ ecr:GetDownloadUrlForLayer │ │ │ -└───┴────────────────────────────────────────┴────────┴────────────────────────────────────────┴──────────────────────────────────────────┴───────────┘ -(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299) - -Do you wish to deploy these changes (y/n)? y - -GolangAppRunnerExampleStack: deploying... -[0%] start: Publishing 0f380582847cffcb6a5ce66113c5f929c8a2ab63ef3e3b0b44efc0e506e12a9c:current -#1 [internal] load build definition from Dockerfile - -... - -GolangAppRunnerExampleStack: creating CloudFormation changeset... -[█████████▋················································] (1/6) - -11:51:29 AM | CREATE_IN_PROGRESS | AWS::CloudFormation::Stack | GolangAppRunnerExampleStack -11:51:56 AM | CREATE_IN_PROGRESS | AWS::IAM::Role | AppRunnerInstanceRole -11:51:56 AM | CREATE_IN_PROGRESS | AWS::IAM::Role | AppRunnerRole - -``` - -This will take 5-10 minutes. - -When you're done, use `aws apprunner list-services` to show the service you've created: - -``` -$ aws apprunner list-services -ServiceSummaryList: -- CreatedAt: '2021-07-12T18:17:03-07:00' - ServiceArn: arn:aws:apprunner:us-west-2:111222333444:service/AppRunner-exampleAbcd1/cb779af9f12f420bbe7b2649caff2c66 - ServiceId: cb779af9f12f420bbe7b2649caff2c66 - ServiceName: AppRunner-exampleAbcd1 - ServiceUrl: example123.us-west-2.awsapprunner.com - Status: RUNNING - UpdatedAt: '2021-07-12T18:17:03-07:00' -``` - -the application will be running happily: - -``` -$ curl https://example123.us-west-2.awsapprunner.com -Hello, World! -``` - -## Useful commands - - * `cdk deploy` deploy this stack to your default AWS account/region - * `cdk diff` compare deployed stack with current state - * `cdk synth` emits the synthesized CloudFormation template diff --git a/resources/cdk/go-apprunner/app/Dockerfile b/resources/cdk/go-apprunner/app/Dockerfile deleted file mode 100644 index 273e8d17e50..00000000000 --- a/resources/cdk/go-apprunner/app/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# This dockerfile is a two-stage build. -#In the first, we build our actual application using go build. -FROM golang AS builder -WORKDIR /go/src -COPY ./* . -RUN echo "Building application in builder image" -# Build the actual application: -# We need to disable CGO in order to remove any dependencies on -# external libraries. We also pass some flags to the linker -# to reduce the size of our application: -# -w disables Dwarf debugging (for linux) -# -s disables symbol table creation -# In a production envrionment, these are generally not useful to have. -RUN GOPROXY=direct CGO_ENABLED=0 \ - go build -ldflags="-w -s" \ - -o /go/bin/app - -# In the second stage, the deployed stage, we copy the built -# application over, plus some files from the builder that Go reads -# and needs. -FROM scratch -COPY --from=builder /etc/passwd /etc/passwd -COPY --from=builder /etc/group /etc/group -COPY --from=builder /go/bin/app ./app -EXPOSE 3000 -ENTRYPOINT ["./app"] \ No newline at end of file diff --git a/resources/cdk/go-apprunner/app/go.mod b/resources/cdk/go-apprunner/app/go.mod deleted file mode 100644 index bca933e0c6b..00000000000 --- a/resources/cdk/go-apprunner/app/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module app - -go 1.16 - -require github.com/gofiber/fiber/v2 v2.14.0 diff --git a/resources/cdk/go-apprunner/app/go.sum b/resources/cdk/go-apprunner/app/go.sum deleted file mode 100644 index b0425841cc8..00000000000 --- a/resources/cdk/go-apprunner/app/go.sum +++ /dev/null @@ -1,24 +0,0 @@ -github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/gofiber/fiber/v2 v2.14.0 h1:oAUxouH4RWBE9r/3aZbucFefjdMmDF8rUsAIbyWkctY= -github.com/gofiber/fiber/v2 v2.14.0/go.mod h1:oZTLWqYnqpMMuF922SjGbsYZsdpE1MCfh416HNdweIM= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/klauspost/compress v1.12.2 h1:2KCfW3I9M7nSc5wOqXAlW2v2U6v+w6cbjvbfp+OykW8= -github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.26.0 h1:k5Tooi31zPG/g8yS6o2RffRO2C9B9Kah9SY8j/S7058= -github.com/valyala/fasthttp v1.26.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA= -github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 h1:hZR0X1kPW+nwyJ9xRxqZk1vx5RUObAPBdKVvXPDUH/E= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/resources/cdk/go-apprunner/app/main.go b/resources/cdk/go-apprunner/app/main.go deleted file mode 100644 index 25660573a3f..00000000000 --- a/resources/cdk/go-apprunner/app/main.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package main - -import ( - "log" - - "github.com/gofiber/fiber/v2" -) - -func main() { - app := fiber.New() - - // Return a string - app.Get("/", func(c *fiber.Ctx) error { - return c.SendString("Hello, World!") - }) - - // Return some JSON - app.Get("/greet/:name", func(c *fiber.Ctx) error { - return c.SendString("{'greeting':'Hello, " + c.Params("name") + "!'}") - }) - - log.Fatal(app.Listen(":3000")) -} diff --git a/resources/cdk/go-apprunner/cdk.json b/resources/cdk/go-apprunner/cdk.json deleted file mode 100644 index 81791fbe768..00000000000 --- a/resources/cdk/go-apprunner/cdk.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "app": "go mod download && go run go-arcdk.go", - "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": "true", - "aws-cdk:enableDiffNoFail": "true", - "@aws-cdk/core:stackRelativeExports": "true", - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true - } -} diff --git a/resources/cdk/go-apprunner/go-arcdk.go b/resources/cdk/go-apprunner/go-arcdk.go deleted file mode 100644 index 45f987afbad..00000000000 --- a/resources/cdk/go-apprunner/go-arcdk.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package main - -import ( - "github.com/aws/aws-cdk-go/awscdk" - "github.com/aws/aws-cdk-go/awscdk/awsapprunner" - "github.com/aws/aws-cdk-go/awscdk/awsecrassets" - "github.com/aws/aws-cdk-go/awscdk/awsiam" - "github.com/aws/constructs-go/constructs/v3" - "github.com/aws/jsii-runtime-go" -) - -type GolangAppRunnerExampleProps struct { - awscdk.StackProps -} - -func NewGAStack(scope constructs.Construct, id string, props *GolangAppRunnerExampleProps) awscdk.Stack { - var sprops awscdk.StackProps - if props != nil { - sprops = props.StackProps - } - stack := awscdk.NewStack(scope, &id, &sprops) - - // Create the Docker image. - image := awsecrassets.NewDockerImageAsset(stack, jsii.String("ApplicationImage"), &awsecrassets.DockerImageAssetProps{ - Directory: jsii.String("./app/"), - }) - - appRunnerInstanceRole := awsiam.NewRole(stack, jsii.String("AppRunnerInstanceRole"), &awsiam.RoleProps{ - AssumedBy: awsiam.NewServicePrincipal(jsii.String("tasks.apprunner.amazonaws.com"), &awsiam.ServicePrincipalOpts{}), - }) - - // Grant App Runner read access to the Docker container. - ecrAccessRole := awsiam.NewRole(stack, jsii.String("AppRunnerRole"), &awsiam.RoleProps{ - AssumedBy: awsiam.NewServicePrincipal(jsii.String("build.apprunner.amazonaws.com"), &awsiam.ServicePrincipalOpts{}), - }) - image.Repository().GrantPull(ecrAccessRole) - - // Create the service. - awsapprunner.NewCfnService(stack, jsii.String("AppRunner"), &awsapprunner.CfnServiceProps{ - SourceConfiguration: awsapprunner.CfnService_SourceConfigurationProperty{ - ImageRepository: awsapprunner.CfnService_ImageRepositoryProperty{ - ImageIdentifier: image.ImageUri(), - ImageConfiguration: awsapprunner.CfnService_ImageConfigurationProperty{ - Port: jsii.String("3000"), - }, - ImageRepositoryType: jsii.String("ECR"), - }, - AuthenticationConfiguration: awsapprunner.CfnService_AuthenticationConfigurationProperty{ - AccessRoleArn: ecrAccessRole.RoleArn(), - }, - }, - InstanceConfiguration: awsapprunner.CfnService_InstanceConfigurationProperty{ - InstanceRoleArn: appRunnerInstanceRole.RoleArn(), - }, - }) - - return stack -} - -func main() { - app := awscdk.NewApp(nil) - - NewGAStack(app, "GolangAppRunnerExampleStack", &GolangAppRunnerExampleProps{ - awscdk.StackProps{ - Env: env(), - }, - }) - - app.Synth(nil) -} - -// env determines the AWS environment (account+region) in which our stack is to -// be deployed. For more information see: https://docs.aws.amazon.com/cdk/latest/guide/environments.html -func env() *awscdk.Environment { - // If unspecified, this stack will be "environment-agnostic". - // Account/Region-dependent features and context lookups will not work, but a - // single synthesized template can be deployed anywhere. - //--------------------------------------------------------------------------- - return nil - - // Uncomment if you know exactly what account and region you want to deploy - // the stack to. This is the recommendation for production stacks. - //--------------------------------------------------------------------------- - // return &awscdk.Environment{ - // Account: jsii.String("123456789012"), - // Region: jsii.String("us-east-1"), - // } - - // Uncomment to specialize this stack for the AWS Account and Region that are - // implied by the current CLI configuration. This is recommended for dev - // stacks. - //--------------------------------------------------------------------------- - // return &awscdk.Environment{ - // Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")), - // Region: jsii.String(os.Getenv("CDK_DEFAULT_REGION")), - // } -} diff --git a/resources/cdk/go-apprunner/go.mod b/resources/cdk/go-apprunner/go.mod deleted file mode 100644 index 69b74cb57fc..00000000000 --- a/resources/cdk/go-apprunner/go.mod +++ /dev/null @@ -1,13 +0,0 @@ -module go-apprunnerexample - -go 1.16 - -require ( - github.com/aws/aws-cdk-go/awscdk v1.111.0-devpreview - github.com/aws/constructs-go/constructs/v3 v3.3.87 - github.com/aws/jsii-runtime-go v1.30.0 - github.com/stretchr/testify v1.7.0 - - // for testing - github.com/tidwall/gjson v1.7.4 -) diff --git a/resources/cdk/go-apprunner/go.sum b/resources/cdk/go-apprunner/go.sum deleted file mode 100644 index c2b2484fad0..00000000000 --- a/resources/cdk/go-apprunner/go.sum +++ /dev/null @@ -1,19 +0,0 @@ -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/aws/aws-cdk-go/awscdk v1.111.0-devpreview h1:RomF/6hPioNhnofaOEm4zNPPTsBAeomPBRRW/HcaAAg= -github.com/aws/aws-cdk-go/awscdk v1.111.0-devpreview/go.mod h1:+wV6ukxHMwtDy9N8DZETTxv6I1zRaA4/UVHxvilcFRs= -github.com/aws/aws-cdk-go/awscdk v1.112.0-devpreview h1:B7NxLPSbGUKrR4H2pCRaJ2kW4W1bn9BOrZ6J0H+uhx4= -github.com/aws/aws-cdk-go/awscdk v1.112.0-devpreview/go.mod h1:+wV6ukxHMwtDy9N8DZETTxv6I1zRaA4/UVHxvilcFRs= -github.com/aws/constructs-go/constructs/v3 v3.3.87 h1:PjTh5wjhB4Sjx58eL03/jgHlP/lxk3ZU3Pzegit+AVU= -github.com/aws/constructs-go/constructs/v3 v3.3.87/go.mod h1:KwR33qDihHU7QlN7QTi0NQh5WfeBHkFXTzrGYtBLUow= -github.com/aws/jsii-runtime-go v1.30.0 h1:KEQ0G78/VVmgRyXKwKdRTbJF2O9VVG39Hv1Y/iROGbo= -github.com/aws/jsii-runtime-go v1.30.0/go.mod h1:6tZnlstx8bAB3vnLFF9n8bbkI//LDblAek9zFyMXV3E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tidwall/gjson v1.7.4/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= -github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 3291f20632ebcfcf80692682071d2b7bf1fc2f6a Mon Sep 17 00:00:00 2001 From: ford prior Date: Fri, 6 Sep 2024 10:31:50 -0400 Subject: [PATCH 75/98] Python - EC2: Audit results implemented (Pt. 2) (#6789) * This update applies coding standards to the source code and test code. --------- Co-authored-by: David Souther --- .../resilient_service/.gitignore | 4 +- .../resilient_service/auto_scaler.py | 631 +++++++++++------- .../resilient_service/{test => }/conftest.py | 17 +- .../resilient_service/load_balancer.py | 352 ++++++---- .../resilient_service/parameters.py | 43 +- .../recommendation_service.py | 41 +- .../resilient_service/requirements.txt | 3 +- .../cross_service/resilient_service/runner.py | 393 ++++++----- .../resilient_service/test/pytest.ini | 2 + .../test/resources/server.py | 4 +- .../resilient_service/test/test_demo.py | 253 ------- .../resilient_service/test/test_deploy.py | 264 -------- .../resilient_service/test/test_destroy.py | 179 ----- .../test/test_runner_integ.py | 139 ++-- python/example_code/auto-scaling/README.md | 22 +- .../auto-scaling/action_wrapper.py | 296 +++++--- .../auto-scaling/hello/hello_autoscaling.py | 2 +- .../scenario_groups_and_instances.py | 129 +++- .../auto-scaling/test/conftest.py | 3 +- .../auto-scaling/test/test_action_wrapper.py | 9 +- .../test_scenario_groups_and_instances.py | 3 +- python/example_code/ec2/README.md | 16 +- .../elastic-load-balancing/README.md | 12 +- python/example_code/iam/README.md | 4 +- 24 files changed, 1303 insertions(+), 1518 deletions(-) rename python/cross_service/resilient_service/{test => }/conftest.py (91%) create mode 100644 python/cross_service/resilient_service/test/pytest.ini delete mode 100644 python/cross_service/resilient_service/test/test_demo.py delete mode 100644 python/cross_service/resilient_service/test/test_deploy.py delete mode 100644 python/cross_service/resilient_service/test/test_destroy.py diff --git a/python/cross_service/resilient_service/.gitignore b/python/cross_service/resilient_service/.gitignore index cfaad761185..8806444ac2b 100644 --- a/python/cross_service/resilient_service/.gitignore +++ b/python/cross_service/resilient_service/.gitignore @@ -1 +1,3 @@ -*.pem +doc-example-resilience-key-pair-* +test-doc-example-resilience-key-pair-* + diff --git a/python/cross_service/resilient_service/auto_scaler.py b/python/cross_service/resilient_service/auto_scaler.py index 81ba58b5d37..d4dfd06577b 100644 --- a/python/cross_service/resilient_service/auto_scaler.py +++ b/python/cross_service/resilient_service/auto_scaler.py @@ -5,7 +5,8 @@ import json import logging import time -from os import remove, chmod +from os import chmod, remove +from typing import Any, Dict, List, Tuple import boto3 from botocore.exceptions import ClientError @@ -13,32 +14,29 @@ log = logging.getLogger(__name__) -class AutoScalerError(Exception): - pass - - # snippet-start:[python.example_code.workflow.ResilientService_AutoScaler] # snippet-start:[python.cross_service.resilient_service.AutoScaler.decl] -class AutoScaler: +class AutoScalingWrapper: """ Encapsulates Amazon EC2 Auto Scaling and EC2 management actions. """ def __init__( self, - resource_prefix, - inst_type, - ami_param, - autoscaling_client, - ec2_client, - ssm_client, - iam_client, + resource_prefix: str, + inst_type: str, + ami_param: str, + autoscaling_client: boto3.client, + ec2_client: boto3.client, + ssm_client: boto3.client, + iam_client: boto3.client, ): """ + Initializes the AutoScaler class with the necessary parameters. + :param resource_prefix: The prefix for naming AWS resources that are created by this class. :param inst_type: The type of EC2 instance to create, such as t3.micro. - :param ami_param: The Systems Manager parameter used to look up the AMI that is - created. + :param ami_param: The Systems Manager parameter used to look up the AMI that is created. :param autoscaling_client: A Boto3 EC2 Auto Scaling client. :param ec2_client: A Boto3 EC2 client. :param ssm_client: A Boto3 Systems Manager client. @@ -50,43 +48,118 @@ def __init__( self.ec2_client = ec2_client self.ssm_client = ssm_client self.iam_client = iam_client - self.launch_template_name = f"{resource_prefix}-template" + sts_client = boto3.client("sts") + self.account_id = sts_client.get_caller_identity()["Account"] + + self.key_pair_name = f"{resource_prefix}-key-pair" + self.launch_template_name = f"{resource_prefix}-template-" self.group_name = f"{resource_prefix}-group" + + # Happy path self.instance_policy_name = f"{resource_prefix}-pol" self.instance_role_name = f"{resource_prefix}-role" self.instance_profile_name = f"{resource_prefix}-prof" + + # Failure mode self.bad_creds_policy_name = f"{resource_prefix}-bc-pol" self.bad_creds_role_name = f"{resource_prefix}-bc-role" self.bad_creds_profile_name = f"{resource_prefix}-bc-prof" - self.key_pair_name = f"{resource_prefix}-key-pair" # snippet-end:[python.cross_service.resilient_service.AutoScaler.decl] - @classmethod - def from_client(cls, resource_prefix): + def create_policy(self, policy_file: str, policy_name: str) -> str: """ - Creates this class from Boto3 clients. + Creates a new IAM policy or retrieves the ARN of an existing policy. - :param resource_prefix: The prefix for naming AWS resources that are created by this class. + :param policy_file: The path to a JSON file that contains the policy definition. + :param policy_name: The name to give the created policy. + :return: The ARN of the created or existing policy. """ - as_client = boto3.client("autoscaling") - ec2_client = boto3.client("ec2") - ssm_client = boto3.client("ssm") - iam_client = boto3.client("iam") - return cls( - resource_prefix, - "t3.micro", - "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2", - as_client, - ec2_client, - ssm_client, - iam_client, - ) + with open(policy_file) as file: + policy_doc = file.read() + + try: + response = self.iam_client.create_policy( + PolicyName=policy_name, PolicyDocument=policy_doc + ) + policy_arn = response["Policy"]["Arn"] + log.info(f"Policy '{policy_name}' created successfully. ARN: {policy_arn}") + return policy_arn + + except ClientError as err: + if err.response["Error"]["Code"] == "EntityAlreadyExists": + # If the policy already exists, get its ARN + response = self.iam_client.get_policy( + PolicyArn=f"arn:aws:iam::{self.account_id}:policy/{policy_name}" + ) + policy_arn = response["Policy"]["Arn"] + log.info(f"Policy '{policy_name}' already exists. ARN: {policy_arn}") + return policy_arn + log.error(f"Full error:\n\t{err}") + pass + + def create_role(self, role_name: str, assume_role_doc: dict) -> str: + """ + Creates a new IAM role or retrieves the ARN of an existing role. + + :param role_name: The name to give the created role. + :param assume_role_doc: The assume role policy document that specifies which + entities can assume the role. + :return: The ARN of the created or existing role. + """ + try: + response = self.iam_client.create_role( + RoleName=role_name, AssumeRolePolicyDocument=json.dumps(assume_role_doc) + ) + role_arn = response["Role"]["Arn"] + log.info(f"Role '{role_name}' created successfully. ARN: {role_arn}") + return role_arn + + except ClientError as err: + if err.response["Error"]["Code"] == "EntityAlreadyExists": + # If the role already exists, get its ARN + response = self.iam_client.get_role(RoleName=role_name) + role_arn = response["Role"]["Arn"] + log.info(f"Role '{role_name}' already exists. ARN: {role_arn}") + return role_arn + log.error(f"Full error:\n\t{err}") + pass + + def attach_policy( + self, + role_name: str, + policy_arn: str, + aws_managed_policies: Tuple[str, ...] = (), + ) -> None: + """ + Attaches an IAM policy to a role and optionally attaches additional AWS-managed policies. + + :param role_name: The name of the role to attach the policy to. + :param policy_arn: The ARN of the policy to attach. + :param aws_managed_policies: A tuple of AWS-managed policy names to attach to the role. + """ + try: + self.iam_client.attach_role_policy(RoleName=role_name, PolicyArn=policy_arn) + for aws_policy in aws_managed_policies: + self.iam_client.attach_role_policy( + RoleName=role_name, + PolicyArn=f"arn:aws:iam::aws:policy/{aws_policy}", + ) + log.info(f"Attached policy {policy_arn} to role {role_name}.") + except ClientError as err: + log.error(f"Failed to attach policy {policy_arn} to role {role_name}.") + log.error(f"Full error:\n\t{err}") + pass # snippet-start:[python.cross_service.resilient_service.iam.CreateInstanceProfile] def create_instance_profile( - self, policy_file, policy_name, role_name, profile_name, aws_managed_policies=() - ): + self, + policy_file: str, + policy_name: str, + role_name: str, + profile_name: str, + aws_managed_policies: Tuple[str, ...] = (), + ) -> str: """ Creates a policy, role, and profile that is associated with instances created by this class. An instance's associated profile defines a role that is assumed by the @@ -113,43 +186,9 @@ def create_instance_profile( } ], } - with open(policy_file) as file: - instance_policy_doc = file.read() - - policy_arn = None - try: - pol_response = self.iam_client.create_policy( - PolicyName=policy_name, PolicyDocument=instance_policy_doc - ) - policy_arn = pol_response["Policy"]["Arn"] - log.info("Created policy with ARN %s.", policy_arn) - except ClientError as err: - if err.response["Error"]["Code"] == "EntityAlreadyExists": - log.info("Policy %s already exists, nothing to do.", policy_name) - list_pol_response = self.iam_client.list_policies(Scope="Local") - for pol in list_pol_response["Policies"]: - if pol["PolicyName"] == policy_name: - policy_arn = pol["Arn"] - break - if policy_arn is None: - raise AutoScalerError(f"Couldn't create policy {policy_name}: {err}") - - try: - self.iam_client.create_role( - RoleName=role_name, AssumeRolePolicyDocument=json.dumps(assume_role_doc) - ) - self.iam_client.attach_role_policy(RoleName=role_name, PolicyArn=policy_arn) - for aws_policy in aws_managed_policies: - self.iam_client.attach_role_policy( - RoleName=role_name, - PolicyArn=f"arn:aws:iam::aws:policy/{aws_policy}", - ) - log.info("Created role %s and attached policy %s.", role_name, policy_arn) - except ClientError as err: - if err.response["Error"]["Code"] == "EntityAlreadyExists": - log.info("Role %s already exists, nothing to do.", role_name) - else: - raise AutoScalerError(f"Couldn't create role {role_name}: {err}") + policy_arn = self.create_policy(policy_file, policy_name) + self.create_role(role_name, assume_role_doc) + self.attach_policy(role_name, policy_arn, aws_managed_policies) try: profile_response = self.iam_client.create_instance_profile( @@ -172,17 +211,14 @@ def create_instance_profile( log.info( "Instance profile %s already exists, nothing to do.", profile_name ) - else: - raise AutoScalerError( - f"Couldn't create profile {profile_name} and attach it to role\n" - f"{role_name}: {err}" - ) + log.error(f"Full error:\n\t{err}") + pass return profile_arn # snippet-end:[python.cross_service.resilient_service.iam.CreateInstanceProfile] # snippet-start:[python.cross_service.resilient_service.ec2.DescribeIamInstanceProfileAssociations] - def get_instance_profile(self, instance_id): + def get_instance_profile(self, instance_id: str) -> Dict[str, Any]: """ Gets data about the profile associated with an instance. @@ -193,25 +229,36 @@ def get_instance_profile(self, instance_id): response = self.ec2_client.describe_iam_instance_profile_associations( Filters=[{"Name": "instance-id", "Values": [instance_id]}] ) + if not response["IamInstanceProfileAssociations"]: + log.info(f"No instance profile found for instance {instance_id}.") + profile_data = response["IamInstanceProfileAssociations"][0] + log.info(f"Retrieved instance profile for instance {instance_id}.") + return profile_data except ClientError as err: - raise AutoScalerError( - f"Couldn't get instance profile association for instance {instance_id}: {err}" + log.error( + f"Failed to retrieve instance profile for instance {instance_id}." ) - else: - return response["IamInstanceProfileAssociations"][0] + error_code = err.response["Error"]["Code"] + if error_code == "InvalidInstanceID.NotFound": + log.error(f"The instance ID '{instance_id}' does not exist.") + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.ec2.DescribeIamInstanceProfileAssociations] # snippet-start:[python.cross_service.resilient_service.ec2.ReplaceIamInstanceProfileAssociation] def replace_instance_profile( - self, instance_id, new_instance_profile_name, profile_association_id - ): + self, + instance_id: str, + new_instance_profile_name: str, + profile_association_id: str, + ) -> None: """ Replaces the profile associated with a running instance. After the profile is replaced, the instance is rebooted to ensure that it uses the new profile. When the instance is ready, Systems Manager is used to restart the Python web server. - :param instance_id: The ID of the instance to update. + :param instance_id: The ID of the instance to restart. :param new_instance_profile_name: The name of the new profile to associate with the specified instance. :param profile_association_id: The ID of the existing profile association for the @@ -228,36 +275,40 @@ def replace_instance_profile( new_instance_profile_name, ) time.sleep(5) - inst_ready = False - tries = 0 - while not inst_ready: - if tries % 6 == 0: - self.ec2_client.reboot_instances(InstanceIds=[instance_id]) - log.info( - "Rebooting instance %s and waiting for it to to be ready.", - instance_id, - ) - tries += 1 - time.sleep(10) - response = self.ssm_client.describe_instance_information() - for info in response["InstanceInformationList"]: - if info["InstanceId"] == instance_id: - inst_ready = True + + self.ec2_client.reboot_instances(InstanceIds=[instance_id]) + log.info("Rebooting instance %s.", instance_id) + waiter = self.ec2_client.get_waiter("instance_running") + log.info("Waiting for instance %s to be running.", instance_id) + waiter.wait(InstanceIds=[instance_id]) + log.info("Instance %s is now running.", instance_id) + self.ssm_client.send_command( InstanceIds=[instance_id], DocumentName="AWS-RunShellScript", Parameters={"commands": ["cd / && sudo python3 server.py 80"]}, ) - log.info("Restarted the Python web server on instance %s.", instance_id) + log.info(f"Restarted the Python web server on instance '{instance_id}'.") except ClientError as err: - raise AutoScalerError( - f"Couldn't replace instance profile for association {profile_association_id}: {err}" - ) + log.error("Failed to replace instance profile.") + error_code = err.response["Error"]["Code"] + if error_code == "InvalidAssociationID.NotFound": + log.error( + f"Association ID '{profile_association_id}' does not exist." + "Please check the association ID and try again." + ) + if error_code == "InvalidInstanceId": + log.error( + f"The specified instance ID '{instance_id}' does not exist or is not available for SSM. " + f"Please verify the instance ID and try again." + ) + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.ec2.ReplaceIamInstanceProfileAssociation] # snippet-start:[python.cross_service.resilient_service.iam.DeleteInstanceProfile] - def delete_instance_profile(self, profile_name, role_name): + def delete_instance_profile(self, profile_name: str, role_name: str) -> None: """ Detaches a role from an instance profile, detaches policies from the role, and deletes all the resources. @@ -284,25 +335,24 @@ def delete_instance_profile(self, profile_name, role_name): self.iam_client.delete_role(RoleName=role_name) log.info("Deleted role %s.", role_name) except ClientError as err: + log.error( + f"Couldn't delete instance profile {profile_name} or detach " + f"policies and delete role {role_name}: {err}" + ) if err.response["Error"]["Code"] == "NoSuchEntity": log.info( "Instance profile %s doesn't exist, nothing to do.", profile_name ) - else: - raise AutoScalerError( - f"Couldn't delete instance profile {profile_name} or detach " - f"policies and delete role {role_name}: {err}" - ) + pass # snippet-end:[python.cross_service.resilient_service.iam.DeleteInstanceProfile] # snippet-start:[python.cross_service.resilient_service.ec2.CreateKeyPair] - def create_key_pair(self, key_pair_name): + def create_key_pair(self, key_pair_name: str) -> None: """ Creates a new key pair. :param key_pair_name: The name of the key pair to create. - :return: The newly created key pair. """ try: response = self.ec2_client.create_key_pair(KeyName=key_pair_name) @@ -311,40 +361,39 @@ def create_key_pair(self, key_pair_name): chmod(f"{key_pair_name}.pem", 0o600) log.info("Created key pair %s.", key_pair_name) except ClientError as err: - raise AutoScalerError(f"Couldn't create key pair {key_pair_name}: {err}") + error_code = err.response["Error"]["Code"] + log.error(f"Failed to create key pair {key_pair_name}.") + if error_code == "InvalidKeyPair.Duplicate": + log.error(f"A key pair with the name '{key_pair_name}' already exists.") + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.ec2.CreateKeyPair] # snippet-start:[python.cross_service.resilient_service.ec2.DeleteKeyPair] - def delete_key_pair(self): + def delete_key_pair(self) -> None: """ Deletes a key pair. - - :param key_pair_name: The name of the key pair to delete. """ try: self.ec2_client.delete_key_pair(KeyName=self.key_pair_name) remove(f"{self.key_pair_name}.pem") log.info("Deleted key pair %s.", self.key_pair_name) except ClientError as err: - raise AutoScalerError( - f"Couldn't delete key pair {self.key_pair_name}: {err}" - ) - except FileNotFoundError: + log.error(f"Couldn't delete key pair '{self.key_pair_name}'.") + log.error(f"Full error:\n\t{err}") + pass + except FileNotFoundError as err: log.info("Key pair %s doesn't exist, nothing to do.", self.key_pair_name) - except PermissionError: - log.info( - "Inadequate permissions to delete key pair %s.", self.key_pair_name - ) - except Exception as err: - raise AutoScalerError( - f"Couldn't delete key pair {self.key_pair_name}: {err}" - ) + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.ec2.DeleteKeyPair] # snippet-start:[python.cross_service.resilient_service.ec2.CreateLaunchTemplate] - def create_template(self, server_startup_script_file, instance_policy_file): + def create_template( + self, server_startup_script_file: str, instance_policy_file: str + ) -> Dict[str, Any]: """ Creates an Amazon EC2 launch template to use with Amazon EC2 Auto Scaling. The launch template specifies a Bash script in its user data field that runs after @@ -359,6 +408,7 @@ def create_template(self, server_startup_script_file, instance_policy_file): """ template = {} try: + # Create key pair and instance profile self.create_key_pair(self.key_pair_name) self.create_instance_profile( instance_policy_file, @@ -366,10 +416,16 @@ def create_template(self, server_startup_script_file, instance_policy_file): self.instance_role_name, self.instance_profile_name, ) + + # Read the startup script with open(server_startup_script_file) as file: start_server_script = file.read() + + # Get the latest AMI ID ami_latest = self.ssm_client.get_parameter(Name=self.ami_param) ami_id = ami_latest["Parameter"]["Value"] + + # Create the launch template lt_response = self.ec2_client.create_launch_template( LaunchTemplateName=self.launch_template_name, LaunchTemplateData={ @@ -384,24 +440,17 @@ def create_template(self, server_startup_script_file, instance_policy_file): ) template = lt_response["LaunchTemplate"] log.info( - "Created launch template %s for AMI %s on %s.", - self.launch_template_name, - ami_id, - self.inst_type, + f"Created launch template {self.launch_template_name} for AMI {ami_id} on {self.inst_type}." ) except ClientError as err: - if ( - err.response["Error"]["Code"] - == "InvalidLaunchTemplateName.AlreadyExistsException" - ): + log.error(f"Failed to create launch template {self.launch_template_name}.") + error_code = err.response["Error"]["Code"] + if error_code == "InvalidLaunchTemplateName.AlreadyExistsException": log.info( - "Launch template %s already exists, nothing to do.", - self.launch_template_name, - ) - else: - raise AutoScalerError( - f"Couldn't create launch template {self.launch_template_name}: {err}." + f"Launch template {self.launch_template_name} already exists, nothing to do." ) + log.error(f"Full error:\n\t{err}") + pass return template # snippet-end:[python.cross_service.resilient_service.ec2.CreateLaunchTemplate] @@ -428,15 +477,13 @@ def delete_template(self): "Launch template %s does not exist, nothing to do.", self.launch_template_name, ) - else: - raise AutoScalerError( - f"Couldn't delete launch template {self.launch_template_name}: {err}." - ) + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.ec2.DeleteLaunchTemplate] # snippet-start:[python.cross_service.resilient_service.ec2.DescribeAvailabilityZones] - def get_availability_zones(self): + def get_availability_zones(self) -> List[str]: """ Gets a list of Availability Zones in the AWS Region of the Amazon EC2 client. @@ -445,15 +492,18 @@ def get_availability_zones(self): try: response = self.ec2_client.describe_availability_zones() zones = [zone["ZoneName"] for zone in response["AvailabilityZones"]] + log.info(f"Retrieved {len(zones)} availability zones: {zones}.") except ClientError as err: - raise AutoScalerError(f"Couldn't get availability zones: {err}.") + log.error("Failed to retrieve availability zones.") + log.error(f"Full error:\n\t{err}") + pass else: return zones # snippet-end:[python.cross_service.resilient_service.ec2.DescribeAvailabilityZones] # snippet-start:[python.cross_service.resilient_service.auto-scaling.CreateAutoScalingGroup] - def create_group(self, group_size): + def create_autoscaling_group(self, group_size: int) -> List[str]: """ Creates an EC2 Auto Scaling group with the specified size. @@ -461,7 +511,6 @@ def create_group(self, group_size): the group. :return: The list of Availability Zones specified for the group. """ - zones = [] try: zones = self.get_availability_zones() self.autoscaling_client.create_auto_scaling_group( @@ -475,30 +524,29 @@ def create_group(self, group_size): MaxSize=group_size, ) log.info( - "Created EC2 Auto Scaling group %s with availability zones %s.", - self.launch_template_name, - zones, + f"Created EC2 Auto Scaling group {self.group_name} with availability zones {zones}." ) except ClientError as err: - if err.response["Error"]["Code"] == "AlreadyExists": + error_code = err.response["Error"]["Code"] + if error_code == "AlreadyExists": log.info( - "EC2 Auto Scaling group %s already exists, nothing to do.", - self.group_name, + f"EC2 Auto Scaling group {self.group_name} already exists, nothing to do." ) else: - raise AutoScalerError( - f"Couldn't create EC2 Auto Scaling group {self.group_name}: {err}" - ) - return zones + log.error(f"Failed to create EC2 Auto Scaling group {self.group_name}.") + log.error(f"Full error:\n\t{err}") + pass + else: + return zones # snippet-end:[python.cross_service.resilient_service.auto-scaling.CreateAutoScalingGroup] # snippet-start:[python.cross_service.resilient_service.auto-scaling.DescribeAutoScalingGroups] - def get_instances(self): + def get_instances(self) -> List[str]: """ Gets data about the instances in the EC2 Auto Scaling group. - :return: Data about the instances. + :return: A list of instance IDs in the Auto Scaling group. """ try: as_response = self.autoscaling_client.describe_auto_scaling_groups( @@ -508,35 +556,69 @@ def get_instances(self): i["InstanceId"] for i in as_response["AutoScalingGroups"][0]["Instances"] ] - except ClientError as err: - raise AutoScalerError( - f"Couldn't get instances for Auto Scaling group {self.group_name}: {err}" + log.info( + f"Retrieved {len(instance_ids)} instances for Auto Scaling group {self.group_name}." ) + except ClientError as err: + error_code = err.response["Error"]["Code"] + log.error( + f"Failed to retrieve instances for Auto Scaling group {self.group_name}." + ) + if error_code == "ResourceNotFound": + log.error(f"The Auto Scaling group '{self.group_name}' does not exist.") + log.error(f"Full error:\n\t{err}") + pass else: return instance_ids # snippet-end:[python.cross_service.resilient_service.auto-scaling.DescribeAutoScalingGroups] - def terminate_instance(self, instance_id): + def terminate_instance(self, instance_id: str, decrementsetting=False) -> None: """ - Terminates and instances in an EC2 Auto Scaling group. After an instance is + Terminates an instance in an EC2 Auto Scaling group. After an instance is terminated, it can no longer be accessed. :param instance_id: The ID of the instance to terminate. + :param decrementsetting: If True, do not replace terminated instances. """ try: self.autoscaling_client.terminate_instance_in_auto_scaling_group( - InstanceId=instance_id, ShouldDecrementDesiredCapacity=False + InstanceId=instance_id, + ShouldDecrementDesiredCapacity=decrementsetting, ) log.info("Terminated instance %s.", instance_id) + + # Adding a waiter to ensure the instance is terminated + waiter = self.ec2_client.get_waiter("instance_terminated") + log.info("Waiting for instance %s to be terminated...", instance_id) + waiter.wait(InstanceIds=[instance_id]) + log.info( + f"Instance '{instance_id}' has been terminated and will be replaced." + ) + except ClientError as err: - raise AutoScalerError(f"Couldn't terminate instance {instance_id}: {err}") + error_code = err.response["Error"]["Code"] + log.error(f"Failed to terminate instance '{instance_id}'.") + if error_code == "ScalingActivityInProgressFault": + log.error( + "Scaling activity is currently in progress. " + "Wait for the scaling activity to complete before attempting to terminate the instance again." + ) + elif error_code == "ResourceContentionFault": + log.error( + "The request failed due to a resource contention issue. " + "Ensure that no conflicting operations are being performed on the resource." + ) + log.error(f"Full error:\n\t{err}") + pass # snippet-start:[python.cross_service.resilient_service.auto-scaling.AttachLoadBalancerTargetGroups] - def attach_load_balancer_target_group(self, lb_target_group): + def attach_load_balancer_target_group( + self, lb_target_group: Dict[str, Any] + ) -> None: """ Attaches an Elastic Load Balancing (ELB) target group to this EC2 Auto Scaling group. - The target group specifies how the load balancer forward requests to the instances + The target group specifies how the load balancer forwards requests to the instances in the group. :param lb_target_group: Data about the ELB target group to attach. @@ -552,83 +634,73 @@ def attach_load_balancer_target_group(self, lb_target_group): self.group_name, ) except ClientError as err: - raise AutoScalerError( - f"Couldn't attach load balancer target group {lb_target_group['TargetGroupName']}\n" - f"to auto scaling group {self.group_name}" - ) + error_code = err.response["Error"]["Code"] + log.error( + f"Failed to attach load balancer target group '{lb_target_group['TargetGroupName']}'." + ) + if error_code == "ResourceContentionFault": + log.error( + "The request failed due to a resource contention issue. " + "Ensure that no conflicting operations are being performed on the resource." + ) + elif error_code == "ServiceLinkedRoleFailure": + log.error( + "The operation failed because the service-linked role is not ready or does not exist. " + "Check that the service-linked role exists and is correctly configured." + ) + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.auto-scaling.AttachLoadBalancerTargetGroups] # snippet-start:[python.cross_service.resilient_service.auto-scaling.DeleteAutoScalingGroup] - def _try_terminate_instance(self, inst_id): - stopping = False - log.info(f"Stopping {inst_id}.") - while not stopping: - try: - self.autoscaling_client.terminate_instance_in_auto_scaling_group( - InstanceId=inst_id, ShouldDecrementDesiredCapacity=True - ) - stopping = True - except ClientError as err: - if err.response["Error"]["Code"] == "ScalingActivityInProgress": - log.info("Scaling activity in progress for %s. Waiting...", inst_id) - time.sleep(10) - else: - raise AutoScalerError(f"Couldn't stop instance {inst_id}: {err}.") - - def _try_delete_group(self): - """ - Tries to delete the EC2 Auto Scaling group. If the group is in use or in progress, - the function waits and retries until the group is successfully deleted. - """ - stopped = False - while not stopped: - try: - self.autoscaling_client.delete_auto_scaling_group( - AutoScalingGroupName=self.group_name - ) - stopped = True - log.info("Deleted EC2 Auto Scaling group %s.", self.group_name) - except ClientError as err: - if ( - err.response["Error"]["Code"] == "ResourceInUse" - or err.response["Error"]["Code"] == "ScalingActivityInProgress" - ): - log.info( - "Some instances are still running. Waiting for them to stop..." - ) - time.sleep(10) - else: - raise AutoScalerError( - f"Couldn't delete group {self.group_name}: {err}." - ) - - def delete_group(self): - """ - Terminates all instances in the group, deletes the EC2 Auto Scaling group. + def delete_autoscaling_group(self, group_name: str) -> None: + """ + Terminates all instances in the group, then deletes the EC2 Auto Scaling group. + + :param group_name: The name of the group to delete. """ try: response = self.autoscaling_client.describe_auto_scaling_groups( - AutoScalingGroupNames=[self.group_name] + AutoScalingGroupNames=[group_name] ) groups = response.get("AutoScalingGroups", []) if len(groups) > 0: self.autoscaling_client.update_auto_scaling_group( - AutoScalingGroupName=self.group_name, MinSize=0 + AutoScalingGroupName=group_name, MinSize=0 ) instance_ids = [inst["InstanceId"] for inst in groups[0]["Instances"]] for inst_id in instance_ids: - self._try_terminate_instance(inst_id) - self._try_delete_group() + self.terminate_instance(inst_id) + + # Wait for all instances to be terminated + if instance_ids: + waiter = self.ec2_client.get_waiter("instance_terminated") + log.info("Waiting for all instances to be terminated...") + waiter.wait(InstanceIds=instance_ids) + log.info("All instances have been terminated.") else: - log.info("No groups found named %s, nothing to do.", self.group_name) + log.info(f"No groups found named '{group_name}'! Nothing to do.") except ClientError as err: - raise AutoScalerError(f"Couldn't delete group {self.group_name}: {err}.") + error_code = err.response["Error"]["Code"] + log.error(f"Failed to delete Auto Scaling group '{group_name}'.") + if error_code == "ScalingActivityInProgressFault": + log.error( + "Scaling activity is currently in progress. " + "Wait for the scaling activity to complete before attempting to delete the group again." + ) + elif error_code == "ResourceContentionFault": + log.error( + "The request failed due to a resource contention issue. " + "Ensure that no conflicting operations are being performed on the group." + ) + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.auto-scaling.DeleteAutoScalingGroup] # snippet-start:[python.cross_service.resilient_service.ec2.DescribeVpcs] - def get_default_vpc(self): + def get_default_vpc(self) -> Dict[str, Any]: """ Gets the default VPC for the account. @@ -639,14 +711,33 @@ def get_default_vpc(self): Filters=[{"Name": "is-default", "Values": ["true"]}] ) except ClientError as err: - raise AutoScalerError(f"Couldn't get default VPC: {err}") + error_code = err.response["Error"]["Code"] + log.error("Failed to retrieve the default VPC.") + if error_code == "UnauthorizedOperation": + log.error( + "You do not have the necessary permissions to describe VPCs. " + "Ensure that your AWS IAM user or role has the correct permissions." + ) + elif error_code == "InvalidParameterValue": + log.error( + "One or more parameters are invalid. Check the request parameters." + ) + + log.error(f"Full error:\n\t{err}") + pass else: - return response["Vpcs"][0] + if "Vpcs" in response and response["Vpcs"]: + log.info(f"Retrieved default VPC: {response['Vpcs'][0]['VpcId']}") + return response["Vpcs"][0] + else: + pass # snippet-end:[python.cross_service.resilient_service.ec2.DescribeVpcs] # snippet-start:[python.cross_service.resilient_service.ec2.DescribeSecurityGroups] - def verify_inbound_port(self, vpc, port, ip_address): + def verify_inbound_port( + self, vpc: Dict[str, Any], port: int, ip_address: str + ) -> Tuple[Dict[str, Any], bool]: """ Verify the default security group of the specified VPC allows ingress from this computer. This can be done by allowing ingress from this computer's IP @@ -658,7 +749,7 @@ def verify_inbound_port(self, vpc, port, ip_address): :param vpc: The VPC used by this example. :param port: The port to verify. :param ip_address: This computer's IP address. - :return: The default security group of the specific VPC, and a value that indicates + :return: The default security group of the specified VPC, and a value that indicates whether the specified port is open. """ try: @@ -670,10 +761,11 @@ def verify_inbound_port(self, vpc, port, ip_address): ) sec_group = response["SecurityGroups"][0] port_is_open = False - log.info("Found default security group %s.", sec_group["GroupId"]) + log.info(f"Found default security group {sec_group['GroupId']}.") + for ip_perm in sec_group["IpPermissions"]: if ip_perm.get("FromPort", 0) == port: - log.info("Found inbound rule: %s", ip_perm) + log.info(f"Found inbound rule: {ip_perm}") for ip_range in ip_perm["IpRanges"]: cidr = ip_range.get("CidrIp", "") if cidr.startswith(ip_address) or cidr == "0.0.0.0/0": @@ -682,23 +774,29 @@ def verify_inbound_port(self, vpc, port, ip_address): port_is_open = True if not port_is_open: log.info( - "The inbound rule does not appear to be open to either this computer's IP\n" - "address of %s, to all IP addresses (0.0.0.0/0), or to a prefix list ID.", - ip_address, + f"The inbound rule does not appear to be open to either this computer's IP " + f"address of {ip_address}, to all IP addresses (0.0.0.0/0), or to a prefix list ID." ) else: break except ClientError as err: - raise AutoScalerError( - f"Couldn't verify inbound rule for port {port} for VPC {vpc['VpcId']}: {err}" + error_code = err.response["Error"]["Code"] + log.error( + f"Failed to verify inbound rule for port {port} for VPC {vpc['VpcId']}." ) + if error_code == "InvalidVpcID.NotFound": + log.error( + f"The specified VPC ID '{vpc['VpcId']}' does not exist. Please check the VPC ID." + ) + log.error(f"Full error:\n\t{err}") + pass else: return sec_group, port_is_open # snippet-end:[python.cross_service.resilient_service.ec2.DescribeSecurityGroups] # snippet-start:[python.cross_service.resilient_service.ec2.AuthorizeSecurityGroupIngress] - def open_inbound_port(self, sec_group_id, port, ip_address): + def open_inbound_port(self, sec_group_id: str, port: int, ip_address: str) -> None: """ Add an ingress rule to the specified security group that allows access on the specified port from the specified IP address. @@ -722,14 +820,27 @@ def open_inbound_port(self, sec_group_id, port, ip_address): ip_address, ) except ClientError as err: - raise AutoScalerError( - f"Couldn't authorize ingress to {sec_group_id} on port {port} from {ip_address}: {err}" - ) + error_code = err.response["Error"]["Code"] + log.error( + f"Failed to authorize ingress to security group '{sec_group_id}' on port {port} from {ip_address}." + ) + if error_code == "InvalidGroupId.Malformed": + log.error( + "The security group ID is malformed. " + "Please verify that the security group ID is correct." + ) + elif error_code == "InvalidPermission.Duplicate": + log.error( + "The specified rule already exists in the security group. " + "Check the existing rules for this security group." + ) + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.ec2.AuthorizeSecurityGroupIngress] # snippet-start:[python.cross_service.resilient_service.ec2.DescribeSubnets] - def get_subnets(self, vpc_id, zones): + def get_subnets(self, vpc_id: str, zones: List[str] = None) -> List[Dict[str, Any]]: """ Gets the default subnets in a VPC for a specified list of Availability Zones. @@ -737,20 +848,38 @@ def get_subnets(self, vpc_id, zones): :param zones: The list of Availability Zones to look up. :return: The list of subnets found. """ + # Ensure that 'zones' is a list, even if None is passed + if zones is None: + zones = [] try: - response = self.ec2_client.describe_subnets( + paginator = self.ec2_client.get_paginator("describe_subnets") + page_iterator = paginator.paginate( Filters=[ {"Name": "vpc-id", "Values": [vpc_id]}, {"Name": "availability-zone", "Values": zones}, {"Name": "default-for-az", "Values": ["true"]}, ] ) - subnets = response["Subnets"] + + subnets = [] + for page in page_iterator: + subnets.extend(page["Subnets"]) + log.info("Found %s subnets for the specified zones.", len(subnets)) - except ClientError as err: - raise AutoScalerError(f"Couldn't get subnets: {err}") - else: return subnets + except ClientError as err: + log.error( + f"Failed to retrieve subnets for VPC '{vpc_id}' in zones {zones}." + ) + error_code = err.response["Error"]["Code"] + if error_code == "InvalidVpcID.NotFound": + log.error( + "The specified VPC ID does not exist. " + "Please check the VPC ID and try again." + ) + # Add more error-specific handling as needed + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.ec2.DescribeSubnets] diff --git a/python/cross_service/resilient_service/test/conftest.py b/python/cross_service/resilient_service/conftest.py similarity index 91% rename from python/cross_service/resilient_service/test/conftest.py rename to python/cross_service/resilient_service/conftest.py index 07332610590..8afcfaf575a 100644 --- a/python/cross_service/resilient_service/test/conftest.py +++ b/python/cross_service/resilient_service/conftest.py @@ -4,21 +4,16 @@ """ Contains common test fixtures used to run unit tests. """ - from datetime import datetime -import sys + import boto3 import pytest -from auto_scaler import AutoScaler -from load_balancer import LoadBalancer +import runner +from auto_scaler import AutoScalingWrapper +from load_balancer import ElasticLoadBalancerWrapper from parameters import ParameterHelper from recommendation_service import RecommendationService -import runner - -# This is needed so Python can find test_tools on the path. -sys.path.append("../..") -from test_tools.fixtures.common import * class ScenarioData: @@ -72,7 +67,7 @@ def __init__(self, auto_scaling, elb, ddb, ec2, ssm, iam): self.scenario = runner.Runner( self.test_resource_path, RecommendationService(self.table_name, self.ddb.client), - AutoScaler( + AutoScalingWrapper( self.resource_prefix, self.inst_type, self.ami_param, @@ -81,7 +76,7 @@ def __init__(self, auto_scaling, elb, ddb, ec2, ssm, iam): self.ssm.client, self.iam.client, ), - LoadBalancer(self.tg_name, self.lb_name, self.elb.client), + ElasticLoadBalancerWrapper(self.elb.client), ParameterHelper(self.table_name, self.ssm.client), ) diff --git a/python/cross_service/resilient_service/load_balancer.py b/python/cross_service/resilient_service/load_balancer.py index 4e177bc665d..4d5bb2f18e8 100644 --- a/python/cross_service/resilient_service/load_balancer.py +++ b/python/cross_service/resilient_service/load_balancer.py @@ -3,78 +3,42 @@ import logging import time +from typing import Any, Dict, List import boto3 -from botocore.exceptions import ClientError import requests +from botocore.exceptions import ClientError log = logging.getLogger(__name__) -class LoadBalancerError(Exception): - pass - - # snippet-start:[python.example_code.workflow.ResilientService_LoadBalancer] # snippet-start:[python.cross_service.resilient_service.LoadBalancer.decl] -class LoadBalancer: +class ElasticLoadBalancerWrapper: """Encapsulates Elastic Load Balancing (ELB) actions.""" - def __init__(self, target_group_name, load_balancer_name, elb_client): + def __init__(self, elb_client: boto3.client): """ - :param target_group_name: The name of the target group associated with the load balancer. - :param load_balancer_name: The name of the load balancer. - :param elb_client: A Boto3 Elastic Load Balancing client. + Initializes the LoadBalancer class with the necessary parameters. """ - self.target_group_name = target_group_name - self.load_balancer_name = load_balancer_name self.elb_client = elb_client - self._endpoint = None # snippet-end:[python.cross_service.resilient_service.LoadBalancer.decl] - @classmethod - def from_client(cls, resource_prefix): - """ - Creates this class from a Boto3 client. - - :param resource_prefix: The prefix to give to AWS resources created by this class. - """ - elb_client = boto3.client("elbv2") - return cls(f"{resource_prefix}-tg", f"{resource_prefix}-lb", elb_client) - - # snippet-start:[python.cross_service.resilient_service.elbv2.DescribeLoadBalancers] - def endpoint(self): - """ - Gets the HTTP endpoint of the load balancer. - - :return: The endpoint. - """ - if self._endpoint is None: - try: - response = self.elb_client.describe_load_balancers( - Names=[self.load_balancer_name] - ) - self._endpoint = response["LoadBalancers"][0]["DNSName"] - except ClientError as err: - raise LoadBalancerError( - f"Couldn't get the endpoint for load balancer {self.load_balancer_name}: {err}" - ) - return self._endpoint - - # snippet-end:[python.cross_service.resilient_service.elbv2.DescribeLoadBalancers] - # snippet-start:[python.cross_service.resilient_service.elbv2.CreateTargetGroup] - def create_target_group(self, protocol, port, vpc_id): + def create_target_group( + self, target_group_name: str, protocol: str, port: int, vpc_id: str + ) -> Dict[str, Any]: """ Creates an Elastic Load Balancing target group. The target group specifies how - the load balancer forward requests to instances in the group and how instance + the load balancer forwards requests to instances in the group and how instance health is checked. To speed up this demo, the health check is configured with shortened times and lower thresholds. In production, you might want to decrease the sensitivity of your health checks to avoid unwanted failures. + :param target_group_name: The name of the target group to create. :param protocol: The protocol to use to forward requests, such as 'HTTP'. :param port: The port to use to forward requests, such as 80. :param vpc_id: The ID of the VPC in which the load balancer exists. @@ -82,7 +46,7 @@ def create_target_group(self, protocol, port, vpc_id): """ try: response = self.elb_client.create_target_group( - Name=self.target_group_name, + Name=target_group_name, Protocol=protocol, Port=port, HealthCheckPath="/healthcheck", @@ -93,76 +57,167 @@ def create_target_group(self, protocol, port, vpc_id): VpcId=vpc_id, ) target_group = response["TargetGroups"][0] - log.info("Created load balancing target group %s.", self.target_group_name) + log.info(f"Created load balancing target group '{target_group_name}'.") + return target_group except ClientError as err: - raise LoadBalancerError( - f"Couldn't create load balancing target group {self.target_group_name}: {err}" + log.error( + f"Couldn't create load balancing target group '{target_group_name}'." ) - else: - return target_group + error_code = err.response["Error"]["Code"] + + if error_code == "DuplicateTargetGroupName": + log.error( + f"Target group name {target_group_name} already exists. " + "Check if the target group already exists." + "Consider using a different name or deleting the existing target group if appropriate." + ) + elif error_code == "TooManyTargetGroups": + log.error( + "Too many target groups exist in the account. " + "Consider deleting unused target groups to create space for new ones." + ) + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.elbv2.CreateTargetGroup] # snippet-start:[python.cross_service.resilient_service.elbv2.DeleteTargetGroup] - def delete_target_group(self): + def delete_target_group(self, target_group_name) -> None: """ Deletes the target group. """ - done = False - while not done: - try: - response = self.elb_client.describe_target_groups( - Names=[self.target_group_name] + try: + # Describe the target group to get its ARN + response = self.elb_client.describe_target_groups(Names=[target_group_name]) + tg_arn = response["TargetGroups"][0]["TargetGroupArn"] + + # Delete the target group + self.elb_client.delete_target_group(TargetGroupArn=tg_arn) + log.info("Deleted load balancing target group %s.", target_group_name) + + # Use a custom waiter to wait until the target group is no longer available + self.wait_for_target_group_deletion(self.elb_client, tg_arn) + log.info("Target group %s successfully deleted.", target_group_name) + + except ClientError as err: + error_code = err.response["Error"]["Code"] + log.error(f"Failed to delete target group '{target_group_name}'.") + if error_code == "TargetGroupNotFound": + log.error( + "Load balancer target group either already deleted or never existed. " + "Verify the name and check that the resource exists in the AWS Console." ) - tg_arn = response["TargetGroups"][0]["TargetGroupArn"] - self.elb_client.delete_target_group(TargetGroupArn=tg_arn) - log.info( - "Deleted load balancing target group %s.", self.target_group_name + elif error_code == "ResourceInUseException": + log.error( + "Target group still in use by another resource. " + "Ensure that the target group is no longer associated with any load balancers or resources.", ) - done = True - except ClientError as err: - if err.response["Error"]["Code"] == "TargetGroupNotFound": - log.info( - "Load balancer target group %s not found, nothing to do.", - self.target_group_name, - ) - done = True - elif err.response["Error"]["Code"] == "ResourceInUse": - log.info( - "Target group not yet released from load balancer, waiting..." + log.error(f"Full error:\n\t{err}") + pass + + def wait_for_target_group_deletion( + self, elb_client, target_group_arn, max_attempts=10, delay=30 + ): + for attempt in range(max_attempts): + try: + elb_client.describe_target_groups(TargetGroupArns=[target_group_arn]) + print( + f"Attempt {attempt + 1}: Target group {target_group_arn} still exists." + ) + except ClientError as e: + if e.response["Error"]["Code"] == "TargetGroupNotFound": + print( + f"Target group {target_group_arn} has been successfully deleted." ) - time.sleep(10) + return else: - raise LoadBalancerError( - f"Couldn't delete load balancing target group {self.target_group_name}: {err}" - ) + raise + time.sleep(delay) + raise TimeoutError( + f"Target group {target_group_arn} was not deleted after {max_attempts * delay} seconds." + ) # snippet-end:[python.cross_service.resilient_service.elbv2.DeleteTargetGroup] # snippet-start:[python.cross_service.resilient_service.elbv2.CreateLoadBalancer] - # snippet-start:[python.cross_service.resilient_service.elbv2.CreateListener] - def create_load_balancer(self, subnet_ids, target_group): + def create_load_balancer( + self, + load_balancer_name: str, + subnet_ids: List[str], + ) -> Dict[str, Any]: """ Creates an Elastic Load Balancing load balancer that uses the specified subnets and forwards requests to the specified target group. + :param load_balancer_name: The name of the load balancer to create. :param subnet_ids: A list of subnets to associate with the load balancer. - :param target_group: An existing target group that is added as a listener to the - load balancer. :return: Data about the newly created load balancer. """ try: response = self.elb_client.create_load_balancer( - Name=self.load_balancer_name, Subnets=subnet_ids + Name=load_balancer_name, Subnets=subnet_ids ) load_balancer = response["LoadBalancers"][0] - log.info("Created load balancer %s.", self.load_balancer_name) + log.info(f"Created load balancer '{load_balancer_name}'.") + waiter = self.elb_client.get_waiter("load_balancer_available") - log.info("Waiting for load balancer to be available...") - waiter.wait(Names=[self.load_balancer_name]) - log.info("Load balancer is available!") - self.elb_client.create_listener( - LoadBalancerArn=load_balancer["LoadBalancerArn"], + log.info( + f"Waiting for load balancer '{load_balancer_name}' to be available..." + ) + waiter.wait(Names=[load_balancer_name]) + log.info(f"Load balancer '{load_balancer_name}' is now available!") + + except ClientError as err: + error_code = err.response["Error"]["Code"] + log.error( + f"Failed to create load balancer '{load_balancer_name}'. Error code: {error_code}, Message: {err.response['Error']['Message']}" + ) + + if error_code == "DuplicateLoadBalancerNameException": + log.error( + f"A load balancer with the name '{load_balancer_name}' already exists. " + "Load balancer names must be unique within the AWS region. " + "Please choose a different name and try again." + ) + if error_code == "TooManyLoadBalancersException": + log.error( + "The maximum number of load balancers has been reached in this account and region. " + "You can delete unused load balancers or request an increase in the service quota from AWS Support." + ) + log.error(f"Full error:\n\t{err}") + pass + else: + return load_balancer + + # snippet-end:[python.cross_service.resilient_service.elbv2.CreateLoadBalancer] + + # snippet-start:[python.cross_service.resilient_service.elbv2.CreateListener] + def create_listener( + self, + load_balancer_name: str, + target_group: Dict[str, Any], + ) -> Dict[str, Any]: + """ + Creates a listener for the specified load balancer that forwards requests to the + specified target group. + + :param load_balancer_name: The name of the load balancer to create a listener for. + :param target_group: An existing target group that is added as a listener to the + load balancer. + :return: Data about the newly created listener. + """ + try: + # Retrieve the load balancer ARN + load_balancer_response = self.elb_client.describe_load_balancers( + Names=[load_balancer_name] + ) + load_balancer_arn = load_balancer_response["LoadBalancers"][0][ + "LoadBalancerArn" + ] + + # Create the listener + response = self.elb_client.create_listener( + LoadBalancerArn=load_balancer_arn, Protocol=target_group["Protocol"], Port=target_group["Port"], DefaultActions=[ @@ -173,65 +228,107 @@ def create_load_balancer(self, subnet_ids, target_group): ], ) log.info( - "Created listener to forward traffic from load balancer %s to target group %s.", - self.load_balancer_name, - target_group["TargetGroupName"], + f"Created listener to forward traffic from load balancer '{load_balancer_name}' to target group '{target_group['TargetGroupName']}'." ) + return response["Listeners"][0] except ClientError as err: - raise LoadBalancerError( - f"Failed to create load balancer {self.load_balancer_name}" - f"and add a listener for target group {target_group['TargetGroupName']}: {err}" + error_code = err.response["Error"]["Code"] + log.error( + f"Failed to add a listener on '{load_balancer_name}' for target group '{target_group['TargetGroupName']}'." ) - else: - self._endpoint = load_balancer["DNSName"] - return load_balancer + + if error_code == "ListenerNotFoundException": + log.error( + f"The listener could not be found for the load balancer '{load_balancer_name}'. " + "Please check the load balancer name and target group configuration." + ) + if error_code == "InvalidConfigurationRequestException": + log.error( + f"The configuration provided for the listener on load balancer '{load_balancer_name}' is invalid. " + "Please review the provided protocol, port, and target group settings." + ) + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.elbv2.CreateListener] - # snippet-end:[python.cross_service.resilient_service.elbv2.CreateLoadBalancer] # snippet-start:[python.cross_service.resilient_service.elbv2.DeleteLoadBalancer] - def delete_load_balancer(self): + def delete_load_balancer(self, load_balancer_name) -> None: """ Deletes a load balancer. + + :param load_balancer_name: The name of the load balancer to delete. """ try: response = self.elb_client.describe_load_balancers( - Names=[self.load_balancer_name] + Names=[load_balancer_name] ) lb_arn = response["LoadBalancers"][0]["LoadBalancerArn"] self.elb_client.delete_load_balancer(LoadBalancerArn=lb_arn) - log.info("Deleted load balancer %s.", self.load_balancer_name) + log.info("Deleted load balancer %s.", load_balancer_name) waiter = self.elb_client.get_waiter("load_balancers_deleted") log.info("Waiting for load balancer to be deleted...") - waiter.wait(Names=[self.load_balancer_name]) + waiter.wait(Names=[load_balancer_name]) except ClientError as err: - if err.response["Error"]["Code"] == "LoadBalancerNotFound": - log.info( - "Load balancer %s does not exist, nothing to do.", - self.load_balancer_name, - ) - else: - raise LoadBalancerError( - f"Couldn't delete load balancer {self.load_balancer_name}: {err}" + error_code = err.response["Error"]["Code"] + log.error( + f"Couldn't delete load balancer '{load_balancer_name}'. Error code: {error_code}, Message: {err.response['Error']['Message']}" + ) + + if error_code == "LoadBalancerNotFoundException": + log.error( + f"The load balancer '{load_balancer_name}' does not exist. " + "Please check the name and try again." ) + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.cross_service.resilient_service.elbv2.DeleteLoadBalancer] - def verify_load_balancer_endpoint(self): + # snippet-start:[python.cross_service.resilient_service.elbv2.DescribeLoadBalancers] + def get_endpoint(self, load_balancer_name) -> str: + """ + Gets the HTTP endpoint of the load balancer. + + :return: The endpoint. + """ + try: + response = self.elb_client.describe_load_balancers( + Names=[load_balancer_name] + ) + return response["LoadBalancers"][0]["DNSName"] + except ClientError as err: + log.error( + f"Couldn't get the endpoint for load balancer {load_balancer_name}" + ) + error_code = err.response["Error"]["Code"] + if error_code == "LoadBalancerNotFoundException": + log.error( + "Verify load balancer name and ensure it exists in the AWS console." + ) + log.error(f"Full error:\n\t{err}") + pass + + # snippet-end:[python.cross_service.resilient_service.elbv2.DescribeLoadBalancers] + @staticmethod + def verify_load_balancer_endpoint(endpoint) -> bool: """ Verify this computer can successfully send a GET request to the load balancer endpoint. + + :param endpoint: The endpoint to verify. + :return: True if the GET request is successful, False otherwise. """ - success = False retries = 3 - while not success and retries > 0: + verified = False + while not verified and retries > 0: try: - lb_response = requests.get(f"http://{self.endpoint()}") + lb_response = requests.get(f"http://{endpoint}") log.info( "Got response %s from load balancer endpoint.", lb_response.status_code, ) if lb_response.status_code == 200: - success = True + verified = True else: retries = 0 except requests.exceptions.ConnectionError: @@ -240,10 +337,10 @@ def verify_load_balancer_endpoint(self): ) retries -= 1 time.sleep(10) - return success + return verified # snippet-start:[python.cross_service.resilient_service.elbv2.DescribeTargetHealth] - def check_target_health(self): + def check_target_health(self, target_group_name: str) -> List[Dict[str, Any]]: """ Checks the health of the instances in the target group. @@ -251,15 +348,28 @@ def check_target_health(self): """ try: tg_response = self.elb_client.describe_target_groups( - Names=[self.target_group_name] + Names=[target_group_name] ) health_response = self.elb_client.describe_target_health( TargetGroupArn=tg_response["TargetGroups"][0]["TargetGroupArn"] ) except ClientError as err: - raise LoadBalancerError( - f"Couldn't check health of {self.target_group_name} targets: {err}" - ) + log.error(f"Couldn't check health of {target_group_name} target(s).") + error_code = err.response["Error"]["Code"] + if error_code == "LoadBalancerNotFoundException": + log.error( + "Load balancer associated with the target group was not found. " + "Ensure the load balancer exists, is in the correct AWS region, and " + "that you have the necessary permissions to access it.", + ) + elif error_code == "TargetGroupNotFoundException": + log.error( + "Target group was not found. " + "Verify the target group name, check that it exists in the correct region, " + "and ensure it has not been deleted or created in a different account.", + ) + log.error(f"Full error:\n\t{err}") + pass else: return health_response["TargetHealthDescriptions"] diff --git a/python/cross_service/resilient_service/parameters.py b/python/cross_service/resilient_service/parameters.py index 5b873ef4679..75e6fc65299 100644 --- a/python/cross_service/resilient_service/parameters.py +++ b/python/cross_service/resilient_service/parameters.py @@ -9,10 +9,6 @@ log = logging.getLogger(__name__) -class ParameterHelperError(Exception): - pass - - # snippet-start:[python.example_code.workflow.ResilientService_ParameterHelper] class ParameterHelper: """ @@ -21,12 +17,14 @@ class ParameterHelper: how the service responds to a health check. """ - table = "doc-example-resilient-architecture-table" - failure_response = "doc-example-resilient-architecture-failure-response" - health_check = "doc-example-resilient-architecture-health-check" + table: str = "doc-example-resilient-architecture-table" + failure_response: str = "doc-example-resilient-architecture-failure-response" + health_check: str = "doc-example-resilient-architecture-health-check" - def __init__(self, table_name, ssm_client): + def __init__(self, table_name: str, ssm_client: boto3.client): """ + Initializes the ParameterHelper class with the necessary parameters. + :param table_name: The name of the DynamoDB table that is used as a recommendation service. :param ssm_client: A Boto3 Systems Manager client. @@ -34,12 +32,7 @@ def __init__(self, table_name, ssm_client): self.ssm_client = ssm_client self.table_name = table_name - @classmethod - def from_client(cls, table_name): - ssm_client = boto3.client("ssm") - return cls(table_name, ssm_client) - - def reset(self): + def reset(self) -> None: """ Resets the Systems Manager parameters to starting values for the demo. These are the name of the DynamoDB recommendation table, no response when a @@ -49,22 +42,34 @@ def reset(self): self.put(self.failure_response, "none") self.put(self.health_check, "shallow") - def put(self, name, value): + def put(self, name: str, value: str) -> None: """ Sets the value of a named Systems Manager parameter. :param name: The name of the parameter. :param value: The new value of the parameter. + :raises ParameterHelperError: If the parameter value cannot be set. """ try: self.ssm_client.put_parameter( Name=name, Value=value, Overwrite=True, Type="String" ) - log.info("Setting demo parameter %s to '%s'.", name, value) + log.info("Setting parameter %s to '%s'.", name, value) except ClientError as err: - raise ParameterHelperError( - f"Couldn't set parameter {name} to {value}: {err}" - ) + error_code = err.response["Error"]["Code"] + log.error(f"Failed to set parameter {name}.") + if error_code == "ParameterLimitExceeded": + log.error( + "The parameter limit has been exceeded. " + "Consider deleting unused parameters or request a limit increase." + ) + elif error_code == "ParameterAlreadyExists": + log.error( + "The parameter already exists and overwrite is set to False. " + "Use Overwrite=True to update the parameter." + ) + log.error(f"Full error:\n\t{err}") + pass # snippet-end:[python.example_code.workflow.ResilientService_ParameterHelper] diff --git a/python/cross_service/resilient_service/recommendation_service.py b/python/cross_service/resilient_service/recommendation_service.py index dea782a042b..58aa3d78e2f 100644 --- a/python/cross_service/resilient_service/recommendation_service.py +++ b/python/cross_service/resilient_service/recommendation_service.py @@ -3,6 +3,7 @@ import json import logging +from typing import Any, Dict import boto3 from botocore.exceptions import ClientError @@ -11,7 +12,17 @@ class RecommendationServiceError(Exception): - def __init__(self, table_name, message): + """ + Custom exception for errors related to the RecommendationService. + """ + + def __init__(self, table_name: str, message: str): + """ + Initializes the RecommendationServiceError. + + :param table_name: The name of the DynamoDB table where the error occurred. + :param message: The error message. + """ self.table_name = table_name self.message = message super().__init__(self.message) @@ -24,32 +35,25 @@ class RecommendationService: and songs. """ - def __init__(self, table_name, dynamodb_client): + def __init__(self, table_name: str, dynamodb_client: boto3.client): """ + Initializes the RecommendationService class with the necessary parameters. + :param table_name: The name of the DynamoDB recommendations table. :param dynamodb_client: A Boto3 DynamoDB client. """ self.table_name = table_name self.dynamodb_client = dynamodb_client - @classmethod - def from_client(cls, table_name): + def create(self) -> Dict[str, Any]: """ - Creates this class from a Boto3 client. - - :param table_name: The name of the DynamoDB recommendations table. - """ - ddb_client = boto3.client("dynamodb") - return cls(table_name, ddb_client) - - def create(self): - """ - Creates a DynamoDB table to use a recommendation service. The table has a + Creates a DynamoDB table to use as a recommendation service. The table has a hash key named 'MediaType' that defines the type of media recommended, such as Book or Movie, and a range key named 'ItemId' that, combined with the MediaType, forms a unique identifier for the recommended item. :return: Data about the newly created table. + :raises RecommendationServiceError: If the table creation fails. """ try: response = self.dynamodb_client.create_table( @@ -70,7 +74,7 @@ def create(self): log.info("Table %s created.", self.table_name) except ClientError as err: if err.response["Error"]["Code"] == "ResourceInUseException": - log.info("Table %s exists, nothing to be do.", self.table_name) + log.info("Table %s exists, nothing to be done.", self.table_name) else: raise RecommendationServiceError( self.table_name, f"ClientError when creating table: {err}." @@ -78,11 +82,12 @@ def create(self): else: return response - def populate(self, data_file): + def populate(self, data_file: str) -> None: """ Populates the recommendations table from a JSON file. :param data_file: The path to the data file. + :raises RecommendationServiceError: If the table population fails. """ try: with open(data_file) as data: @@ -97,9 +102,11 @@ def populate(self, data_file): self.table_name, f"Couldn't populate table from {data_file}: {err}" ) - def destroy(self): + def destroy(self) -> None: """ Deletes the recommendations table. + + :raises RecommendationServiceError: If the table deletion fails. """ try: self.dynamodb_client.delete_table(TableName=self.table_name) diff --git a/python/cross_service/resilient_service/requirements.txt b/python/cross_service/resilient_service/requirements.txt index 8dd2ddb2241..a58421ca7c0 100644 --- a/python/cross_service/resilient_service/requirements.txt +++ b/python/cross_service/resilient_service/requirements.txt @@ -1,3 +1,4 @@ boto3>=1.26.79 pytest>=7.2.1 -requests>=2.29.0 \ No newline at end of file +requests>=2.29.0 +coloredlogs>=15.0.1 \ No newline at end of file diff --git a/python/cross_service/resilient_service/runner.py b/python/cross_service/resilient_service/runner.py index 74cc37964d1..1e14e97a924 100644 --- a/python/cross_service/resilient_service/runner.py +++ b/python/cross_service/resilient_service/runner.py @@ -12,26 +12,50 @@ import argparse import logging -from pprint import pp import sys +from pprint import pp +import boto3 +import coloredlogs import requests -from auto_scaler import AutoScaler -from load_balancer import LoadBalancer +from auto_scaler import AutoScalingWrapper +from load_balancer import ElasticLoadBalancerWrapper from parameters import ParameterHelper from recommendation_service import RecommendationService -# Add relative path to include demo_tools in this code example without need for setup. sys.path.append("../..") -import demo_tools.question as q +import demo_tools.question as q # noqa + +# Configure coloredlogs +coloredlogs.install( + level="INFO", fmt="%(asctime)s %(levelname)s: %(message)s", datefmt="%H:%M:%S" +) # snippet-start:[python.example_code.workflow.ResilientService_Runner] class Runner: + """ + Manages the deployment, demonstration, and destruction of resources for the resilient service. + """ + def __init__( - self, resource_path, recommendation, autoscaler, loadbalancer, param_helper + self, + resource_path: str, + recommendation: RecommendationService, + autoscaler: AutoScalingWrapper, + loadbalancer: ElasticLoadBalancerWrapper, + param_helper: ParameterHelper, ): + """ + Initializes the Runner class with the necessary parameters. + + :param resource_path: The path to resource files used by this example, such as IAM policies and instance scripts. + :param recommendation: An instance of the RecommendationService class. + :param autoscaler: An instance of the AutoScaler class. + :param loadbalancer: An instance of the LoadBalancer class. + :param param_helper: An instance of the ParameterHelper class. + """ self.resource_path = resource_path self.recommendation = recommendation self.autoscaler = autoscaler @@ -41,93 +65,65 @@ def __init__( self.port = 80 self.ssh_port = 22 - def deploy(self): + prefix = "doc-example-resilience" + self.target_group_name = f"{prefix}-tg" + self.load_balancer_name = f"{prefix}-lb" + + def deploy(self) -> None: + """ + Deploys the resources required for the resilient service, including the DynamoDB table, + EC2 instances, Auto Scaling group, and load balancer. + """ recommendations_path = f"{self.resource_path}/recommendations.json" startup_script = f"{self.resource_path}/server_startup_script.sh" instance_policy = f"{self.resource_path}/instance_policy.json" - print( - "\nFor this demo, we'll use the AWS SDK for Python (Boto3) to create several AWS resources\n" - "to set up a load-balanced web service endpoint and explore some ways to make it resilient\n" - "against various kinds of failures.\n\n" - "Some of the resources create by this demo are:\n" - ) - print( - "\t* A DynamoDB table that the web service depends on to provide book, movie, and song recommendations." - ) - print( - "\t* An EC2 launch template that defines EC2 instances that each contain a Python web server." - ) - print( - "\t* An EC2 Auto Scaling group that manages EC2 instances across several Availability Zones." - ) - print( - "\t* An Elastic Load Balancing (ELB) load balancer that targets the Auto Scaling group to distribute requests." - ) - print("-" * 88) - q.ask("Press Enter when you're ready to start deploying resources.") + logging.info("Starting deployment of resources for the resilient service.") - print( - f"Creating and populating a DynamoDB table named '{self.recommendation.table_name}'." + logging.info( + "Creating and populating DynamoDB table '%s'.", + self.recommendation.table_name, ) self.recommendation.create() self.recommendation.populate(recommendations_path) - print("-" * 88) - - print( - f"Creating an EC2 launch template that runs '{startup_script}' when an instance starts.\n" - f"This script starts a Python web server defined in the `server.py` script. The web server\n" - f"listens to HTTP requests on port 80 and responds to requests to '/' and to '/healthcheck'.\n" - f"For demo purposes, this server is run as the root user. In production, the best practice is to\n" - f"run a web server, such as Apache, with least-privileged credentials.\n" - ) - print( - f"The template also defines an IAM policy that each instance uses to assume a role that grants\n" - f"permissions to access the DynamoDB recommendation table and Systems Manager parameters\n" - f"that control the flow of the demo.\n" + + logging.info( + "Creating an EC2 launch template with the startup script '%s'.", + startup_script, ) self.autoscaler.create_template(startup_script, instance_policy) - print("-" * 88) - print( - f"Creating an EC2 Auto Scaling group that maintains three EC2 instances, each in a different\n" - f"Availability Zone." - ) - zones = self.autoscaler.create_group(3) - print("-" * 88) - print( - "At this point, you have EC2 instances created. Once each instance starts, it listens for\n" - "HTTP requests. You can see these instances in the console or continue with the demo." + logging.info( + "Creating an EC2 Auto Scaling group across multiple Availability Zones." ) - print("-" * 88) - q.ask("Press Enter when you're ready to continue.") + zones = self.autoscaler.create_autoscaling_group(3) - print(f"Creating variables that control the flow of the demo.\n") + logging.info("Creating variables that control the flow of the demo.") self.param_helper.reset() - print( - "\nCreating an Elastic Load Balancing target group and load balancer. The target group\n" - "defines how the load balancer connects to instances. The load balancer provides a\n" - "single endpoint where clients connect and dispatches requests to instances in the group.\n" - ) + logging.info("Creating Elastic Load Balancing target group and load balancer.") + vpc = self.autoscaler.get_default_vpc() subnets = self.autoscaler.get_subnets(vpc["VpcId"], zones) target_group = self.loadbalancer.create_target_group( - self.protocol, self.port, vpc["VpcId"] + self.target_group_name, self.protocol, self.port, vpc["VpcId"] ) self.loadbalancer.create_load_balancer( - [subnet["SubnetId"] for subnet in subnets], target_group + self.load_balancer_name, [subnet["SubnetId"] for subnet in subnets] ) + self.loadbalancer.create_listener(self.load_balancer_name, target_group) + self.autoscaler.attach_load_balancer_target_group(target_group) - print(f"Verifying access to the load balancer endpoint...") - lb_success = self.loadbalancer.verify_load_balancer_endpoint() + + logging.info("Verifying access to the load balancer endpoint.") + endpoint = self.loadbalancer.get_endpoint(self.load_balancer_name) + lb_success = self.loadbalancer.verify_load_balancer_endpoint(endpoint) + current_ip_address = requests.get("http://checkip.amazonaws.com").text.strip() + if not lb_success: - print( - "Couldn't connect to the load balancer, verifying that the port is open..." + logging.warning( + "Couldn't connect to the load balancer. Verifying that the port is open..." ) - current_ip_address = requests.get( - "http://checkip.amazonaws.com" - ).text.strip() sec_group, port_is_open = self.autoscaler.verify_inbound_port( vpc, self.port, current_ip_address ) @@ -135,10 +131,8 @@ def deploy(self): vpc, self.ssh_port, current_ip_address ) if not port_is_open: - print( - "For this example to work, the default security group for your default VPC must\n" - "allows access from this computer. You can either add it automatically from this\n" - "example or add it yourself using the AWS Management Console.\n" + logging.warning( + "The default security group for your VPC must allow access from this computer." ) if q.ask( f"Do you want to add a rule to security group {sec_group['GroupId']} to allow\n" @@ -157,21 +151,22 @@ def deploy(self): self.autoscaler.open_inbound_port( sec_group["GroupId"], self.ssh_port, current_ip_address ) - lb_success = self.loadbalancer.verify_load_balancer_endpoint() + lb_success = self.loadbalancer.verify_load_balancer_endpoint(endpoint) + if lb_success: - print("Your load balancer is ready. You can access it by browsing to:\n") - print(f"\thttp://{self.loadbalancer.endpoint()}\n") + logging.info( + "Load balancer is ready. Access it at: http://%s", current_ip_address + ) else: - print( - "Couldn't get a successful response from the load balancer endpoint. Troubleshoot by\n" - "manually verifying that your VPC and security group are configured correctly and that\n" - "you can successfully make a GET request to the load balancer endpoint:\n" + logging.error( + "Couldn't get a successful response from the load balancer endpoint. Please verify your VPC and security group settings." ) - print(f"\thttp://{self.loadbalancer.endpoint()}\n") - print("-" * 88) - q.ask("Press Enter when you're ready to continue with the demo.") - def demo_choices(self): + def demo_choices(self) -> None: + """ + Presents choices for interacting with the deployed service, such as sending requests to + the load balancer or checking the health of the targets. + """ actions = [ "Send a GET request to the load balancer endpoint.", "Check the health of load balancer targets.", @@ -179,86 +174,71 @@ def demo_choices(self): ] choice = 0 while choice != 2: - print("-" * 88) - print( - "\nSee the current state of the service by selecting one of the following choices:\n" - ) - choice = q.choose("\nWhich action would you like to take? ", actions) - print("-" * 88) + logging.info("Choose an action to interact with the service.") + choice = q.choose("Which action would you like to take? ", actions) if choice == 0: - print("Request:\n") - print(f"GET http://{self.loadbalancer.endpoint()}") - response = requests.get(f"http://{self.loadbalancer.endpoint()}") - print("\nResponse:\n") - print(f"{response.status_code}") + logging.info("Sending a GET request to the load balancer endpoint.") + endpoint = self.loadbalancer.get_endpoint(self.load_balancer_name) + logging.info("GET http://%s", endpoint) + response = requests.get(f"http://{endpoint}") + logging.info("Response: %s", response.status_code) if response.headers.get("content-type") == "application/json": pp(response.json()) elif choice == 1: - print("\nChecking the health of load balancer targets:\n") - health = self.loadbalancer.check_target_health() + logging.info("Checking the health of load balancer targets.") + health = self.loadbalancer.check_target_health(self.target_group_name) for target in health: state = target["TargetHealth"]["State"] - print( - f"\tTarget {target['Target']['Id']} on port {target['Target']['Port']} is {state}" + logging.info( + "Target %s on port %d is %s", + target["Target"]["Id"], + target["Target"]["Port"], + state, ) if state != "healthy": - print( - f"\t\t{target['TargetHealth']['Reason']}: {target['TargetHealth']['Description']}\n" + logging.warning( + "%s: %s", + target["TargetHealth"]["Reason"], + target["TargetHealth"]["Description"], ) - print( - f"\nNote that it can take a minute or two for the health check to update\n" - f"after changes are made.\n" + logging.info( + "Note that it can take a minute or two for the health check to update." ) elif choice == 2: - print("\nOkay, let's move on.") - print("-" * 88) + logging.info("Proceeding to the next part of the demo.") - def demo(self): + def demo(self) -> None: + """ + Runs the demonstration, showing how the service responds to different failure scenarios + and how a resilient architecture can keep the service running. + """ ssm_only_policy = f"{self.resource_path}/ssm_only_policy.json" - print("\nResetting parameters to starting values for demo.\n") + logging.info("Resetting parameters to starting values for the demo.") self.param_helper.reset() - print( - "\nThis part of the demonstration shows how to toggle different parts of the system\n" - "to create situations where the web service fails, and shows how using a resilient\n" - "architecture can keep the web service running in spite of these failures." - ) - print("-" * 88) - - print( - "At the start, the load balancer endpoint returns recommendations and reports that all targets are healthy." + logging.info( + "Starting demonstration of the service's resilience under various failure conditions." ) self.demo_choices() - print( - f"The web service running on the EC2 instances gets recommendations by querying a DynamoDB table.\n" - f"The table name is contained in a Systems Manager parameter named '{self.param_helper.table}'.\n" - f"To simulate a failure of the recommendation service, let's set this parameter to name a non-existent table.\n" + logging.info( + "Simulating failure by changing the Systems Manager parameter to a non-existent table." ) self.param_helper.put(self.param_helper.table, "this-is-not-a-table") - print( - "\nNow, sending a GET request to the load balancer endpoint returns a failure code. But, the service reports as\n" - "healthy to the load balancer because shallow health checks don't check for failure of the recommendation service." - ) + logging.info("Sending GET requests will now return failure codes.") self.demo_choices() - print( - f"Instead of failing when the recommendation service fails, the web service can return a static response.\n" - f"While this is not a perfect solution, it presents the customer with a somewhat better experience than failure.\n" - ) + logging.info("Switching to static response mode to mitigate failure.") self.param_helper.put(self.param_helper.failure_response, "static") - print( - f"\nNow, sending a GET request to the load balancer endpoint returns a static response.\n" - f"The service still reports as healthy because health checks are still shallow.\n" - ) + logging.info("Sending GET requests will now return static responses.") self.demo_choices() - print("Let's reinstate the recommendation service.\n") + logging.info("Restoring normal operation of the recommendation service.") self.param_helper.put(self.param_helper.table, self.recommendation.table_name) - print( - "\nLet's also substitute bad credentials for one of the instances in the target group so that it can't\n" - "access the DynamoDB recommendation table.\n" + + logging.info( + "Introducing a failure by assigning bad credentials to one of the instances." ) self.autoscaler.create_instance_profile( ssm_only_policy, @@ -270,93 +250,78 @@ def demo(self): instances = self.autoscaler.get_instances() bad_instance_id = instances[0] instance_profile = self.autoscaler.get_instance_profile(bad_instance_id) - print( - f"\nReplacing the profile for instance {bad_instance_id} with a profile that contains\n" - f"bad credentials...\n" + logging.info( + "Replacing instance profile with bad credentials for instance %s.", + bad_instance_id, ) self.autoscaler.replace_instance_profile( bad_instance_id, self.autoscaler.bad_creds_profile_name, instance_profile["AssociationId"], ) - print( - "Now, sending a GET request to the load balancer endpoint returns either a recommendation or a static response,\n" - "depending on which instance is selected by the load balancer.\n" + logging.info( + "Sending GET requests may return either a valid recommendation or a static response." ) self.demo_choices() - print( - "\nLet's implement a deep health check. For this demo, a deep health check tests whether\n" - "the web service can access the DynamoDB table that it depends on for recommendations. Note that\n" - "the deep health check is only for ELB routing and not for Auto Scaling instance health.\n" - "This kind of deep health check is not recommended for Auto Scaling instance health, because it\n" - "risks accidental termination of all instances in the Auto Scaling group when a dependent service fails.\n" - ) - print( - "By implementing deep health checks, the load balancer can detect when one of the instances is failing\n" - "and take that instance out of rotation.\n" - ) + logging.info("Implementing deep health checks to detect unhealthy instances.") self.param_helper.put(self.param_helper.health_check, "deep") - print( - f"\nNow, checking target health indicates that the instance with bad credentials ({bad_instance_id})\n" - f"is unhealthy. Note that it might take a minute or two for the load balancer to detect the unhealthy \n" - f"instance. Sending a GET request to the load balancer endpoint always returns a recommendation, because\n" - "the load balancer takes unhealthy instances out of its rotation.\n" - ) + logging.info("Checking the health of the load balancer targets.") self.demo_choices() - print( - "\nBecause the instances in this demo are controlled by an auto scaler, the simplest way to fix an unhealthy\n" - "instance is to terminate it and let the auto scaler start a new instance to replace it.\n" + logging.info( + "Terminating the unhealthy instance to let the auto scaler replace it." ) self.autoscaler.terminate_instance(bad_instance_id) - print( - "\nEven while the instance is terminating and the new instance is starting, sending a GET\n" - "request to the web service continues to get a successful recommendation response because\n" - "the load balancer routes requests to the healthy instances. After the replacement instance\n" - "starts and reports as healthy, it is included in the load balancing rotation.\n" - "\nNote that terminating and replacing an instance typically takes several minutes, during which time you\n" - "can see the changing health check status until the new instance is running and healthy.\n" - ) + logging.info("The service remains resilient during instance replacement.") self.demo_choices() - print( - "\nIf the recommendation service fails now, deep health checks mean all instances report as unhealthy.\n" - ) + logging.info("Simulating a complete failure of the recommendation service.") self.param_helper.put(self.param_helper.table, "this-is-not-a-table") - print( - "\nWhen all instances are unhealthy, the load balancer continues to route requests even to\n" - "unhealthy instances, allowing them to fail open and return a static response rather than fail\n" - "closed and report failure to the customer." + logging.info( + "All instances will report as unhealthy, but the service will still return static responses." ) self.demo_choices() self.param_helper.reset() - def destroy(self): - print( - "This concludes the demo of how to build and manage a resilient service.\n" - "To keep things tidy and to avoid unwanted charges on your account, we can clean up all AWS resources\n" - "that were created for this demo." + def destroy(self, automation=False) -> None: + """ + Destroys all resources created for the demo, including the load balancer, Auto Scaling group, + EC2 instances, and DynamoDB table. + """ + logging.info( + "This concludes the demo. Preparing to clean up all AWS resources created during the demo." ) - if q.ask("Do you want to clean up all demo resources? (y/n) ", q.is_yesno): - self.loadbalancer.delete_load_balancer() - self.loadbalancer.delete_target_group() - self.autoscaler.delete_group() + if automation: + cleanup = True + else: + cleanup = q.ask( + "Do you want to clean up all demo resources? (y/n) ", q.is_yesno + ) + + if cleanup: + logging.info("Deleting load balancer and related resources.") + self.loadbalancer.delete_load_balancer(self.load_balancer_name) + self.loadbalancer.delete_target_group(self.target_group_name) + self.autoscaler.delete_autoscaling_group(self.autoscaler.group_name) self.autoscaler.delete_key_pair() self.autoscaler.delete_template() self.autoscaler.delete_instance_profile( self.autoscaler.bad_creds_profile_name, self.autoscaler.bad_creds_role_name, ) + logging.info("Deleting DynamoDB table and other resources.") self.recommendation.destroy() else: - print( - "Okay, we'll leave the resources intact.\n" - "Don't forget to delete them when you're done with them or you might incur unexpected charges." + logging.warning( + "Resources have not been deleted. Ensure you clean them up manually to avoid unexpected charges." ) -def main(): +def main() -> None: + """ + Main function to parse arguments and run the appropriate actions for the demo. + """ parser = argparse.ArgumentParser() parser.add_argument( "--action", @@ -373,21 +338,41 @@ def main(): ) args = parser.parse_args() - print("-" * 88) - print( - "Welcome to the demonstration of How to Build and Manage a Resilient Service!" - ) - print("-" * 88) + logging.info("Starting the Resilient Service demo.") prefix = "doc-example-resilience" - recommendation = RecommendationService.from_client( - "doc-example-recommendation-service" + + # Service Clients + ddb_client = boto3.client("dynamodb") + elb_client = boto3.client("elbv2") + autoscaling_client = boto3.client("autoscaling") + ec2_client = boto3.client("ec2") + ssm_client = boto3.client("ssm") + iam_client = boto3.client("iam") + + # Wrapper instantiations + recommendation = RecommendationService( + "doc-example-recommendation-service", ddb_client ) - autoscaler = AutoScaler.from_client(prefix) - loadbalancer = LoadBalancer.from_client(prefix) - param_helper = ParameterHelper.from_client(recommendation.table_name) + autoscaling_wrapper = AutoScalingWrapper( + prefix, + "t3.micro", + "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2", + autoscaling_client, + ec2_client, + ssm_client, + iam_client, + ) + elb_wrapper = ElasticLoadBalancerWrapper(elb_client) + param_helper = ParameterHelper(recommendation.table_name, ssm_client) + + # Demo invocation runner = Runner( - args.resource_path, recommendation, autoscaler, loadbalancer, param_helper + args.resource_path, + recommendation, + autoscaling_wrapper, + elb_wrapper, + param_helper, ) actions = [args.action] if args.action != "all" else ["deploy", "demo", "destroy"] for action in actions: @@ -398,9 +383,7 @@ def main(): elif action == "destroy": runner.destroy() - print("-" * 88) - print("Thanks for watching!") - print("-" * 88) + logging.info("Demo completed successfully.") if __name__ == "__main__": diff --git a/python/cross_service/resilient_service/test/pytest.ini b/python/cross_service/resilient_service/test/pytest.ini new file mode 100644 index 00000000000..ca0c9f17105 --- /dev/null +++ b/python/cross_service/resilient_service/test/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +addopts = -s diff --git a/python/cross_service/resilient_service/test/resources/server.py b/python/cross_service/resilient_service/test/resources/server.py index 97f0baae9b2..366c0c4fafa 100644 --- a/python/cross_service/resilient_service/test/resources/server.py +++ b/python/cross_service/resilient_service/test/resources/server.py @@ -10,10 +10,10 @@ """ import argparse -from http.server import BaseHTTPRequestHandler, HTTPServer import json -from functools import partial import random +from functools import partial +from http.server import BaseHTTPRequestHandler, HTTPServer import boto3 from botocore.exceptions import ClientError diff --git a/python/cross_service/resilient_service/test/test_demo.py b/python/cross_service/resilient_service/test/test_demo.py deleted file mode 100644 index 7d2bee6638d..00000000000 --- a/python/cross_service/resilient_service/test/test_demo.py +++ /dev/null @@ -1,253 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -from datetime import datetime -import time -from unittest.mock import MagicMock -from botocore.exceptions import ClientError, WaiterError -from botocore.stub import ANY -import pytest -import requests - -from auto_scaler import AutoScalerError -from load_balancer import LoadBalancerError -from parameters import ParameterHelper, ParameterHelperError - - -class MockManager: - def __init__(self, stub_runner, scenario_data, input_mocker): - self.scenario_data = scenario_data - self.scenario_data.endpoint = "test-endpoint" - self.scenario_data.bad_profile_name = ( - f"{self.scenario_data.resource_prefix}-bc-prof" - ) - self.scenario_data.bad_profile_arn = ( - "arn:aws:iam:us-west-2:123456789012:instance-profile/test-bad-profile" - ) - self.scenario_data.association_id = "test-association-id" - self.scenario_args = [] - self.scenario_out = {} - answers = ["1", "2", "3", "3", "3", "3", "3", "3", "3"] - input_mocker.mock_answers(answers) - self.stub_runner = stub_runner - - def setup_stubs(self, error, stop_on): - with self.stub_runner(error, stop_on) as runner: - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.table, - self.scenario_data.table_name, - ) - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.failure_response, - "none", - ) - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.health_check, - "shallow", - ) - runner.add( - self.scenario_data.elb.stubber.stub_describe_load_balancers, - [self.scenario_data.lb_name], - [self.scenario_data.endpoint], - ) - runner.add( - self.scenario_data.elb.stubber.stub_describe_target_groups, - [self.scenario_data.tg_name], - [self.scenario_data.tg_arn], - ) - runner.add( - self.scenario_data.elb.stubber.stub_describe_target_health, - self.scenario_data.tg_arn, - [ - { - "id": "test-id", - "port": 80, - "state": "unhealthy", - "reason": "test reason", - "desc": "test desc", - } - ], - ) - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.table, - "this-is-not-a-table", - ) - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.failure_response, - "static", - ) - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.table, - self.scenario_data.table_name, - ) - runner.add( - self.scenario_data.iam.stubber.stub_create_policy, - f"{self.scenario_data.resource_prefix}-bc-pol", - self.scenario_data.bad_policy_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_create_role, - self.scenario_data.bad_role_name, - ) - runner.add( - self.scenario_data.iam.stubber.stub_attach_role_policy, - self.scenario_data.bad_role_name, - self.scenario_data.bad_policy_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_attach_role_policy, - self.scenario_data.bad_role_name, - ANY, - ) - runner.add( - self.scenario_data.iam.stubber.stub_create_instance_profile, - self.scenario_data.bad_profile_name, - self.scenario_data.bad_profile_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_get_instance_profile, - self.scenario_data.bad_profile_name, - self.scenario_data.bad_profile_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_add_role_to_instance_profile, - self.scenario_data.bad_profile_name, - self.scenario_data.bad_role_name, - ) - runner.add( - self.scenario_data.auto_scaling.stubber.stub_describe_auto_scaling_groups, - [self.scenario_data.asg_name], - [ - { - "AutoScalingGroupName": self.scenario_data.asg_name, - "MinSize": 3, - "MaxSize": 3, - "DesiredCapacity": 0, - "DefaultCooldown": 0, - "AvailabilityZones": ["test-zone"], - "HealthCheckType": "EC2", - "CreatedTime": datetime.now(), - "Instances": [self.scenario_data.instance], - } - ], - ) - runner.add( - self.scenario_data.ec2.stubber.stub_describe_iam_instance_profile_associations, - self.scenario_data.instance["InstanceId"], - self.scenario_data.association_id, - ) - runner.add( - self.scenario_data.ec2.stubber.stub_replace_iam_instance_profile_association, - self.scenario_data.bad_profile_name, - self.scenario_data.association_id, - ) - runner.add( - self.scenario_data.ec2.stubber.stub_reboot_instances, - [self.scenario_data.instance["InstanceId"]], - ) - runner.add( - self.scenario_data.ssm.stubber.stub_describe_instance_information, - [self.scenario_data.instance["InstanceId"]], - ) - runner.add( - self.scenario_data.ssm.stubber.stub_send_command, - [self.scenario_data.instance["InstanceId"]], - commands=ANY, - timeout=None, - ) - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.health_check, - "deep", - ) - runner.add( - self.scenario_data.auto_scaling.stubber.stub_terminate_instance_in_auto_scaling_group, - self.scenario_data.instance["InstanceId"], - False, - None, - ) - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.table, - "this-is-not-a-table", - ) - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.table, - self.scenario_data.table_name, - ) - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.failure_response, - "none", - ) - runner.add( - self.scenario_data.ssm.stubber.stub_put_parameter, - ParameterHelper.health_check, - "shallow", - ) - - -@pytest.fixture -def mock_mgr(stub_runner, scenario_data, input_mocker): - return MockManager(stub_runner, scenario_data, input_mocker) - - -def test_demo(mock_mgr, monkeypatch): - monkeypatch.setattr(time, "sleep", lambda x: None) - monkeypatch.setattr( - requests, "get", lambda x: MagicMock(status_code=200, text="test text") - ) - mock_mgr.setup_stubs(None, None) - - mock_mgr.scenario_data.scenario.demo() - - -@pytest.mark.parametrize( - "error, stub_name, stop_on_index", - [ - (ParameterHelperError, "stub_put_parameter", 0), - (ParameterHelperError, "stub_put_parameter", 1), - (ParameterHelperError, "stub_put_parameter", 2), - (LoadBalancerError, "stub_describe_load_balancers", 3), - (LoadBalancerError, "stub_describe_target_groups", 4), - (LoadBalancerError, "stub_describe_target_health", 5), - (ParameterHelperError, "stub_put_parameter", 6), - (ParameterHelperError, "stub_put_parameter", 7), - (ParameterHelperError, "stub_put_parameter", 8), - (AutoScalerError, "stub_create_policy", 9), - (AutoScalerError, "stub_create_role", 10), - (AutoScalerError, "stub_attach_role_policy", 11), - (AutoScalerError, "stub_attach_role_policy", 12), - (AutoScalerError, "stub_create_instance_profile", 13), - (WaiterError, "stub_get_instance_profile", 14), - (AutoScalerError, "stub_add_role_to_instance_profile", 15), - (AutoScalerError, "stub_describe_auto_scaling_groups", 16), - (AutoScalerError, "stub_describe_iam_instance_profile_associations", 17), - (AutoScalerError, "stub_replace_iam_instance_profile_association", 18), - (AutoScalerError, "stub_reboot_instances", 19), - (AutoScalerError, "stub_describe_instance_information", 20), - (AutoScalerError, "stub_send_command", 21), - (ParameterHelperError, "stub_put_parameter", 22), - (AutoScalerError, "stub_terminate_instance_in_auto_scaling_group", 23), - (ParameterHelperError, "stub_put_parameter", 24), - (ParameterHelperError, "stub_put_parameter", 25), - (ParameterHelperError, "stub_put_parameter", 26), - (ParameterHelperError, "stub_put_parameter", 27), - ], -) -def test_demo_error(mock_mgr, caplog, error, stub_name, stop_on_index, monkeypatch): - monkeypatch.setattr(time, "sleep", lambda x: None) - monkeypatch.setattr( - requests, "get", lambda x: MagicMock(status_code=200, text="test text") - ) - mock_mgr.setup_stubs(error, stop_on_index) - - with pytest.raises(error): - mock_mgr.scenario_data.scenario.demo() diff --git a/python/cross_service/resilient_service/test/test_deploy.py b/python/cross_service/resilient_service/test/test_deploy.py deleted file mode 100644 index f462662d0ad..00000000000 --- a/python/cross_service/resilient_service/test/test_deploy.py +++ /dev/null @@ -1,264 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -import logging -import time -from unittest.mock import MagicMock -from botocore.exceptions import ClientError, WaiterError -from botocore.stub import ANY -import pytest -import requests - -from auto_scaler import AutoScalerError -from load_balancer import LoadBalancerError -from recommendation_service import RecommendationServiceError - - -class MockManager: - def __init__(self, stub_runner, scenario_data, input_mocker): - self.scenario_data = scenario_data - self.scenario_data.profile_arn = ( - "arn:aws:iam:us-west-2:123456789012:instance-profile/test-profile" - ) - self.scenario_data.ami_id = "test-ami-id" - self.scenario_data.zones = ["test-zone-1", "test-zone-2"] - self.scenario_data.vpc_id = "test-vpc" - self.scenario_data.subnet_ids = ["subnet-test-id"] - self.scenario_data.lb_endpoint = "test-endpoint" - self.scenario_data.sg_id = "test-sg-id" - self.scenario_data.ip_address = "test-address" - self.scenario_args = [] - self.scenario_out = {} - answers = ["", "", "y", ""] - input_mocker.mock_answers(answers) - self.stub_runner = stub_runner - - def setup_stubs(self, error, stop_on): - with self.stub_runner(error, stop_on) as runner: - runner.add( - self.scenario_data.ddb.stubber.stub_create_table, - self.scenario_data.table_name, - [ - {"name": "MediaType", "type": "S", "key_type": "HASH"}, - {"name": "ItemId", "type": "N", "key_type": "RANGE"}, - ], - {"read": 5, "write": 5}, - ) - runner.add( - self.scenario_data.ddb.stubber.stub_describe_table, - self.scenario_data.table_name, - ) - runner.add(self.scenario_data.ddb.stubber.stub_batch_write_item, ANY) - runner.add( - self.scenario_data.iam.stubber.stub_create_policy, - f"{self.scenario_data.resource_prefix}-pol", - self.scenario_data.policy_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_create_role, - self.scenario_data.role_name, - ) - runner.add( - self.scenario_data.iam.stubber.stub_attach_role_policy, - self.scenario_data.role_name, - self.scenario_data.policy_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_create_instance_profile, - self.scenario_data.profile_name, - self.scenario_data.profile_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_get_instance_profile, - self.scenario_data.profile_name, - self.scenario_data.profile_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_add_role_to_instance_profile, - self.scenario_data.profile_name, - self.scenario_data.role_name, - ) - runner.add( - self.scenario_data.ssm.stubber.stub_get_parameter, - self.scenario_data.ami_param, - self.scenario_data.ami_id, - ) - runner.add( - self.scenario_data.ec2.stubber.stub_create_launch_template, - self.scenario_data.lt_name, - self.scenario_data.inst_type, - self.scenario_data.ami_id, - inst_profile=self.scenario_data.profile_name, - user_data=ANY, - ) - runner.add( - self.scenario_data.ec2.stubber.stub_describe_availability_zones, - self.scenario_data.zones, - ) - runner.add( - self.scenario_data.auto_scaling.stubber.stub_create_auto_scaling_group, - self.scenario_data.asg_name, - self.scenario_data.zones, - self.scenario_data.lt_name, - 3, - 3, - ) - runner.add( - self.scenario_data.ec2.stubber.stub_describe_vpcs, - {self.scenario_data.vpc_id: True}, - vpc_filters=[{"Name": "is-default", "Values": ["true"]}], - ) - runner.add( - self.scenario_data.ec2.stubber.stub_describe_subnets, - self.scenario_data.vpc_id, - self.scenario_data.zones, - self.scenario_data.subnet_ids, - ) - runner.add( - self.scenario_data.elb.stubber.stub_create_target_group, - self.scenario_data.tg_name, - "HTTP", - 80, - self.scenario_data.vpc_id, - { - "path": "/healthcheck", - "interval": 10, - "timeout": 5, - "thresh_healthy": 2, - "thresh_unhealthy": 2, - }, - self.scenario_data.tg_arn, - ) - runner.add( - self.scenario_data.elb.stubber.stub_create_load_balancer, - self.scenario_data.lb_name, - self.scenario_data.subnet_ids, - "HTTP", - 80, - self.scenario_data.lb_arn, - self.scenario_data.lb_endpoint, - ) - runner.add( - self.scenario_data.elb.stubber.stub_describe_load_balancers, - [self.scenario_data.lb_name], - ) - runner.add( - self.scenario_data.elb.stubber.stub_create_listener, - self.scenario_data.lb_arn, - "HTTP", - 80, - self.scenario_data.tg_arn, - ) - runner.add( - self.scenario_data.auto_scaling.stubber.stub_attach_load_balancer_target_groups, - self.scenario_data.asg_name, - [self.scenario_data.tg_arn], - ) - runner.add( - self.scenario_data.ec2.stubber.stub_describe_security_groups, - [ - { - "id": self.scenario_data.sg_id, - "group_name": "default", - "ip_permissions": [ - { - "FromPort": 80, - "IpRanges": [{"CidrIp": "test"}], - "PrefixListIds": [], - } - ], - } - ], - self.scenario_data.vpc_id, - ) - runner.add( - self.scenario_data.ec2.stubber.stub_authorize_security_group_ingress, - self.scenario_data.sg_id, - cidr_ip=f"{self.scenario_data.ip_address}/32", - port=80, - ip_protocol="tcp", - ) - - -@pytest.fixture -def mock_mgr(stub_runner, scenario_data, input_mocker): - return MockManager(stub_runner, scenario_data, input_mocker) - - -def test_deploy(mock_mgr, caplog, monkeypatch): - caplog.set_level(logging.INFO) - monkeypatch.setattr(time, "sleep", lambda x: None) - monkeypatch.setattr( - requests, - "get", - lambda x: MagicMock(status_code=404, text=mock_mgr.scenario_data.ip_address), - ) - mock_mgr.setup_stubs(None, None) - - mock_mgr.scenario_data.scenario.deploy() - - assert len(caplog.records) > 0 - attrs = [ - attr - for attr in dir(mock_mgr.scenario_data) - if not callable(getattr(mock_mgr.scenario_data, attr)) - and not attr.startswith("__") - and attr - not in [ - "ami_param", - "lb_arn", - "lb_endpoint", - "profile_arn", - "tg_arn", - "vpc_id", - "bad_policy_arn", - "bad_prof_name", - "bad_role_name", - ] - ] - for attr in attrs: - val = getattr(mock_mgr.scenario_data, attr) - if isinstance(val, str): - assert any( - val in rec for rec in caplog.messages - ), f"'{val}' not in log messages!" - - -@pytest.mark.parametrize( - "error, stub_name, stop_on_index", - [ - (RecommendationServiceError, "stub_create_table", 0), - (WaiterError, "stub_describe_table", 1), - (RecommendationServiceError, "stub_batch_write_item", 2), - (AutoScalerError, "stub_create_policy", 3), - (AutoScalerError, "stub_create_role", 4), - (AutoScalerError, "stub_attach_role_policy", 5), - (AutoScalerError, "stub_create_instance_profile", 6), - (WaiterError, "stub_get_instance_profile", 7), - (AutoScalerError, "stub_add_role_to_instance_profile", 8), - (AutoScalerError, "stub_get_parameter", 9), - (AutoScalerError, "stub_create_launch_template", 10), - (AutoScalerError, "stub_describe_availability_zones", 11), - (AutoScalerError, "stub_create_auto_scaling_group", 12), - (AutoScalerError, "stub_describe_vpcs", 13), - (AutoScalerError, "stub_describe_subnets", 14), - (LoadBalancerError, "stub_create_target_group", 15), - (LoadBalancerError, "stub_create_load_balancer", 16), - (WaiterError, "stub_describe_load_balancers", 17), - (LoadBalancerError, "stub_create_listener", 18), - (AutoScalerError, "stub_attach_load_balancer_target_groups", 19), - (AutoScalerError, "stub_describe_security_groups", 20), - (AutoScalerError, "stub_authorize_security_group_ingress", 21), - ], -) -def test_deploy_error(mock_mgr, capsys, monkeypatch, error, stub_name, stop_on_index): - monkeypatch.setattr(time, "sleep", lambda x: None) - monkeypatch.setattr( - requests, - "get", - lambda x: MagicMock(status_code=404, text=mock_mgr.scenario_data.ip_address), - ) - mock_mgr.setup_stubs(error, stop_on_index) - - with pytest.raises(error): - mock_mgr.scenario_data.scenario.deploy() diff --git a/python/cross_service/resilient_service/test/test_destroy.py b/python/cross_service/resilient_service/test/test_destroy.py deleted file mode 100644 index 7d065aa9d8d..00000000000 --- a/python/cross_service/resilient_service/test/test_destroy.py +++ /dev/null @@ -1,179 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -from botocore.exceptions import ClientError, WaiterError -import pytest - -from auto_scaler import AutoScalerError -from load_balancer import LoadBalancerError -from recommendation_service import RecommendationServiceError - - -class MockManager: - def __init__(self, stub_runner, scenario_data, input_mocker): - self.scenario_data = scenario_data - self.scenario_args = [] - self.scenario_out = {} - answers = ["y"] - input_mocker.mock_answers(answers) - self.stub_runner = stub_runner - - def setup_stubs(self, error, stop_on): - with self.stub_runner(error, stop_on) as runner: - runner.add( - self.scenario_data.elb.stubber.stub_describe_load_balancers, - [self.scenario_data.lb_name], - arns=[self.scenario_data.lb_arn], - ) - runner.add( - self.scenario_data.elb.stubber.stub_delete_load_balancer, - self.scenario_data.lb_arn, - ) - runner.add( - self.scenario_data.elb.stubber.stub_describe_load_balancers, - [self.scenario_data.lb_name], - error_code="LoadBalancerNotFound", - ) - runner.add( - self.scenario_data.elb.stubber.stub_describe_target_groups, - [self.scenario_data.tg_name], - [self.scenario_data.tg_arn], - ) - runner.add( - self.scenario_data.elb.stubber.stub_delete_target_group, - self.scenario_data.tg_arn, - ) - runner.add( - self.scenario_data.auto_scaling.stubber.stub_describe_auto_scaling_groups, - [self.scenario_data.asg_name], - [self.scenario_data.asg_group], - ) - runner.add( - self.scenario_data.auto_scaling.stubber.stub_update_auto_scaling_group, - self.scenario_data.asg_name, - 0, - ) - runner.add( - self.scenario_data.auto_scaling.stubber.stub_terminate_instance_in_auto_scaling_group, - self.scenario_data.instance["InstanceId"], - True, - None, - ) - runner.add( - self.scenario_data.auto_scaling.stubber.stub_delete_auto_scaling_group, - self.scenario_data.asg_name, - ) - runner.add( - self.scenario_data.ec2.stubber.stub_delete_launch_template, - self.scenario_data.lt_name, - ) - runner.add( - self.scenario_data.iam.stubber.stub_remove_role_from_instance_profile, - self.scenario_data.profile_name, - self.scenario_data.role_name, - ) - runner.add( - self.scenario_data.iam.stubber.stub_delete_instance_profile, - self.scenario_data.profile_name, - ) - runner.add( - self.scenario_data.iam.stubber.stub_list_attached_role_policies, - self.scenario_data.role_name, - {"1": self.scenario_data.policy_arn}, - ) - runner.add( - self.scenario_data.iam.stubber.stub_detach_role_policy, - self.scenario_data.role_name, - self.scenario_data.policy_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_delete_policy, - self.scenario_data.policy_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_delete_role, - self.scenario_data.role_name, - ) - runner.add( - self.scenario_data.iam.stubber.stub_remove_role_from_instance_profile, - self.scenario_data.bad_prof_name, - self.scenario_data.bad_role_name, - ) - runner.add( - self.scenario_data.iam.stubber.stub_delete_instance_profile, - self.scenario_data.bad_prof_name, - ) - runner.add( - self.scenario_data.iam.stubber.stub_list_attached_role_policies, - self.scenario_data.bad_role_name, - {"1": self.scenario_data.bad_policy_arn}, - ) - runner.add( - self.scenario_data.iam.stubber.stub_detach_role_policy, - self.scenario_data.bad_role_name, - self.scenario_data.bad_policy_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_delete_policy, - self.scenario_data.bad_policy_arn, - ) - runner.add( - self.scenario_data.iam.stubber.stub_delete_role, - self.scenario_data.bad_role_name, - ) - runner.add( - self.scenario_data.ddb.stubber.stub_delete_table, - self.scenario_data.table_name, - ) - runner.add( - self.scenario_data.ddb.stubber.stub_describe_table, - self.scenario_data.table_name, - error_code="ResourceNotFoundException", - ) - - -@pytest.fixture -def mock_mgr(stub_runner, scenario_data, input_mocker): - return MockManager(stub_runner, scenario_data, input_mocker) - - -def test_destroy(mock_mgr, capsys): - mock_mgr.setup_stubs(None, None) - - mock_mgr.scenario_data.scenario.destroy() - - -@pytest.mark.parametrize( - "error, stub_name, stop_on_index", - [ - (LoadBalancerError, "stub_describe_load_balancers", 0), - (LoadBalancerError, "stub_delete_load_balancer", 1), - (WaiterError, "stub_describe_load_balancers", 2), - (LoadBalancerError, "stub_describe_target_groups", 3), - (LoadBalancerError, "stub_delete_target_group", 4), - (AutoScalerError, "stub_describe_auto_scaling_groups", 5), - (AutoScalerError, "stub_update_auto_scaling_group", 6), - (AutoScalerError, "stub_terminate_instance_in_auto_scaling_group", 7), - (AutoScalerError, "stub_delete_auto_scaling_group", 8), - (AutoScalerError, "stub_delete_launch_template", 9), - (AutoScalerError, "stub_remove_role_from_instance_profile", 10), - (AutoScalerError, "stub_delete_instance_profile", 11), - (AutoScalerError, "stub_list_attached_role_policies", 12), - (AutoScalerError, "stub_detach_role_policy", 13), - (AutoScalerError, "stub_delete_policy", 14), - (AutoScalerError, "stub_delete_role", 15), - (AutoScalerError, "stub_remove_role_from_instance_profile", 16), - (AutoScalerError, "stub_delete_instance_profile", 17), - (AutoScalerError, "stub_list_attached_role_policies", 18), - (AutoScalerError, "stub_detach_role_policy", 19), - (AutoScalerError, "stub_delete_policy", 20), - (AutoScalerError, "stub_delete_role", 21), - (RecommendationServiceError, "stub_delete_table", 22), - (WaiterError, "stub_describe_table", 23), - ], -) -def test_destroy_error(mock_mgr, caplog, error, stub_name, stop_on_index): - mock_mgr.setup_stubs(error, stop_on_index) - - with pytest.raises(error): - mock_mgr.scenario_data.scenario.destroy() diff --git a/python/cross_service/resilient_service/test/test_runner_integ.py b/python/cross_service/resilient_service/test/test_runner_integ.py index b8a822b2bf9..d247a698c54 100644 --- a/python/cross_service/resilient_service/test/test_runner_integ.py +++ b/python/cross_service/resilient_service/test/test_runner_integ.py @@ -1,51 +1,102 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 +import unittest +from itertools import cycle +from unittest.mock import patch -import logging - +import boto3 import pytest +from botocore.exceptions import ClientError -from auto_scaler import AutoScaler -from load_balancer import LoadBalancer +from auto_scaler import AutoScalingWrapper +from load_balancer import ElasticLoadBalancerWrapper from parameters import ParameterHelper from recommendation_service import RecommendationService -import runner - - -@pytest.mark.integ -def test_runner_integ(input_mocker, caplog): - caplog.set_level(logging.INFO) - prefix = "doc-example-test-resilience" - table_name = "doc-example-test-recommendation-service" - recommendation = RecommendationService.from_client(table_name) - autoscaler = AutoScaler.from_client(prefix) - loadbalancer = LoadBalancer.from_client(prefix) - param_helper = ParameterHelper.from_client(recommendation.table_name) - scenario = runner.Runner( - "test/resources", recommendation, autoscaler, loadbalancer, param_helper - ) - - input_mocker.mock_answers( - [ - "", - "", - "y", - "", # deploy - "1", - "2", - "3", - "3", - "3", - "3", - "3", - "3", - "3", # demo - "y", # destroy - ] - ) - - scenario.deploy() - scenario.demo() - scenario.destroy() - - assert f"Table {table_name} deleted." in caplog.text +from runner import Runner + + +@pytest.fixture(autouse=True) +def disable_capture(pytestconfig): + pytestconfig.option.capture = "no" + + +class TestRunnerIntegration(unittest.TestCase): + @classmethod + def setUpClass(cls): + # Set up AWS clients + cls.ddb_client = boto3.client("dynamodb") + cls.elb_client = boto3.client("elbv2") + cls.autoscaling_client = boto3.client("autoscaling") + cls.ec2_client = boto3.client("ec2") + cls.ssm_client = boto3.client("ssm") + cls.iam_client = boto3.client("iam") + + # Initialize the services and runner + cls.prefix = "test-doc-example-resilience" + cls.resource_path = "../../../workflows/resilient_service/resources" + cls.recommendation = RecommendationService( + "test-recommendation-service", cls.ddb_client + ) + cls.autoscaling_wrapper = AutoScalingWrapper( + cls.prefix, + "t3.micro", + "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2", + cls.autoscaling_client, + cls.ec2_client, + cls.ssm_client, + cls.iam_client, + ) + cls.elb_wrapper = ElasticLoadBalancerWrapper(cls.elb_client) + cls.param_helper = ParameterHelper( + cls.recommendation.table_name, cls.ssm_client + ) + cls.runner = Runner( + cls.resource_path, + cls.recommendation, + cls.autoscaling_wrapper, + cls.elb_wrapper, + cls.param_helper, + ) + + @pytest.mark.integ + @pytest.mark.usefixtures("disable_capture") + @patch("builtins.input", side_effect=cycle(["3"])) + def test_deploy_resources(self, mock_input): + try: + self.runner.deploy() + # Verify that resources were created + table = self.ddb_client.describe_table( + TableName=self.recommendation.table_name + ) + self.assertEqual(table["Table"]["TableStatus"], "ACTIVE") + + lb = self.elb_client.describe_load_balancers( + Names=[self.runner.load_balancer_name] + ) + self.assertEqual(lb["LoadBalancers"][0]["State"]["Code"], "active") + except ClientError as e: + self.fail(f"Deployment failed with error: {e}") + + @pytest.mark.integ + @pytest.mark.usefixtures("disable_capture") + @patch("builtins.input", side_effect=cycle(["3"])) + def test_service_resilience(self, mock_input): + self.runner.deploy() + try: + self.runner.demo() + except Exception as e: + self.fail(f"Service resilience test failed with error: {e}") + finally: + self.runner.destroy(automation=True) + + @classmethod + def tearDownClass(cls): + # Clean up in case any resources were left + try: + cls.runner.destroy(automation=True) + except Exception as e: + print(f"Cleanup failed in tearDown with error: {e}") + + +if __name__ == "__main__": + unittest.main() diff --git a/python/example_code/auto-scaling/README.md b/python/example_code/auto-scaling/README.md index 699f059dd85..90818c5420c 100644 --- a/python/example_code/auto-scaling/README.md +++ b/python/example_code/auto-scaling/README.md @@ -50,17 +50,17 @@ Code examples that show you how to perform the essential operations within a ser Code excerpts that show you how to call individual service functions. -- [AttachLoadBalancerTargetGroups](../../cross_service/resilient_service/auto_scaler.py#L535) -- [CreateAutoScalingGroup](action_wrapper.py#L30) -- [DeleteAutoScalingGroup](../../cross_service/resilient_service/auto_scaler.py#L562) -- [DescribeAutoScalingGroups](action_wrapper.py#L113) -- [DescribeAutoScalingInstances](action_wrapper.py#L195) -- [DescribeScalingActivities](action_wrapper.py#L220) -- [DisableMetricsCollection](action_wrapper.py#L271) -- [EnableMetricsCollection](action_wrapper.py#L248) -- [SetDesiredCapacity](action_wrapper.py#L169) -- [TerminateInstanceInAutoScalingGroup](action_wrapper.py#L139) -- [UpdateAutoScalingGroup](action_wrapper.py#L67) +- [AttachLoadBalancerTargetGroups](../../cross_service/resilient_service/auto_scaler.py#L615) +- [CreateAutoScalingGroup](action_wrapper.py#L31) +- [DeleteAutoScalingGroup](../../cross_service/resilient_service/auto_scaler.py#L656) +- [DescribeAutoScalingGroups](action_wrapper.py#L167) +- [DescribeAutoScalingInstances](action_wrapper.py#L284) +- [DescribeScalingActivities](action_wrapper.py#L317) +- [DisableMetricsCollection](action_wrapper.py#L399) +- [EnableMetricsCollection](action_wrapper.py#L359) +- [SetDesiredCapacity](action_wrapper.py#L248) +- [TerminateInstanceInAutoScalingGroup](action_wrapper.py#L204) +- [UpdateAutoScalingGroup](action_wrapper.py#L92) ### Scenarios diff --git a/python/example_code/auto-scaling/action_wrapper.py b/python/example_code/auto-scaling/action_wrapper.py index d55a8abf5a6..a1f2b6ff178 100644 --- a/python/example_code/auto-scaling/action_wrapper.py +++ b/python/example_code/auto-scaling/action_wrapper.py @@ -9,6 +9,7 @@ """ import logging +from typing import Any, Dict, List, Optional from botocore.exceptions import ClientError @@ -29,8 +30,13 @@ def __init__(self, autoscaling_client): # snippet-start:[python.example_code.auto-scaling.CreateAutoScalingGroup] def create_group( - self, group_name, group_zones, launch_template_name, min_size, max_size - ): + self, + group_name: str, + group_zones: List[str], + launch_template_name: str, + min_size: int, + max_size: int, + ) -> None: """ Creates an Auto Scaling group. @@ -41,6 +47,8 @@ def create_group( instances that are created by auto scaling activities. :param min_size: The minimum number of active instances in the group. :param max_size: The maximum number of active instances in the group. + :return: None + :raises ClientError: If there is an error creating the Auto Scaling group. """ try: self.autoscaling_client.create_auto_scaling_group( @@ -53,91 +61,150 @@ def create_group( MinSize=min_size, MaxSize=max_size, ) + + # Wait for the group to exist. + waiter = self.autoscaling_client.get_waiter("group_exists") + waiter.wait(AutoScalingGroupNames=[group_name]) + + logger.info(f"Successfully created Auto Scaling group {group_name}.") + except ClientError as err: - logger.error( - "Couldn't create group %s. Here's why: %s: %s", - group_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + error_code = err.response["Error"]["Code"] + logger.error(f"Failed to create Auto Scaling group {group_name}.") + if error_code == "AlreadyExistsFault": + logger.error( + f"An Auto Scaling group with the name '{group_name}' already exists. " + "Please use a different name or update the existing group.", + ) + elif error_code == "LimitExceededFault": + logger.error( + "The request failed because you have reached the limit " + "on the number of Auto Scaling groups or launch configurations. " + "Consider deleting unused resources or request a limit increase. " + "\nSee Auto Scaling Service Quota documentation here:" + "\n\thttps://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-quotas.html" + ) + logger.error(f"Full error:\n\t{err}") raise # snippet-end:[python.example_code.auto-scaling.CreateAutoScalingGroup] # snippet-start:[python.example_code.auto-scaling.UpdateAutoScalingGroup] - def update_group(self, group_name, **kwargs): + def update_group(self, group_name: str, **kwargs: Any) -> None: """ Updates an Auto Scaling group. :param group_name: The name of the group to update. :param kwargs: Keyword arguments to pass through to the service. + :return: None + :raises ClientError: If there is an error updating the Auto Scaling group. """ try: self.autoscaling_client.update_auto_scaling_group( AutoScalingGroupName=group_name, **kwargs ) + logger.info(f"Successfully updated Auto Scaling group {group_name}.") + except ClientError as err: - logger.error( - "Couldn't update group %s. Here's why: %s: %s", - group_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + error_code = err.response["Error"]["Code"] + logger.error(f"Failed to update Auto Scaling group {group_name}.") + if error_code == "ResourceInUse": + logger.error( + "The Auto Scaling group '%s' is currently in use and cannot be modified. Please try again later.", + group_name, + ) + elif error_code == "ScalingActivityInProgress": + logger.error( + f"A scaling activity is currently in progress for the Auto Scaling group '{group_name}'." + "Please wait for the activity to complete before attempting to update the group." + ) + logger.error(f"Full error:\n\t{err}") raise # snippet-end:[python.example_code.auto-scaling.UpdateAutoScalingGroup] # snippet-start:[python.example_code.auto-scaling.DeleteAutoScalingGroup] - def delete_group(self, group_name): + def delete_group(self, group_name: str) -> None: """ Deletes an Auto Scaling group. All instances must be stopped before the group can be deleted. :param group_name: The name of the group to delete. + :return: None + :raises ClientError: If there is an error deleting the Auto Scaling group. """ try: self.autoscaling_client.delete_auto_scaling_group( AutoScalingGroupName=group_name ) + + # Wait for the group to be deleted. + waiter = self.autoscaling_client.get_waiter("group_not_exists") + waiter.wait(AutoScalingGroupNames=[group_name]) + + logger.info(f"Successfully deleted Auto Scaling group {group_name}.") + except ClientError as err: - logger.error( - "Couldn't delete group %s. Here's why: %s: %s", - group_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + error_code = err.response["Error"]["Code"] + logger.error(f"Failed to delete Auto Scaling group {group_name}.") + if error_code == "ScalingActivityInProgress": + logger.error( + "A scaling activity is currently in progress for the Auto Scaling group '%s'. " + "Please wait for the activity to complete before attempting to delete the group.", + group_name, + ) + elif error_code == "ResourceInUse": + logger.error( + "The Auto Scaling group '%s' or one of its associated resources is currently in use and cannot be deleted. " + "Ensure all instances are stopped and no other operations are pending before retrying.", + group_name, + ) + logger.error(f"Full error:\n\t{err}") raise # snippet-end:[python.example_code.auto-scaling.DeleteAutoScalingGroup] # snippet-start:[python.example_code.auto-scaling.DescribeAutoScalingGroups] - def describe_group(self, group_name): + def describe_group(self, group_name: str) -> Optional[Dict[str, Any]]: """ Gets information about an Auto Scaling group. :param group_name: The name of the group to look up. - :return: Information about the group, if found. + :return: A dictionary with information about the group if found, otherwise None. + :raises ClientError: If there is an error describing the Auto Scaling group. """ try: - response = self.autoscaling_client.describe_auto_scaling_groups( - AutoScalingGroupNames=[group_name] + paginator = self.autoscaling_client.get_paginator( + "describe_auto_scaling_groups" ) - except ClientError as err: - logger.error( - "Couldn't describe group %s. Here's why: %s: %s", - group_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + response_iterator = paginator.paginate(AutoScalingGroupNames=[group_name]) + groups = [] + for response in response_iterator: + groups.extend(response.get("AutoScalingGroups", [])) + + logger.info( + f"Successfully retrieved information for Auto Scaling group {group_name}." ) + + except ClientError as err: + error_code = err.response["Error"]["Code"] + logger.error(f"Failed to describe Auto Scaling group {group_name}.") + if error_code == "ResourceContentionFault": + logger.error( + "There is a conflict with another operation that is modifying the " + f"Auto Scaling group '{group_name}' Please try again later." + ) + logger.error(f"Full error:\n\t{err}") raise else: - groups = response.get("AutoScalingGroups", []) return groups[0] if len(groups) > 0 else None # snippet-end:[python.example_code.auto-scaling.DescribeAutoScalingGroups] # snippet-start:[python.example_code.auto-scaling.TerminateInstanceInAutoScalingGroup] - def terminate_instance(self, instance_id, decrease_capacity): + def terminate_instance( + self, instance_id: str, decrease_capacity: bool + ) -> Dict[str, Any]: """ Stops an instance. @@ -147,33 +214,47 @@ def terminate_instance(self, instance_id, decrease_capacity): you can stop an instance without having a replacement instance start when the desired capacity threshold is crossed. - :return: The scaling activity that occurs in response to this action. + :return: A dictionary containing details of the scaling activity that occurs + in response to this action. + :raises ClientError: If there is an error terminating the instance. """ try: response = self.autoscaling_client.terminate_instance_in_auto_scaling_group( InstanceId=instance_id, ShouldDecrementDesiredCapacity=decrease_capacity ) + logger.info(f"Successfully terminated instance {instance_id}.") + return response["Activity"] + except ClientError as err: - logger.error( - "Couldn't terminate instance %s. Here's why: %s: %s", - instance_id, - err.response["Error"]["Code"], - err.response["Error"]["Message"], - ) + error_code = err.response["Error"]["Code"] + logger.error(f"Failed to terminate instance {instance_id}.") + if error_code == "ScalingActivityInProgress": + logger.error( + "A scaling activity is currently in progress for the Auto Scaling group " + f"associated with instance '{instance_id}'. " + "Please wait for the activity to complete before attempting to terminate the instance." + ) + elif error_code == "ResourceInUse": + logger.error( + f"The instance '{instance_id}' or an associated resource is currently in use " + "and cannot be terminated. " + "Ensure the instance is not involved in any ongoing processes and try again." + ) + logger.error(f"Full error:\n\t{err}") raise - else: - return response["Activity"] # snippet-end:[python.example_code.auto-scaling.TerminateInstanceInAutoScalingGroup] # snippet-start:[python.example_code.auto-scaling.SetDesiredCapacity] - def set_desired_capacity(self, group_name, capacity): + def set_desired_capacity(self, group_name: str, capacity: int) -> None: """ Sets the desired capacity of the group. Amazon EC2 Auto Scaling tries to keep the number of running instances equal to the desired capacity. :param group_name: The name of the group to update. :param capacity: The desired number of running instances. + :return: None + :raises ClientError: If there is an error setting the desired capacity. """ try: self.autoscaling_client.set_desired_capacity( @@ -181,111 +262,168 @@ def set_desired_capacity(self, group_name, capacity): DesiredCapacity=capacity, HonorCooldown=False, ) + logger.info( + f"Successfully set desired capacity of {capacity} for Auto Scaling group '{group_name}'." + ) + except ClientError as err: + error_code = err.response["Error"]["Code"] logger.error( - "Couldn't set desired capacity %s. Here's why: %s: %s", - group_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + f"Failed to set desired capacity for Auto Scaling group '{group_name}'." ) + if error_code == "ScalingActivityInProgress": + logger.error( + f"A scaling activity is currently in progress for the Auto Scaling group '{group_name}'. " + "Please wait for the activity to complete before attempting to set the desired capacity." + ) + logger.error(f"Full error:\n\t{err}") raise # snippet-end:[python.example_code.auto-scaling.SetDesiredCapacity] # snippet-start:[python.example_code.auto-scaling.DescribeAutoScalingInstances] - def describe_instances(self, instance_ids): + def describe_instances(self, instance_ids: List[str]) -> List[Dict[str, Any]]: """ Gets information about instances. :param instance_ids: A list of instance IDs to look up. - :return: Information about instances, or an empty list if none are found. + :return: A list of dictionaries with information about each instance, + or an empty list if none are found. + :raises ClientError: If there is an error describing the instances. """ try: - response = self.autoscaling_client.describe_auto_scaling_instances( - InstanceIds=instance_ids + paginator = self.autoscaling_client.get_paginator( + "describe_auto_scaling_instances" ) + response_iterator = paginator.paginate(InstanceIds=instance_ids) + + instances = [] + for response in response_iterator: + instances.extend(response.get("AutoScalingInstances", [])) + + logger.info(f"Successfully described instances: {instance_ids}") + except ClientError as err: + error_code = err.response["Error"]["Code"] logger.error( - "Couldn't describe instances %s. Here's why: %s: %s", - instance_ids, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + f"Couldn't describe instances {instance_ids}. Error code: {error_code}, Message: {err.response['Error']['Message']}" ) raise else: - return response["AutoScalingInstances"] + return instances # snippet-end:[python.example_code.auto-scaling.DescribeAutoScalingInstances] # snippet-start:[python.example_code.auto-scaling.DescribeScalingActivities] - def describe_scaling_activities(self, group_name): + def describe_scaling_activities(self, group_name: str) -> List[Dict[str, Any]]: """ Gets information about scaling activities for the group. Scaling activities are things like instances stopping or starting in response to user requests or capacity changes. :param group_name: The name of the group to look up. - :return: The list of scaling activities for the group, ordered with the most - recent activity first. + :return: A list of dictionaries representing the scaling activities for the + group, ordered with the most recent activity first. + :raises ClientError: If there is an error describing the scaling activities. """ try: - response = self.autoscaling_client.describe_scaling_activities( - AutoScalingGroupName=group_name + paginator = self.autoscaling_client.get_paginator( + "describe_scaling_activities" ) + response_iterator = paginator.paginate(AutoScalingGroupName=group_name) + activities = [] + for response in response_iterator: + activities.extend(response.get("Activities", [])) + + logger.info( + f"Successfully described scaling activities for group '{group_name}'." + ) + except ClientError as err: + error_code = err.response["Error"]["Code"] logger.error( - "Couldn't describe scaling activities %s. Here's why: %s: %s", - group_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + f"Couldn't describe scaling activities for group '{group_name}'. Error code: {error_code}, Message: {err.response['Error']['Message']}" ) + + if error_code == "ResourceContentionFault": + logger.error( + f"There is a conflict with another operation that is modifying the Auto Scaling group '{group_name}'. " + "Please try again later." + ) raise else: - return response["Activities"] + return activities # snippet-end:[python.example_code.auto-scaling.DescribeScalingActivities] # snippet-start:[python.example_code.auto-scaling.EnableMetricsCollection] - def enable_metrics(self, group_name, metrics): + def enable_metrics(self, group_name: str, metrics: List[str]) -> Dict[str, Any]: """ Enables CloudWatch metric collection for Amazon EC2 Auto Scaling activities. :param group_name: The name of the group to enable. :param metrics: A list of metrics to collect. + :return: A dictionary with the response from enabling the metrics collection. + :raises ClientError: If there is an error enabling metrics collection. """ try: - self.autoscaling_client.enable_metrics_collection( + response = self.autoscaling_client.enable_metrics_collection( AutoScalingGroupName=group_name, Metrics=metrics, Granularity="1Minute" ) + logger.info( + f"Successfully enabled metrics for Auto Scaling group '{group_name}'." + ) + except ClientError as err: + error_code = err.response["Error"]["Code"] logger.error( - "Couldn't enable metrics on %s. Here's why: %s: %s", - group_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + f"Couldn't enable metrics on '{group_name}'. Error code: {error_code}, Message: {err.response['Error']['Message']}" ) + + if error_code == "ResourceContentionFault": + logger.error( + f"There is a conflict with another operation that is modifying the Auto Scaling group '{group_name}'. " + "Please try again later." + ) + elif error_code == "InvalidParameterCombination": + logger.error( + f"The combination of parameters provided for enabling metrics on '{group_name}' is not valid. " + "Please check the parameters and try again." + ) raise + else: + return response # snippet-end:[python.example_code.auto-scaling.EnableMetricsCollection] # snippet-start:[python.example_code.auto-scaling.DisableMetricsCollection] - def disable_metrics(self, group_name): + def disable_metrics(self, group_name: str) -> Dict[str, Any]: """ Stops CloudWatch metric collection for the Auto Scaling group. :param group_name: The name of the group. + :return: A dictionary with the response from disabling the metrics collection. + :raises ClientError: If there is an error disabling metrics collection. """ try: - self.autoscaling_client.disable_metrics_collection( + response = self.autoscaling_client.disable_metrics_collection( AutoScalingGroupName=group_name ) + logger.info( + f"Successfully disabled metrics collection for group '{group_name}'." + ) + return response except ClientError as err: + error_code = err.response["Error"]["Code"] logger.error( - "Couldn't disable metrics %s. Here's why: %s: %s", - group_name, - err.response["Error"]["Code"], - err.response["Error"]["Message"], + f"Couldn't disable metrics for group '{group_name}'. Error code: {error_code}, Message: {err.response['Error']['Message']}" ) + + if error_code == "ResourceContentionFault": + logger.error( + f"There is a conflict with another operation that is modifying the Auto Scaling group '{group_name}'. " + "Please try again later." + ) raise # snippet-end:[python.example_code.auto-scaling.DisableMetricsCollection] diff --git a/python/example_code/auto-scaling/hello/hello_autoscaling.py b/python/example_code/auto-scaling/hello/hello_autoscaling.py index 5beb6fa498c..2e5867dd2f8 100644 --- a/python/example_code/auto-scaling/hello/hello_autoscaling.py +++ b/python/example_code/auto-scaling/hello/hello_autoscaling.py @@ -12,7 +12,7 @@ def hello_autoscaling(autoscaling_client): This example uses the default settings specified in your shared credentials and config files. - :param auto-scaling_client: A Boto3 Amazon EC2 Auto Scaling client object. + :param autoscaling_client: A Boto3 Amazon EC2 Auto Scaling client object. """ print( "Hello, Amazon EC2 Auto Scaling! Let's list up to ten of you Auto Scaling groups:" diff --git a/python/example_code/auto-scaling/scenario_groups_and_instances.py b/python/example_code/auto-scaling/scenario_groups_and_instances.py index 7bd0bc3135e..c78bc3f4707 100644 --- a/python/example_code/auto-scaling/scenario_groups_and_instances.py +++ b/python/example_code/auto-scaling/scenario_groups_and_instances.py @@ -20,19 +20,26 @@ 9. Stop collecting metrics, terminate all instances, and delete the group. """ -from datetime import datetime, timedelta, timezone import logging -from pprint import pp import sys +from datetime import datetime, timedelta, timezone +from pprint import pp + import boto3 +import coloredlogs from botocore.exceptions import ClientError from action_wrapper import AutoScalingWrapper -# Add relative path to include demo_tools in this code example without needing to setup. +# Add relative path to include demo_tools in this code example without needing to set up. sys.path.append("../..") -import demo_tools.question as q -from demo_tools.retries import wait +import demo_tools.question as q # noqa +from demo_tools.retries import wait # noqa + +# Configure coloredlogs +coloredlogs.install( + level="INFO", fmt="%(asctime)s %(levelname)s: %(message)s", datefmt="%H:%M:%S" +) logger = logging.getLogger(__name__) @@ -49,19 +56,22 @@ def __init__(self, ec2_client, cloudwatch_resource): self.ec2_client = ec2_client self.cloudwatch_resource = cloudwatch_resource - def get_template(self, template_name): + def get_template(self, template_name: str) -> dict: """ Gets a launch template. Launch templates specify configuration for instances that are launched by Amazon EC2 Auto Scaling. :param template_name: The name of the template to look up. :return: The template, if it exists. + :raises ClientError: If there is an error retrieving the launch template. """ try: response = self.ec2_client.describe_launch_templates( LaunchTemplateNames=[template_name] ) template = response["LaunchTemplates"][0] + logger.info("Launch template %s retrieved successfully.", template_name) + return template except ClientError as err: if ( err.response["Error"]["Code"] @@ -70,16 +80,14 @@ def get_template(self, template_name): logger.warning("Launch template %s does not exist.", template_name) else: logger.error( - "Couldn't verify launch template %s. Here's why: %s: %s", + "Couldn't verify launch template %s. Error: %s: %s", template_name, err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise - else: - return template - def create_template(self, template_name, inst_type, ami_id): + def create_template(self, template_name: str, inst_type: str, ami_id: str) -> dict: """ Creates an Amazon EC2 launch template to use with Amazon EC2 Auto Scaling. @@ -88,6 +96,7 @@ def create_template(self, template_name, inst_type, ami_id): :param ami_id: The ID of the Amazon Machine Image (AMI) to use when creating an instance. :return: Information about the newly created template. + :raises ClientError: If there is an error creating the launch template. """ try: response = self.ec2_client.create_launch_template( @@ -95,60 +104,69 @@ def create_template(self, template_name, inst_type, ami_id): LaunchTemplateData={"InstanceType": inst_type, "ImageId": ami_id}, ) template = response["LaunchTemplate"] + logger.info( + "Created launch template %s with instance type %s and AMI ID %s.", + template_name, + inst_type, + ami_id, + ) + return template except ClientError as err: logger.error( - "Couldn't create launch template %s. Here's why: %s: %s", + "Couldn't create launch template %s. Error: %s: %s", template_name, err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise - else: - return template - def delete_template(self, template_name): + def delete_template(self, template_name: str) -> None: """ Deletes a launch template. :param template_name: The name of the template to delete. + :raises ClientError: If there is an error deleting the launch template. """ try: self.ec2_client.delete_launch_template(LaunchTemplateName=template_name) + logger.info("Deleted launch template %s.", template_name) except ClientError as err: logger.error( - "Couldn't delete launch template %s. Here's why: %s: %s", + "Couldn't delete launch template %s. Error: %s: %s", template_name, err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise - def get_availability_zones(self): + def get_availability_zones(self) -> list: """ Gets a list of Availability Zones in the AWS Region of the Amazon EC2 client. :return: The list of Availability Zones for the client Region. + :raises ClientError: If there is an error retrieving availability zones. """ try: response = self.ec2_client.describe_availability_zones() zones = [zone["ZoneName"] for zone in response["AvailabilityZones"]] + logger.info("Retrieved availability zones: %s.", ", ".join(zones)) + return zones except ClientError as err: logger.error( - "Couldn't get availability zones. Here's why: %s: %s", + "Couldn't get availability zones. Error: %s: %s", err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise - else: - return zones - def get_metrics(self, namespace, dimensions): + def get_metrics(self, namespace: str, dimensions: list) -> list: """ Gets a list of CloudWatch metrics filtered by namespace and dimensions. :param namespace: The namespace of the metrics to look up. :param dimensions: The dimensions of the metrics to look up. :return: The list of metrics. + :raises ClientError: If there is an error retrieving CloudWatch metrics. """ try: metrics = list( @@ -156,20 +174,26 @@ def get_metrics(self, namespace, dimensions): Namespace=namespace, Dimensions=dimensions ) ) + logger.info( + "Retrieved metrics for namespace %s with dimensions %s.", + namespace, + dimensions, + ) + return metrics except ClientError as err: logger.error( - "Couldn't get metrics for %s, %s. Here's why: %s: %s", + "Couldn't get metrics for %s, %s. Error: %s: %s", namespace, dimensions, err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise - else: - return metrics @staticmethod - def get_metric_statistics(dimensions, metric, start, end): + def get_metric_statistics( + dimensions: list, metric, start: datetime, end: datetime + ) -> list: """ Gets statistics for a CloudWatch metric within a specified time span. @@ -178,6 +202,7 @@ def get_metric_statistics(dimensions, metric, start, end): :param start: The start of the time span for retrieved metrics. :param end: The end of the time span for retrieved metrics. :return: The list of data points found for the specified metric. + :raises ClientError: If there is an error retrieving metric statistics. """ try: response = metric.get_statistics( @@ -188,21 +213,24 @@ def get_metric_statistics(dimensions, metric, start, end): Statistics=["Sum"], ) data = response["Datapoints"] + logger.info("Retrieved statistics for metric %s.", metric.name) + return data except ClientError as err: logger.error( - "Couldn't get statistics for metric %s. Here's why: %s: %s", + "Couldn't get statistics for metric %s. Error: %s: %s", metric.name, err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise - else: - return data -def print_simplified_group(group): +def print_simplified_group(group: dict) -> None: """ Prints a subset of data for an Auto Scaling group. + + :param group: The Auto Scaling group data to print. + :return: None """ print(group["AutoScalingGroupName"]) print(f"\tLaunch template: {group['LaunchTemplate']['LaunchTemplateName']}") @@ -215,20 +243,28 @@ def print_simplified_group(group): print(f"\t\t{inst['InstanceId']}: {inst['LifecycleState']}") -def wait_for_group(group_name, as_wrapper): +def wait_for_group(group_name: str, as_wrapper: AutoScalingWrapper) -> list: """ Waits for instances to start or stop in an Auto Scaling group. Prints the data for each instance after scaling activities are complete. + + :param group_name: The name of the Auto Scaling group. + :param as_wrapper: The AutoScalingWrapper that manages Auto Scaling groups. + :return: A list of instance IDs in the group. """ group = as_wrapper.describe_group(group_name) instance_ids = [i["InstanceId"] for i in group["Instances"]] return wait_for_instances(instance_ids, as_wrapper) -def wait_for_instances(instance_ids, as_wrapper): +def wait_for_instances(instance_ids: list, as_wrapper: AutoScalingWrapper) -> list: """ Waits for instances to start or stop in an Auto Scaling group. Prints the data for each instance after scaling activities are complete. + + :param instance_ids: A list of instance IDs to wait for. + :param as_wrapper: The AutoScalingWrapper that manages Auto Scaling groups. + :return: A list of instance IDs that were waited on. """ ready = False instances = [] @@ -251,9 +287,18 @@ def wait_for_instances(instance_ids, as_wrapper): # snippet-start:[python.example_code.auto-scaling.Scenario_GroupsAndInstances] -def run_scenario(as_wrapper, svc_helper): +def run_scenario(as_wrapper: AutoScalingWrapper, svc_helper: ServiceHelper) -> None: + """ + Runs the scenario demonstrating the management of Auto Scaling groups and instances. + + :param as_wrapper: An instance of the AutoScalingWrapper that manages Auto Scaling groups. + :param svc_helper: An instance of the ServiceHelper that interacts with AWS services. + :return: None + """ logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") + logger.info("Starting the Amazon EC2 Auto Scaling demo.") + print("-" * 88) print( "Welcome to the Amazon EC2 Auto Scaling demo for managing groups and instances." @@ -261,7 +306,7 @@ def run_scenario(as_wrapper, svc_helper): print("-" * 88) print( - "This example requires a launch template that specifies how to create\n" + "This example requires a launch template that specifies how to create " "EC2 instances. You can use an existing template or create a new one." ) template_name = q.ask( @@ -292,9 +337,10 @@ def run_scenario(as_wrapper, svc_helper): ) group_zones = [zones[zone_sel - 1]] if zone_sel <= len(zones) else zones print(f"Creating group {group_name}...") - as_wrapper.create_group(group_name, group_zones, template_name, 1, 1) + as_wrapper.create_autoscaling_group(group_name, group_zones, template_name, 1, 1) wait(10) group = as_wrapper.describe_group(group_name) + logger.info("Created Auto Scaling group %s.", group_name) print("Created group:") pp(group) print("Waiting for instance to start...") @@ -316,6 +362,7 @@ def run_scenario(as_wrapper, svc_helper): "GroupTotalInstances", ], ) + logger.info("Enabled metrics for Auto Scaling group %s.", group_name) print(f"Metrics enabled for {group_name}.") print("-" * 88) @@ -323,6 +370,7 @@ def run_scenario(as_wrapper, svc_helper): q.ask("Press Enter when you're ready.") as_wrapper.update_group(group_name, MaxSize=3) group = as_wrapper.describe_group(group_name) + logger.info("Updated maximum size for group %s to 3.", group_name) print("The group still has one running instance, but can have up to three:") print_simplified_group(group) print("-" * 88) @@ -332,6 +380,7 @@ def run_scenario(as_wrapper, svc_helper): as_wrapper.set_desired_capacity(group_name, 2) wait(10) group = as_wrapper.describe_group(group_name) + logger.info("Set desired capacity for group %s to 2.", group_name) print("Here's the current state of the group:") print_simplified_group(group) print("-" * 88) @@ -353,6 +402,9 @@ def run_scenario(as_wrapper, svc_helper): as_wrapper.terminate_instance(instance_ids[inst_sel - 1], False) wait(10) group = as_wrapper.describe_group(group_name) + logger.info( + "Terminated instance %s in group %s.", instance_ids[inst_sel - 1], group_name + ) print(f"Here's the state of {group_name}:") print_simplified_group(group) print("Waiting for the scaling activities to complete...") @@ -362,6 +414,9 @@ def run_scenario(as_wrapper, svc_helper): print(f"Let's get a report of scaling activities for {group_name}.") q.ask("Press Enter when you're ready.") activities = as_wrapper.describe_scaling_activities(group_name) + logger.info( + "Retrieved %d scaling activities for group %s.", len(activities), group_name + ) print( f"Found {len(activities)} activities.\n" f"Activities are ordered with the most recent one first:" @@ -406,6 +461,7 @@ def run_scenario(as_wrapper, svc_helper): if use_metrics: print(f"Stopping metrics collection for {group_name}.") as_wrapper.disable_metrics(group_name) + logger.info("Disabled metrics collection for group %s.", group_name) print( "You must terminate all instances in the group before you can delete the group." @@ -417,10 +473,12 @@ def run_scenario(as_wrapper, svc_helper): for inst_id in instance_ids: print(f"Stopping {inst_id}.") as_wrapper.terminate_instance(inst_id, True) + logger.info("Terminated instance %s in group %s.", inst_id, group_name) print("Waiting for instances to stop...") wait_for_instances(instance_ids, as_wrapper) print(f"Deleting {group_name}.") - as_wrapper.delete_group(group_name) + as_wrapper.delete_autoscaling_group(group_name) + logger.info("Deleted Auto Scaling group %s.", group_name) print("-" * 88) if template is not None: @@ -428,6 +486,7 @@ def run_scenario(as_wrapper, svc_helper): f"Do you want to delete launch template {template_name} used in this demo (y/n)? " ): svc_helper.delete_template(template_name) + logger.info("Deleted launch template %s.", template_name) print("Template deleted.") print("\nThanks for watching!") @@ -440,5 +499,5 @@ def run_scenario(as_wrapper, svc_helper): helper = ServiceHelper(boto3.client("ec2"), boto3.resource("cloudwatch")) run_scenario(wrapper, helper) except Exception: - logging.exception("Something went wrong with the demo!") + logger.exception("Something went wrong with the demo!") # snippet-end:[python.example_code.auto-scaling.Scenario_GroupsAndInstances] diff --git a/python/example_code/auto-scaling/test/conftest.py b/python/example_code/auto-scaling/test/conftest.py index cc2910b2309..0ca27fb479e 100644 --- a/python/example_code/auto-scaling/test/conftest.py +++ b/python/example_code/auto-scaling/test/conftest.py @@ -5,9 +5,8 @@ Contains common test fixtures used to run unit tests. """ -import random import sys # This is needed so that Python can find test_tools on the path. sys.path.append("../..") -from test_tools.fixtures.common import * +from test_tools.fixtures.common import * # noqa diff --git a/python/example_code/auto-scaling/test/test_action_wrapper.py b/python/example_code/auto-scaling/test/test_action_wrapper.py index ce12af05a0c..27a41f4a76a 100644 --- a/python/example_code/auto-scaling/test/test_action_wrapper.py +++ b/python/example_code/auto-scaling/test/test_action_wrapper.py @@ -6,9 +6,10 @@ """ from datetime import datetime + import boto3 -from botocore.exceptions import ClientError import pytest +from botocore.exceptions import ClientError from action_wrapper import AutoScalingWrapper @@ -24,7 +25,7 @@ def test_create_group(make_stubber, error_code): min_size = 1 max_size = 3 - autoscaling_stubber.stub_create_auto_scaling_group( + autoscaling_stubber.stub_create_group( group_name, zones, launch_template_name, @@ -73,9 +74,7 @@ def test_delete_group(make_stubber, error_code): wrapper = AutoScalingWrapper(autoscaling_client) group_name = "test-group_name" - autoscaling_stubber.stub_delete_auto_scaling_group( - group_name, error_code=error_code - ) + autoscaling_stubber.stub_delete_group(group_name, error_code=error_code) if error_code is None: wrapper.delete_group(group_name) diff --git a/python/example_code/auto-scaling/test/test_scenario_groups_and_instances.py b/python/example_code/auto-scaling/test/test_scenario_groups_and_instances.py index 73546336288..063597ab143 100644 --- a/python/example_code/auto-scaling/test/test_scenario_groups_and_instances.py +++ b/python/example_code/auto-scaling/test/test_scenario_groups_and_instances.py @@ -3,10 +3,11 @@ from datetime import datetime from unittest.mock import MagicMock, patch + import boto3 +import pytest from botocore.exceptions import ClientError from botocore.stub import ANY -import pytest import scenario_groups_and_instances as scenario diff --git a/python/example_code/ec2/README.md b/python/example_code/ec2/README.md index 6271628ade1..590ff78290d 100644 --- a/python/example_code/ec2/README.md +++ b/python/example_code/ec2/README.md @@ -54,24 +54,24 @@ Code excerpts that show you how to call individual service functions. - [AssociateAddress](elastic_ip.py#L82) - [AuthorizeSecurityGroupIngress](security_group.py#L68) - [CreateKeyPair](key_pair.py#L57) -- [CreateLaunchTemplate](../../cross_service/resilient_service/auto_scaler.py#L346) +- [CreateLaunchTemplate](../../cross_service/resilient_service/auto_scaler.py#L393) - [CreateSecurityGroup](security_group.py#L42) - [DeleteKeyPair](key_pair.py#L118) -- [DeleteLaunchTemplate](../../cross_service/resilient_service/auto_scaler.py#L409) +- [DeleteLaunchTemplate](../../cross_service/resilient_service/auto_scaler.py#L458) - [DeleteSecurityGroup](security_group.py#L148) -- [DescribeAvailabilityZones](../../cross_service/resilient_service/auto_scaler.py#L438) -- [DescribeIamInstanceProfileAssociations](../../cross_service/resilient_service/auto_scaler.py#L184) +- [DescribeAvailabilityZones](../../cross_service/resilient_service/auto_scaler.py#L485) +- [DescribeIamInstanceProfileAssociations](../../cross_service/resilient_service/auto_scaler.py#L220) - [DescribeImages](instance.py#L253) - [DescribeInstanceTypes](instance.py#L274) - [DescribeInstances](instance.py#L106) - [DescribeKeyPairs](key_pair.py#L89) - [DescribeSecurityGroups](security_group.py#L108) -- [DescribeSubnets](../../cross_service/resilient_service/auto_scaler.py#L731) -- [DescribeVpcs](../../cross_service/resilient_service/auto_scaler.py#L630) +- [DescribeSubnets](../../cross_service/resilient_service/auto_scaler.py#L842) +- [DescribeVpcs](../../cross_service/resilient_service/auto_scaler.py#L702) - [DisassociateAddress](elastic_ip.py#L121) -- [RebootInstances](../../cross_service/resilient_service/auto_scaler.py#L21) +- [RebootInstances](../../cross_service/resilient_service/auto_scaler.py#L18) - [ReleaseAddress](elastic_ip.py#L162) -- [ReplaceIamInstanceProfileAssociation](../../cross_service/resilient_service/auto_scaler.py#L205) +- [ReplaceIamInstanceProfileAssociation](../../cross_service/resilient_service/auto_scaler.py#L249) - [RunInstances](instance.py#L43) - [StartInstances](instance.py#L190) - [StopInstances](instance.py#L221) diff --git a/python/example_code/elastic-load-balancing/README.md b/python/example_code/elastic-load-balancing/README.md index 1b82dd7bbd7..a38b6073b4b 100644 --- a/python/example_code/elastic-load-balancing/README.md +++ b/python/example_code/elastic-load-balancing/README.md @@ -47,13 +47,13 @@ python -m pip install -r requirements.txt Code excerpts that show you how to call individual service functions. -- [CreateListener](../../cross_service/resilient_service/load_balancer.py#L143) +- [CreateListener](../../cross_service/resilient_service/load_balancer.py#L194) - [CreateLoadBalancer](../../cross_service/resilient_service/load_balancer.py#L142) -- [CreateTargetGroup](../../cross_service/resilient_service/load_balancer.py#L67) -- [DeleteLoadBalancer](../../cross_service/resilient_service/load_balancer.py#L192) -- [DeleteTargetGroup](../../cross_service/resilient_service/load_balancer.py#L106) -- [DescribeLoadBalancers](../../cross_service/resilient_service/load_balancer.py#L46) -- [DescribeTargetHealth](../../cross_service/resilient_service/load_balancer.py#L245) +- [CreateTargetGroup](../../cross_service/resilient_service/load_balancer.py#L28) +- [DeleteLoadBalancer](../../cross_service/resilient_service/load_balancer.py#L255) +- [DeleteTargetGroup](../../cross_service/resilient_service/load_balancer.py#L84) +- [DescribeLoadBalancers](../../cross_service/resilient_service/load_balancer.py#L288) +- [DescribeTargetHealth](../../cross_service/resilient_service/load_balancer.py#L342) ### Scenarios diff --git a/python/example_code/iam/README.md b/python/example_code/iam/README.md index 54fe379d338..611634ed2e3 100644 --- a/python/example_code/iam/README.md +++ b/python/example_code/iam/README.md @@ -47,7 +47,7 @@ Code excerpts that show you how to call individual service functions. - [AttachUserPolicy](user_wrapper.py#L107) - [CreateAccessKey](access_key_wrapper.py#L21) - [CreateAccountAlias](account_wrapper.py#L23) -- [CreateInstanceProfile](../../cross_service/resilient_service/auto_scaler.py#L86) +- [CreateInstanceProfile](../../cross_service/resilient_service/auto_scaler.py#L154) - [CreatePolicy](policy_wrapper.py#L25) - [CreatePolicyVersion](policy_wrapper.py#L79) - [CreateRole](role_wrapper.py#L23) @@ -55,7 +55,7 @@ Code excerpts that show you how to call individual service functions. - [CreateUser](user_wrapper.py#L25) - [DeleteAccessKey](access_key_wrapper.py#L47) - [DeleteAccountAlias](account_wrapper.py#L44) -- [DeleteInstanceProfile](../../cross_service/resilient_service/auto_scaler.py#L259) +- [DeleteInstanceProfile](../../cross_service/resilient_service/auto_scaler.py#L310) - [DeletePolicy](policy_wrapper.py#L61) - [DeleteRole](role_wrapper.py#L102) - [DeleteUser](user_wrapper.py#L46) From b7888f95d4d4a8340b6784a5b475d28e3678d1e3 Mon Sep 17 00:00:00 2001 From: David Souther Date: Fri, 6 Sep 2024 13:07:05 -0400 Subject: [PATCH 76/98] Rust: Update localstack and dynamodb-local examples for Guide updates. (#6760) * Rust: Update localstack and dynamodb-local examples for Guide updates. --- .doc_gen/metadata/dynamodb_metadata.yaml | 18 +++++ rustv1/examples/dynamodb/README.md | 13 ++++ .../dynamodb/src/bin/list-tables-local.rs | 44 ++++++------- rustv1/examples/localstack/Cargo.toml | 11 ++-- rustv1/examples/localstack/aws_config | 6 ++ .../localstack/src/bin/use-localstack.rs | 66 ++++--------------- 6 files changed, 76 insertions(+), 82 deletions(-) create mode 100644 rustv1/examples/localstack/aws_config diff --git a/.doc_gen/metadata/dynamodb_metadata.yaml b/.doc_gen/metadata/dynamodb_metadata.yaml index fc2f262668b..10c0d001e5e 100644 --- a/.doc_gen/metadata/dynamodb_metadata.yaml +++ b/.doc_gen/metadata/dynamodb_metadata.yaml @@ -2309,3 +2309,21 @@ dynamodb_MidLevelInterface: - dynamodb.dotnetv3.MidLevelQueryAndScanExample services: dynamodb: {} +dynamodb_local: + title: Connect to a local &DDB; instance using an &AWS; SDK + title_abbrev: Connect to a local instance + synopsis: override an endpoint URL to connect to a local development deployment of &DDB; and an &AWS; SDK. + guide_topic: + title: DynamoDB Local + url: amazondynamodb/latest/developerguide/DynamoDBLocal.html + category: Scenarios + languages: + Rust: + versions: + - sdk_version: 1 + github: rustv1/examples/dynamodb + excerpts: + - snippet_files: + - rustv1/examples/dynamodb/src/bin/list-tables-local.rs + services: + dynamodb: {} diff --git a/rustv1/examples/dynamodb/README.md b/rustv1/examples/dynamodb/README.md index ac17834fd6c..f1d2f5b1ec8 100644 --- a/rustv1/examples/dynamodb/README.md +++ b/rustv1/examples/dynamodb/README.md @@ -46,6 +46,7 @@ Code excerpts that show you how to call individual service functions. Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. +- [Connect to a local instance](src/bin/list-tables-local.rs) - [Query a table using PartiQL](src/bin/partiql.rs) @@ -62,6 +63,18 @@ functions within the same service. +#### Connect to a local instance + +This example shows you how to override an endpoint URL to connect to a local development deployment of DynamoDB and an AWS SDK. + + + + + + + + + #### Query a table using PartiQL This example shows you how to do the following: diff --git a/rustv1/examples/dynamodb/src/bin/list-tables-local.rs b/rustv1/examples/dynamodb/src/bin/list-tables-local.rs index 349de2761c8..213ef95cdf4 100644 --- a/rustv1/examples/dynamodb/src/bin/list-tables-local.rs +++ b/rustv1/examples/dynamodb/src/bin/list-tables-local.rs @@ -1,36 +1,34 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -#![allow(clippy::result_large_err)] - // snippet-start:[dynamodb.rust.list-tables-local] -use aws_config::BehaviorVersion; -use aws_sdk_dynamodb::{Client, Error}; - -/// Lists your tables in DynamoDB local. +/// Lists your tables from a local DynamoDB instance by setting the SDK Config's +/// endpoint_url and test_credentials. #[tokio::main] -async fn main() -> Result<(), Error> { - let config = aws_config::defaults(BehaviorVersion::latest()) +async fn main() { + tracing_subscriber::fmt::init(); + + // snippet-start:[dynamodb.rust.list-tables-local.client_config] + let config = aws_config::defaults(aws_config::BehaviorVersion::latest()) .test_credentials() + // DynamoDB run locally uses port 8000 by default. + .endpoint_url("http://localhost:8000") .load() .await; - let dynamodb_local_config = aws_sdk_dynamodb::config::Builder::from(&config) - // Override the endpoint in the config to use a local dynamodb server. - .endpoint_url( - // DynamoDB run locally uses port 8000 by default. - "http://localhost:8000", - ) - .build(); + let dynamodb_local_config = aws_sdk_dynamodb::config::Builder::from(&config).build(); - let client = Client::from_conf(dynamodb_local_config); + let client = aws_sdk_dynamodb::Client::from_conf(dynamodb_local_config); + // snippet-end:[dynamodb.rust.list-tables-local.client_config] - let resp = client.list_tables().send().await?; - - println!("Found {} tables", resp.table_names().len()); - for name in resp.table_names() { - println!(" {}", name); + let list_resp = client.list_tables().send().await; + match list_resp { + Ok(resp) => { + println!("Found {} tables", resp.table_names().len()); + for name in resp.table_names() { + println!(" {}", name); + } + } + Err(err) => eprintln!("Failed to list local dynamodb tables: {err:?}"), } - - Ok(()) } // snippet-end:[dynamodb.rust.list-tables-local] diff --git a/rustv1/examples/localstack/Cargo.toml b/rustv1/examples/localstack/Cargo.toml index 7e288f30bc2..65254851e4f 100644 --- a/rustv1/examples/localstack/Cargo.toml +++ b/rustv1/examples/localstack/Cargo.toml @@ -2,14 +2,11 @@ [package] name = "localstack-example" version = "0.1.0" -authors = ["Doug Schwartz "] edition = "2021" [dependencies] -aws-config = { version = "1.0.1", features = ["behavior-version-latest"] } -aws-sdk-s3 = { version = "1.4.0" } -aws-sdk-sqs = { version = "1.3.0" } -tokio = { version = "1.20.1", features = ["full"] } -http = "0.2" -tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } +aws-config = { version = "1", features = ["behavior-version-latest"] } +aws-sdk-s3 = { version = "1" } +tokio = { version = "1", features = ["full"] } +tracing-subscriber = { version = "0.3", features = ["env-filter"] } # snippet-end:[localstack.rust.use-localstack-cargo.toml] diff --git a/rustv1/examples/localstack/aws_config b/rustv1/examples/localstack/aws_config new file mode 100644 index 00000000000..bd2049af88d --- /dev/null +++ b/rustv1/examples/localstack/aws_config @@ -0,0 +1,6 @@ +# snippet-start:[localstack.rust.aws_config] +[profile localstack] +region=us-east-1 +output=json +endpoint_url = http://localhost:4566 +# snippet-end:[localstack.rust.aws_config] \ No newline at end of file diff --git a/rustv1/examples/localstack/src/bin/use-localstack.rs b/rustv1/examples/localstack/src/bin/use-localstack.rs index 8af03119e1a..73616b546fe 100644 --- a/rustv1/examples/localstack/src/bin/use-localstack.rs +++ b/rustv1/examples/localstack/src/bin/use-localstack.rs @@ -11,65 +11,27 @@ use std::error::Error; async fn main() -> Result<(), Box> { tracing_subscriber::fmt::init(); - let mut shared_config = aws_config::defaults(BehaviorVersion::latest()); - if use_localstack() { - shared_config = shared_config.endpoint_url(LOCALSTACK_ENDPOINT); - }; - let shared_config = shared_config.load().await; + // snippet-start:[localstack.rust.use-localstack.config] + // set the environment variable `AWS_PROFILE=localstack` when running + // the application to source `endpoint_url` and point the SDK at the + // localstack instance + let config = aws_config::defaults(BehaviorVersion::latest()).load().await; - let sqs_client = sqs_client(&shared_config); - let s3_client = s3_client(&shared_config); + let s3_config = aws_sdk_s3::config::Builder::from(&config) + .force_path_style(true) + .build(); - let resp = s3_client.list_buckets().send().await?; + let s3 = aws_sdk_s3::Client::from_conf(s3_config); + // snippet-end:[localstack.rust.use-localstack.config] + + let resp = s3.list_buckets().send().await?; let buckets = resp.buckets(); - let num_buckets = buckets.len(); - println!("Buckets:"); + println!("Found {} buckets:", buckets.len()); for bucket in buckets { - println!(" {}", bucket.name().unwrap_or_default()); - } - - println!(); - println!("Found {} buckets.", num_buckets); - println!(); - - let repl = sqs_client.list_queues().send().await?; - let queues = repl.queue_urls(); - let num_queues = queues.len(); - - println!("Queue URLs:"); - for queue in queues { - println!(" {}", queue); - } - - println!(); - println!("Found {} queues.", num_queues); - println!(); - - if use_localstack() { - println!("Using the local stack."); + println!("\t{:?}", bucket.name()); } Ok(()) } - -/// If LOCALSTACK environment variable is true, use LocalStack endpoints. -/// You can use your own method for determining whether to use LocalStack endpoints. -fn use_localstack() -> bool { - std::env::var("LOCALSTACK").unwrap_or_default() == "true" -} - -const LOCALSTACK_ENDPOINT: &str = "http://localhost:4566/"; - -fn sqs_client(conf: &aws_config::SdkConfig) -> aws_sdk_sqs::Client { - // Copy config from aws_config::SdkConfig to aws_sdk_sqs::Config - let sqs_config_builder = aws_sdk_sqs::config::Builder::from(conf); - aws_sdk_sqs::Client::from_conf(sqs_config_builder.build()) -} - -fn s3_client(conf: &aws_config::SdkConfig) -> aws_sdk_s3::Client { - // Copy config from aws_config::SdkConfig to aws_sdk_s3::Config - let s3_config_builder = aws_sdk_s3::config::Builder::from(conf); - aws_sdk_s3::Client::from_conf(s3_config_builder.build()) -} // snippet-end:[localstack.rust.use-localstack] From 73cb1ba5383e54df84e7dc8a961f599668f4bdb0 Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Fri, 6 Sep 2024 13:56:18 -0400 Subject: [PATCH 77/98] JavaScript (v3): Rekognition, DDB - Remove unhelpful examples (#6817) * JavaScript (v3): Rekognition - Delete Rekognition PPE app The rekognition PPE app is not much different from the photo analyzer cross service example. The only difference is the action used analyze the photos. The example also used outdated jquery versions, and needed heavy refactoring. There are no usages of this app in a dev guide so I'm removing it. * JavaScript (v3): DynamoDB - Remove item tracker cross service example The item tracker example was an express app showing basic usage of DynamoDB. It also had deprecated versions of jquery and needed heavy refactoring to be up to standard. Other examples cover the DynamoDB usage more thoroughly, and this example isn't being referenced anywhere. * JavaScript (v3): Rekognition - Remove video analyzer While we don't have other examples of analyzing video, it's a simple call that's covered by SDK reference docs. This example is using deprecated versions of jquery, is documented incorrectly, needs heavy refactoring, and is showcasing bad practices by doing so much processing on the client side. Deleting this for now as I believe it's anti-helpful to customers. --- ...s_DynamoDBDataTracker_JavaScript_block.xml | 14 - ...itionPhotoAnalyzerPPE_JavaScript_block.xml | 23 - ...ognitionVideoAnalyzer_JavaScript_block.xml | 23 - .doc_gen/metadata/cross_metadata.yaml | 15 - .../cross-services/ddb-item-tracker/README.md | 778 ------------------ .../cross-services/ddb-item-tracker/app.js | 269 ------ .../ddb-item-tracker/images/additems.png | Bin 32446 -> 0 bytes .../images/cloud_formation_resources_tab.png | Bin 116124 -> 0 bytes .../images/cloud_formation_stacks.png | Bin 43167 -> 0 bytes .../ddb-item-tracker/images/homepage.png | Bin 120627 -> 0 bytes .../ddb-item-tracker/images/homepage2.png | Bin 87302 -> 0 bytes .../images/identity_pool_ids.png | Bin 68165 -> 0 bytes .../images/item_tracker_projects.png | Bin 7469 -> 0 bytes .../ddb-item-tracker/images/pic1.png | Bin 21966 -> 0 bytes .../ddb-item-tracker/images/pic10.png | Bin 13442 -> 0 bytes .../ddb-item-tracker/images/pic11.png | Bin 17110 -> 0 bytes .../ddb-item-tracker/images/pic12.png | Bin 112598 -> 0 bytes .../ddb-item-tracker/images/pic13.png | Bin 25567 -> 0 bytes .../ddb-item-tracker/images/pic14.png | Bin 15916 -> 0 bytes .../ddb-item-tracker/images/pic1a.png | Bin 20037 -> 0 bytes .../ddb-item-tracker/images/pic2.png | Bin 8865 -> 0 bytes .../ddb-item-tracker/images/pic3.png | Bin 108519 -> 0 bytes .../ddb-item-tracker/images/pic3a.png | Bin 91852 -> 0 bytes .../ddb-item-tracker/images/pic4.png | Bin 46223 -> 0 bytes .../ddb-item-tracker/images/pic5.png | Bin 55216 -> 0 bytes .../ddb-item-tracker/images/pic6.png | Bin 25521 -> 0 bytes .../ddb-item-tracker/images/pic7.png | Bin 50610 -> 0 bytes .../ddb-item-tracker/images/pic8.png | Bin 11103 -> 0 bytes .../ddb-item-tracker/images/pic9.png | Bin 11112 -> 0 bytes .../ddb-item-tracker/images/project.png | Bin 11447 -> 0 bytes .../ddb-item-tracker/images/project1.png | Bin 14994 -> 0 bytes .../ddb-item-tracker/images/project2.png | Bin 25541 -> 0 bytes .../ddb-item-tracker/images/worktable.png | Bin 65117 -> 0 bytes .../ddb-item-tracker/package.json | 29 - .../ddb-item-tracker/public/add.html | 126 --- .../ddb-item-tracker/public/css/button.css | 136 --- .../ddb-item-tracker/public/css/col.css | 43 - .../ddb-item-tracker/public/css/common.css | 48 -- .../ddb-item-tracker/public/css/styles.css | 29 - .../dynamoAppHelperFiles/create-table.js | 55 -- .../ddb-item-tracker/public/index.html | 114 --- .../ddb-item-tracker/public/items.html | 273 ------ .../ddb-item-tracker/public/js/items.js | 223 ----- .../public/libs/ddbDocClient.js | 41 - .../public/libs/dynamoClient.js | 35 - .../ddb-item-tracker/public/libs/s3Client.js | 35 - .../ddb-item-tracker/public/libs/sesClient.js | 35 - .../ddb-item-tracker/setup.yaml | 186 ----- .../photo-analyzer-ppe/README.md | 455 ---------- .../helper_functions/js/upload-objects.js | 62 -- .../photo-analyzer-ppe/images/lam.png | Bin 6364 -> 0 bytes .../images/readme_images/IAMPerm.png | Bin 31037 -> 0 bytes .../images/readme_images/classes.png | Bin 12757 -> 0 bytes .../images/readme_images/classesA.png | Bin 10119 -> 0 bytes .../cloud_formation_resources_tab.png | Bin 116124 -> 0 bytes .../readme_images/cloud_formation_stacks.png | Bin 43167 -> 0 bytes .../images/readme_images/dynamodb.png | Bin 80346 -> 0 bytes .../images/readme_images/email.png | Bin 9027 -> 0 bytes .../readme_images/identity_pool_ids.png | Bin 68165 -> 0 bytes .../images/readme_images/jar.png | Bin 27635 -> 0 bytes .../images/readme_images/lambda.png | Bin 20346 -> 0 bytes .../images/readme_images/project.png | Bin 14249 -> 0 bytes .../photo-analyzer-ppe/index.html | 66 -- .../photo-analyzer-ppe/js/index.js | 183 ---- .../photo-analyzer-ppe/libs/dynamoDBClient.js | 35 - .../libs/rekognitionClient.js | 34 - .../photo-analyzer-ppe/libs/s3Client.js | 34 - .../photo-analyzer-ppe/libs/sesClient.js | 34 - .../photo-analyzer-ppe/package.json | 27 - .../cross-services/video-analyzer/README.md | 578 ------------- .../video-analyzer/package.json | 30 - .../cross-services/video-analyzer/setup.yaml | 271 ------ .../video-analyzer/src/css/styles.css | 29 - .../video-analyzer/src/images/pic0.png | Bin 42183 -> 0 bytes .../video-analyzer/src/images/pic1.png | Bin 69151 -> 0 bytes .../video-analyzer/src/images/pic2.png | Bin 60659 -> 0 bytes .../video-analyzer/src/images/pic3.png | Bin 65214 -> 0 bytes .../video-analyzer/src/images/pic4png.png | Bin 15683 -> 0 bytes .../video-analyzer/src/images/pic5.png | Bin 20247 -> 0 bytes .../video-analyzer/src/images/pic6.png | Bin 20923 -> 0 bytes .../video-analyzer/src/index.html | 107 --- .../video-analyzer/src/js/index.js | 272 ------ .../src/libs/rekognitionClient.js | 34 - .../video-analyzer/src/libs/s3Client.js | 34 - .../video-analyzer/src/libs/sesClient.js | 34 - 85 files changed, 4849 deletions(-) delete mode 100644 .doc_gen/cross-content/cross_DynamoDBDataTracker_JavaScript_block.xml delete mode 100644 .doc_gen/cross-content/cross_RekognitionPhotoAnalyzerPPE_JavaScript_block.xml delete mode 100644 .doc_gen/cross-content/cross_RekognitionVideoAnalyzer_JavaScript_block.xml delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/README.md delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/app.js delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/additems.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/cloud_formation_resources_tab.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/cloud_formation_stacks.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/homepage.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/homepage2.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/identity_pool_ids.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/item_tracker_projects.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic1.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic10.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic11.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic12.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic13.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic14.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic1a.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic2.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic3.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic3a.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic4.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic5.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic6.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic7.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic8.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic9.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/project.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/project1.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/project2.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/images/worktable.png delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/package.json delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/add.html delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/button.css delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/col.css delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/common.css delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/styles.css delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/dynamoAppHelperFiles/create-table.js delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/index.html delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/items.html delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/js/items.js delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/ddbDocClient.js delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/dynamoClient.js delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/s3Client.js delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/sesClient.js delete mode 100644 javascriptv3/example_code/cross-services/ddb-item-tracker/setup.yaml delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/README.md delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/helper_functions/js/upload-objects.js delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/lam.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/IAMPerm.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/classes.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/classesA.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/cloud_formation_resources_tab.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/cloud_formation_stacks.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/dynamodb.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/email.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/identity_pool_ids.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/jar.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/lambda.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/project.png delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/index.html delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/js/index.js delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/dynamoDBClient.js delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/rekognitionClient.js delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/s3Client.js delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/sesClient.js delete mode 100644 javascriptv3/example_code/cross-services/photo-analyzer-ppe/package.json delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/README.md delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/package.json delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/setup.yaml delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/css/styles.css delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/images/pic0.png delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/images/pic1.png delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/images/pic2.png delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/images/pic3.png delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/images/pic4png.png delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/images/pic5.png delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/images/pic6.png delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/index.html delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/js/index.js delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/libs/rekognitionClient.js delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/libs/s3Client.js delete mode 100644 javascriptv3/example_code/cross-services/video-analyzer/src/libs/sesClient.js diff --git a/.doc_gen/cross-content/cross_DynamoDBDataTracker_JavaScript_block.xml b/.doc_gen/cross-content/cross_DynamoDBDataTracker_JavaScript_block.xml deleted file mode 100644 index 6a27bafdfbd..00000000000 --- a/.doc_gen/cross-content/cross_DynamoDBDataTracker_JavaScript_block.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - %phrases-shared; - ]> - - - Shows how to use the &DDBlong; API to create a dynamic web application that tracks &DDB; work data. - - - For complete source code and instructions on how to set up and run, see the full example on - GitHub. - - \ No newline at end of file diff --git a/.doc_gen/cross-content/cross_RekognitionPhotoAnalyzerPPE_JavaScript_block.xml b/.doc_gen/cross-content/cross_RekognitionPhotoAnalyzerPPE_JavaScript_block.xml deleted file mode 100644 index 79214cf1a38..00000000000 --- a/.doc_gen/cross-content/cross_RekognitionPhotoAnalyzerPPE_JavaScript_block.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - %phrases-shared; - ]> - - - Shows how to use &REK; with the &JSBlong; to create an application to detect personal protective equipment (PPE) in images - located in an &S3long; (&S3;) bucket. The app saves the results to an &DDBlong; table, and sends the admin an email notification with the results - using &SESlong; (&SES;). - - Learn how to: - - Create an unauthenticated user using &COG;. - Analyze images for PPE using &REK;. - Verify an email address for &SES;. - Update a &DDB; table with results. - Send an email notification using &SES;. - - For complete source code and instructions on how to set up and run, see the full example on - GitHub. - - diff --git a/.doc_gen/cross-content/cross_RekognitionVideoAnalyzer_JavaScript_block.xml b/.doc_gen/cross-content/cross_RekognitionVideoAnalyzer_JavaScript_block.xml deleted file mode 100644 index a931751e595..00000000000 --- a/.doc_gen/cross-content/cross_RekognitionVideoAnalyzer_JavaScript_block.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - %phrases-shared; - ]> - - - Shows how to use &REK; with the &JSBlong; to create an app to detect faces and objects in videos - located in an &S3long; (&S3;) bucket. The app sends the admin an email notification with the results - using &SESlong; (&SES;). - - Learn how to: - - Create an unauthenticated user using &COG;. - Analyze images for PPE using &REK;. - Verify an email address for &SES;. - Send an email notification using &SES;. - - - For complete source code and instructions on how to set up and run, see the full example on - GitHub. - - diff --git a/.doc_gen/metadata/cross_metadata.yaml b/.doc_gen/metadata/cross_metadata.yaml index f32e659be8c..cd51d9f6e0e 100644 --- a/.doc_gen/metadata/cross_metadata.yaml +++ b/.doc_gen/metadata/cross_metadata.yaml @@ -235,10 +235,6 @@ cross_DynamoDBDataTracker: - sdk_version: 3 github: python/cross_service/dynamodb_item_tracker block_content: cross_DynamoDBDataTracker_Python_block.xml - JavaScript: - versions: - - sdk_version: 3 - block_content: cross_DynamoDBDataTracker_JavaScript_block.xml service_main: dynamodb services: dynamodb: @@ -475,10 +471,6 @@ cross_RekognitionPhotoAnalyzerPPE: versions: - sdk_version: 2 block_content: cross_RekognitionLambdPPE_Java_block.xml - JavaScript: - versions: - - sdk_version: 3 - block_content: cross_RekognitionPhotoAnalyzerPPE_JavaScript_block.xml service_main: rekognition services: rekognition: @@ -531,13 +523,6 @@ cross_RekognitionVideoDetection: add_services: s3: ses: - JavaScript: - versions: - - sdk_version: 3 - block_content: cross_RekognitionVideoAnalyzer_JavaScript_block.xml - add_services: - s3: - ses: Python: versions: - sdk_version: 3 diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/README.md b/javascriptv3/example_code/cross-services/ddb-item-tracker/README.md deleted file mode 100644 index be9c9ba8add..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/README.md +++ /dev/null @@ -1,778 +0,0 @@ -# Create an Amazon DynamoDB item tracker web application - -## Overview - -| Heading | Description | -| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| Description | Dicusses how to develop a dynamic web application that tracks and reports on Amazon DynamoDB data by using the AWS SDK for JavaScript V3. | -| Audience | Developer (beginner / intermediate) | -| Updated | 1/14/2022 | -| Required Skills | JavaScript, Node.js | - -## Purpose - -You can develop a web application to track and report on work items -using the AWS SDK for JavaScript version 3 to access the following services: - -- Amazon DynamoDB to store the data -- Amazon Simple Email Service (Amazon SES) to send email messages -- Amazon Simple Storage Service (Amazon S3) -- Amazon Cognito -- AWS Identity and Access Management (IAM) - -**Note:** In this tutorial, we use the AWS SDK for JavaScript version 3 to access these services. - -The application you create is named **DynamoDB Item Tracker**, and uses the [Express web framework for Node.js](https://expressjs.com/). - -This tutorial guides you through creating the **DynamoDB Item Tracker** application. It shows you how to deploy the app locally. - -#### Topics - -- [Understand the AWS tracker application](#understand-the-aws-tracker-application) -- [Prerequisites](#prerequisites) -- [Create the resources](#create-the-resources) -- [Run the app](#run-the-app) -- [About the project files](#about-the-project-files) -- [Destroy the resources](#destroy-the-resources) - -## Understand the AWS tracker application - -The **DynamoDB Item Tracker** application uses a model that is based on a work item and contains these attributes: - -- **date** - The start date of the item. -- **description** - The description of the item. -- **guide** - The deliverable that this item has an impact on. -- **username** - The person who performs the work item. -- **status** - The status of the item. - -When a user opens the application, they see the **Home** page. - -![AWS Tracking Application](images/homepage2.png) - -#### Application functionality - -A user can perform these tasks in the **DynamoDB Item Tracker** application: - -- Enter an item -- View all items -- Modify items -- Send a report to an email recipient - -The following figure shows the new item section. - -![AWS Tracking Application](images/additems.png) - -A user can retrieve _active_ or _archive_ items. For example, a user can choose **Get Active Items** to get a dataset that's retrieved from the DynamoDB **Work** table and displayed in the web application. - -![AWS Tracking Application](images/pic5.png) - -The user can select the email recipient from the **Select Manager** list and choose **Send Report** (see the list in the previous figure). The email contains -a link to the Amazon S3 bucket with the table as a .CSV file. - -![AWS Tracking Application](images/pic6.png) - -#### Work table - -The DynamoDB table is named **Work** and contains the following fields: - -- **id** - Represents the key. -- **date** - Specifies the date the item was created. -- **description** - A value that describes the item. -- **guide** - A value that represents the deliverable being worked on. -- **status** - A value that describes the status. - -## Build the app - -### Prerequisites - -To complete the tutorial, you need the following: - -- An AWS account -- A JavaScript IDE - -#### Important - -- The AWS services included in this document are included in the [AWS Free Tier](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc). -- This code has not been tested in all AWS Regions. Some AWS services are available only in specific regions. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). -- Running this code might result in charges to your AWS account. -- Be sure to terminate the resources you create while going through this tutorial to ensure that you’re not charged. - -### Create the resources - -You need the following resources for this app: - -1. An Amazon Cognito unauthenticated user role. -2. IAM permissions attached to the user role. -3. An Amazon DynamoDB table named 'Work', with a primary key named 'id', of type 'STRING'. -4. An Amazon S3 bucket (this is used to store the CSV file). -5. Two email addresses verified in Amazon SES. - -You can create the AWS resources required for this cross-service example using either of the following: - -- [Option 1: AWS CloudFormation](#create-the-resources-using-cloudformation) -- [Option 2: The AWS Management Console](#create-the-resources-using-the-aws-management-console) - -####
      Option 1: Create the resources using CloudFormation - -You can run a single CloudFormation script to provision all the required resources for this example. - -1. Install and configure the AWS CLI following the instructions in the AWS CLI User Guide. - -2. Open a command prompt in the **./ddb-item-tracker** folder. - -3. Run the following command, replacing _STACK_NAME_ with a unique name for the stack. - -``` -aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM -``` - -**Important**: The stack name must be unique within an AWS Region and AWS account. You can specify up to 128 characters, and numbers and hyphens are allowed. - -To see your stack, do the following: - -1. Open [AWS CloudFormation in the AWS Management Console](https://console.aws.amazon.com/cloudformation/), and open the **Stacks** page, and chose the **Resources** tab. - -![ ](images/cloud_formation_stacks.png) - -2. Choose the **Resources** tab. The resources required for this cross-service example are listed in the **Physical ID** column. - -![ ](images/cloud_formation_resources_tab.png) - -For more information on the create-stack command parameters, see the [AWS CLI Command Reference guide](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html), and the [AWS CloudFormation User Guide](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html). - -#### Option 2: Create the resources using the AWS Management Console - -#### 1. Create an unauthenticated user role - -1. Open the [AWS Cognito in the AWS Management Console](https://console.aws.amazon.com/cognito). -2. Choose **Manage Identity Pools**. -3. Choose **Create new identity pool**. -4. In the **Identity pool name** field, give your identity pool a name. -5. Select the **Enable access to unauthenticated identities** checkbox. -6. Choose **Create Pool**. -7. Choose **Allow**. -8. Take note of the **Identity pool ID**, which is highlighted in red in the **Get AWS Credentials** section. - -![ ](images/identity_pool_ids.png) - -9.Choose **Edit identity pool**. - -10. Take note of the name of the role in the **Unauthenticated role** field. - -#### 2. Adding permissions to an unauthenticated user role - -1. Open [IAM in the AWS Management Console](https://console.aws.amazon.com/iam/), and open the _Roles_ page. -2. Search for the unauthenticated role you just created. -3. Open the role. -4. Click the down arrow beside the policy name. -5. Choose **Edit Policy**. -6. Choose the **JSON** tab. -7. Delete the existing content, and paste the code below into it. - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Action": ["mobileanalytics:PutEvents", "cognito-sync:*"], - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "ses:SendEmail", - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": ["s3:PutObject", "s3:CreateBucket"], - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": ["dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:Scan"], - "Resource": "*", - "Effect": "Allow" - } - ] -} -``` - -8. Choose **Review Policy**. -9. Choose **Save Changes**. - -#### 3. Create the Amazon DynamoDB table - -Create an Amazon DynamoDB table named **Work** with a key named **id**. For information, see [dynamoAppHelperFiles folder](#dynamoAppHelperFiles-folder). - -#### 4. Verify to and from email address on Amazon SES - -This example requires a minimum of two verified email address. - -To verify an email address: - -1. Open [AWS SES in the AWS Management Console](https://console.aws.amazon.com/ses/), and open the **Email Addresses** page. -2. Choose **Verify a New Email Address**. -3. Enter a working email address, and choose **Verify This Email Address**. -4. Open the email in your email application, and verify it. - -## Run the app - -1. Clone the [AWS Code Examples Repository](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. - See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for - instructions. - -2. Install the dependencies listed in the [root]/javascriptv3/example_code/cross-services/ddb-item-tracker/package.json. - -**Note**: These include both AWS SDK for JavaScript v3 client modules and third-party Node.js modules. - -``` -npm install node -g -cd javascriptv3/example_code/cross-services/ddb-item-tracker -npm install -``` - -3. Open **items.js**, and replace the following: - 1. **TABLE_NAME** with the name of the table - 2. **BUCKET_NAME** with the name of the Amazon S3 bucket - 3. **SENDER_EMAIL_ADDRESS** with the address of the email sender. This address must first be verified on Amazon SES. -4. Start the app. - -``` -node app.js -``` - -The app is now running at [http://localhost:3000/index.html](http://localhost:3000). - -## About the project files - -The following figure shows you the structure of the project. - -![AWS Tracking Application](images/item_tracker_projects.png) - -- **images**: contains images used by this tutorial. You can safely delete it from your project. -- **public folder**: contains most of the code for the app. See [Folder in the public folder](#folders-in-the-public-folder) for more details. -- **app.js**: the main file in the app. It interacts with the Express web framework to execute code. See [app js file](#app-js-file) for more details. -- **package.json**: defines functional attributes of a project that npm uses to install dependencies. -- **README.md**: the page you're reading. -- **setup.yaml**: the CloudFormation script used to create the resources for this project. See [Create the resources](#create-the-resources) for more details. - -### Folders in the public folder - -#### css folder - -Contains the CSS style files for the app. - -#### dynamoAppHelperFiles folder - -Contains a script that creates a table using the AWS SDK for JavaScript (v3). - -To create the table for the app: 2. Update the client files in the **libs** folder as described in [libs folder](#libs-folder). 3. Change **TABLE_NAME** to **Work**, and enter the following in the command line: - -``` - cd javascriptv3/example_code/cross-services/ddb-item-tracker/public/dynamoAppHelperFiles - node create-table.js -``` - -#### js folder - -Contains **items.js folder**, which contains all the functions triggered by buttons in the app. - -- **GetItems()** - sends an Ajax post request to the '/request' route defined in the **app.js**, which returns all the items in the table. - The items are then posted to the UI table using [DataTables](https://cdn.datatables.net/). - -```javascript -function GetItems() { - $.ajax("/request", { - type: "POST", - success: function (data, status, xhr) { - console.log("it works"); - console.log("data.Items", data.Items); - - // Enable the buttons. - $("#singlebutton").prop("disabled", false); - $("#updatebutton").prop("disabled", false); - $("#reportbutton").prop("disabled", false); - $("#reportbutton").css("color", "#FFFFFF"); - $("#singlebutton").css("color", "#FFFFFF"); - $("#updatebutton").css("color", "#FFFFFF"); - - $("#myTable").dataTable({ - bAutoWidth: false, - aaData: data.Items, - bDestroy: true, - columns: [ - { - data: "id", - }, - { - data: "guide", - }, - { - data: "date", - }, - { - data: "description", - }, - { - data: "status", - }, - ], - }); - document.getElementById("info3").innerHTML = "Active Items"; - }, - error: function (jqXhr, textStatus, errorMessage) { - $("p").append("Error" + errorMessage); - }, - }); -} -``` - -- **Report()** - sends an Ajax post request to the '/request' route in the **app.js**, which scans the table and gets the items. The - function then iterates through the data table, parses it into a CSV compatible format, and creates the CSV. - The function then sends an Ajax post request to the '/uploadCSV' route in the **app.js**, which uploads the CSV file to the - Amazon S3 bucket, then sends an email to the email address selected from the **Manager** dropdown on the **Basic dialog** on the - **Add** page of the app. The email contains a link to the CSV file uploaded to the Amazon S3 bucket. - -```javascript -function Report() { - // Get the email address. - const e = document.getElementById("manager"); - const value = e.options[e.selectedIndex].value; // get selected option value - const email = e.options[e.selectedIndex].text; - - $.ajax("/request", { - type: "POST", - success: function (data, status, xhr) { - console.log("it works"); - console.log("data.Items", data.Items); - - const tableArray = []; - const noOfItems = data.Items.length; - var csv = "Item, Guide, Date Created, Description, Status,\n"; - var i; - for (i = 0; i < noOfItems; i++) { - csv += '"' + data.Items[i].id + '",'; - csv += '"' + data.Items[i].guide + '",'; - csv += '"' + data.Items[i].date + '",'; - csv += '"' + data.Items[i].description + '"'; - csv += '"' + data.Items[i].status + '"'; - csv += "\n"; - } - console.log("csv", csv); - - // Merge the data with CSV. - - // Upload the CSV file to Amazon S3. - $.ajax("/uploadCSV", { - type: "POST", - data: { csv: csv, email: email }, - success: function (data, status, xhr) { - console.log("CSV uploaded."); - $.ajax("/report", { - type: "POST", - data: "email=" + email, - success: function (data, status, xhr) { - alert("Email message sent."); - }, - error: function (jqXhr, textStatus, errorMessage) { - $("p").append("Error" + errorMessage); - }, - }); - }, - }); - }, - error: function (jqXhr, textStatus, errorMessage) { - $("p").append("Error" + errorMessage); - }, - }); -} -``` - -- **GetSingleItem()** - gets the selected table item's details and puts them in the **Modify item** form on the UI. - -```javascript -function GetSingleItem() { - if (!document.getElementsByClassName("selected").length) { - alert("Please select an item from the table"); - return; - } - const id = - document.getElementsByClassName("selected")[0].childNodes[0].innerHTML; - document.getElementById("id").value = id; - const description = - document.getElementsByClassName("selected")[0].childNodes[4].innerHTML; - document.getElementById("description").value = description; - const status = - document.getElementsByClassName("selected")[0].childNodes[3].innerHTML; - document.getElementById("status").value = status; - $("#modform").show(); -} -``` - -- **UpdateItem()** - gets the updated item's details from the **Modify item** form on the UI and updates them in the **Work** table. To do this - it sends an Ajax post request to the '/changewi' route defined in the **app.js** - -```javascript -function UpdateItem() { - $("#modform").show(); - const id = document.getElementById("id").value; - const description = document.getElementById("description").value; - const status = document.getElementById("status").value; - - if (id == "") { - alert("Please select an item from the table"); - return; - } - - if (description.length > 350) { - alert("Description has too many characters"); - return; - } - - if (status.length > 350) { - alert("Status has too many characters"); - return; - } - - $.ajax("/changewi", { - type: "POST", - data: "id=" + id + "&description=" + description + "&status=" + status, - success: function (data, status, xhr) { - var msg = event.target.responseText; - alert("You have successfully modified the item."); - console.log("modified", data.id); - - $("#id").val(""); - $("#description").val(""); - $("#status").val(""); - - //Refresh the grid. - GetItems(); - }, - error: function (jqXhr, textStatus, errorMessage) { - $("p").append("Error" + errorMessage); - }, - }); -} -``` - -- **addItem()** - gets the new item's details from the **Add item** form and adds the item to the **Work** table. To do this, - it sends an Ajax post request to the '/add' route defined in the **app.js**. - -```javascript -function addItem() { - const guide = document.getElementById("guide").value; - const description = document.getElementById("description").value; - const status = document.getElementById("status").value; - - //var description = $("textarea#description").val(); - if (description.length > 350) { - alert("Description has too many characters"); - return; - } - if (description.length == 0) { - alert("Enter a description."); - return; - } - if (guide.length == 0) { - alert("Enter a guide."); - return; - } - if (status.length == 0) { - alert("Enter a status."); - return; - } - //var status = $("textarea#status").val(); - if (status.length > 350) { - alert("Status has too many characters"); - return; - } - - $.ajax("/add", { - type: "POST", // http GET method - data: - "guide=" + guide + "&description=" + description + "&status=" + status, - success: function (data) { - alert("You have successfully added the item."); - console.log("You have successfully added the item."); - location.reload(); - }, - error: function (jqXhr, textStatus, errorMessage) { - console.log("An error!"); - $("p").append("Error" + errorMessage); - }, - }); -} -``` - -#### libs folder - -Contains Javascript files for each AWS SDK for JavaScript module client required for the app: - -- **ddbDocClient.js** - creates a client for the Amazon DynamoDB Document Client. Update **REGION** to your - AWS Region. -- **dynamoClient.js** - creates a client for the Amazon DynamoDB. Update **REGION** to your - AWS Region, and **IDENTITY_POOL_ID** with the Amazon Cognito Idenfity Pool Id you created in [Create the resources](#create-the-resources). -- **sesClient.js** - creates a client for Amazon SES. Update **REGION** to your - AWS Region, and **IDENTITY_POOL_ID** with the Amazon Cognito Idenfity Pool Id you created in [Create the resources](#create-the-resources). - -### app js file - -The first section imports all the required modules. - -```javascript -import express from "express"; -import { v4 as uuidv4 } from "uuid"; -const port = process.env.PORT || 3000; -const app = express(); -import bodyParser from "body-parser"; -import path from "path"; -import { fileURLToPath } from "url"; -const __filename = fileURLToPath(import.meta.url); -import { UpdateCommand, PutCommand, ScanCommand } from "@aws-sdk/lib-dynamodb"; -import { dynamoClient } from "./public/libs/dynamoClient.js"; -import { ddbDocClient } from "./public/libs/ddbDocClient.js"; -import { SendEmailCommand } from "@aws-sdk/client-ses"; -import { sesClient, REGION } from "./public/libs/sesClient.js"; -``` - -The next section sets the path for the public directory. - -```javascript -const __dirname = path.dirname(__filename); -const static_path = path.join(__dirname, "/public"); -app.use(express.static(static_path)); -app.use(express.urlencoded({ extended: true })); -``` - -The next section defines the variables required for the app. Replace **TABLE_NAME** with the name of the Amazon DynamoDB table (for example, **Work**), -**BUCKET_NAME** with the name of the Amazon S3 bucket, and **SENDER_EMAIL_ADDRESS** with the address of the email sender. -This address must first be verified on Amazon SES. - -```javascript -const tableName = "TABLE_NAME"; -const bucketName = "BUCKET_NAME"; -const senderEmail = "SENDER_EMAIL_ADDRESS"; -``` - -The next section registers 'bodyParser' before it is used. - -```javascript -app.use(bodyParser.json()); -``` - -The next section defines the '/add' route, which adds a new item to the table using the Amazon DynamoDB Document Client. - -```javascript -app.post("/add", (req, res) => { - const body = req.body; - const id = uuidv4(); - const d = new Date(); - const month = d.getMonth() + 1; - const day = d.getDate(); - const todaydate = - d.getFullYear() + - "/" + - (month < 10 ? "0" : "") + - month + - "/" + - (day < 10 ? "0" : "") + - day; - const params = { - TableName: tableName, - Item: { - id: id, - guide: body.guide, - description: body.description, - status: body.status, - date: todaydate, - }, - }; - const run = async () => { - try { - const data = await ddbDocClient.send(new PutCommand(params)); - console.log("Added item:", JSON.stringify(data, null, 2)); - console.log(data); - res.contentType = "application/json"; - res.send(data); - } catch (err) { - console.error( - "Unable to add item. Error JSON:", - JSON.stringify(err, null, 2), - ); - } - }; - run(); -}); -``` - -The next section defines the '/request' route, which gets all the items from the table using the Amazon DynamoDB Document Client. - -```javascript -app.post("/request", (req, res) => { - var params = { - TableName: tableName, - }; - - const run = async () => { - try { - const data = await ddbDocClient.send(new ScanCommand(params)); - console.log("data", data); - res.send(data); - } catch (err) { - console.log("Error", err); - } - }; - run(); -}); -``` - -The next section defines the '/changewi' route, which updates a selected item on the table using the Amazon DynamoDB Document Client. - -```javascript -app.post("/changewi", (req, res) => { - const body = req.body; - console.log(req.body); - var params = { - TableName: tableName, - Key: { - id: req.body.id, - }, - UpdateExpression: "set #description=:d, #status=:s", - ExpressionAttributeValues: { - ":d": req.body.description, - ":s": req.body.status, - }, - ExpressionAttributeNames: { - "#description": "description", - "#status": "status", - }, - }; - const run = async () => { - try { - const data = await ddbDocClient.send(new UpdateCommand(params)); - res.contentType = "application/json"; - res.send(data); - } catch (err) { - console.error(err); - } - }; - run(); -}); -``` - -The next section defines the '/uploadCSV' route, which sends an email selected from the **Manager** -dropdown on the **Basic dialog** on the **Add** page of the app. The email contains a link to the CSV file uploaded to the Amazon -S3 bucket. - -```javascript -app.post("/uploadCSV", (req, res) => { - const d = new Date(); - const month = d.getMonth() + 1; - const day = d.getDate(); - const hour = d.getHours(); - const minute = d.getMinutes(); - const todaydate = - d.getFullYear() + - (month < 10 ? "0" : "") + - month + - (day < 10 ? "0" : "") + - day + - hour + - minute; - const uploadParams = { - Bucket: bucketName, - Body: req.body.csv, - Key: "Items_" + todaydate + ".csv", - }; - const run = async () => { - try { - const data = await s3Client.send(new PutObjectCommand(uploadParams)); - const linkToCSV = - "https://s3.console.aws.amazon.com/s3/buckets/" + - uploadParams.Bucket + - "?region=" + - REGION + - "&tab=objects"; - console.log("Success. Report uploaded to " + linkToCSV + "."); - console.log("Email", req.body.email); - try { - const emailParams = { - Destination: { - /* required */ - CcAddresses: [ - /* more items */ - ], - ToAddresses: [ - req.body.email, //RECEIVER_ADDRESS - /* more To-email addresses */ - ], - }, - Message: { - /* required */ - Body: { - /* required */ - Html: { - Charset: "UTF-8", - Data: - "

      Hello!

      " + - "

      The CSV has been uploaded to here.

      ", - }, - }, - Subject: { - Charset: "UTF-8", - Data: "Report ready.", - }, - }, - Source: "SENDER_EMAIL_ADDRESS", - ReplyToAddresses: [ - /* more items */ - ], - }; - const data = await sesClient.send(new SendEmailCommand(emailParams)); - console.log("Success. Email sent.", data); - res.contentType = "application/json"; - res.send(data); - } catch (err) { - console.log("Error", err); - } - } catch (err) { - console.log("Error", err); - } - }; - run(); -}); -``` - -The final section binds and listens to the connections on the specified host and port, which in this case is 3000, -as defined at the top of **app.js**. - -```javascript -app.listen(port, () => { - console.log(`Listening on port ${port}`); -}); -``` - -### Destroy the resources - -If you created your resources through the Amazon Management Console, you must delete all your resource manually through the console. - -However, if you created your resources using AWS CloudFormation, you can delete them by deleting the stack. - -**Note:** By running the app you modified the table, and the bucket, so before you can delete the stack, you must delete these resources manually via the console before deleting the Stack. - -4. Open [AWS CloudFormation in the AWS Management Console](https://console.aws.amazon.com/cloudformation/), and open the _Stacks_ page. - -![ ](images/cloud_formation_stacks.png) - -5. Select the stack you created in [Create the resources](#create-the-resources) on this page. - -6. Choose **Delete**. - -### Next steps - -Congratulations! You have created and deployed the Amazon DynamoDB Tracker example web app. -For more AWS cross-service examples, see -[cross-services](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/cross-services). diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/app.js b/javascriptv3/example_code/cross-services/ddb-item-tracker/app.js deleted file mode 100644 index a1058e140f0..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/app.js +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -Purpose: -app.js is the main file in the Amazon DynamoDB Item Tracker example app. -It interacts with the Express web framework to execute code. - -INPUTS: -- REGION - -*/ -// snippet-start:[cross-service.JavaScript.ddb-item-tracker.app] -import express from "express"; -import { v4 as uuidv4 } from "uuid"; -const port = process.env.PORT || 3000; -const app = express(); -import bodyParser from "body-parser"; -import path from "path"; -import { fileURLToPath } from "url"; -const __filename = fileURLToPath(import.meta.url); -import { UpdateCommand, PutCommand, ScanCommand } from "@aws-sdk/lib-dynamodb"; -import { ddbDocClient } from "./public/libs/ddbDocClient.js"; -import { SendEmailCommand } from "@aws-sdk/client-ses"; -import { sesClient, REGION } from "./public/libs/sesClient.js"; -import { s3Client } from "./public/libs/s3Client.js"; -import { PutObjectCommand } from "@aws-sdk/client-s3"; - -// Setting path for public directory -const __dirname = path.dirname(__filename); -const static_path = path.join(__dirname, "/public"); -app.use(express.static(static_path)); -app.use(express.urlencoded({ extended: true })); - -// Variables to update. -export const tableName = "TABLE_NAME"; -export const bucketName = "BUCKET_NAME"; -export const senderEmail = "SENDER_EMAIL_ADDRESS"; - -app.use(bodyParser.json()); - -app.post("/add", (req, res) => { - const body = req.body; - const id = uuidv4(); - const d = new Date(); - const month = d.getMonth() + 1; - const day = d.getDate(); - const todaydate = - d.getFullYear() + - "/" + - (month < 10 ? "0" : "") + - month + - "/" + - (day < 10 ? "0" : "") + - day; - const params = { - TableName: tableName, - Item: { - id: id, - guide: body.guide, - description: body.description, - status: body.status, - date: todaydate, - }, - }; - const run = async () => { - try { - const data = await ddbDocClient.send(new PutCommand(params)); - console.log("Added item:", JSON.stringify(data, null, 2)); - console.log(data); - res.contentType = "application/json"; - res.send(data); - } catch (err) { - console.error( - "Unable to add item. Error JSON:", - JSON.stringify(err, null, 2) - ); - } - }; - run(); -}); - -app.post("/request", (req, res) => { - var params = { - TableName: tableName, - }; - - const run = async () => { - try { - const data = await ddbDocClient.send(new ScanCommand(params)); - console.log("data", data); - res.send(data); - } catch (err) { - console.log("Error", err); - } - }; - run(); -}); - -app.post("/changewi", (req, res) => { - console.log(req.body); - var params = { - TableName: tableName, - Key: { - id: req.body.id, - }, - UpdateExpression: "set #description=:d, #status=:s", - ExpressionAttributeValues: { - ":d": req.body.description, - ":s": req.body.status, - }, - ExpressionAttributeNames: { - "#description": "description", - "#status": "status", - }, - }; - const run = async () => { - try { - const data = await ddbDocClient.send(new UpdateCommand(params)); - res.contentType = "application/json"; - res.send(data); - } catch (err) { - console.error(err); - } - }; - run(); -}); - -app.post("/uploadCSV", (req, res) => { - const d = new Date(); - const month = d.getMonth() + 1; - const day = d.getDate(); - const hour = d.getHours(); - const minute = d.getMinutes(); - const todaydate = - d.getFullYear() + - (month < 10 ? "0" : "") + - month + - (day < 10 ? "0" : "") + - day + - hour + - minute; - const uploadParams = { - Bucket: bucketName, - Body: req.body.csv, - Key: "Items_" + todaydate + ".csv", - }; - const run = async () => { - try { - await s3Client.send(new PutObjectCommand(uploadParams)); - const linkToCSV = - "https://s3.console.aws.amazon.com/s3/buckets/" + - uploadParams.Bucket + - "?region=" + - REGION + - "&tab=objects"; - console.log("Success. Report uploaded to " + linkToCSV + "."); - console.log("Email", req.body.email); - try { - const emailParams = { - Destination: { - /* required */ - CcAddresses: [ - /* more items */ - ], - ToAddresses: [ - req.body.email, //RECEIVER_ADDRESS - /* more To-email addresses */ - ], - }, - Message: { - /* required */ - Body: { - /* required */ - Html: { - Charset: "UTF-8", - Data: - "

      Hello!

      " + - "

      The CSV has been uploaded to here.

      ", - }, - }, - Subject: { - Charset: "UTF-8", - Data: "Report ready.", - }, - }, - Source: "SENDER_EMAIL_ADDRESS", - ReplyToAddresses: [ - /* more items */ - ], - }; - const data = await sesClient.send(new SendEmailCommand(emailParams)); - console.log("Success. Email sent.", data); - res.contentType = "application/json"; - res.send(data); - } catch (err) { - console.log("Error", err); - } - } catch (err) { - console.log("Error", err); - } - }; - run(); - module.exports = run(); -}); - -app.post("/report", (req, res) => { - // Helper function to send an email to user. - // Set the parameters - console.log("This is the email address: ", req.body.email); - const params = { - Destination: { - /* required */ - CcAddresses: [ - /* more items */ - ], - ToAddresses: [ - req.body.email, //RECEIVER_ADDRESS - /* more To-email addresses */ - ], - }, - Message: { - /* required */ - Body: { - /* required */ - Html: { - Charset: "UTF-8", - Data: - "

      Hello!

      " + - "

      The Amazon DynamoDB table " + - tableName + - " has been updated with PPE information here.

      ", - }, - }, - Subject: { - Charset: "UTF-8", - Data: "PPE image report ready.", - }, - }, - Source: senderEmail, - ReplyToAddresses: [ - /* more items */ - ], - }; - const run = async () => { - try { - const data = await sesClient.send(new SendEmailCommand(params)); - console.log("Success. Email sent.", data); - res.contentType = "application/json"; - res.send(data); - } catch (err) { - console.log("Error", err); - } - }; - run(); -}); - -app.listen(port, () => { - console.log(`Listening on port ${port}`); -}); -// snippet-end:[cross-service.JavaScript.ddb-item-tracker.app] diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/additems.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/additems.png deleted file mode 100644 index 4cfb9998dbc394487ccf97be6822f26a7d20a864..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32446 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%0D8^_b%vD1UDy#|CL1G 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 diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/cloud_formation_resources_tab.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/cloud_formation_resources_tab.png deleted file mode 100644 index 7c98018d46ca43580a3281d5d779b8fd6ef46085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116124 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 z%0D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 diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/cloud_formation_stacks.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/cloud_formation_stacks.png deleted file mode 100644 index 7b3d853b7a7d9ab1609b94b250daccfb0077f8c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43167 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

      xn8k#k(kI_ug#GGS(J;*8#Age@>*>`pMe$T zz>p~HLZw4RM4VZG9#KNlQ6xt21DUZSGW1=Y7mrGRywg%{hp~NBWUq8z%>0$Hq1ER^ ze4le_MV~KD@5Lp#r6xD8=RB@LsxQmAGnIW(QNV(vu8;NaN&9&cj&23sXJ418jGkB> zyG^9M9#}B}+i%up#x`53L|}fqGt_$3@xYVNYA58Ms%5*@?^8xww#}YLNA}Xjkifz9 zUEzn$mTls@909e&)4pZHS%f&7jTJ0d5B}uYqxA<4NPO8^j75AReckb!o;B7)hrT>y zuP^CsQPdO7nC(<+ad9{V(X$PX7TyOu;Z3)=x@4q^^M`#x9Y|{c5l{ZakW`=E;EPxS z2d$&}QWJDhlT#~j?4n@wEM~dLPrrGyQZu#xueq-PYU}&fg;Jnsp%f_4K+yt43KZAk zuKnSz#Wh6(v_PRqp}1S2K#>sKgS!>iP@Lc%JTLHnbLY+6d3WZ{{O`=oOtLd`&e?mf zwb%OA`u5pp9}_L8*WxCdF+xzCVjG+}k!5Sr)cLwtjNyE%=2TgJvvRWX6Wn5a+WnGw zG+~trcMQz{Pp|3|A$hf+t=v3vn09kXZ|z1nf^&NJB1HSH>l(E;#(;tXsE^qvBOS@N zY{|#Da`L;yjm%F96qigeeZy!{CjM>w`@C(9coDXZ)3BAwnaLzh`aF_S?9!B*Dv+0l z#@hRsH*X5jXugA+==f2};X_9fRx2)esq`4lr-`$D3zin7GWz zK<=YSJjUE7ouuV1lf#hWbisp`wsi{8Vx8DvK3jI6)GgTh?DYAHl)E=-JzC149oc0U z5TV)R$}9S8Zcn#mk^B1vytwG@r6`iXsnL}3Nara7q@{t9wQl$v&-*ggOj)mLyrsGu zoKxm$XA(QWL%*MG+WJKEcN!n?1~FO@;zu+e)mZ~{c*FUtt}b~+GrOwrc;~p={`a-v zj`R4IZ$U@6(ouegZgDvvN7Pq_c9W^=gY$r~hORv{sI1F1^49we){s&6Nt|1qtNmlO zC}qaxGfJ^^ntpHkpE*tGTb&>0l;4;eMSPN`!F=h>@VPfkw(&K$!~uyuF`5q|`sWZ0 z-o;Apr}SrOop^}OBZYI^Oy3Q9Sxj@U%d2q#M!LwKsT~^2KOX;Xa0V=eSEwv$slE{c zR3@nLVWge(4MwcZ9rd^xx@UJEPdXZ^lPZim1|oxhIh zGV3mQ{gJS}dz*m{T=3kgiO>`pCW`yYY;b_$lfWT|AGZzA?_khq#>*u%qdxgNZ0L3~ z{Q?>J#_@W8BARsdR=+~eSM-oIzau`I^Ox8X+ehw~TKoL?0+lKquPd!EBeaK04LPWY zWi{Q>e86(0&<$=r=kH8a!%L-B@ksU6`QT+k?^876EE3tHSbsxLcPc)peq)zC4|dE6 zdVB(yq2@&V;?|ZR>rsi-WqYlcenSaQ&kB9$Ja60`i(TJ?bsxG;<2ul>N5STwcZv}1!3be_@AFF@R_q9RH;;M zDrVUXO{z@{xdESh53d5K!y_yN5Bi85Qh72zuf}<=CG7F6sAzd!$JO7hs(C810;5bo zpX^M~00%ehfRoJ4?o)0o=&?Z1N)F2^w5NYSZ=wtUY_{);fLZsy?t0E?tRgm^toicQ z@9TX0{e}YG$t6@s+*em``9xd)rr6qwPW9D#yzT*dc_{w*m|2OCrqiS_i;TRst;Z$*0kQj?n}zS>2@Isn%EcEPXkc z8e{dF_VwwkQlVvXX0+dejPtH0V5PTw?HP{T7=S+gtHz#Nbg4HB`Nog(205h?+uiqhhig)Z9w;ils`( zPloX<@2Ny|W~bluH%~XY@oJs%pL)%E_WAJ*-C$zgc~5!TW~p_qSjkZL>5@r&%BhPB zopX`~`%yMd3zDeE8yDa4eQeM%%LjbPC(krxKZShZ7qei|;Xc0Eu706XT$G447tenK z1K{>U^;&Z|e)_5UGTO#ZH%rc5l_jJWp$t5QCfu8j$ZLK+2}JobGVol3Qk>THsj1?zES6|>AlP$} z4Zzn>z0$+kiNHA{kf)4F@sO82JJMHpZ7`86k*#1m99X=g$F8D3U&}o8_T`KCt)03SaLji}ep&(w5=5Jd z%OY3$V5(-Jw|6dF_5<@ou7Mjw{j4A z^`tEvIP1$)YOl~ruDu9@U@TyfeS~;<*$|hqApNr$#ez|b`Od_KxHtMc*$-?+&z~D zI-xmuYR##hC&rtQr~Z8x?nvd$se+^Zvw?5;#efeq*ME~HuMcv)b;>BYzlRzt(F-;b z6y?O2_&*bG-0-$j(Uv=1Z=eRd_nj7{e;Nvr7_z!TBR{?_zLU62debKl_7*OEtf>~5 zwK2S&8;s>7sO=#L+J`n>&G#ofIvcd)S3e1a1^k6Lb8e=}Wig4p!)Mi&+>H|v$lVc3 zk7`I8*oXS|)Z)ytz0hCU5vAO$k`Ly@M0GfHRbQ2;5%>PZ8!YMGY{ud8e8 z)tNM5zz;c9+pE!uC4X8@6F1VEORchkyQ5+xIB9MV`#UJDuI}xHlcEQ_bDs9YmK$}*@nPu!(H0(W*jhb%{Ukqg?A z%AW**Uso6*lI)l{Ildk;OCrWYp#*13YZgi5T87k$A0|{?&qLk9l?HGY$FFwmkr=-G zn0mz^!LF`#BFe7eb*b^5?54V8x9t}}vI$y-gHF}+aarGd<|hy^c)59b5~WMs<7?!> zKiJon`ur`md7@RK3mB80eM>Dj)F1T=#n(#y{)DPoU8;g*GrS1MGgijD6~=PRz(Jt4 z?x^eEWVTrmj+0xCT2z+h;>r$-%6||O5L}6|mh(Rq0o*{C$%Vri8($*XC~Ct4r#&Cn zc(EMiO!^+w=h1m1P4ffwOdarGf+ZkTp(T!vCFa{e}lwuhaVxM>7 zpWl}Zm|Q{4_oc%7K~v8AQj>^h=Kpt!131fq(-w)Ve79zr^a^!0oXEO7iSYeUVEHIn z)3Zwgj=+3K`_fd35cF;DZ>O- z8L~#-qwrdGxnc~Kf^);NghD7HXqS87_`;ka2Z@{I+5h-H)5m13Rm<$O-+6ROldO0; z=c38eK=dQ4YmL_tUJVojTdk|l2xSm=j43=pZ5jtzG10n!dg{F2eD~EjSyj@D81I+O zc&;xUD*dY35)7}pz~EuM*BZlKX^>kK$gk%-o=vaICorG$XgrC}rMtJ0LY(1iO0?>7 zG5g^pm0HZa({scE*Ds&M78hGWn$4s~GM3`EZ+W6AhJ*Nx6cA%Cnfx2Vp9QveHQnix zy@`eo6s9>bRh!~+4#Ln{b-;J2ivq)3=mO8y^FKHk%EDq@(1Z*{k}u@L1}@lF z$t{oP+-naHm@c39o=~94Hn9{JRvYSbR2w!3}lv=s}T&1+ZMb?k0 z(k((>6-T|oi9Mvsajo^6hfsCc<+72yAa7Imjy+C?K{oY~d7NK~+gVIIvo|%L@>jMV%HS4?rz0 z#5jBNf130vgN(xOM|u*TZD?UqP>x1y25izsy*kZGtgWP7`dRKY_YTbo9JqI@^5hJS zHdq?#?brhV5n_i9N8awwX)4}@UzTtZ5+%jUH&q_YJxzz)BZEhwu!r@o=QQzhr>8RG zo#`~~!_dC>7)629gT~I&|1CiA?}3~DTnnJS7Vz9*p^kGq<~(9XyOi(~&b<{?nd||} z`2`*%@Hnh{Zt`GS|Ko7@pZoW3#$9aj8Rw#GOD$qjgL9)K(tMftcPB_d#Y#kG0Pty34unri=uo^JBV|?`kLqUe1f{1J$aoUSx@n^sa$i zKFVz2530LiV`_qyOi{ZQJhfKWG&Oly0%uiZDSARnC-QivHS*fOEqJ|X;Ur08H*Oqe zuToU>C0r$+i2Bu97=|G#WX3WSsjA?fXZi6Z1q>(a9h|#kofr7lmJyso#N1zsXVl?7 z+EY;3Q;r~r&}$*qG}tq4YbI`&y;YR*8c%()%;n^{&*5dkM#2cADj!?3bA#CL5ED&1&FG0#EhCj&|_s3aQ=RJWHEisR+MCiT+;R@z)zx#0^&uhBYnprmwY+S72u(mVQrjs(^>vnJiV|?b0C$5?iRI!Ooj{(^NjgeRiPhZ%~Uw&1DkPL=te$yQ-o*0 zi|t9*1#uv|t4;oR@ugqp?Ow+qbGF@vXlRpUpysjokXd&@F*7VST;e8i&4;j8sq2w(klEy1}pI-gm2}F$sCibwnfMp{T@QslgE~&J_aO z8x#1cLOe_In#&%wjojxmhB0JCo8dx!JR-~Yn;vF)eO*|F5^7yiN917F^G9r;Z&|mr zalBlh`in>+Yf%ImqPg}{kAFZ)r+vsCe3DV(F5R~2t#5~F^Q6YfSklETO~vwQTjVaq zuyBA^A|fIXsk{smw}jlxwBReUnoq5jY`ZRKXkiM1MFuO2=XrK3+D^sM`E;IZ)Y)!o zES}Z74BXsWV ziA!Rf(jJ@=!D8F*iWRxsB}cOYr#1R*{80&-69k_YPT)Xep}^nCkew?+&wf;cR;pRQ z)!yO}hU>C|{1wxxKUESGmWTHu{&AJ+@(S@!`3SHP>Wyx*31`uR*(TjC!@`6usc{Ar zSLolBEIPg6d1op`hD^}vOsa*+LhrU+2V4WsvZkACAU;lsd6yltVO273)%r>Vk39T` z?6gofuH;7w3PKZ3>$|T+s=I0L-7I~_IFy%le`||ddeG*UL4=qxPGV_2VScRr8z-|O z@>HWqTUbl)AKW_A&aFH;>XulFvp##u9`zeIGeg4*6A=0;VA>XL6}792PAU=c8@_mm z#-4Ncs&R3uA8Gri)h_VPf_eoWiqb^d)wAY;9^1h&g$0*Ac9Ek`dmP` z`mz`XrYEq83R31p3D}p*K_hiVKOd7=gN_ZR%++sF2OF7Ydwp3~Z2X48Wp=z$T93CT zYw>P;#p+Mo`f%Xw6n(1G_i=UXuEHR?ao~kOwvU4Un8NE=E*FV$%I*TLLi&<`RlUq1 zL*=_)x&8S^mok%$evPgeqz2CvrW zw3@rQMHDj6tJ@naQi=~}>O%dvcHU^d@VRA{%}lAYko9c@+V?GeknU5R6}r1PZ)M#8 z7iQ-&CykK3mk+J!+>>EH>ZuLo4m*|FNL9bcTB*m7la7Mc0F(me!DtiAKq zeW#{#%FL_rthAcPP<;a|m_N^w*g2cCieEC~wRTIY$g#hsPgQ{yThrMBXYz{^5qfY- zV7hOCYtN(}T4#Q=*+*{m#O_w@`oW7;-LKGC`TnD2bLW&l68LYr|Mf)e4(>%nl@Z+o zol6{Pc?VX{v&he*&wUuxY}z|r4S59lWGgv0dOp_BfW~RJ$MkuY{72{ohML|BIYU zZXYRCLg#DF2UiOL#D$v z?e@p;PRaLZaCs}msr#?C|I7nnkYXwtv8hS)EC zC~k}WgjR@K;xT$`sO2bf$d--yg|Z)8d`a(GbjqB6dWMJEaZ4 zMB28oEw79G2b4LqJ%*z*)ajMy6$9+5JZx*?9fufa$XN8Rw-&a<#9Ah%Dw;y{yIKkt4gKhYt&5o0I@~Ya^5V+G}N&XHJuL`QK zdz%)G7v7s;)YiJchuELEmrFq?jBr=;W(L3e)S#;}AWIGNfvGYsdnhU}GBPH_$8&Us zyf4V(C`rzcx+60kz&eH&H8zG_y!*O%PK3A_VYTL%8SSK-8{bJMvR29JR2~!Pu-|zw z!uPvq>|IN={-X(}4QF~x1!A3H)H>Ynd|&b}2!(`gps_3*AG)ZDfSx1D{F1Mohrd{8 zDU`1M@e0vg9fhfR%WdI6qXGe6S(Rv7hFh&-H6KjQR-roHh22K$zie}V7o6z_p z>3jk*OCDso)~mc{slqcd>e|u@GEazq07VyC!Voks2EtD=Z7j!B(@MV*7yb3;l%NYUHF>JNS z*#1cVOjQ~bT?N*{+&OXU_4dVmGu%9@{(ug+KB3)_AOLH4;*VMfj2q@3sz+Q=FlBHN zE_B$;TZWDWU~#SzDpVr)z)s=np1oMUaCOs%SuPZpE%)qtnD0`!j{jfHTK|I;%I!O1 zV^Z<&M+oKJ($)M^9Axz6!Dn=Q0lNgM5B>uX;rN$O|6`MQ{{@2nH=ue3iQ#diK#=y~ S{V5viqadRyT_$Pz<^KQ?{$#}f diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/homepage.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/homepage.png deleted file mode 100644 index d4e930e3a4c66ddf602251846bd88fb1f73e92fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120627 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≫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� zPb8Q?*~Z&a1@U8-u+A9AoMmp(ED+Qr`I;!~*1N}jNWcNF!ov(!#}Z-dp?ls7ma<0O)>LFUcMP<&`r#`)dt0Y@qedJ1#+D$jZX+S z2_SC)s&I9pZ3P86tggWZR~KGtFMZXi11+fkp+kK~f!HLy4qjpYCE$q)?1)}p>f-P^ z&7#5(o*3s4c@s4_PfvIM3TwOq1jG>vQe3n;&rF9ZO!dUa|I0!4N&k6v|9e`*d{I%Y z@-lLPzaeFPX%Ty~4Qmz#h$CrFZtD~Dvc`%Suok!H=TGx{K!{s)AK!JIEk8=0c-qGX zip0Mv))QogiXtWKYvoDbDAx_i`JTWy1%R*Vu83rPNge_iuqZD))Ku+9c6SnAd3DCa zFbqhyd3MIMRrZr@WQ~@8Ru^Bnpq76CiVAwl;Mmi5@c&u#v=F<_pF2(8T<_8{5#3VZ&u z=BM0s`&n2+6c?cTRas*(tq0Q%3FXYJqs__OMD8Nj3$MDtglY_3>xuZYBI)lIAAvZ% z`0BAf@pI)hVOy<&dmOhRcMSIrb69(neWl|@c=rKyKnf4A7~0)$_q93x7(C_#NOByX zyvp{+u9-P^ioSA$Ylf&*jo@cN+9t7=0dG4LmNtF@>TtZcQmcYM$`XG|J#M&`Sv`-T z)QK%T%Z8j4#5LRVe!~KCr{TQS#Bii+H9daGZ%C;JqCulM>$qwB*n2PW-QmA+s(veL z|Iv>E$O!*0W8nV%wLn1smo&MKyMBveF#~{V^j#PUZdWwv?><)TNaM8GTc~g&IOfQD zgtsP;{{rJw2Oh~;$E_U2@lJ90bA88pUxR>xh*-HMTs-_aTq-{|fw8Aj9IdF@wkS({ z(k{0l`RBcWkH+w>%zc&__`^y%+mVtNTCAz4m?+pD`}bWy&I#`fqjZ8|Kp0c4APBi4 zZ?sDf%5IsE3ao1YRlGlWSY4NH+O;qaE=@9iy#yCRTU3WTWy3eCQi`GOJBSd|y7mc#1Z;IK-pCU~7rOGA1lZ~2eDcF@U#jLefr3AomynoSb8Fe7 zGWS{GyC?uiM;4RK7@s|Ms+g5cFMPK}i;pn4n+b)k93qQB`eT&srvSQEVQ}gN%KipM zRBOr-HyWw0CM2S+SZzAFWH3)8r7N)-la;yX_RK}5!e5e)D7$PVfw!EALd*PK5V!!5 zdJDhfptOTp0pjd`u4O2|om_XRJgrt#c3f2%wgSZam`07WFh_o#kkhk%84tX}A;W$o!{kCd41K03|4Wv$#|S&hblu{$1+q_0fl0CO^(! z`P8RnTr3N=S#m^1G~nM{JuO~2uX-8*C>;OKfvQg&m+8-~on?9ue)f_8UC>!?n_w1) z$<52Qvzr%T6F`?uO@;d3xi@gFWVr6jYHlU77bKF?51pOWB#6TibFffz%Pn0nF27Y6 zCT2VrZS2Hw_rH=KH{#pby{BmxY&n;Cz7_3XtSj4H`x=E49^`|9J>A?>z0E!jAsg+N zV~lN(jH}tZA!A_$L==AEle;MgO##Sxtd0+HI5T5xc}Z|tCp8u~qLG|GAq$KRMK~3^>`B!!10o4%t zw8!sOd*|jbx6W?OekVgOyL%LzUmC=LzmwGN>#L)`W^i6;m%7w%e!RLLEQMsf z*2}(YIFe2;VYQ*vu)k)l&vJ_Px>$`*)?j8oJ@prKeHn}ugqNY=dYYC@4J3GbHehV( zuO|G!bqx_N>#U5L9dwpJjXen9cUG=47np`pW&7-KwPLG*{sp(;@LT1>wK!`O$3d|OC7XWIe>#}+TS`>4+9<^vFYOVJBMqNtjx)587n08jd=wthUUdeJy22PgBS)Pw+37LYQU_DZ_PTxiVsP>}#L=e1c)f z`MoG2VZhM_WrDi#Ps?j{j~X{#Zfp%HmPkGeRWtzyCr5?(_9CNIpXg)5Ix37 zk;~*wNk1iiS%kK@s3EQRpBJ6pXkJlmWMsxE&6E89`$vC2C12syz<)LNa%6TAi_$j` zMCATs+E0ijMtGaoy~EoErzH6Ajg$;cJ?i@o6d}_GVJ5_Yo^ixQgV1{e zaOsWblgMkg)0@j@Wz@(tt|CZiXH6z{O~fh8)Jq}?J19VK;?DLga|0#j9bGJ4%_~Z! z?$j3a&S(|eNHj`e|9ztBpnu<0Ua{l-Q))=b`7ZA#?o$~+8E>L%s&7;}8^DVGKWnJI z^g9sXmqD76t)Kk$!BkEu(J1gSs)aqDBTmB!)2l^d@C1!*R7-NzT>REzhv^%q;|81s z1KjUE;lHTuqxbzR?GV08)u z^wY%%TS8@=JJpnAW*AT)*05>gl$K6y=O?K}Z&xW#RWhl^KXYh6y{Y{{jf)i7hpyX7 z2_jjwfpY*Hx1vtM@kN&o14eIL?IKuwc)vsJ$?k|$^r*St%R~bj?khm28e7R52s2J24 zdygA8Ot(p8nt`G+TS^HjTnb&9X#8D}(RHi+$7V_01YUgLQT@q8YW^UG?18yTT<4e; zaMY&ov~U=6=KMEsoE(HITcR|&RMKIl9xBSoDD{&Oblm&*27aG;=a_QR{P7f)jNOLUBuhE2jj(b%&kg+Q z(kD$3DsxaQRxVp_eowu2yjeHeyVjpq2(H?YPa%SJ2{@;cKZ;@rT_HF0kTx)A&46Yi zd$ljz${FO`&b6|sXXc+~o*}-2Va#BJT^;&;bPZ!LkKM(xB3H4?U`TmPLZw0sF5`j! zMZz)%;nVeX$G0kz3Q0WIIEY`S+h!qi;6tT{i)g^8a#Et)_ zQ%ul@G=T?-l#?(}DyX`cUp%0#JcSsTM^sXaCMf^jIk`QWbWWEptdBtFzIXut+Tm9V z7T24fw(m5~KiBs(;D!G$iOBzhlj|>Q_MhMUf7$2$^X>Q7|EJ;0QPjNiWQvp?TBnBa z01oA~YPTYfli+}b8Fr%yU{_6@<2xU+mijrSd--0*pjDEF0I|)iUcp$j14K#sM{@() zZ|hbJ5xlb)+KS)LYS~;<`zeJ!feZYv5X`(ML6`VryLTOqv-8z{7LYdZ4~)4a#vmyh zC(CO5p^{qGT_g3iMj>a@V)5kToN()7Ai%^UF5s4}Q0~%LAZ4m6kyFmS(5ACSR%JPw zrs)oNJJb$b+bR1sYdX?(m7!n21UbCumWE!yY`5I+6jd5%(+=3&e53C(mH${)x0yN^Oo*914O=N$qRfE+VYyuZ6 z&PkV-sh{uB{K7!QP8o-)ykIhavtHRbFSiVd-WGSuUEevb0P5>0BbLA*q|}d4_9zV@ z>2$h~!_~SL+AGm|1|c#OYe%oHpIK#PReLcJdt*{&8s4JC4(JDC*D$wthif9O;tsI( ztjcqZ)kY!v%LW&KrCF?y${K-n&hV;P)P%47X5mK5@b4mrcO z%ckuzICfO-n);(Izx!}_ps$*%si+vc#&W4%(BLZkEGL&Kh8@g3u00Ev@L22O%kZQK zK?Nj--wX5bC9}GgEn9N5MaPb&T-}(GQ_Q!yAHeG|e<{>XSs18&0Fa&$h zm^ZVeL=H0s$k80U!efQ~@*ROQ8^^MYyRt;XLC4@t;@y+|J&)oLQy~lWz@0HpHbx@L;se8M#mFHkTDF6*uIA6`^4?6RuQ;XNn z9#+EM2Xi^9<1}eITi6fXvCR3zd`?f za$aHmn+8A3^n$A_<1gL8N!VMKgL7V;>2GiA!P*ID1KNxZ~>w!i^Su6oarv_ zK$|1TzDzOQz{0eV?3G0%LGx3X+MTTf@>S_MWY&(IJ61n8sSQD8P!2`ZZK*6p4n240 z5sZ#~b@#{W?<4hzO{miQ70Sc48c|+@ndrgw&2^2^`tfR6dY+xHY5JwrVrMZOPriR~ zYza2Wqx}%=Pg1VgX8F+GU&nz%Hyh@$YN+LSR(AIU9a1UHTTt%pkRI09{33BUt@aVO zx`V-9cJ3!VwLSF*@LM?h}V9N~x?E(NW2UDCNW=3fliTmqKTh|M-@EwgDWk@8*vX(7mSi zP~aswlYKo0e%`&Lp)rucgq1^!A$5#1+8^b1qRW)>bTVF3&T|$DTZS{T!!o9g0W0AO zjY5_4f;YHuTrdV@)diD>ujrYaY)ozh$pl4;!L)M22d)KRmcUs{1g0QGq8qrpL<$Rn zNIo-1%paNdw{E^;N*I|i)+&q|#l20AYJ6@|6nX)gdQY%Q+GOg$^%sM`)$lj|FKrx zsW-NHRTO@~nYey#y7VfK^6Ovm(dOv-6It6^kZGgrJ||LT1Cf}LKHN9g9CW=1!1p7P zuB(PX3nag3A;B-Z%45s|Vq(eE3|y^~+|vrJ`UX!eI2>s?xxPKtjwaSvt%=-6jLPUV z)rb*Yy<4Fg1qa`q`9MJTnHRu7-x*a>UM#40(*hv3-Y#|$%fzYP)&PmHNGO)2Hg~b- z)-7}_^^=X4+wFkEK9}R{xTa^-t-;-LAkB(v)h6LxKMuFcN%D!7*=yJL%d(}MMNT(4cWfT^EO~OVv)#Q?@;*i=TDWUrXV6;B9t`vUH z74P@LqaQ4 zZ?>5u*RGU*Pjmv616*a0K}=m}!|Wr#5g^j^kaIb)AECLCo&Dj}5xKv1697n3o_V0u z?!M{Lgqs`gV~5wk)8C9h#SrV=qA;tx7-fJU@DB_tbSYo6|t+~Z_^z$azm`$ zG(~4sNeq@-Q@fQHg>Xm&0I-CCsCOu-J5j#_Ma>Y87Y*agm}ZtE&JVeX_yEf4Tm5Jo zKZczcq(~#~%RAas|E`D!qT9u|bNUEHbO@Y*F0uQ3Qup``{z;?)f(H+SJ8VBd*sH!j zy=Vkqc-IE&PC0FagqB$tGGa_io-;z`tjtW=7FKxj_`FslCf@EVeHp?T70Z%#p%=sD zA+_q@q{0xZk61=VHm zh_*J~IMi68YyI^^PJ2m*@IgUV5nts|QcEqDUu!QF=Oo&|2)BO%$c{%O zRPB$c@J0nFW zw@8fd5lPJa1siG1>X9Nht2(-9@~;XbfmsvlXu zBeGTP_rMdpkfn<~0&tfT5b2xPBghh#(S#J@&dEVs=$d$EQ13`Q{j<<5$*xF8J1~47 z?f(X|H?g>9`toNhW zIL29p0YOmxO?&6SwnT@`C_LJk@j!e})&411IVydaUEAObVp3c14ST`G=bOP9<<_6~ zG*W450M5Tas#qp`N88GUlW4d~H&j0O+Dc8Dw;{ta(xGW&wB*t;7oKKIO|c|+Tze-Z zycN;}t}>)k(HN@n>^J$+q`Vi_a^27`i@NwtsF;wNtgve)Rmd3UTfOg5#EGSTk-JC;^o)*l3g=VIH4=26Az=6ZE7izqv;uS5~?7DC! z#`=V#PR`S1o02EMb-9&3#9$6*n153RtE~>u+y6c0_kjF1bL%pcNuZ_A=duLKZpRNV zfXgj(hYb#0$<IM?Y2%-ufwLLSjBuQAxE* zza=QWJx-jZFjy7AV%i0SQyiioZ=?Ba>pH;@`@3kks6IP!;dRV&OmohlcM&D(0Ule*p+k zvBbsN_jC!Mn`B&j3kQ?-yKNmx%L8@@=tamm|G2eKz&QN3cIq#&kC!f4xZ@VhNP&^r zYmn)r&uaZf?eqiFgjW>Fwt0`A+mN$jt>A^t$)i{#xOFkr>fk^@m{Bro|E>d_R_HiwRaM1eL;1moR#iU+sgZ_aJ!FEeL)$xp(8~K2e z@x(@9wAH{yH<%olPQih63bk)mRbE>&IcMJx;9}4NmK{(hFp2EkgoUV+6fri9CtIW8 zt$!Kr!XZ3`G8UJNc*0Z8=zUn*sbQ1+o9&tR&8rTLOyn1Hl*VOl)k~$xZ@?tc-k#dl zYsY;m4da<(W>Jh!zTzBL?3i_$id^<5bO#NzY-FERo)J(LmWB2W&I^yf%IX7u|Hi@L zY+o$NogzY}D*Or+q2UkDk~zoG8<8pfi3z%Y|E0LU4`4dwYIZ;mWo)g_OI*d+dj+sa z3C5d+aPVD{Q5v^s!kA7o|H+)JKKz?GDTWq{Y}1|MHXPC(rL!6;iyeb2c_boHMY&F&M7 zzW5k5`7F+y#FbhO6nujg>;|?3Q#2BtW!vP!9@_zpx0UfggdeSJ2r;ddG=+6v0rX5f zowhF!bYmOe1>WYkv-qfEGwJ#zc?}+|SXV?Mda2#rI%L#Lw#2Ox3EgN|9HbfKXEGgf z=3G-aNLK2qFsg+#v{lWRo_fKhu+UOz5&Gqn5=mms&bid}_vVD97@7;s6h7_WU5V@3 z)iwgzdLTeVTc(qScLsaIA}*IeBBIAtOUMAK1_`20paEt$v887)IHiX1-!?O(XM7>DXZDh6we8twW|pTmXO@surReyO&7z34w)%x`7a9;$}5H;^Yi! zoo+of{)PXP=1B?$ORXJgI^d zBcFtFQtd8p?nBuQuLYEwA^&QH-*o=zwf|W`-?f_c^YehK%0m60(M z06&UT62$}`{wqMR3I!F`YbX3Gm(~$=$1V-2y^h_4@;}tW$#PK#67H!I4d(fp1xX(-Kt=|2n=(2 zMW_0<*OIv@#vcV`MP~XU8R1jcw#*CJT>-rXJKLAFM4otVI$_mR?_(p0I?+g@ber3x zP*dthd38lGHS10L&X5-c$s+*8@~mp(dW4X2YbMm}$yRLVTq@E#_6r8p?Gi!?+ps8P z%93^4AvAIfjRtXEl{}1s^&@aCxE$sY{Vr{quvsYr)L3n6?>E-7c;$M<)(FC-VojZ6b5B=!VyE4mrmtXxo{@iw|NQ1@ z^Ue7C)6;^SY7SHQ{mv}^iGMJ~(O$AGnjVgh{v?tD!(A(pFyyb%8a)ztMddlpS`JIl zTyjktp>IEb>GpF`xlC<(`IeN3WO6A20#vhK&cp0}`isN?!c*}E!Pzl_TZEZ*|Ex$~ zf#0i66B^)E3tmom-V@wodat08s39Xp)>x3h3g>v(l*W;=_X4 zj+$pTlX(Nkxm8uGr*NLF^p<~oCOsY*VDvA?GJh%b+d5U&`qZ*bC>A%d5J6%E!;ip2LSxA zd<#Xky8v~Gy#HNmR$u5CJF4tZXO%N+U-d_62R_UizPZ$vstb?RTBHP4xRGY+{!VUvYBsux1wOF$|a4OTxRc@3xAfRAGL4tnHq2Nkffg3gE zZa1xv`VK9hdyo>RIjdaYRHjCy1ncv0d&*4f1!L||Lk=@LAD<_}rLG2*o<2E@x2Hy& z%E0-m@PS$x%tL$3sfWap{1quiBkP?0D^hG=%X`-2)rb+%Ob(|2ER3G&8%v|oBYAV7 zo;wGt^0H)0e*dI3vhhPrJ#U34*S;OoWz<+Ehvy&Te`J7Jt_Xi>t|WCS9-87ITSDi6 zfuLIaq^zX%<>eqKKIxoMs(SE}V>kZJm8W?rkAL8)wgW20|HR~u5~k+INb9L`#L}3e zuwtmWv;jcw34aPV0I04(uxbhkIM)iJ`qKX{JV z(FD-y{g(@%6kGoP7i);?q4e@zdC!E%F0EMD^s3h_ zT|I>s;e@;`)oq4r0pW=0A8EizV?1OLX@Jy=nk^`r;#^?pxNUWl2sq;jL;diOV?r$w z4i^%9>@H@g=oA;=i&4)58X-AXx!t>y<=Efz5#6>2b8_pM1U7hP=LrGO;5HS3oQo3? z^aErNt0(#@!KwYU^t`Rya8f3laN*7I7d!Hfdmd*uqy5L7k=*BG2BAGsMWpoE;a?dP00ufBI?qf!eabeP^ zZMK}cnDwr7jtqQn7O&l2UfdUg}ew$68-orFRWst0!OZ8El4K*^$QH(d9#f z(NT5j-F&XNv188J7Sib^S%t?&DAGwj5l9WzL6si)>K^xSoA`&$SHLbN>w7&65IuqO zsJU0cDRy<8a*-m~u!E8LOD^2}{SEFNClS1XnO7?%?VN6UB&;?5)owzifkR~Oh2km9 z7ovRAfg`M)l+`ROytEy-wYw;T#T2HqC(EX!+;^ya{`6x!B8dNbfd4aqX*I2Vl6OZ8(KLY?CY%=d3XCE$-mBw&Kk8S>*_18K2JW z2xI26YaE-u1(rnsb|@>;@}li8tlMY|OiGA=`0=g~q3Itah%Y8KFRox0NMEAMHFhJC z;W4ACa`L*5AIT4Ka%A_54-gD=RMRGR!^enq5=Y#TtUVW0ltw%!cSYG|3E_V*V;l{M zs14eFds$b&MF&%z*1uoaI_#2$9F}7Jc&}wT`FZUglPjE1vezIShyBw^$ojn;EHC1>_WuXGY;4yp+2Nx)K+&m?{}a9#DL@hL|dh`Pi=JqF4TkOA5HOOba4PDkuqQ zIYY2d$Hz~(l|4D@-u;d-#@~sTaq>i=r5J64gAuG}C?I1?Y4Lrk(bP2ZdR52YkjL7t zE^^m)4`#?j$#C(uYg6E>f+-8lY6yC+6Dmb_XaaS@R}ex1$Y^0df>(HtQhut_AD5}B zWjo4RSAnGG57^G5CI^Y!ziiEsjjHAJ#qUiT5Ui$5XzVn(eK9^IA##9|;@3>INMwX+ z^2Lx47L8G*6Hq|8y>bE3Yj^E}?n*bGNjYYR+OqLq5?-6qT5?3JYc$DKE?N#~kfTZ`4?Dzvoc}e0- zL__7v4f#RXOIWc=6d7~J2Ve_%M z#&7dVi{#T!nG}9}Ww35ZTeO8A!SGL`6Oh&2Z3Q}37xzD# zt@7xdSjmec3ti)|#*CpsX_yoq*amn_x*DPi>&zUh+FzTxxeR-A?Lnb9vZSG%nz#xR zZ3*Z(COWBQWz{~@)%guEOql-|Ej`4kyPbdIq@B#ix+SzX-63LUv!&HqJz2KwFS<6a z#Poua#Gp6=MfP%S0VByfYPcSTd*J{znzCQBt7$Q_Eh|!cDxKT#)DykMk2tO2NI%8! zrOM}=dh|S6JXKQ#f;7*nXdspW%k8@`edR%rD@Qd9(9a9~!k@Z}{d4$&x;(`4P9&nC}yXA8c^ zuq?BF{^v`5?WH_2^<6AVD|D!}n1jEOgs_?rCl6Nyq?*xSHY5&ILwhD{Of+Y87Q09; zdzJWC-#Nz0t`qq0#n|bE>(8bo3~X(AAqGdeKXeK1Lm#iS&nynR{Br{r)`AIq2TMJM zZ#%$9f~88jckuR%8p7y5v`roOF)eD3&Jgfx=zWeP3D%|zXpO!y_S-c?RR~(K5W~a` zZDnH~3!{n|jYY!W#rFD`afT1mvMNLj3qQ}Vy2g12M3PsIuX8`@n*%-Q8E}*#vo3y$ z9ni-YP+qD3?ffUp>G$m5$sI5#drpZTXGd7{)mpF#&O^NqqOxX@Qm$4#jD66<2%;9S zRrRGW4mpnI{YYcWDpw!nQq}@`LkL{%>p{_1Ge$kYP^MmYoo^yUHB01Xuqn~{VjSgb z%T5*=cAA(bY%ix*`WWV_(*h^;wKcZ}EU4wM4@{*+23(5r##1!A=HC3x8a(LSQ%h`@ zP&J%mYvfTUf6ou`7Z~*iST6&kD_ad_Gnp>>N2vGWQ;H+D28D$5fK9xE@d0rHOVu|$d>20 zLN8_>r7{a6lC`8AO`1UUaDONm2w96S0 z5v`pp(!VVGNzUr& z?;bAnixwMlV=&h0Y%>uSx(_6{l2Pk!SUU|NCq+njS~9!)l6sothZV|ruivBNL07a7 zf9m%iwT){?i1u1uJ(_)Rq$iz(gE=YJ3`iRjXS>+Fm;S)EpZ5^MqsUJN8pq#+GQJ?q zM$bHxB`4Q5elTa8BSdSH3KVFaWaMmGMVrR+26o%-lH-KN3{CLyx!cU*dAQX5r9Rs| z!PtI*NtJCZ~_L&qx(CeIWSN?2aRlENzletk;g%*#+C`HzhA&W1RlK1=T1y)=sy z5DCgMsR#^Cny2-e+BCt&aAOjh>2|`K!6^7Ks=7sPRoB9pgyq0GynPq)rsRwtSe{QFtRl`21w;U)!7N=FUy{ z9())pNsfXJ=MCxSHz*EI1I$d<0$edkG>Y4aGKf@;YCE`#1}>@2D95aWN{ug7;8)&n zAOZ7&9IktE#k1~S+P1!ze%?-P2&*Bc3wIGBXL^M|qXhoB+h}&#ny5pwx)Sku!|qbG z#Q+ic1eiX^-&3l(P^_YlQH@#)5D`t??^2f-d~5u}{Ij_j=ds7g(ux)A%cbv8i$-`? zXsEAKAQPu&y?34b#SossNu20u(69*9C3HIP>xmt@B<0iQIx{u(aJF!oo7;)gj}V~`(3dVLJ-_RFp|9wFCrF`own z>$!ea&kU`UwIN6{&_K?;X5US0MCj)M+He)V-x~ppC-6uDIKPi?xm97%heHZQn@gvm zIJLWA=0+sbZ{AXBi;J3J?vQOQ2rnn)qWi5CdjS|H(~4w^;(T>YMXKmFBg9gS%ip6S z8^dSLT8Nf=e|=Ro-5RN>RSU3X>5-Ra0-tnSxKJYLl`T`y4_TH zP;3$6tVYC>*d8!p%9^f_i=Xg4HzhW@Wa-lPV&33v$&h4ecJVmA=rDYNrj`{KNy(bl zrqr)y-vT808>=SgZ6gVO$PoS|6Apm#7A>m835k6=-VFah7NVh(u;1*y?XWeCaMESJ zwU2*cPr+2Q5VNc4LQjd@;p8dvDbLG9^~aX^0_fn+vgBtNr5~WN}uJ=BUr8tPXw)%GJ=__)U85v?t~y^Wc__ z#XpIV`sW%$BY7c}a=$}{wpmK!l2$_|gp1f$Qksk(V5(*JfSA{n$;0lc0?L?qQwOnA zJNB7`J_G^}ki<{0;LK^}V!i-gT&5BlbkCN{mq9_ee!da%holrqxvpW4#bFhRnmW(1 z;XXlD|E5zK&*Y!f2Jx0ScWlw&^c0PUQ5i`PS%*vA7x&R6SxUa{V-G+n+O_?g;9r~d z75f?Y>+DXk6Cjr}`aM@Snx!S(6D3%f-D>@n<+jW-xK^4(h^uDJ8U{&dhOFTro|z11 zk5ic(?wBkoh?)$MwfpKbLak~9NJ=tY)y?;q)Le=T7<1b&9817&SwB~;GPiMHb5xcE z`+Y^o<``ejJnJpWiv!c1D0IIdAl_ZMZ|-F@wZv#MNslItxa%RvHIhHa&yu^6Psf8- z6fe4|$hyVlGrbbeRte53As^b~wgteImu7M%=?%XYsnDAg!2=dT@=`9$Q2WG^0y+QU z7eAuFl$lj*6D?%hun5{aKDd}(c!%-l>m*yPvb;z&CrWC+k{q${cw3Gd-rwVK2vwy8 zP5_D1cSKInWbnECM&y=a7;fugaxhf;VMS#6+6?+pTKl^(&|T$ojNHznA!D>c0xsck zn%x%nEKhHUq`-KiIY-cHv#d_-&aosP6@1Hb zqm8pO+Oyf#&RUtK0bctg2Bxzad!-YfB1i6=6~684j zx-~YaJ7k#Mh`DJQM#t9bwkR}6d(h8$eHXIkx)^)>Tu830VyXdlNI|xfaDN}?brf6A zg87V~w0RNW7!zfjdxtLa{A&e>y*=Qp0g6Di7y)U>Btc)FiC(6X^pb8;naF&zPZ zw$Dw3Ps2$bK@D=cYtkxi^U#+;j0*agPLp{p?8PpX^zyKN^$Cc4ljlG5m|@cE|I*;^?i#;ZOJ@UrQD)YUhn1EdTw?qAuzZYKOf&4EaZ zNwV-v%E;#+U5(LE?3(iQ1}{-P5DLtvjS`6(ioNmZkk7AG1Qz8J!hq(+aMWP=Ic47rD3&EBj{kyG{-4PNhi^T5&#$~mX zRpkrMXgN^9hVLs@l8e1l0^CAVXp&}2GiFAxZP9zXIYK_CqzQP4iw$vSlM7PQs1;*g zxZ@i_-FhXM&DS~Lvb=|7x;iK}C%G$t+q#D#sP+3|4IyH90K-^y+g^~Z;Ym#!Z?T4N zn{}3^>#jltrCR7-U?*(#W?#Da#F_O;CDOa*3dS4OdN? z+F1cfyj`3VMA2>l=E#s+(VH;Or(UYl$N?cz8y8&tR3vITf7xqMS-ARpGcj}`-Yl5Luxlkl&GbjiqDIJT2J=D(b@MZ7 zT}ekdFB(ulLAB#c}skrl$7~r>FB70rXvNIPJroxCKg88LMAu0^)l&KuNEE-N3f z5O!=I*WO@xlo?XX6;Z1=>uKuc)U&)+{^;7L5ArH(Yo8`|`!f<){*Hv`eQe$#f+b=s zuBUTk|0}zIXBp#QLd<)qb4utQ&o+dXAlVMam*4v$ULf3gR@kY~FQTkSBcZqA2^ZxO}Qg%%TVdJJg zHe0PHf&)eM*!k)P4q3?*N3{bwFN&KWcZ!xK(Fr9ep6P!>%E$=&k{JFz>M(GuyBIzF zs3T(9Vq6s&0hc+GkpE!Fg?@!l!O7bH(0SQZBzLwVl)`pWoVB)5R=HyBYNy zUl+DsDa2s4kI8dwD_cngkG?CGe|2THvsrNTh#n@5QLU2!oo8{x?cXMWS)`%Zg_WY| z%h}Tpsv(%6f9)ei#vdL}*j@r&UULZ~iO4sSq}AGPPqlfI3Bb(^ShRdaY<{`-eF3MU z+1TPHss@ZLzxpCQe)46VV&TIIKQ7RW7s7!;{M7?D)cfFoY2j_yFu<@gTUVFJZu)b~ z=Zr>*zWz&AGoZsu(YkD~8AYpbB(1s;o-z0Elnu%;w1&G1yh_KRoyuDeTST6wS5_%j z&hjM~@|zYi=JjU;2eI@M?Ur9j6Zt#iZANf|n+2NR?VkD;d);>OJmuU)rOd9O&zkfS zAX6BXAoHi~xI|~bcA;u*%@bxSEdbr63)(01M~`Jib1|5xnmV>JpuE%NEZ$Oyl865p z5*0?OiUH=FH2Q92Q+Pg=1ntn?bJ%K;|Rwo%|fZ>^L=i5n|(u1__c?u z{4Kkh4d1hUhx5 z1)X8obIjje!fJJxdcH3y-lM-sKKzBwU5AGpln>f2$`Rsx2SU9kd02-AxReZ0Q_|>U z7)-QcmtFR%5{<+zQ|>l-aJ?zK?_}3Wsm+|KE;d6`j{mqZ660Kp`V>y#7nxdKEe@aF z#=Y-oIG=dogeDpGl3V&Z!~?vk#_Wa1&#X%bK=zYdrVg2FN@t)83x6O!#mOg=x7&d% z#lK%&x|Q(@E$zt%4riB@74F7UWJX(<&OK97lqwRc8ugi1Qc`24qZVpt@-`ovDEDpY zZ3}NYwst^{Udme9x0Q2~3&kO}d34^FFdSKwgfC@U^vnxZfU{wF??-g`O8eF3+t#g% zB~BHFfh2sJj_hPXE4Hda^18G!%G%!qsWzGikl0Q8HUuf^c!t*!s?wh(My=vya6VV1 zn2ASJF0p#6G~S#uV8Iyc!ObZIIz)s-($XZDQvDZov7nottJyHa9W#OFs!5^xJ z&3^~2P@`kc-$Wl?7>691g|^kk1B7@Z?5+=~48m^iTU+YF5fnA`ssjGkn3m#LqpK)? z!rH-6R42S4wXBs7UB#GIo?Fs$?57r64?6R{46UH@z)H6#8oSy3tuVx6XuRYk zUhgzQ=-g)*Um|V@=BIfJ`ZjK=K1suGh-#^gKe|LpXpgNp z6>)+p+#3I;XupPtuapQ&>a?$O_PbcIKBdCkSDh6}!|Pa8Tm0Cx-usYT~O=1qw#4-Ax1EudCuJi@h6oPB#XM1QTe^i~fdtFY_Y6mlor;PbJcr52@mOSR(UEn) zL4$$(=TbklE&{Yv8ot(!*yFQ6`~0v&zWLnI-SSYyA>SSK*XX!z!1DYQePcP$lqRa| zkark9#Jy(=wOnS4K&hm_oS~gci=fZQW?342+}R*vaOj24RH&7j$HbZ}&rLr)uP`v~ z4%x5__>;dy2qGWgPyB5ewiTMfJ2whkepTRp65rk?If|wQ#iPfSHTN|3q{Ym6<8ZbS zo@4N%*~z#BSp?fFDRYLDFKO|(MDpzX@+|8;S7ivF`nR%W3g(lHe2bi~qh?a<01r(q z7|Xl(9io~s1Oe^Es!`*oNT%49nB-h#_XU!&^GeT@eH9upUM3Y9fYe~a{tA6Y35vO3 zDP^qiYI{W?{FRV}zVMD(XL&QT-(wm2(kCt7k&RX=DC_4t$GC~5I*e#8kQXFiU_yAp zEL*|<;d=Uko2G>^p;JpG@)Wu6<_-`uF~G5ecYun4;O4QxUK^4LlHH+=OGsq}c{}{7y{tKD+;ocAX@ordeF9wn{Vu z8O?MSPC9x?3(=E`xG2A=!R(cMG-+PsI_A0F$0;IxpSj{yHhDTE5-DydkORXj30; zDi9yxTIFobS2E_VX&hFezCV^h`>bgmBm>}PQ|Ql#Z4{ZkmUBMK?2n;t@80&>NbEvejWsF(W;<8MWM z=@laViJ9)vdD8jl7P~$2`HR~?p>Tt|!>Bh)356hO>aCIX^&v@OsKM(ROg1#vcXAqJ zhnf6@L>b`~CN+D(b?UM&*uV~dk?E5)Q$T9vCD078Mu#XZe7?8oqp+hOFgOg>!kem% zZ+E9=fQ(HgJ*pNo>)s~SewXDJh-gIIw-*MyO$bx9Ci#-?)3(1QLz$q#f*rohI!ARK z;gC)nu{u`4#ew%t*)IEmR6T-pomw1OO*+7E+rm=2i|vAiGQfm zIK~7eMh!OGJ?XJk3WdCGi6<;Ag_atx-kpr?QxuuPb>JO;)nKWKtuA^T_IebWmWNf1^@m~sMzZOE8ZMFt(yu%3&-2j>bmV$3RJ zVn`LZfbf7JhEV;%jjO%FQW&RU%=h07w?CHv=2Q2}epPUhUfJ*yTJp|OwP#3YpD&J; z{v|-hU>G=)owcPIp z5OH4Z_kb&t$+^Y-hd$5sFZ^cMnFKIeVaP;#c(ohVT*5kROLQomuosvD$OG<6=iTM| z*FJbn{o(?ZgZnUMv==|KS^GJC;0bQT`S4-$3;0+CXyS@S4f@FN80FsvWznf%htg7u zE0trgB-%rc&nyk!rb2_36=O=yAfkamGS`jB(Y*?0@O2Of(*?7)X=c-<_0 z2ZQPg+l$7Q68c9mbB@?-cZa^!`6;@XGLFPYVpfh6i-i5n+7pMg5Q{2-`zO3-#G_Pk zmez1Mm%@+kpt}hgy>}?JdMiXfYZ>*JgPI64=dj zv=_!XiMU@fI&pu>x_ZkbIG{S8H{B*?OB1Xe6Iid zSkWK?`6yQd)i~6LTW)PH42(J-Q?h_V~nf)=u&OV;LHQL z^8r9)8hGorg0zYpjlNNH_oFV8xC;KP@ejX4foH4%iXz^!fgOPaA$AoS5#MK5(iS+I zf_y&kx9HWZ-fIE%qbrY+zj?#HIL(HdsEo`QAX#F50Pmsy;xq9#cVE1DLdg0hW*R<(*+3oLuopo%`lofcUG>MWn||4F9t~UDW_~F z{uA>3jpEEX53K8eWCU`6ctLG-?lj{*q>wRIxsHCU+dL%RRl?}1oC3e{b^M$|vX+j} zs~;njCzEF`C1n}Ia@#aKYpcy^*{?W_FaDh-*ZDY^L2b+gFh%*gQ`o!j%G8>7zB*+T z1o+5FrnbN2NWjv(WQO!P#4`0sj!c3L-gox&Ilz#_b-+(&hfyY>F?zX_7A`hf(8hNR4bd$dEYi(TH?&_9 zuWD^>OifEaO6%uLLRjlmwi!uoy43vr{=P_O^jVfkgg{a|1r4C5w z2@V&*%!tf6iVB(#D{rWDL(>{kGD2kzP0tYvj>Bv5Ns8$fgE@(naUUugKYr#x( z5;j8*;kX*7{3lF{-fYCA) zODq1?<#9&+S<;!MhFqPdk~Wq{o|b3uB&Of0Dr%Jq?*&kCFq^nf4et&qU-t||A6XAi zS#xo(4scFtU^UoBof!n42(Z%tWu$ha<(`YXs);Najp{Ni!%4Q@8Mko4$qXVl2cOsy zG8S~p3PhZLY~z@k)_8V%!68;VGqd-k-cPDNugt{;z`uTp%rD#MVJIY^A^`Q+JI8GV z^{HvO=>C=FhzHqCW@^ILc?BoM)vIj2c-ht!+~GEbh$~6!caF|IZp!YrM3zC6G~ zOo>PgURgiqz}DMo!sYjg&GKIqknx2of9}(uI;h#^_{ufuwjq|NeUr=DkJrq+J*_x< zrTJy+2H1N{iCR>Wr~0BbP?SiFX*S7VbJYU`;S`mH7zN=LBC0z2sj7*K_d94}%nqg; zmHh)+pJ2`>_d5h|m`1@=@vnVlZ%%W2=ZD^n;jFQQ4!{!<%I-Jo|6y!`<}Fby{!Q5g z&uXVO6a0)SHEq)Ji%zHfXf7WU!ilG%QgC-4Ca)L0kf}e@^$70Q2Qa?b-SIfG_U1Z0 zWV*S-sDE!%_8QSUDjB~Pjv(1)U^$%hZvR~ZZQc=t)(t{iAbSQbzom=nAU&v`q(;{h~N}g2WUu}f}=!Um+_gW zs^*XzUQ<-cTMS1y5)UpO-_=di-&QVogmI7Y@|M;lIlT5J0*|x4R71ep7kmub@SROp zn)gI0V}G8Fqw-@p^xJ))zN0U$c4t3wNI)&4tSK=wa2b>C*4KR^Z{nlZO2r^*R-xEE zEkZmIm36J<_wV?2LH|oS$sJ<6A!dt(pMBiiMRFo4EPS}Reaou(lB3ogb?3zC;MpyY zI%)|Yke)ScV+(iTQJYf&?UWB>j&YTdn^cdl5zb^0|IQS-NV_`#LGpO4&Yl;|or^E1 ztAi2|@Ps8XEp%*~y@VMw)>GW97Qvc6K<5@F^j+F4U+I-=FV?-0JBg7Zc+c@Jd>uKF3s-VjYHJ_%GKbubGo^R;i_84lxiOk%Vjd4dvv>slmW1 zzo6GPi~GCj@>N-Rk)xeIBZ+Oek^$I(n@N6cA_J?c($e(3m$gpN-S*B^CPN}H&oxud z^Gj=My341hh?Sd2uU#Xc?JBX82@Zh$^II)H?!~b3>+-TrP#nSH)?(m$3I6MyVFG&J zmUoK6yicdeQ6H3 zl_=oP)Ta0ws7+GHfUp}R^DGz;nZnprZo6n&_fpj8>ni|L0TTpOI=Qyn@isIsCu_5t zP6BEY^Paus{eKUxvF*@mvB}?@dX5{NCSBk>h}@*nSlXqG{dIUCB*EA19yfYJy)_!< zXsraN5M#OtF`wA4>flVXQ_raRNb%N0|Cpv~B7qw99{au=_lM32<~CI5X%A6Ld)DIP zJGd2DHB2wKY|(i;PX7_#Eg%PRmAB)K5*v7TJa9hq#ec6%G5v$H*zDatjYid`#Sgg) z+!}<}EqgckMI5H;mIre<;+hdvcLJYII@-ZF`-pBDg)_@&4#>VdeV#$^{2CU`m)Q1P z@ai@XKT4Bl1xD+|{m&P-G4@&S5v{iOcGzBC*k6PhXAxL@t_AA>W4r3X)?6vqv~@TAN)SSOL~bS^79Nu6^Eu*TE7iGq^Re z%Ps>?yFiz@A0^_pr*sJjWF}+;RbgL6^*Np6R;B0A$gt(0HM0y^CY5%6yIw(ULQp`N zo3^o(K=xDmAWbUD{WPJZa~JhUfg#6ZTz@WStC3LyddhD-txA#?MWk|GSbUJORd6dv2dhC zJHkvC0>}H2OAvr0#zcSvJ&hxiBJ*~~R)Of6OElbP(j8t#XZT#ZjZ^GJVYCje{@cd6 zZ^R31!f!&tX}gr$J;!jn*X52>BW}kReO6 z1kCjemDqz1Wa=^6a+y-LT1xE;A`3d!vi_h2HruYV&R^};mTu;m*DHU;W{v6ym@rAs z)k;)W#tRd#uId$BtlmQAlgSy+QgC0jTpoou>5`KB<1@zJhzhuude#8&@HX1ukd@mL zCbf3Z=8KGqg3Oy);+2GIM9Ky4eIa8dv}xE<_nfJ1>Q08@gUXi?^zis5!{N@}hnKOV zjD4OpzDXFUy0Zuz9YnH*g%iXQ#Fh7f)al^e++cm(5cf|dj9>EV#EAfc4c4Vf({b_! zH2Sx>OzAXiOJ6zfu33SWJn_8f%p|%F`aJo!<@M0modffN{cxAQgI1N zb0BwHHe6mEx;Q>Xcgjk6N}+i=n3l8j)})wUoDq2ONl{9IMX}Qt5Ndbo71G0=+EJU) z;GsXKiF~B9TODhxagHXgnJ3(9N=vwzg(ePg1deBN9cTSj`K8ma2N71LsAzN|_CH+~ zR2#Iiv>+vAY=|t5ZA)l>46#-gGM+4Ht?EZPn@Mpy_3sF>2QI-QI<#9_ICEO*tR#&T}YS}Im#U<-Z|`C3_I}L1%B9o!B@EnhD308IN+XEWo;mEoOEEs zCl9!ICB1>S=FZ54Imyk4Fd`rZ+^OT%W~V)90Jx1_==R283me>5CS_>kZ@5 z^*iGBJL2*sa{UO^6f%MHqghtN6mJ&FGX=96R?99i;DY;fs~Cfu&zP>&)}rVDQ*%#AE;4@8i`r%H1`~3Jq{V*~vxJDW!mnKxs~-apa=;@ZB4T}n+w z?LPWqH`&|kY;#}6C_6ObYTANI8Pv)tOBT`wG`+eX1YPt9IJ%zYt65OKNMHBx6qpR;@K#$F^I1cun^ ze7nkH)pgn-xxCCIoL2YhizB-`EXd2SEKMls9&m;lmR99*TFmJCNB~z7-f~Ra=2vy*#Z^}3EC=?QOtU%y1foT7|0a5H~&ms;)j3)7_l2;Vc7lAA11Wu$< zB*XW3&To3p!@OON82YaMy(+`kk6RLkn5?Rgh9cFuak9l^ZZVD$H5|VEAvBZu(EJL@ zNOQA6VFYVkVZ8U(q0gwQQFx98(-O6A)Lvx%#8Jc{e&;!P+MOo!!EqEV95`BM8XJO~ zKW;o3H&g}+0uZzm)98}{e5)=r_5{H=Ef6MiO96gFT=dksaPye2=&9l*0>Lw3SEhWlrAR#_TAI)P3T|7Besz65LiY*Nl8}rKQM>^JNyrZGa-3P{7lHu z8KWcYqyz2~jA$&X!U=X1yB=QrYbvodA~HK;0jSoZ=3lPq1uK+BzXY|diG*#IRi9gS zfjVP_PqnF%cPk@>h-Op&Vn$q+j*BMP9cT38JNMq+VF9JT;A8O95Z?N*+=_{Uq=KxY zKfbV|YJ>I3C3xJSqw~i7;XWqo_go8elOQMV(N5abU-VT2uEFgMs%&N(To6x|?iFGw zk0TJ-Qij#K51!dHa>Pj%F&yG%_y0I zt;~Y_{Xx>zbVu$`Y+7+pEKID;a(iRx(gz-hvw|OwZ%A1_8G}lk(K2+6Fu=c$4IVyR zQZG9XSexcZFV^&Q5t=efzf!sY>TFk_yo3}p&S(s9LXAs!28E;!5zsG0rrQ#RZ zFgjR+8i5rmBI?*(Bkv##5K)xNgOgN6xoWL8TAe`t3$2JB{5Y_8z+EIl3K~VEP{=0h zk7PL1wVbdM&B@h@jVwndG{`Pkw~=$sy|%W2F$=iLHgcn(zk>p zoKkX6%nudp@laMxNl7O7s+C(Q)yz!@Y5#DQY5yH|nbj_)Ak5)8C^9!SPepQBvPRqk zLzWQ|I0htIbjFuqNbQGvZpYYwVlo%0Jb|0t*~6MrtlwidoC;2*>e6y#Df5nWz=lhB z7KGMFpfwF41vcU|CEUSHm~k zC>1=2uaGbTzO3;Flb}$?IFm3LMimr~Fw&{tDej$U z;wJ8_Dd8kBKL3b*_041Ipz9u0^Dc8heD-z?l;~pMRW_d)-hZyQB!n``t;!kCEVrln z4^Tiz#F9=>6u!?x%vayg*^GDnuGHn}JQ zYP|uxJsdR13FmO^#KaI1F5pA|h9DeI{sTc^P8pPP{oxZfSX4JmGW9N=8<{OP+R85% zgW?`V`hL`%?4RAa9!>W=7|>(5Os&fc6Y2dA!|(%ze0)_6E~T^A!(+N(6IwW0u;hd? zk+!I;p$L1-caVur6sDxK9l!38S>7;)aT{pK6!D#FGanl=HtH&*%3h@puopCpWgG*HBW*}!)3SYSk-RD`q>mK$*P}G zOvj}Hpas+Fo~?6A_BZ^!Y>5ToEU>A_fsYiR6ydnuuS-&RgrSh0-X*=8!|?C`tWF;x zUho+b5^8i;a848b;c$oLjevU_Qvg1~hYdM5fi_iBu znfMBFvLtX3$)e!#)&WVFA~3?bSiVsvyLwxgh#d#Nt(nlLIotlqKLa0sy*>vQQ6}%1 zywU&+UFxd@FDHtcBg?dQd#1^GU|v;oKhCv{<4pl0pLYNFH+@|F2a)?=mXB#lM+&Bfv}x38f8OfVaUZR*KNw8({tB{K>x3alVf{ZL z2iS6L^L+P29thCecSzYZLV}rq;c}LL@K<-wfqkbplZF(1m~?+ zqRG-@1Top^-XT$Se(1Q$GsVEnRGN^h@z#2&hBTA=8#zXaaA`q`x3SQ?tySI0dCcE& z#huM%bM9eo%C`1}_B)*6C;EBq#9Yr)GjB&~27{@r!}eOIrsok>nY((|2LJR!a<0<- z^M%3B+Ewb!l7tw^P`mRQ`U|l}z;XfYb>*@qYnBX?l$*hC@^xu+n9_$*c{qy8TyJu% z_zL&Hu)RcEXgc2web79pEOr~P?38vSE?;KtOZ7M1HL^MbK<0>v!Xn`cmBII~2n}n} zVaq?dMWO<<4qAFhml1dL)_g(Dp>B+XGG@Pa{ znQxc9VKJnWQ*tUm#QTuT4h$`{nL1B9H(S#yUf2RR^|I z*W}wu}oluHtJ1 zPLHQKNEK*kaY26Q+V{BwRY`(W$MZigu@4ug2zN3|SY9bs!JQ;r7cVs^ZMwhT4?_3j z3li3-fX(iKM$8Vhs;mj z^v+ggl2-A%U)++|5TH;ImP;wc1j%yZyEB>ZWVn>eNeJX~M$y?MAG2=9O1j(rRta>@ zpzgb3)+_UCx(_@zheh{<05tQpgC;s;Qkq^G)cL}9c)_2T8%!$-E{`)@M7H2iZ9=tk z9$~G^mlssg9?X)K)A{{ki<`fx{#YIeR4U>N0hc1?iCBe3^y)}@);x~C9xoNC^?}UB z@rtlVXRCdTE3mhYsA4kaxxMbk2NfbOa}d+WqKXu#N$Uj(ag!ecn+_2lGp{g6ZULsU zAL#x%OI!s=JzH(;mX_Yu&%3pVb$Dp&SlU=F(VkAg4~)@17|{nFKk7p}0b5=42&)IQ%3D1^ty{pwMx1}F zT~~A&V{RC}4keXb5xaN}oeE>@fC|ke=d~f7?@O-R7HcLMqMc=6wz-yvvO2M2Mcu8Ip7Muc1fp0XObYDVKeRj!L0? z!qJn68)MnnP}b|}&YWm`#p`Wtmui?RH?S&fEKOq|ah@x2K&6?Z>smy*pdX~!g6ITp z!+(VLQY@f6xKQijiKT*#N|$qn!X#%l_2w6_Q{QpYcGoXjpvl=4)pD$?IV<-2(geQFu3@lwx0=x6<8la@;VJ z0$FF*0=`Bxcj`N1-;$e!X76&N{(TBU1ir_|nI+C9E_pKkZX5Q_C<&zTwU(FQ9mOv! zsOSG9>u2%c1aayY4nWoRHU3N1_YT(Jxm7oyX9kUCkgPATX!>8OK3A)+fSRhZalLC^ zCwGngLnjm~j|C-#(H~v^$cd9yzpvcXNgdr)E=F8H)V1-XNr+z#CuG|w6 zXE5(gd1P#f;;N)BZ|SK;jQr3cqAc@`mzi?>o&oP8`@d{pHmbQrrYdmL;&lo=8~V4WzzF?}5(sbi+rDnwSA3cdF~}8V!(U#I zZ;&mZy10pDe+9p)j~OTKbxprj9HtAAKaP&tP%fd|-79?06HgD1IfSCTgE&jz)zo68 zIEq>UIf>Y{X{$G%(K1CZRd0f25dP33k+#Lg9dMX0R(O?BFQkB8DhXX3ktCruk&Dr6;DAg1F$zGFERAhw;O77+=SLYKsnP zV?Xgcf$Z&T`deN28#=C^$I$O0r8b5omxqbapV+QMT$L zDDrk-bms97Q{ku{bUT&*lyYGQ$A6DSb)K4DR=VI--tyO?g<7*{?KGOv(NH>t)Op3oxH1WI>|bsE{HSB#KBc`Ar#{n4B>>wKX4OmMD3KCt^vKDP zG7-GF`iI!Xw{%*MR6hzv31hOJ{j~>?T6q8ZCh-Wgd*il|J zMyBpPULCF>OGK1QKqT(84s01{^J(ejQLo1wfW`jC6Yn%Ie zxwmy+QbUfz@QJ`TX?ti`+OpDTO6qe!R;C4d8y_xVG`~+I?Ag#Keqf?`U{U%m zcyt!qFNr5ohHuBFjltLD%-HO>j1cr&9s+>NF4zebPYn(2NI9OY-W5{fTf1zUi__r( z1!qmwB3V!r1seMU>~TBhW_IOBY33CVgcbTVR%tMG%}T5puebahlD``VnQ}Iib!MF{ zE54eSbSgDYEzqG<90%lE!{w`H{4o$w{Q+9LP=YD6<3MgMxn=`q)+(zk<{W3kJNnH` z(WRf_*b^-xazrxvzo{;TGM;kl+vQxn;Vc7CYI9_VDR?E9-A3y@S3PLdhltbQE)(JJ z=`cj^rs@0dIQ0$1Eli?$%_@vca7bm8gBN7-b|xW-)@zKme;%Nj@49vmX|gfdCDl;7 zgtoIC%SF5u_UKtFr_vxMrJov$6)pt4g~pX=cV00v8vcl6u)3tQEsGf?B^*m;iFkOP zI}G%BV-!U<4}VpUChhmoQ5(}0@eHPCH2$emocM;?E+rOAxCz(+xf7ya9q!u*@P!9L zcZjU|-Kf4PXz+FC1TF*$K+GRlRo1Zl+t|b=DOu#5&Zc;Cs>^tHA{5bkZx#RfSM8g0 z{2s--rtHO}3eam*i|27=wM(PZqS@_!c%8GCG&bDr_Ff%`e@>HL8 zVtiSaiN#3cJ3YOCU%j|e!dHmC&d=v;jB|w^L5*Iu3aGj>B8M?%|3M!>jVpG6d+Z*0 zXEM`-mE$m*;q|fLl}%qtHxLACJQDJQ+j}LtMs}^CpeTp0A|ikf{i*{Mo`EpgTiZ#i zM0mgYcO`uTH$d(h++CaTosXjn6s&1tNS!J9E!kPFMgvAcyu7JsmrW*5uD(0g>ahK_ zf!tDNp$~xTG=(D}l0wxOJ3$b0K?A+9-tGeO2sy!5j(2%lM9%HE@5C3&lj(OP{Tb1X zAgJ$pW2({}bF70+{*WXCNR1osRxrH6w22b07LW2KiS=SC^_ z;HC}4%%xNYGL@_6!`Vy#0YuPxmS&{z@BbLG6sq+R}oMvpdV9)rFcGyPCl_QHhM z`VtN+=ED0D|-KFYcWHmM#vyPyCclk?mgepYc-Qh;-65Ndw zm?@fTD3q+Gbx8gOw~?|J#Ah0VxbYyDQPC%~7kNJz7cB3DL^9=pd@T&Vm|@v6vT=gX zFwxPHaEkgbwUVJur&1V9&5_DFZABK${dt8^w8M3*PmE-%Dof5TN<>nwjF!{ibJxBx zTb?Q?hq}NCMl&~(2WugK-+ku1?pg(v=Y$Vc#3V9nY-U%cy_hX)za7sEJ$p{L4|~-} z`qbCfwW2+uc({^0t?1~pkb-j1|8ON8I=24;OYA!13nhjISA~zA*JIDNt+FW_Y>k%H zsRY;(Ag1lR9@vRD+6uw=D1YQM{Ju6Rzn5iPvHO0}WPIF)wMV!< zlL)ceC8bLf&$;++5vg5(TCPrielUKu3qdfs8Qh>3#0bc*VsG^Tyip=L+xU)|z1rAv z7*p!3M^6=B;CIS{TN%rI>0#*ss#khgw75NOs$hs@B_VVk9UIX=8G~=TR(@49QiY-0 zM3p@JXwx5ek(O|ZYd%6$AuMRsr2haY?UHs|bEh{pmNz8MH~}p?=_z>i5_bz6W|Y}7 ztZ;mc)F_#oU-$OPY!drb(DS$1CQ5E{5f#cs*+yc>qyKRf5daX)MvQA)%Ka1yDcqQp zBtpU$sz5nFBErTNjyY9HBpBGqyN2$#YK|#9TEw`?>i8f=QmF?r+bG~v?#<^{Q$nhf z8J^s$!gHWWHh7c35XKj*2tGT>43v#ME-Y>0pWB;{9U{prs4vyj7Th+VZZCrdYsp_TR*HJq@k7sOtP^BFj7#?6WvqfnzcUH7XK$O~07;f^HWFQ@K}4bYB{ z!FRJxX~j|}VK;Q%Hnmo923Qd57?ehz@tiKfc@ z$MywOw|kg!ne)n{)`}?67*x12xQdjT-1O_;WQ>ZpSB2%infq3tdrUzwT&Etf-=WE^ zuBjr*uz3SJ(LD(4kk|>y5n2%_1Jv*J8!SK-HNp@sMo8&cA}$kC_m}lCGw?Ui7=6z5 zwJ^D`C2Y7=vL(W$tQrrMTn`@}j18P|@y+{VeY2M2L+Cg+aB&P}_6cP2!u*TkqEsKl zVTH{(sx`*wI_7g}DU05SZdv4q5(9?fGlGt^CgSpvP-levps0DfEQow_INkGf%+42? z%fyViirbkXWX<2T$W=dDN?Y=$g~&i=E9N3j!=dC#O~)7hefoGRY{*<({X@2mIR%Re z8pftH;hjSSFgdX*zm86*AWD`8$M16kENUOWTcexe=A|wUb|Je9ReXL-zy4T5J?<83 z&SZc6BUO?C0Ga!X`maIK=9!1PJ+98 zaJS$NyGh>n{l2x=cWRy5Rpf za7H;B2F{#_iMG4zG&0GT;e+{0t3C`%Lm}p(XpC}OrF&YS zf&34v0nJ$AoR98Df_E4aSR+`=mi2Al>y(#>x4kOn?2xP3#c1w4-;Z0N+jzU;Q1%Oc zC~A`>cQi~+r7W)xxW$Dou;c|#(5?D968ND-s%nSS6rg+BpPAXqHhC{yN;WDsFQEhpQlMSNX8loC zzJty;-%QKdxgqjZq&>Zr0iD%^^MY;ij_9H>Ufn*(RwI!LFFh&%+A$PCEXv@_3Z(PS zQo6@evJCe_{E?RMhtA1HDS)v#S2kk*?vjD;d34D%Bh(K(d>ZJMu5Rv=8zp@G0aFwn zb>Tuh%2F96P-#5a8lxWvyUlw(w^BlvIER5L&zZ$8FnSgNrFtj$=_1@J0cF2Y8Q z!n+rL##}(17@-Y>7b&8eEhbKpFqX1l8Ue;VHKX?4)5tNF#P)ov!XytQG*y@jR{s>r zo=(BZX_6@MortX9veS>x;8h*dN(5r@WV=C%WC_Nh4D2E>KA&qWk?pm}tsSl}4da%Z zdT9hF@|rg<9%`!_0yoFCBWqzZ-B#4I>eScOHG#U7QL-GwD-5f6%(e#NUltmZ*<8s$ zNoQHZmYo|IfsEeZFHDM^HoKjvx9@7~!oTyrn{<1|IbNSrdqdC0`JM2p{y;HiOl`yp|z zkwb&Jga@`>C!3Ju^JW0M$yf4ChzC}M*^|zVzN$4UNve3;VE#fAJ}^JhjG$!6U8vXg#nOXtbcH16UZ!;}BzIVQ z!&?06t~d!@AmhEi^K`jKqlSqAzX?o?V7ELERNhqjeqDE|%do>jeqVbQnZZ~$E-v%S zJCi#WTbsX}6W>t$ODXG;lJGMeA|(tL!eW#Z`#zgZTPRzBbhvw@G6Kv`g+C z6pVkx+xJPYhqxr*fHZ~)tX4~RtM@kEKMMd2h(FKA;N<1`pEw~i_3Ax+RjZP-ozvS1 z<(+OYN^yyTE2C}an}_)1Eed1l3sPT_?uU)zJJADWxH(`q5e*Tx=WT81Jng+S;Rd|u z%{2YNOL;xKn)7O6Ra@Pv80%xYeV9L`j`8Fio2qyQ3B($sl8l=QvFCerdn#MgKCuU8 zXd?;fs)F}<#SIk33zJog;DX^vnng$bm#2G$*>ZSqocaSr$K-uyy0lih#43`Z>1ZY; zEkMv2{Z+gdXI8#%t6}$AV2EaY!`2rO6TAtImr^gZnW1a}$N|rTC+HVXNVcD9%JHb$ z&RXjRlv;If-IiqfE1&2d?oE^(wJFy_ryJoQy(tazEOYARP*U@XU+$fe1JuE)GOi`T&>p^OAhBT8$iMR%Q>dW~R|LMNb?F)D zz4caCpP#lwy`aIMG=kKeT)A!(*#p0j9zr0oKDjbv-DUA5Zj9Be1d>&|#4jSo{Lm~L zbSS+}4I?8;7?zet2!K3#V{M~3V3=VgAp}6d`c#>0ueG#F!ZyO4{?ss*InD9w&i%dR z8kdPFwBC=yZp~ts;eB<{t?lngfg4~I+jV?|Q^;_hNmQE;!Z^@rY)Z7Y1b=_kt?1~J zp6)ct1+6QZ5zXAa)ftD6+tX41bjXqz6YpGaI7&`A4Xp8wzd{-ZUY&geE!O`m>t^hb zJ#aRf>KuJDLr!^_m*I2-%>lTJ{ceP}OC$b-l69@`9ubEVAucF0^4-ogWQQ?ps}{Ds z7s%!O`638+^XhBXj!XH<=W}VV3&R2&b^Ze@n%U#O#V-eMMgJv!SvP!@$7a`Ck$EE3 zp2i$K--R0T#|v^`A8#H{aVT2+C5~F!vI6sL)mk}@&8}8SBZoFN9jWU~W6^42voWc0 z6E?jQQt(ln@L3~v`>?W58?tF_V$h)#8rZ$UxcLm-+CH^3{{0iurUYU9QM#PyzwMZYqe-Hr%6nm!~jQm}vw&yf*L zZCn|w#k?>K!=e%Yi%8-iScqkSRTtY%sacla_9r-D zV)gX=5-nFx7xOLCG9%mZN1W82$(eydvPe~at?nM>lExd630F(Zed`?vVF-DpktDP= zfGKNjF|zt(HEhx|kM6`~?4dfgFzeAqqy3kSCM>m75+CJn8;x*VZ!Wcvy1Hx+jXEFc z%&3m7MG;Kr2Z{2=D5)#2wYJwyuyuI4o}a0S5gZ;GhTv@VJVBoyABY74Lc#iTq%%NkaK$eVF0s(jCL%zm z8JF6IH=ToI+_%+Z27Ek$ysUpu0~M-^qefGcywv(Y&?o>YJeQgyDvuS#TdR2pt=VKL z*6#WQmFoBjvhMJlz)jo3HqeQA<`b&(JAAa~r{9`@NWZULpvroh2R3k(h`GqPDdAO#DmAV~Z`S zs(3v5EJ-YQu~c+OuEV7x#*hA;NegCLYG<2M{d%`9DGZQ$&L3tM!r#ZfjZxr?NzgDy zn1&P1_So;5Ii(4c)MET~F>Xa}VK5Y6;;R9s!jcw3b62(Uf%s<`GuYo|X&uAXBu>`K$bxr-0_t(AAFcJQYiVWVQb#@LP9oMK)<*G#PABW7nytr4E_)DIdeW86% z)6JK+<+6HO)Pjp$(k3|UOr{zDmIDa3BEUed#A3B}b9Z>$f`G=fw z5=EL}6ygHG?_Wzbfj2fJ)F0WKe9_!NYqpe%3m4pDG-p^Y3yL*@>LXBNS0pAyAq6rk z3*ZJ7Ww+H+B3P)YRjI!MNzu)^Ts5~{i)9qU$Afq39@#2xu!k1^&$q`43kzzgBx&wC zD+=o6a}I$=Ua?$gmwvFpM)o+^{-LI#`b|-NiAXg{R+Vi z=lQg+SXU!nJKf}NHafn;JH7gZe74(DxYxBt<#C~!Qu4A*C#&^5@;%xL(bdpG~krf zHs()k^yz?fLd9o)%W!zMEzNPY)h;UIyIjko38=Zr9OSufZ~DS@R}PRM`QxKii9h3t zF~|hu=4djnA_|W*Fy!!xp7@`~vE=jUh{?R9+NbMPTWAY#4o8;2r)M)5cAW-kJOI2Y zqE?9NpAH9&0*&Hzrc@hl5DrMA=)eDM!SSaajf)3ZIu(_E{NoGC_&^T-Lt)aMv~@AW zUO5CA>eq(Igo{@%QCv5;ThO56adublg7OA75#n(*lOAb2S*fIo-pkd;- zTnN}*hFNfEW^fg7Awq=7LUn_TwmU!AmwONZc}Ny|D`G5=v6^81^?m-GSm_VN8nTIJ zhi?cZ7G?_DAZGD9;9e6?ZMJ%V3E@=jArNtsWG(}8Ufe;n+Zxh|naJrTLvogP!Oj)v z$#&@bHA2QYVRNdd3Z7hE-Hv{HbHO!sao}-+p4nKO<~$zhz%TzVzD?8FJcEWJ%kV*6MMY@+zm5 zFUK`b3ixEVoFBe9k!-p@jjb9zC@?Bo>n>2o7Z=wKCp!@GYT1R0R<%t`*z$Rno-EzC z*fR=SM1R+9N-vVC2$-pNACK3zyIVt@f{#+u62P^YG9G|THxv>%*Ye8V8Pm)P;vF)A z8ty&)e>#(X-KtEHS%%Cr3T4!fHZ?m!);2z}MosbEhGr}E^2_0S+*&Uh5{3}uF{upJ}@Dor{JaG@epYbrYC91XT%a+{LaE0ncI+XeNFg^~l5>0XQ1Kt>){%Q)xQ-14ZrU2fH zxi}kYkRt^m7?4?%k2u&IeT_EPt8FIE>yhk>(nApjt7Ta?V{Lpt=Q%!1?fS6$Uuizv z>yqcNQQq9PJLu!gwL-v^et0)FYoNoQDsiqxDJA_*cT%@OQ2%hWMg~a0-oUH@!wSE> z20apUFw;&=dVGT9;}|!!YQN?a%nL*)HY2P_r4-krgog6JLLrF2E?Cslqhp^Hh;Zd| z?Xet+a8utqPoWwaXc`yz$@F2%tZby+Rli=0&sQ&8yHf*^(uBSs6@pF(X&)S9DcE?FoT<)I?61lRB2oC!B7fSMyh;N6&y6KRAjqVRvHO#C-}b7gZK3xH2oy)yWLX z#i59^;eq}UKJ`jZ3laijw{~-$ZAf{E`E2l3S;h0?7&n4_9-7({gKasKc9nGz95^a@ z%wMR-f~kBS?cR^ML$ud>r=-!3RmQnZl6wW7E2ZS8)XN@w;Jvq^nSC3T;*f#WR zCi^Z8m2(rmTR>p0u7L81HI-ExzUz%|vALY4RvPDO|KusOs1VM$kE+Qaq^EdK-szdb zlS`prmgF~kCTNr>_!qX@3p6vbE!{c6lZ@lo2%U1t= zJst}dQ8bFT8r4U< zaS*=3x_Y5(XfGg=PV?->Ao)du9ONr_%p%*43Q)h#=4Rd(mX|MOb;|FGE-yV-#M#S` z0!l`ThVkg{1rD=vo8)@K+(^E#Q%P`Dk9iSl2J#JCQ!FYNKq@`#tr7N_GmLE|_+btgENKbx_0 zQV+FGCke*3-q<$hu<`9kz@39?!iBP|-Bicf6jG0pF5nr>)ia{=SCdXDV?Bn!T{b^{ zR>orHvl%ulV#STi;7(^xVi@}SEeLnq7H8x(~ zYt6FCy+Ut}&q&;M6Dhb%xJHLJF9jP^#Y2mo183YG3@6pC#BD`uIb8{q&Kk;6*6;R* z)>D0J`23N*s*(Pt@`gxwDG{;Okz8KfDL=@x^CMPEbn}ny>Ui{nfTi%Pzd(GR2$ zsVJ#}p{c}P@n__E!are$&6oCfy_tIt4aZepXKyMtPsODE{v?yfm=kpD#FQnHZ((7x zexJm4^ouO=EPkJ+x>H9^Xr4&7bU({*$w%92Ept1D<*e*SfKq zpK$$3LRw8zOZVheDR={-YjItyI8HfEdRlT`wQtMtWXWTL*H(NKHbz}Qu($D%@b}su zfG{i|NJTdfa`4y;6IBKCah-2h7ad=AZf;r7E7HdPiL1KR^n`tL5qQTEno45^uHHZv zPTIGe>+emZs_NIw)qdTk@!zV?n9!s~!J?%=LvvhQSglOYa}n|Beu3M|qdDZQH9J&qAx^y~AP znSO9iBJem?x-^8{7PGy|Gf(2ZUqB38d1A-qARw7OkBDGfg?5+l=>g4pI)LsAeXX3v zFHwfz{4d637X5&*0Ru_(w0582x+}YeqH3ZYvEvu^A(ow34*atFN0!CnqX;MV!FNG^_FC03f7>)ie12W$@)?F zYY+*)uvbQ_dy5A+X)g$lr#-pu>@AjJq9n_*vs5S>R*va1 z%ydK{t(A#mNbx3R5@Q+;=Yd5^n%&v~TU}GVE09aKZWOJqCU*;|B>xvh@OB9=#}mqq zGhOsCIjBn$sTDqV`Dj-uX7`T8mdJvs+KAtR}{~l)>frSh6xo-;Y-xc;% z0r{Q{1kKFn-y2x@-VHqic+VOPj$qf>jH&H173a?lX%(5xO%%wDHE22IcYJm;-FH*) z2&L7|pe>0LDb{iE{mviSj@k?px74KK{=vBZH*-tGmZ1G`s5-_*KgQkFJ2{hFmubuG z5yFsKaV;%ty(RIPd_C=>f$2qke>l?6dKJ-)+`{Yrms(>#!s-VM2@mX`OuY4$mG6(z zf%VMOj=khXhc&7D#j)@NOr42Qt+!q|dp{y~`WB1wMcqQoUeT)Rw)n;*-f&Z4cm90-a#p?etq zLHQ*7TM5zUxCd}dT>ZN%!O_W6x#GMzhVN!tCy5+mfoqaog)IJuTjI_AdF?>M=~0jy z2@7wA@6bjh`1=@r^-3?r^Sv+Nh*AW6)r%3np>NF>&U&ji{Xg~4wd89G+9R3~Sn1sV z0ll2!ZRJvIaqpb)IlXO7Q6*fV>~Rzh2IicdJ>mPq&y zeA(a>04#}kk^ZopC=f1;yETWr>f8~aVof_4Az4Vwek7hDy+Cc*E3RNe}!k^R)8x|luVB?@Mm}GdI3wFU0 z8Ar|bPy9HM(eC=rV(sei<(r#4*V9mtkslMBI7jtOjyd7sTM~7a8M)O`Y`DHYhBR3b z%q*pU`UFd9s*Q7?5BA}_pvFFohD9vFc%V(XzWMBrqA2$(t@C(IwH|1C&b34%C~)|S zb7>iRpk(~kDe*z?d(MN-g+7h!Sb0RBGt=bg_|X^^v*J81Fymn77KKpxu?{?aoi^rah#s zSJh&^P$7_ezzsP!J|gfrMPS19O(sv|z2wGNru69!tn;c$UjqBp)!wHTGCvFE(!?|X zM8!C9&ZwI=hDu7woRHFubpAyojnVkABIVOGV?o|V8zY;%hYv&UHdQ;+VXLyn_!h2B z;$NxyoEun=vr^om^d9=rNsZWV#u&Va=tPheNS6 zmyJ?OeQWBNsBWb5gI%l~+F(vY?H;La-rT5hp?3Bb%m(I@QvBN7EC(fGNJv;0!~n=z zGSD6P?bJLMhPZPxv(i*&^cwH4brWxywJ*?h!IK(|l-8laXsYb+F5ez`K72@Summe5i=`TBLM}^T<>HC5$ubjl_DYg;@OqnLZMXVx5F+ z3?}6+L)Fr*REw5k|7G0M>HRgT6ApiRA)#kEX}?IXTBj*lteJw-LMaU;zjtWJpult; zv&J5e+_r9o7U@qa)(N$wb0e>{Xp*ih<17~?9zN`NbgPAzEH^|rKv94qNRD60bFISZ zS^DU>F9FewXjx}AusEzbs^^7fI?sH?R@RWn@V-cxA^|ZY<@&WSr-iWKaX^Gj%o$a- zJ4)4z^(qUf%`~>nL0t|@^@bo{OxQ)sUEoiM6K3qeGxj77)tbaFoP4lFs@v}5CvKJp z+ZKaii}x2$bCVhQ`{zexWF2iiTNFZB&K2t{2mh0_20?5+dA=xG4bx-uQ#1t({l zFK7a22imqcETPuNE6J9s*q&fxrd9WmS)+izgPqXk{$ZD(CKG11yGFVkXsINuyxjq@ zc_jJ8{QYy^WYrW4gakIdoV6mAGQ;>6VyQe|rZYX0RCka#XP-6AvF7KQux&YcAKlzs z{!3qSHF$7b{3wSCPgH3^1xs2iE~)?h?T?Bdpo-`GtOAt}R90?=Nf!zeHwnpkYF{V> zO@!Ohkh-NuQ3MCEax^K`GhW<9Uo^1!oNpa036nk#p+sQ~Qn?8$CLL&;T1BJUc%yQLwwNax@uH_f(> z$@1($HcUvnwq7_fy(Z-#QM~AvPotsAzhI7-AV@R@#?eN)0gshm*R|89haBeM?-%5K zV8EMW++H@Snm2Q3hH*XL&Zn0zrPe^@f4G~jy^d^=6QYc8Zu46MIXRqBH)vIh!2%l*BAGGKLn{Of zid|t(ik|UbM9bjJ*0$z=4i%xPEEv2{i45~S+y0Bh2T?0Lv~La9Rx`Mt{&6HN77P7W zBmq2U-s(Xye#ay=Uh{=BW}9Ku*teKDsw!z0M-))}R{roC(AqkV7W9mn6L@q6Ir;=? zYfzF{qj6G3e@cm&9j(PQFFTI9y2P#8%iC>zq|I>g|CMEBXhn$)noR`aefd^JQR+{N zj5g7%fhbcsiA7_wJDqAPW~%yl+x#o#w@w??B6~f0`H#~Xwn(r!4WIJ5;H1`U?&I^j zkQ<66gI0gfi%sw~;Ch;vf405i_M<0I%>6vyNY%0O^2wCb0#IFDN^wOKuuFE0Vdr7j zp4kQY<=tY|w*H2YO$~pqR{i1QCaoudbCT8``ou!6RVM#bmADW^yyPm#45q0+uwN(wq}{nUw#YWQ7BQVEHsXfl^x~|6bek;~GB*B7G|KgWB^rGb zsO@ipN*pUwvN1VCBHdD8Tw44Dmt6iA047z)+ym$UIuQ$@d8_;snD1K{3-hZ$O-ePz zrFC&~-UR+7Zkd*#9Hcyz^!Rs1hfo8(db2;6_CG`d?KQik>pyu|y^V^`2Yfg|^}&1* z)K2Ga-NF=UM+cpspB|R{tg7_-I8c=ICO3=v`IJdUWk$u_QrOA&&R)avL#Rdn`lbx? z%j|4wg=MVUc0WEJEl!zhORf+^@K^){9n4M)tM7Q~EuqVvFq zdI?)?pD;77!}&I{tD26+`)s#c?b~?wdJ{N!-w$Y)rIW5kt%`AoDQ7snX)vrfA#fne zjEPeC#t@z(^8?cr4WN-clp@SDn(+d~_npPwk61qGUyQc&#)8u2vhTF6pwF$*L(e>H z<;LkqEtk`8?q4YN{McszZcnUjvqc~+TYr*4c65a1kVePxyAZxXUYX^Bkx=j%f{$9D zivV0YyvJW35$xCZVnz|GgGa<_VLaQKe{O7`yKo2g!+Vknc&xbKMmv={*c(pno(;;O zauD@v*0qH2>er3zTci@zpKuL6-_X8rlFtlC)SS18;F2qCU;tER3eDT`Gx1rG@sr&% zd-t@pL)|Ka7ImF}`cUwzWiJysJck9*+LOz3I#b^79*r5rQ``VOJiH$+?K4kP@7nc# z1SKS!UVI={ZUT>SMqXjVUz~1ZIA2U)VaLTx{EI~yO+cg&riC}9AW1CRcJnAx41^__ z_CTQDjJO78YvzO3ti{qWJ(^rxeJpP)%g$YT7FrTy&rI0y4_s@|{zE7b_Tqx%f;U(i z6tj|om3;4+QC|hg!?*VeKQ>*` zS%7xJgK;zGa19uJKE#Q@4VQtA^AXQ}xqjJ>^R>Q%LY!Lpm5`}tbK)Pst7yReAK{aJ zfeT~vZXPMJ&@!6LKI)3m2sCm_2Hu%ra7)P?I9Rfa^i9O^gt=#W{QwiLdl>KP20oQAAF-&UO~yR647MToyo;5 z(6IESg+oAKeo;5CcRdvYmS-HKD>h+b5y^l_vF9TccI)@`EANf$t4LZ^rlXc7=H?S1 zES0;WS?_jq=wby{H+qd4@Vsv(?$9IZ^rOsMx$d|XIl(WXCtm=rFLA%Xx|#NtKX<=0 z@o)&ZOQ}P>B7~(z74$dYMrV>9)hjb5r4I?UsMzTQGXhBUSQ;CR`Z06lK&%g4O-0+v zWU=x8?y~99Ij#fH-Ew2~387zvn*2x5#+FDJmVcD>zSNopcYlz@_dt)rJyH)Piz57W zpl5r=E1!2^pFY#L`81t=@i7MQM5!!{L+Ik6QC5Bv7v0IaXo%*u z0NRdvg;Z_kTAxlqHDCxHoi z!rsj?KA9OITJ8}tj6y`q<;sf^7N@PUI!{lMD0s$bokr~lYJ@l7xfwVhmlQ4}MPE1W zr14D)&7JX0)KHJMM2bYa(F&+BUlqA1$CsZmj1C@{J`R6gyvJ^tShsPQ{VyX*R|&(l zNzog=(Z(+;?xXu;E#E8!k0W{ckE+rzhGt;V?`;9i2Kqm@-;Zt>RptBB{!H7rWPT}Z z+x7V?RWoTi6OO+`wuf>m;T<8@@30^d>a9KV3ML%4E*t}g;i?({+P#{GpA{M>G!F~O z&bIaET`;iQp!zLo^CF@s+*EOcL-0jxktP4-(OIq3d&Vvi5v@FIxgZFZD(x^~!x%oX zqDbRL?@D>w6$5>_WO(Z+s<2(0xnX!15#k$lErEOP>NZ0X$5dEQW-?VC0~K-SZK;eBDK3|50tF*-UBZSvVLJneq< zDrx8i*(MnJ2)jhB9-m#(ghl!fa+pX~kbk5I^H;_6Ng_rpk^j->_lBt;QVQ_tB^OhJ z;{A2TD`%I9m=wp3swf8V;PgTxhSWJ-LHX^uV8`YJ0x06OBs#;@CyBg~y>QxdhiNBr ze&)asT2{aTLmkFwOsDjd>oAPsEqRoyUA!K`jrMU0+8DrLqH#&an>z8L1Jx?p=0fLP z>-T;GAG@A**&%vg6@593+r2+jo7ry@m@I&1DjbUUccnQF^2*pBT!TwbW1F~>`*9NU zRVcp=se2C=DAxU8&?)9g!g8oxX~7X`w4LHKxT0g(c|c}_&p^24;@UK<9m0jUuGRus zsJj!RBv+KD{9qm+hT=^^-;JtTp`2lL0p@Of;Dh9%V)+lu~j*p<6< zXVn&wo3L=3f;M{#(TNP@lbfK(yNXqxNN8Wby>a)Dvg!x|@i}hd>1)&w2Jo8#ONNZm+t+2V_ z+~j(p5<*~2Toeyq{H9l`7tgbwJd>QT7#B2{WJf;nekK2znXIM`V%CHZj*FM+;P_Q2j4dBmb`Trpn*mPkmFbBbi zZfzRv=o)MpZ$G@qmMWjC$(|7^t_#IX3L5%%=Pw=IBRT95khg@np>_H4gz9^fI$P=Hx!*#)MRy8YC6ayY zKYbf#ADJ?AlnT=>(CrxNe#-JYfM|R+m(bs4w%J2-;(;eDIDe)?_6v-6iGE2*7SR_( zybyw3fcf=6xMmf3^@{ehYmZA44=&ny({vr1)`?Bxph|=7Xsk+hT=BqZwKF)1(*ak| zgl!SRPDD;-D`yd4Ejxw?LlA<37-~aTB7(+wAG0v#(jYwSB zrIgF@`^LgbqNkV|xR-059h^He9N87kIl{Vy&3z7MzC;a} z{07+FhB_StNB3j%l?us73lg!Mntq1euj<01hY<+eWqxsk?hfzRCP{e zOT5+uY`z-s4A^MhL}Kc^v4HBXCd3e%MW-}}y%gAB|6DQi=`(3XUm`3G$=r%s3Lz9H z@0o=+oq?RXmBq4)Eb6FCiDij|#20gCvP57EthmbzEAHm1z83y#3MQYOjA7|Ed0 z{iiLjT?NRnokjMh^w*PGS!KJcZ+t6!nNw-aH}$@Q2#CAq-(7u1AYCHI8@OXw0|FN%1QH)*be|<2 zuKc;gO|oFn%g`peMCYKxKno_*iG*2LzLF;nhy)KmN^7KHsXAAl){2+fbor?cb0yI; zt*{6R@r5c+Z1MV2gz%d{qiWW(k@Pf?k!#3+MhIUfmt~X1c)WDR27<=glf)5M*~yed zjfM$-7$Q;bAl<0xuyb-t!Stu`J~_e!ByITR?s=4S^I1r+Kft`F3ba#l#~Xwo9rkH` z)nU2UAtD92?}sMY$`cX$RA196rtO7_l)02Ia7ir7v$auMB0EBs4(Zd}KDPYC>vyPvD58uB< z&N47KG^~Li=4L;<-P>c|^4xEmLKGJqwl-a0mu(FK8#$JTN7Up^-2?C&J-p@Y>PY~7 zmIbQwHOX?7GPdJOrcv$?o~Qyl_6A&5#>N~)bg7Y)Q1N({3QP)Ek!T!NB+|qZh0Ca7 zEa=I~ribK?4up_1S(Pjhm%43h=ZFlsKH6PjiQ-++RPwcvu>S=~yi83pn|^NC_=8e@ zt8J!rzy7|+SR?%(HK0Fw|F?t}r~mfIe+!d&?6v&+_Wx~k%)jsH|H(Y_@6Y+aNAvfm v@&9+o&)@rf{QG~uslPvs|3eKE!iziKAfRj*IDfkD@ueh1npn{;%rKt!=lPWDjM5Q+c=~WOAX-cm_K|qiqLMT$A(xih(=!x{6 zP^1P32q6Rl0Rn^;GI7uQ%-(zE{WbIb`R?OLx!19hb+4GqLql^> zTkD|_4Go-7x3Iq?1dUM7_O<#?MraFn?_~}{d{rQ(# z7CtmISA74xPR%*<2hz|`3bY@pJqfhMlL-Mfy{2debaA9iw^qJBRJbg!fgkFc=X~QtUv}%qW2r=G zXzMk|a$iRkmumI|lGvPSICxkcP;OZ>UQ!#bWwl4@beXgaA%FXH$IWysdv`JXh;kfG z2|x2^5C6ChX(Ocnar@_M*qK(&e-FJ@jj(6@_s~8512l}h?#1%&VVV`@b6x-2(9Y#E zR4M-JIz0D(yQ-ShA6@+8`kZu)llC9?)UQLDm*P+TduT=A|M9V2pZZ-|3HwSRdVwT) z755FIbt&6+v84aCvi;_NJ(>OMdw)M-AaNx`YFYB+x8(B;Gy=|xQ z-RQMrA~yWn+K-(CQQwbz%T0;A6aK$fYaw~S<2>MMPodv^@fJ$=5n7#@f)&`}k_voM zOUdyj!A~0Z$#rahEB&=X5{%w)@}OHSa_GzaelqZ_`r6a(pkz%-}nH5IjPw5-8r4%xOcZv>w0 zOD3q^hE=i@EhxYb^h?5!y)#XHrvY}LAP5Y*M8f8lo(6bMz7c4Fb003mFTNfvueDq6 zjXOnis3sXHt?Et$8IO@lT0htp#+Yp$|N3o6x^pYeejw{qgmlP19PwwCrd^~oe&y&3 zvd9N=S;AZ76DQzV zN1o=3D6{b6?%x5YCUp^Tcve%!j{w~mAYBi_9(63QG*phLOIAq7Z8E`xA zcN32ZGT~s#t@L+@L#e-KC0hGJN4=~A%=CzFi;>G2Nax6j7|lbIZMIM}cs4R)m*Rd| zDTgFX1O&X9mJ8peoRs=*#kj0!f_!h&LRi|doo`7;RW`VEmS&VaqgR3d9zUdiN>gz? zfa8qg9^Jpqi_Q^r0;JqWB>!}Y4($#>XEt=H(WzQ#1jjsdcaw&7!L^ZEn{Oz1#*64h zW6Vs(q|Rsa#=sD0WfD1OhRl?E7J+JR3EmYYiMJyV2?>-!=3bW=j3=FAA5TfBKY~Cx z;UAJDZ-;*g58Z&owF>a75|)#ob)5mHsyI3#&O7bKLl*D(E^@$zur;h6qdl9eRpz`T zoScfg71HqJ(S{N|>X~Y#PB4_a@nYBU02nf;(*M&HnDMzenBnhGNYy(!Li(dXV$R3V zdo8}7!@)#b2Lo7%Rc`fz54@2JA)zJi#Vi11^k|R1MqXU^pE-`9 z90Av-Po0=7wKazx7Cjej`(8ahw_xA1#H`Oo=M*TYYY|2eQaScK(byL^ zzVj|eN4(`+S99in_b`;jx^OEm$Rgl!B4qzHh|tS&xKq3w_BT8@5N7reTUU`R8psu61Kfj$9PWD=w z>#nLfq=pj~2(5h`&O|DDp`0oFU^)Ct0DSS~Mwnio|I^t*VW`JVl#1$_PH-XjrTCzx zdqKPG|5p83$3Q2|m51{Z&5Avj=+rp_H*KV02ZLTl z>mdfqbFHObxs(O|IOM(-(&w6n<*Srn&jI*hGXJ0ox31y9@QD70Ji8rb&h|3$YGrJz zTy&jRO71Cp1)Qc-bY!C#(B}@xAbO1!a!OF8+czuMGg82W8p763W5%rhk?H2{9$txm z8so6?oD_MbTB5PfIr^w$t`&_jksXm$9qGGjdy2RQe&eMDSWVhjSP%$Xu*S$u9B;T&MQ z0abM%WnESVw2MIh8_O2-6q)4{)9|$FIsVTSNgEH6H@4c z1OZ(!X%9ZCndcsp%PCu^or6w(#L{{T;jRv4=lE>!=6t{fc(2Qutu&wTH80BSxXvX5 zAT|DFMYD=yRXU4eo#;3mL0>PZoBZ5dfE|HHFNwFzrs2q*oT5Su7|60+qIzULBr z|8)2SPIMv`zSSDD!@>YGF^|q>pZlGHBrhE0NW65lJ;sHj!3KK~o{`d_c2h)m!-E;6 zaf`H5!~|*@-#HEnJ*@%saAiCZLe(EYjsxWO0=i^_yQ(~Xugyfin%+OzHpxDqu5+}$G{Ijk{8y8*0WAM zv&nF}MBFzn{j$$Vz9O!GO$vW&@%3f;#5QyvA|bYX?;uGGC@_aKpr136Xodu(Amg{5 z3da*zecsZ?>9(pw^SYTZ9VaR2PgO6`>l zSRVQ7#BiFd zKFMsEm*0Y)9C{5MX~F;jNz4;m6@V{}xohW&vPN&JVBe|0t#$yMMEdZ}Y?$g^fH%B* z$5p}I^&G0u?zq5i{1iWqEN$+;(4>5^i`9d+ueJGWBcjpAZQU$o6!{$kE)!9nSlj*s z(Eqyj1XP&2s#qeC7_$!O1eJ?(f;~+}Ka>2El2^eNBB!oJuQ5#+PK+N9??G2SCtg;CXYI&xwtMfd9G#@? zH{}~PIq8N4nhc^(np`?a;NenxM*7cP;q&x9NGT_1nps0t!Z!yvFXi_LT--)*wErLC z6QhdnxNo`=Lq}ZDp%-G`(Ncj##VX;HI6G=S7r1bWTT%(*W z`W1DXEU57hPgOqTQWJ2tVFmE%)FxW|2&A+@FUZ**EZ{Mfs$(Hl+haSkUyucc50ZRr zCtvYdsaSN_Dpd+LwRQ9f-gKtaAJ@Zl;L=7QM?%T{I0?Vak{W~QvoX(TOX(czbBTTF zo1o}*W%|4M*bD=|!6NrDeaU`~|Crch<&GR@JMF9920p9eHnA&hAwhSvhp&&T;vc3u zhoqNlEwqO3GtwK+5JrMz)S2F7$ljj$B=L6CZuzHk_YBn{_zBYosEgzaT~f^nR{Nep zzKXBrb-ewftl~T8L-J)`V!1Q7-Y#uOfc-eMJ`EA7%Z!y@d5YO#rPBI4GUbNf) z%^{0Ee?G^=dXMAeK+XofrK?OSqvgq7JVKC1iNjt|Vqy1h7Kv0!5zVseo2w%eC=%Xs z+g{B`IQ(oHR8gDf6nPT_?WQ|aeuT*eX`64L)ryu1vGjeHe zP%F`*P$zhwEN;w{sEZwad18FpX!eq>*MR>f7q@#Buk^v@xbaCClgOq`zCv@{8)VD8 za_9DocC=cU+#F3Ro$1< zaS^fZw2Jx*K8*D62Ct=Odq;2z{SE}Q99NIwBV~?*b|*T#q*}!7{-Zm4_{gZe-oR5n zfR~_u_*9y`YBSkl|1OKqbD0HEc7OYQro72Li|SC{U<9M_(z>F2l@7>%t;rZY%*O zj6Xgk;yCb`h$v>jW#DU2`fj;}Di`_YZN_&lcy?DVGm!3K0 zzT&q_sFGNxP8S|6tHZ5Y3iJS-hiNSxF_&z^@|Z;M=UmIN>g<5N5FhP-Qj$#^x>&ta zIGyO3b0ppJG|bT^_4H$Lmbn`;zl=`+?9F0g92I%ikOx6NQm-TLQqjWkF|vFa8F8?h zL{U5pohlgs4S5799dZ1H7Az^)?WM8U3VeNh_};Xr3g|fGchjMVuF^dYG1_r1+gVHB z6UNHs1^bThlc==@bjcY<#Sgu^qRr{VjyHXqApY^SM`*6JkTMSp(I(#{)mpXsXYl{- zJObsuBHn4;Jou6E$I|%{-5HZ5tga!~nDSrV>zr*zYKw(BsNHZC)E}N=zHYMjB7iA( zb_P}kY0b!p)bNhbwwjj~QIphGaI`|QDVZG{;eEv~uzSR?ti^7(jNi^G2~`ulkUWq9y|(&vDu`9X&;;y#6kcwD#3Az)^CtSmm(x)4up9jyS^y z&hZ;{Ym}%ox0>I_8gt}91)o)Vh@iqfeH<`p_g_c}IiroHOV-ypGRJZgzmLhqv(o(b z@&-uEqW>Lw8M-=njGSU{x(3@{PlajWoABSj&d+ zUa&yI_jTdfp+a=%?!>gOVD=V=M-kH1Y`RXU*3JmfU4U&Pyr)65K?(zV5ne z`%Au(3eyj#-#8^sX3!?raV^#`=ezKb!rgSeT-iflc&R|!Sk}Vy*s1ds?IZG5c)Xt9 zwoEmR#qfoQ3_kpXeS9QuIk0-uSf%&DOrTK$ z?Sy3y)pl$_IWW^UP4YkfT4jf`kkatBm3CtKGHL4M#N^N4o7u_a=+6^F(oth~wYrwe z)>mqEd~{Rz2H?X~G9KOiWa`CWj9K$$ABX?Dw}jMrALd+@qp&TTzr-Wm?O6X^_V;oHz&+|Mr*RZ&z4Bfmf5o#*xrQ!WS z212f30H02#$|JevP9gn~3g_bd>y1?;whq3^_8)QJL(?{xlT9DV7=@TVxh--k+1xUd zHKY~wNE`Y6IREHKohprv=?GE(I_{EbBiQZQQE4kv@OOL0x|rqy+kJrXkNd-y*P8OP z7cd{7TnYLQr~ZL%=-%W~OCqqEV$W^V@5opsZR1?O%@?%2B3G2#CLi;70@;1Ky0Q@q z0LRihjjtMOQljc;7A%GrLIf3uF8SOdMS$oW9TGb-9PKPKA1@CipMF{9BkcmBN`if7 zD^@92+3&;m#rV3s1=2QP|MlTCDffz5h?F$_4HlnI+jGYwWK|H?Ek|P{OH^L05KCFr1jz+>i9^D7n-Yf!s-Wy9;7$K!^OBZiAttHn&$jRtGpRzI zm)D|fr$#pMN`>ifqW(xL$LLc~zYM}|ANC<*&LmUoMs2rr3%dMoC_|T-ONHZa-rtC+ zOZs6#m!kY$Y5B=H-b17Ln^67B0D*iT+WVSOOYz^XXo*I^iB0gM455==7l*1|VW%XL z0nSBAX!&PKb}l1w4^tlAcI3#EKZ!?wKU2$=BQX(X<>(9;HM zyhO7;?kb9Vu*#)va+*gvCa`F?v}CkV#}c6SQGkUZ&hHan1uedwoSTA%grqIJmgBd- zt%9P4?>zt&4rWb`gQfGglTDNSN`O^?FeNoI#yy3tCpE9yw-M;O0f?*#!55E2!LEG=E$pWs%#TT?4b0JcuSk|HRhLT_i zTYT~A2j~2G8}V;l1|j})N2G0ei|~ET@YJS>%RWB}Rs~pmKBS#>{6itE%ZW3k+` zz}bZ+eKl5LA9B-qCT5iz9yq93*{a<*n-D?{gG@Fx%s65%_+{}iJ=?xMwLsJZBHXE! zoQavT-$pkK#jxLUe3DAgCh2r!Z_KJ9cl8?Kb~|F6#?G>iJELj-R?Z?Fuq{KR-6dq~ zf{6@|FL+Mya!P>YhiBveaF;y+8)|)};fSYM@T8Ur0uQ~$nV%M>4f*nsRI}OiCsF^O zRe4re(f038xuOW~lyd6_KaOA*n%C=W7>56-8}HJ{ z)K%qUsQjVHY%_>%B;bLAm1q6>x0^9sXe2U<;GN3*TU_b=(ZVmrKNuiG^?;soi)f=c zRgz>t^|feP51y9{XkIJK@A-Qd=%2J<+pcB&a1dqxv4tCN=zDUpE0oH#KD40Lrhib} z@JP7%cw=WNWX4pxn!t*i2c7ToUCU=GK7?iPX}OkPfQVgJ0=?fJFWu2{v5~5-d7&(r zHuuB^_p5&+m3TAd}+30cr2#Qtr%n>)rRZZVb?2%Cz0!vOD9o z-X$AE_L8+`ul7h(F5qwFOtW)WH<{{V)0n<0DULMgZ>H*##b;cb>LsN8pxiswH{Xjg zJ?y4#rGx3HGI%d$vGcuG+?&No)2M3iDgh+1z;zI(qYJ>YTyEy+eIhW_{q@rM6OQ_@bh&x)>rKJGOZ z^yp?t?*jTF`CL~=gtmy78K-|26U(bq0`8cO)C08n&}e>AeBHR;12ytymBx7mW%!USJeY2Oi5kuG}9MmD(q zm*S{mzf)xgo+KGzxO^G|j*d~B@lz63S5ty?s(|3H-k3egAD)-Qof7PCtv5I0sY43T zmF)Ywej@l%@fL40GNd-Vd`|^@P~kY`bC0Jv;)YWfbSacliuQ{Kk+vLPMd`+ks(m`O zmK}@l*sYXpnOiM7*IPWu7%Uadd?h^_&sfQ+m18mR2D}+094=xG{r&mEeuXr z>d^D!>4sv(ykBagOO0}8S0i^q#XnyglV(cv|NS!sPrC@^WsJqCiI3cZcM9!F*_&!Pq>Do8kUlCY8w8HoRE~C%AMtLD6;#f2 z*#yxbmRDx|e)=&C0goZjo3f zK43W=bO3)I6CW-ycAYaT2N}d%_vklQy+~tkkxg{5tF}`HquvzN@A+Z1_#yB zR9^j%oAO}?Gk~si6HaA)sC#k8cg@<#TwXkHlh(Pn zx78?EH{KKmxu1QgrB_#~Sgd$4J8hE}zsW#Y|Mg~n8>4%b@`isvrJq%)e$QBHnVGVZ z)Ip^M5SwbV3uI}Bm|%`xr9ygYUB#qYDa8J6;qa%+JuT$H&J7iH1S%CAVe(gEnpBNO z%7`FP=H#q>VF-A^fa@Tp=oB_cCK0sJf2s~W0{_9rObCyY>?H4OVNs9glVbkjzfzbq z)}v2e$LMp~f($meU0yrbAR@BoJ&;WBqp>+`u?o5TCt`%I{2(YqUj0+tC+PD%4MdG; z!jGDM`&#1!f`LeTqnB;kpVJ*(e1 z>veaz!{DOK=1*I1o&8OM2@g&4bd*_(7GYc4CaCpoB0Cel$~Z03TAH2*KpPbD<3_h< zB~)t**KvRdvKJmTlsJ(KBW+b;a!ChE{Ko=^)VydOYREOx7n=k;pxkYqPs$i%a2buU*_ykdw z(@C|CPlBQD;D>t5aU*@3aR8=y?=U7>==Exuv=uoOac=)q_OlNJTkvV-!Nz`3X8YR8 z2*mCm)&aTyGS^XzPAL4jPNnI`T%VT>)>N{`vODe>Prpk^%Q;kptqQ;L`qALEGmieK zv~91CiPE9|eEl~~;YvNE6pH6#pyU`_6w`OGkB8Xw%=T|KfM(cZkf|zW&#ZXe9mA=R zO&NIbz%p9hKmXrOO9elBSFvNlq30@g^hBk**;B6IKOiogUy$hE59PuI#R4frV38p( zixrLe_KB2{*V&rL<9|aIAId{Lo9Q?T4U`wFJpBPSaq%Ou+01$$I~v>t+nHsZ#yPtd|+es9pW+zVKyZUTfV*ej@ews@(%<4uO-#D-B z`Q`16`r}F$S3Du!&FYHk;wY}F8t~f2_5iT37vDVnE<7dIWwLPF zA8gHU4(Ca*+rM9VZF{#|3rI}?)zHr?q|%fESnbaEh)(|5kqv%=y=BRMy_`y)Y2GM$Lk;`_-Ue>X`7 z54AcZJfSsX7Fxhq8M**gSnx6VFdb#kS9`05eYui5Ibq z9a?91O3V-djKy;JTu@Th7Oo6FkIdOB{(h02#pj1_TXAKQi6zb$Y)j`Ds7`}?ZaC$9 z3;ea^h-=QsF!;7c9l}JYuwB~4WVp=vyzTl=rXQ05aXi*WWUX?m0oyZgR)4M@SGIFdGo0a!cvs>=KYhqA=PACff>Rk2mV<9hm`q`O#niWy%N!GEVD z^gsP4ugQ8C`*>ds`qB3ieLU(0-K^cgkLTZ-J=)Z{fNQwnU{#}(PaF8&9@`yB56?5( z@>Lc9BVT_D-VYb1(*NxSd`#xMGUpaqe9oA@I#&LlFwIt+v;F1lZ=z?L%l-Np`0+Lj zRLDaA8+5TtF;I}6{z{3W>H$6t(r{R#GR0md%A>a*8wFWaJh!-F5`40UR(W7IM=957 zT{L)CQ1>EdX}voR(d*5MyNl}iPK4ex_u8KkQ$;@rmK-f_xhK^%r0YWVoHF9CFto0$ z2T`k;R{403%pc0-qux$7Ngl}VQ!KZO%xA;*@T6S}%WC_?GibmGEztahaj?ZdthT^g zYT0ZYq|ft>^y0k?Jpj?>CDnZTD?T*x>(BG_AC;%lVsaQmZ%6JR{_Y6TeUl>`s-*-m z`H8hX{?oV865c|&$mG1~canodJasXK=M*QFv~n6WLB_F2O4a72dE1}cDb7Ph?j9U} zMPa4AIO?fje{5tFL~JT-qIxfg%lZUpPKgPotAjucc;5XXXaWzm3smiM%v3_D;oS*; zrT@KI>t+L8=(}*?Q~eoytgTL6XbjO(@!rv(7pTT%_eaW(RJIT_t9cORIh|l0T)Gk$ z8F@YX1io8G@e~Ri#0+46R~Zz!v-Af4q(35ZahCaj?j`NU?7nmAjA^7G+9{d&3bWG; zXB-(@{KpB=65#p6PPL1+Z~7Z?br^&0N$2Wy2X3L3NL-=ydnk7CustX}*T>xpKD3*# zcE3!rjeH&Ys+!I5dduy<%K_lXaHcd3WTQ|#OA4iKP*`0J;ru=X5#g(5!wHK7MUJ>fR=s3d2;l}E}HrOHEYs? zda`}=(JO4tYR9MaqVi5UMMvmTyWVjMa>bCcgY3ZmYx?V1x>io9&6oC=ai`ro!oMf&T{z?T^QSR;`~j7@F{HKx*@d$IYsRG8 zpS28Yrt*=JCsHj(yfId%GDtAuE&b3#u32&=+@R79&JOusEoFcGnC{fy-46ftZ~y;m zp8H!2|7|DX|A#$&$*S~@wnKdib6;rF<)hFvG+xYAXKj4EqM3Mjion=5ucNDK3a~~s ztOnEY%8bw*S<=SokOPlLZ(hhdVY`B^@>LAaI2#|UM6HW0mM|fPqBprYX>7fQ+hQNc z9cxEI3(#m$dDlbxI*;4a9#ZExZTOnDzb;MR-hxhNV$EFLE1%7sDqi0uM_s*`@XOT? zxK}Q==0MslTscP5oDYZsN0~nW9vN zo-lP~AQFt;-nYiONQ$YYc-qYW;Q5LRY4x%q?&RuVS4Q&ie%*+RB|fT%xzD^f(t7m9 z2bcnU47PW8wp`M1IFlvD^_yT!!1I;O(4eSl-kCB+^p^$4JIZ&Yb;U?SN>b)w7o6^R zXKNT54q?Qyevp-S8y@Uz#3~QY8i32gx)mxmQd-mfI#R1bc##U<)Mmuy3hf7obU9O{ zuX}7k+)qA#(x3ADMGxd0wa(Lq4z{myt6BMnpL{#?Pe|i)ss#AMGKS<^PC9kBNb7Fd zdwFto7#sA|*RiSd%6{$-foq(mVUT?P3KTX(-zQ~xPD8l(-8!xB*z$&clgH}RYp9>y zr>zGb2gS!t1wkP?31^vxmpoj&KJ6?mH!Emxei0}tdhVoKQR#Hox&+r~IvFz>7VY2i zi;=%@y5q)dFwbPGtiL%#k?PjV2Ck;C;S2~)}K*Pjg-=4y9QN$!^%nZ;VoE-L3;*dGv%dA>qyvM8E% z8(U#2^;PFt8>|&^vo2gQmECLNSPCkb3(%Xbq*HR_aCVIq>jSGd-YtzEtKP96Sm}%g zqpy~W4~$?K{I05$iSlzdB>f8Uf9rx4EmIAXdQfUQVd?Fk5Fzu#Cu?C|J~R;nc(BVn z^~U#IS4Dx`y*=J9h`TVg6n;ZSd*Ks7l^-%P;w6XkYZ*@$r#$@%(W!K=n1iw+q?=lQ zj@x{QE>i%I*ozVC1p(z|)K-g{(Ql(~wv=r#SlC4Wv%c>=H35>qe<_q5mr+%|Z$?%qaIg2Jjnq!9&jO^2x!r6G5wB-b%NGTw;p=8CQv^RJ1^oHfL_eBpe--&;u?KZ02pjCh zEtM&CnxipQ^=?cR{iljL5wQ(C-bOI+d#Dir0eMcZkz)$)JAu85rB`F|wK?~41+DsR z__^ZyUzAyfUn^Xt?K+vc7=r%SZ;?lzTt@YWFYf}F8~NhIfOG6+s+|$fk>k&en9mr} z)x-!OTR<-=;6OtXdF@7W0G|87_X*xXg?zOc-ML8(w)aMq^#@(4TbAvL7dGT z$&oG9gOR-PuS$)c0EyMdO;!tgbJiid$9wDC2j@+Ao-C-k6E3(pTx`<%P$@pTWBB`JabW}#^`Y&=Houjs1G7q14zADF^UL8V};~<}Qe2 zKm2V9KPTqDOTP0dYY~)C1%B6Mmo^BB-#74~q%_g;R_3p<=X=o0i3*E4WPY(Yw!McOlqaB8F?%k^i zY0b!y2-_TL!rz+Eoy59^Sp_bS30Sr~DG~_gA_L??%M3;nG{^Qfn0dHJ*u>@ZZIsW` zf!AG46*=t9H@XnVj0uQ5r>lc{igx>x_^E5po>zIP;V zn2h?Jrd_Un|Lb)H=~uNp?>s+T{3IdfgPzHe@>oyQCAOM;I_`02k@pR3-Zh{odpXGj z2^u9L2_tPC=A{EcUN~cx_Yt7{J7*f3WxvO&xX^tcu6ZN#mLPR7f!jR~s}74vUv7~2 zHDEjY6gG_^MvP;#H&9P*R1s2=!at zvc#;Z&rXlfx!;^~d+(m&t+kv6g$YZFAayimmbx|lmu<_{}_Y&3? z%H)nVbsC>0Soa>~Q47bgqo5Q%=qhXa;MW}Ts+}47;89?Voe)YKfL3K+QgHv#_#<;{ zn|nnreXD>@h0)!v$>x#w^MN6*kiw3kg_I|D_1xL(H*p$zc5G3>h4Y8s=W`recQ@Kh zBomzc6i(KwR2g|IVh@l#YkQ$Wl$3aFFR^=!~S18reO7DyS)9V-O}L$6l8t0sSX z6fmd<0ur3tbg-o!r9gCpzTM|=H@KijcfOfg-C>9~AWx)*I}SF^tZo!C{bpT?;8D~h zUtKohGcl>8&CVypdFi)rX9^avvAdwJLfjp*m2@xNwu(H+khN~6(RKwqemfTa%A|JP z4D@+bW25e_<%tQCv^sM6aZpPXpkhc|AZ&-No;QJq= zP-`2207*$)r^v!=)_UwQebRI2e-72d-2ylf80Pxdv3fF z(o)?&S#T$KTTxBZojaA`NtdZVO#WbSrV`1!?NQb@aegZC$MiGGOGhz4b&J1Py{eJl z#Q5%Un7Ti5*X4BC?OOa?49k!FuC}%Ft)@PF)}W73+8jp$-zW61jm`3}ejRQvn-k4H z@h~uCS%(xE9tXU#k$&=m(sb3V!HX@4xcwwm_r=lmSr-qzW!UR91EE6?o%P&ZhF+JP zsl5S6$ERnSsKz3)O7I%#N=&ua`zwbtpDu*Oy--bmIHjSrPAWQh+;<2z%5v1w))YfV zKG-k2x)FTA8wN}$L!L94OiAEcM2h>P0h#+=l`nFVh;m`Y z8hH>26uBgQeGbuT%AhO}^Lz*YRmHAAEqxs}o-P}+o0-^O{J!rJC@?q8b2=b*KE$N6 zF>fwURGMF|)8&VFSg^GXFjd!!I47Rq-M#--h6g&}Ws~{E*nP%Z_j5Ck*d<&+k?K(xxT*&opCGDc+ zfy~L4dS`UEe}Z48-!mI9Zd0>Hh+H1< ztiQ!X=)GBOSefJ`F*J1sG3n*(YaBi*XIbtxJ3XLtz*}_IL_xDf#@6N$@8#R1tx_(R zNH-4CUvNUMDdl_Ee9foZxxW(TE^jc_2QV~V9-Z)3sqy!I2p$BxhserpY>1RLZP!7p zOWhin>bBbtAW}|zh;yDedThArH(*=PwbRP{U(5T82q(?oE8ExQP5YPHgZ-u4oy<%t zjphVL`g}P2+MrRduwT#<=XRn!8iNBic$(;;gVoB}y)iAOCY9t9gYPY(ZOSFb;7Vmh z7Uhsy0n=KB%trFNG}TA0W8PIVy^78Fj*mZ;W-4@F%?5>q?>$lNR8z?S!wR^LrIRyf0H9;TD*>3dbBwHL@R48``u?sN#(#mXkdK3k&gUZh01HScaJlBx}z`%J=x8BhP{^6=mt z!tTdsg$<^xMh&?vNDoggNPqG<1iBsGeaaPJ<#k8I@2j6(qy8&L4z#I6b~*0HE3)YL zJAb7~7=V@f-RPYOw$8L+eeZQ@jhtkzm2TO{4Nzw02pHr5Q z>Ai;fiu}5A50&+=%$YI>mSUmwAA6DgI%Cp)kP!a0&dG)C`KICChj9Imvtk)HKMQk( z_+Oh!w46P97J&%+u18`K%2%A#UiUG>89yO4-0YFR|J^`%@2KyH8mdxq6K?=;zIImw zFj{*7I=Ef@YD|Se{SIFNF3YW?EUE6<{Hm=v0%04lWY?odrIC#DP+z}qHH1M%s=-_B zwkU2OZPh2+Xs0EV58)W7P+_vW_#KpveenCo^GrS?k6JWytt-cxn^&KZ=16_>XRj+e zn9*mM&H={#P70Gb_VJ&ynbQO1^MD^*OS%$rm}P(PJ+y|DZ7QU`G-3=R-qsg=kUWd% ze*$|c0@rQ=&e!1l5-M!Yj+)W|KBqXhZ?%H0->rgj%d4LV-bztCCsXq@yG-D+wcB%< z5RH8@7Ti5SYod>r$^F}dWluwIUS+vBn96;C2mw2Qr^voho9h5dHBVhwJ z2ft)^J+1hE?LJa{EPU^JVe_`KbN?{^48X{*)$^ionj?c45OoczeCdmUWlo@B3(#ja zhp@PolokfF?VilQ92VnsGc+iKK{|;jSt~yA7l4<2lDbFhRgoKgGT3a6$Rg9dGT_sD zk9srL%~j#Birt^irUQ~|;pSb<7y*So&|Ef;H|ARp>ZHt*^Guljh^z@>;+MU^hwgUu zjdSr}`Z~F`I*%{}PRtQd#HHeUn9OZ{4s-Ro3TK|O<1r#W%#@0n>QdHB+L|1wD8yVT zfO_;a=aSslB+#-qXVYoRX7B8F7WEPL=1qxkW_jXU|DL{qU1RUW#{r}0}W@^r3gHLv`v(HxZ9*$q_%>iI_c z7D6P`iXmt5?P7W=4684Utk}4oGl+G4M8$I6may2W#ulLg%p2di+xH4|dF1IMnu6!mF3YjzI{_^7dz4i*l zo?q&PauVxzi}pPRT7t+7>$Yx318Eyq2hP|ET4h!IBGs;GpI9&7g2pd~Z9MSZh!#U$ z2)i%=iu!(gv*G4J$IX%zUn96=ft|=N;sxBxptK}qsYc0!riUMob3WR5A705`b0;P< z^Yx@G+t_*^nC9#4@esLKNH4*Kx{p2oOu{_pAc6W>kt@kAY9!)6}hYr++XLsf4vo za=gm@<>T2>bvgNq<sSOft z0!P;>b*f_`dSDHPSM8_YxJ}Y5Rbet-F1Wju~cm}{#~nU1nc0E6`X!LPlSK7I@tTFJbtEBm>Dh@lr? zt9aFz(jpn{`g&}B)qt%*+EfG7k`#uTPCaJ7*!Qz^&4Sho&CPh1rvg?-$M&USx5s%o z7OMbU%;-g3&SUXbQU;(rZ=o88VUm@VuEFfB;B?8PN4XN)X!%{G6OWdwqv#hxh5U$D zLbb7{aIKu&8D_L&yFJ>WrB_F&%NF$?97V2Emp)7y{|e&6ebi8ZC^+sI`72ics;a z@@q$SF_dz7;G2BoB;VUls!0mBF4D4!Cf)s+Fnzj7FrJ|#-j>l+EA8=isF!==EZ=p` zTNrx7pd77g?j|GP!|iofYr2T_`gW4W;Ug$0YWIPV7m-mutZ6dFMK4nus&o@=s!i)5 z`$q7~`pfTzIz5a& zt22=)gqh%ubPu^~YaE%2flh1p*K9pl7SUeDMv`w;-~URN$1Lt{y@%Nq&*?0!J!H#r zz}w_kOa@z*2>9#f`!~JlbM{_OPP1wnRPc7E=kVa_T211PL_&$qzUoY$q0?(-t1Wj& zfev+6q}mF$NfiZ{?|0ufsV`5zQBNZ29G!xO5xWK(6F1S8X3cvxl=bwa{P)YSuP5dC zMTNFPlQw_6@r&n9KDlxz1|OU~QET12*KWYX9*Gd_*j2`-n^uL$t8m#2>d%*N!oCJy zY45vLjI{Y;ILrWf{|lS`Er0Zesb{%d!HyVlw^>Iy4xc|t{&kX>H;ERRD#(CM#%|m{ z$P9f(`$b678I_&hCG_j<&uftpj*n;#e%;2f8`IYk#rQ!#AJK z3@~L))9T;0q|veHmy$b^Ev@Tj3{BCwdd8x2=i=*}%n1;}f914bTzawu< z1jHPBe}0TzVns0hZkA&NyQga3*~pCL8VO6A+=70NRk@PwnQ7!*g?ct+?C^JKZ-l>I zoRinH%gYl-O~UduIv~gIh>43uqYYE8pB}OA1*yq{4o7$NTK7o(bP|Jzk)>`O7vRef z9G#ztX*6#r3T)CJ#2OYb$J8}MiiO^Wz?RcJqfQe5@C>Ujj|yzTEn+&7t8ZJ(uCglT zyy({-;l`=HPlYkw> zjR;5e5W&x$JmFid!)NjfL8e-bZH0~S8elnpYhXqy%%qG@IN^c~q|=iQcbrNRYhug6A`GJazIm2GK} zqos3Ws1D`Ft%a=9{m*!%nP$g3)KyO855_z`g~0u@4_MCX&8cHcyZUBP7y5dP##LN2 zyA&@GPtKHUbY0lsHK6l8u)N_fxy*46!!58DF16m67FmwkAUCQYcNhd*6Ve)zs}(oS z?a0OLdskTWl-isxY%7 zr^F&}+&%aaYH1)O>NRz~*<{XT)aXic&u6F1Nh}m|yRh}QZ`-e$8*L!tICm#eoLtHf zL5yIwycPuZt-s5W(5t)F^6(cr)37ph@KQ~R(5yvJ;gVocUZ&S_-H2Qh%Q>iUOqiV> zmey)G);8|oqx&Om)Z(+@+~!BAdvmG!jOlgOIbv1x3jw7)-v>5KgC;zyLg@En;Ofe9 zF6?+v?CFAp4Bm6S5w&MzJ$L3cB$2GyS1+Ke?F29MaB7CPU5I|J+5X_u@O*@%C&d!w z%8*{)+250vl#U&5IM=-@SFFsX8w_vZ_B~kp;;tu%EK;HvXqs2+HI^{;{3dt`41Sgf zzAZN+eS0TEGqGq~4pt0$LO(ob<(~hRPDb6%yQ5FcU&V&Q*H+i1%lsfr+0dt% zW2u_xYa<2IVE3~$XTV^d6CUuSgmD2%Xu~WjUUCYJhLa%&}h{`#PbPK?uEo?~$3hiL-E{JW+k; z5q(=Sqvf7L8nSffjGxG-qMkZ>Mb5loF;?edPi73asYeb&plOMjAR%t#z4B86nC@&) z&c~g?d!+mwzv2lnM%3Qf`@2C$FJfLMMe9diKlH$2>X1btcjN+U?LsSC4Y_@I#+1GI zEz<1c4U&1!Q{D( z&Vb=BgLFsdNIIF@KU2NJBcwG|16)l12Yc@w)zsImjjAZ92#81#1XL8HS3yD(5s=<% zXwpmQ5PDHmlq$V<2sLzq)POYUy#|OV5JC$j5FrF^^!=T2&Uw#2_kQD!JMK5exBnr7 zvG>l-+H1}=*PPGu%5Hjb(STLeMK_+ zF@0L4w>R}zk~`okiTFE-*_A`#kAKmZAGE*ozr$9R5*3tFM+;ljIlbGQ?Y-sM z->(meP%p+$-TgoqXsswOWXrbeP4v^2dH8Y}$%$4lF}DOy6iSrybNX=}^MBnBBY(Ld zr~_f?{)Cb(IBJnPM@O4+y=3a1JJk|rV1u-Y+0d}1H(m+29o!hf^XwY9@u1~&=*Lwn zkmBRz8{BC_G`x^4?A(l&lJ)*pm~IBgH;TXV-u!F9k4BXM{fG-grT$hG`Z!DL)*P5IqOA{Mqyb-ZrIr|WGB3zp2AvrOj1wFUMB zHmqiQ?TJoqMoo;`r}k0g=}?^JMWd@KI;N(jSi9}!btG*OF?q6tFxFpE7<|qqrsO)X z?eL{N2HQ;7by;sAgCdFc$8^ z5U?d)US6+vGbFhw*g!LctAXapMstbx1gVl$_`d6Y=Y)H>+dUUc!>t#)U!F*_J$)Xi zzol&%d}kr)=?%oo-@2H;A===s*H}A$Y^j)YxKbw9(Iarxqo?7-+AExI%Q@-qS`uRl zLh>ppdX0TJw6~t##iV)sB;r+s*47rfzCTCIkG~V0FD7I#$qgb5){t7AyYmFJO^Y3V zKMreC1MIDl)b*qABPcP7A{Jhg^)ZI+$+!dl|P&! z9PphZ$MV523xuJHNtLr-<3WN8?$&bIGiRr7B!lIxRk_*SW3{T=o(3B_cNd_cUh@Nw zx4fR@7$*n9h4{C)yt%VcEOCcE%FWcXDRW=H>di`KJTP^NTQ%35J5M(=s`BA@D)AMm zRlx?qEbO*m75Hi6oxw*%))}?hMu}(oMIg&phjeu(5z0XckFK^L_FGQ7iKeg!5?#ry zd<^R00==k6cu)uZptoK_u2XhJCCf7-Tw`==Ug6~9=`~Yx`!Tt^7fW=8MYNI&O+EoL~v;}{%jeRSZE1_LyLLLd&UUYWIa;UtrxuXA0QC@_}6OaUT&itzW zh&4ytbGyUUYej6qx5wVt1gjqbt)&(Vi%!(s@sxG7Pg3jS3%(t;)uWqP$|#TMDW1Jf zA;rE^FRa%fRI=(VOme}xlIs$8!y|ju-yg~KPRU>JkcOG`i8T2y*#xY*h3B3I!MU7i zt?JpGQ_)#RKg_%j=2dY5DxIFK5MeL=Ec+q*bL&R2b8RdS|;aSTe zro5lA%MB7u3jKSL?U?>dB5O;{PZqr0sq?AJB{PmmAUlz7Nj z4K8Qoq)=3uhIb^g@Ax4P2{m5&S+9}r?X&e$+F)c6hkxm9=Q`7QeXr1vd>(&2QNhJF zrC%N@yDg=)s~)!oh3Z>q2W-R`axJ310U9WyqQ|M?qXUK zemOkGAGiDCLGW^T-Fk9f5Ie=yH56p@;Lb%iudn4vt&Nz7bX5vx6%Vo+-jZg>rDjKu zP+3WIacdg!BYkEpoxiX5N&+JPCz>N#=U3VI_%-ysI=y$v`#jV9U;UldP>3rA$S{xO z<%ZxxE?yIc;$|7E_Kr^~AQPd08kkq;VL`jOXPrw$*pH4He-(NIRPV-89Zhprf>OXX zLhp~!Zv1}EtR?C?f`+RZs9zMhg5L<2qZ$>ge)Z`!4FT^}j!)P@C_lug&+f%U$Cdy} z0TQR@q{Ha8%&v~wTqf!^o=M?Z%KImCNx~tA0@I@hmq%nxBW9Mcu2p=h8?^)TCs&rD zyg?q42F!jyn1YyYlbNJa7d_L17+ZSimIGP7Gb>$XXk5GUASoQq#zB;czSGpa%&;Ez~W= zK1T&F1B@SpweGkbJ#jju(-n_0OQ(kIMZ8&qka~M&;Lf+zzo`6&zKG~ z3vS?hvaZObu|&!Vlr*rVN@bU-w^Kj|HA77;<`0@~PSRL;y=v=QGKXSZx7A=2)Rj$o zvyMYkl?BQM$#x~@D}lW(DoE7%N#Q2d>OyLv|HGp3cxhD-_j^_bR`ogWn*2%6IHirg`@($8b zd*?%mMosfX*s*!78e;;z45sK;>r=Fcl8emqrSQHs*jUV4-z#QHZVxMG^+$rU$}Dgq z3!g(0W9~~l9xc-dHkXz9oM)4^j8ezwJk3~uj>^Y7zZc0;-@$SEr5tnH7!}VzA4&Af zS}jX^i_kA#clVa;L2?#}Rr1%k*C_eSuzz*R!qf9Kn-`saQl1^8+Vz>k?Vt3qJp(j? zylVwrPx*+tF#K3;>bhZV)9IZCk^S5kbW&UyPq_%q!NpO7ygz+8W>OlfXFTNC$!K8VgvHCmQCvZUF#j;GO%PQUN~ zzf)(nT0?ooj>S#Vcs12L8M#0F#^z17cZpA+X0ejqI4d2fDz9dI-;JA8u{A1FYo9TD zr$q!;Bk?Il;@Mz*O#z^KC1^Y*a!*~Q;-wgCdBll3RBv4_yh+QrfTL+7BB)UvnDGZW zS3r8OALeB>I_&^xh`M=jv>M4-Rzt1tf5bO>>;^{@Wb8InRrsec9K9ZXk;xiEzZL#* z9j0*=aDGo0M;4muIcKFg-$gY4m3?ME%rfQo1$=18wM@OlcX z9>2iPI|!#T9`&z2>Db|=!1U6?VKM`UiJ%nbn<=_R`?qAy5gJ4vGG0r)JRVQbS(rC* z*`XeH=ImI*u1j=BQ|I0jv&uRZ}UR{(+k*a?cR0YdrauC14uw z(tT8GIGT>#iztgd4()#E@wX_QYdNxX+H_ zJvt!I+QgOhX6Y^y!H}YZ6_pjRcEm+675CTXxZBF;Rk;lK8}DzkSbfc0gY_FE4EDhnJX zVYjhIsaa4`wE!fmbT8ph%~d|;QIpxLiLOs;V?k{@&G53@&Nmx7$z9@^276%P<1mxn ziXVvs-__Y~_fj(+5u(>hw^IR@azB3|zPnZ}`msK11~KcQgUIDykq(npsLZsN*Zv6Y zXm%7U!{Uq)^-ATmSQyvma#>zId}IIdBZ!8jsi4>Nx#AID)fVS3$uuqxC6G)yu)bT? z-Y!xX=)3vO5f^#-A^EEr;(&5X{aVZHu1t1RRj9iEAFE#(cwRFKRoc<<+VcF|FZwcG zo#P0veVXKMR9sl_T^&MZb+`XqowIFUvU|JmkEPciOw@#Q#%WS{_+oSjDd>GLehU=5 zn^t+G9aksIQk8grDs_IARb3_6MEh|hF-?%5|D_A@Ilsmf zRq8?K`{o5n=*SBqj;~|;B2DHi>m`BjMBUGh?7tdpp|YKoE?g2iSGGwOjbLeqvBYb= zlt<6Vk8cgshvAv8_l7QqSqugDfsea`WG-JKxkc36+vfZ$3CeJFF^xS<&ZjfDCllp% z{q3_$mo})|4)`}buO$$D8u3f~son|V6L**f>wi){@elbp)AKbFJ(sA-SsKcVPy1N@~EtzNGW^o@<5(wCY;mFD~Z* z%v^ij>!aB1!>;gB(VEv=h#lmSltJ%wopAk1yAS9U+-YM^sf>TIXlHgF4{r-fp=0me z`2Ohx(q6Scb-r8}J^#zgqA&(J`QIP6+R5u~RFh0dCgrW!jl}~-D6(B;D_XuR#IUj4 z!fZmW9cEZeLgpm0qhV)&t z`Ujn|yy^oTALvN{eDYkKuq9H{&NoS?!-<&j$;0{q%qpI*6lE*6ga142{>u|}>`uxG z*e38%!R5&KmWRzydR*tqNpqq$qg4}goj&%U9;jhWYqQEE1}=vgc5SFkvxsVjv`^n` zHe}(;(uFe@HSq>up0)c#>1W$u1`BWemwOXGTBM*KF#G|)28L7K&&cy`<28E!T3~%e zTg@~lA2_`2ZA-8OO9<0Mm5xso5Oo=rn`Do|Fk_rdQx4176XnhxvMm4ohM`i01@knW0nGHLH<~v^?RyAwS_$9F3K(xnTiE)xv1wNR%Hz zH)t}Oqze};B1`Vm$~%5{7-~Z#4XAgW24TkbY6R0wmJ4@gBL4W@|8`X4v8zL=!Q(f3 zufzX?>-WzI+hqT4D3|`%<)^K4!~R{L8_)dj4|D1NP=fw7_W$eS{C`jL{C_MF{~xK3 z|L4^Ee?XwRGgpWv`op;-`fsjli{>TcW3RLHa|YoUMX*a|@yZJ0u(N0nk}Qo#b@KZ0 z_BzrgP!s033JYI`vkP<&zRck0ugs_8GRUXD1xSmf+aQvk#~J}IC? zOF0SWqz@P30)&lo3|h~XYMmFo=i73VTw93?g7Z!IQ6#%mtB`yH_0dvT_{IUmi^?Ku z+1k5Q=$-T~#~A!yTJ*V@o#eel|H*X7;ZTy%xqetK0{%i4bBE!vZZVUhRf6dHa;wD< zxFE*jR!Mhme~=8i^T%vs8&xmJoT>O>(#O1c%7qcAAJJ24r6cYHlYf;7Nu+Eg@+&?d zh2}1e1{?y34=v!koGXl%X0Qso+Z>x>cbeU#QO`z{Vg;LmTUeu3er%0(%IRh}kDU(N zG@rj{r+VH-bS}^x^Ige&;GmAzde|?K#abCQuhlSs8ei3Tg26Xo{Jr}9zwd=vSd)n6 z=dYS*q6t?egOPQnjz>D~`QlwV*cRfll~(pC($9Q{!gQ&}*~%v}hC zXL9Z1;7ws`#a@J$S)0+FCRqaZ9wFsf>{)jjfC2ZT{2CMzx-es7)s8ZKO!d4=I+w^i zDDP+H1JzD&qWt#WCJm$XGXq(p8Fhf?B2DXLW9eQO3wN``5xE@aZ5ACHKKLmo(3hWK z_l$>+PIf1{stWCRh(G#Np@J8&V-W?#Aio;VLt3L5+LXu(w-)YzvUR`N|fsT;Yh86@Z{(YJ#L+Z)QqAXG9ts0Zw;xKf^DEnRzgT&G(N; z)plKrCks{bi7ayODkY|rn2EP5oW{nwHULRrlj&F^>!9(iAEbS_(B*`el4(}G0m z%Du&N7K5E#rF29f=b4LpXIk5fs=yrrU6>^kve@;nA8&QIr691r%+n?zEmsa)jC&R~ zR!JIiy%)=H)#}eqppE!`xmttN6IcX3b*4i70Qv2vK>sPCN>;jQkTSQq#;q@sEy~65 z_j%Qty=CWf1O)1r#+*F~kynao87|$9ng=4DKkX!Hp!FdiMJ*T3BTHf)GSpSMA%5E! zgi_Mku5G=FHCX@d92oM?h^`BUlKsY6?4>Y9?UPC&8d2z>8tNmQgoxMg$7-TyX>d`s zhn*cEcuH3ZH$#4ev_N30BTZyI%YBbU#*$Y5SKRdK=|LaZ{H6mA$$@>TKC3vKSY6^f zd=9ec!)HN2K9#v%)csa}Pt1U`YOu}C4?+J7m%o#BfPNaAoasPRh`9zTPp8nt- zGo!SA@io`p%%)g)QqPW4)k;0T>KJEv0>HGG!+u4*sjhLGAdk+BY?UdJw7$8D_f2!$ zOm9VcCCtbepnukJZbyAv4yrIslft=4qf7QJti7sok-+Ej+$$1~>Q{HIf6ix|eluMF3v+M}JQ*0FgPN61mZ+6; zHXa{qW^Hti=)-P(q@3LtB9cTBk6%{hcOi@9jbO0)>ZSqtfHC(5!j5tu5=o2!Nc{VbS(-W^$-=?VJwfBr>-@ys}Mr0WUx%-z4?hh0Uf$gbM95=-(X}2HyBrS;?@7)m`z9q-@v#xO-Cg0&VZ=RS%4cUP!j^HitY2{gLlkEX+paM} zKLGdn`T?ec@8oWyO*Y>y2rXS$(*u$zJdb`p#)vb$)F!eHGketMjSik8r(13dp7 zOBy~*Xw74@-n?^lKxiYDc7FlpnIpml3L(T-=ID(+1s=UeM7t+oYMgek8Nta;1%^~M zSyXtd(`Bk&V?R)(+WeN0&|5Ys1usCA^@WyWjwqrRw+= zh^f_9+lg__um!5Eo-haY&5jl96t;aFTF?6H0HCB2I~+7@m$3o}-%?V%PAGNu0X^C`rO;j0uw zJq&bMW_OW6`0CB5d+w|0)4RDkLedUzLU7D9l zmipXk1Xai1Kv;(qebhuw>@;?w_c!KYlsuVGYBIKEof9q>{(u`5tD`_MV@gleiOl179 zHrINuc_%_#E63|69@_mfNn^bcR$8X6>bYczDxRc5nAz+?3uoUTh%DrLaoZBw3&n+j zzTQ8F!ch*Noj*EBJU8`8tc=Ml96V)qs>gC_?CuS=+zg|OQfgFr*yEg59Lce;!_}w- z(x411*@Pf{RQSpzg8>Wv7NaJ*-cEY+cfjY_&DQv9T(KaHI_I>`?>f6U7$R>3?=I-| zqTh)mEAyieQO|Nvq%MdJG48IH9E|8Cq|*?iAqI_Hu2Rq8;`&a%*6(j^^!Uys4?6~m zR72j;GECzKdkB*+{gTB=?WB!h z&U%xuJ{M5Y0?lmuGuAW_Td(%g1??wndX%1xdaT{1A=M=u2fyDk!?aTLf(!el5KcPH z(a_Pr-%Azps2 zW_o1Ky(~vBOd7dwVaL))dQI)9;uOs18pV`rXX|Oy6e+wr?5YlS*)yQK>y|1>78A`f z5Z{P$Kn`+)eP3jb;?={LOV1-73A;Ua+jrSwp^!;PkPZD3oRYnG=^(CtqBA2Jjog~Z zAx~~X&b`qqp4LW%Y!hfFjq)T95(gWJJa}|GR|0<oTW z(l6_vzpti{{p4YTXG>(~r>OPc`Bq+>~i>#RNcR`;xd zgzvS}3l9G;Eh#mW>A3Yp!nBt!(A9}Ln>T-NP`{SGvO;^?M})v9^=|of_jYn!PLrhP zrMKQb`EBWi5z=%k2Wjpd3tp?6K?yVbWkS?m-=Lxn)4agO!&;A+_*`j~#W&&~5NV}n zL8jkx27UOP-6y>C zq)d_%8KV^uzf&#wDl5_0&zp{)urcw+oKIMx073c2vjAsP>j1H!QBR&0qxI6$oX(`U zP^3o0LfrPV0uI?6`Bz^|iw+{GxeZcAUx05;e*8_y;Ig6ZN`8||rXYPHA^-_Vb#5^M zvK<91xn|*h{REllzy!bJyX0X$!2vq*kZXQEJ1*K;++#Idr<1ZF;-zgV8*=bRTq^Qr zu@&mrYV$YkIU(jc4d$398>xYO#y4D&N;LV0eGaY4^#M>b^eOlE&I-}AsGQ@k7D95;@R%F#*p1obr}I~vUG(>g<{bZQBtkoXMpO3I+tI@2eb>GB zOceKGa236kLN};HW^gDnEu z*x-?N@vG1;=f3mC96AaxYP%HXsCs6^WtY9Iv=eq}PY7+%BtW9gt}Ib8`|3$^s1-Y$ zeMc^*k-1zWS*_agR9$PV3+j7AdNSW!}`0PPF4trpRW1c>Gu-m=-wYyGbXL*Izd+utsGAP2D-_qvEoNL1D>r<%d zZRUlC+5i!EyaTq1p!y^zYN9aO2rSJ^kx2(z4tGv5HA+U#O7nBqrSrPw3g^YpSzw>I z9UHe@-}=IRu^4fAtJMj5rH-g*Y6zB14@~cRQ0YF#nYMIeP4m?&NZBo{GIOVNx(D`v zwZElz(|quuo-A>?Y0ykh-$paX9TzA|=X-xkPO1K;+{igGP^t~`mr1Ru`yth;*XS-0 z-)6fluPk-f+Mx8zvU}heB=ROg;X}-DeQm^>L4g7?*qJ3zcpf$=6UMbX(;cFM>C@{@ z(%{Bi6PgZ>!`nEJ48*l&_~&S&ZhG;Q5p@F8kBwb>S+p;7Ulf%$5+Wk}rw)TZ5P}8v z6|C^yHbGZtu76o$?b*~lUxLB!S9VXVjS$K?jZv66TA7JWdj}_{Cit7aZ9jJk@GO);}JPz&*QG}-+9+n6IC}+}xFR%l!t!3)xrIL8 z*v{h-#@Jw6t|^A)(hu{~55t_v6tU8XMwTa(dmpfhlfOvuX&v(2^EQ*IKIs5eqeNC1 zvmg9XW!QlU2>f7_5 z3&-8(#H=PbvGD$~Yt~3!t7nW_?==ySzqyzLs=T=VP2=SK^HnY>ujX94pEpNdFctPo zWL;DIqh#Wn!L&@r0j^Yu`N~UiG_9n;|C!_^w?lb)w>S*y>fb_|P%vuPr3n#5D>)`2~U zu?^bs(^>6pMZ^8cQ+KUIDZc|7qU430!@)1c=-?kCD|<+$ac_1U^k*w-Gw5>9NivB+ z-gzoK(jLh)i>`0B%Es8h^YdBeYd1{c-!{S2@#?+|CkEubsi9c{g59J#z@SeC{0{i> z^!eIogNQ}ZAiL#s-5EjgIj1WkvVLEGe5_*|PN_fiP0;7tKMrN{vMt(HKlyJ}D9k0oIqUyrJ zz){wzM9NGrvx80sBir>x9eUJfToB8t{W42o>c>=6@PIbF<=X=@)&~HUBPwX!1xi3s{C;IvkW5HW+t2z!H1UdVunh{RqG);gZp(OSZEO1KV*YALZ`^yWe9UlEC^*N;cS5^?R~y{zGOmEL!v;trSzYJ)YA z7OGo;)Y2Bge{kZ$N}|c5WEkiJoebREW`{`|f9`Xn!)d|AuK#wNzR%)e+m?au6dRC^ z_%{_F8<>rh&HEtH$MNn4%PW0}$hm$pZS(HU7OM@n=zmEG`JnS=*A<*UQTSUQx^g_W z9(k>8Xas8)BT5a)luWLAgza){@D1`IdwuY{+)Q~noH*vYE_$A5^?zm1!^qwV>X8n| z;iD6{oWZ(*xp%roUi>V=ZsO&Z=~(yrc%bwv z7n!Xq-I6$+WU%IB|ASzBZz5P7oG*b6)5I8;pujKmV6<{4bj)!$?y|xZhxz-E;X!6e2l1gvEKF8}6W>mAI! zY~!u_`xKDQI!LDx&{`)?eijt+B%IjOpjLY|Q{TU(>=O%cK4r#_{dD*WzBI=HQJ{SK zv}1J3xy@3YlQ~lp=>&aIvsQ|I8c-#X(y0>3o6(Or54!0itt|VZQodU@-(dSIblZ5Y zUJ2M^UAGn_p#o ztbNvZ1ij+axS{e{*1bDKbc5)}>wXow!Gg-x91UV`nDqXc6)CVb-E+`wapXAiO3VDC z1v)zibja6lud1rIL>R0Zu@Q6Jlj@MErrN+_v<7iua_}z3{j(~`yBo3RaSRn64c-E; zm0DD(HKpLl>nQ{8y4XMl6myF1uF8l$>})t3@6f-Y&4fH^tN^|DXF#;qJ{#d3SNa?3 z$X+F8(ZXzl-~uGGEI+e6Vw8z*TTw<>Qia^{N7B7d8-X$7-|{!Vd}N+pHw~IAW)P_% z`)!9?79+m$WCGOBHCciCs`cL&e!BEI?6&{`{6fp0^i%G?-uUy#ZG=mRP3Py_tm44z zuB)c8&wCKv%jSYvv;%UFwc2eTh|4$5)Y`E&+{W_Ayb$(JXSx+Uohy7c9Qni!Dj=9~ zyMYsZJn-F=Vv$}Bm5QK|G_Nf3h^r^aZ1aI0&2I$JO%58TJeTb>s`8YETqYzq48sr+zjtl}xI9+SPJ0Q254o!J@%$ zmyeiIhSG$0@r}u&TcH-b!dtTtbBZXGOBueBXVM!eZEJBsNs*JCM|&QPEU<2Ndy~0& zzTKXx_8lG5HAOKVM`N)nt^QA;bOwKfph%xw^MBn2bSp{x{^TQ31z?C>FUWJvOwatu zy-GgS?{DXC0*27OK8xHby{#}Ux$_@Dt`tKf&V%C&k~=1>lv+Fa^Oe1YD1m5GZBZ>A z;Mc?{4N)@q(TzDt2RIX4EL)*QF(ebtW>Qyp~dHv+A%n4`NJhi(Dh~lZhS6lBv z=BXy<*f)16!8ZrJEX6QGAJrYk$)pg7b5< z!6(qmMb6{8L8*GkpS)2zn-Bh2RtL)gG4bKs@noFwy&fZ$Av;h|{u!lh$;e(ynGUfk zlRw%+M78t{H8K3Dk(Y(R6*O9N6~}W$VzTZ%zTW||CGDX)a*@^#YmIfXgU?_XEU{kv5vD40r2F8zj#|5IvL!z1ZqClLBLa;m z|0&-4*`6Lr%a3+fnHJfEV^De?F~z#!Y+4@_5Vy(NnWUD*H| z9f+77(lS@hFDf}T<$P|}dHziDe;pefe}G%ZEG<=Dr?MrkH@>JK1yKh-ZX5o`2}Is&2&cN50MCq{kp!du(%?%6|qbH z*RT~mZTA3fZkhVoja5tkfDqc8T6%~&qQ5~CSRzbpdw_hUajCn|YHV|JB>GT9(xjki z81h@<68pJ5W(U`2gjw2^3I7(gxES~kVO?-SC$Vv{zjEXHrilOVFN`JS zoj4-%zbrNNAf^ycl}sn)=|w^mh6)*fR}GsaFi2)PR}KABY3$ z*EYpMTrkpQEcKMob^<+anB}(*@{1VBe6A|TE8Z$67mgZaW*e>A#O-9r!qi-0Lx-!Y z%VM{q9OB4(MI5YLs;)dDs>pu1)|vVU#&jem!BDXCaz@${@q70(V^&kOY9mWqVom_! zQ@wLnpQD$fWwQRR{AMh6aqkTy!8d!xXZ-jf!=!kaD+$;D#*}g;$kwp<&xYxMQEJ=b zY)@gL)Hx}8%ME0^83evF(y>=`&viOEX8;aNZ!DggL*G_gh8pBt;ou8eY` ziS*iXx1c{peEoy0z4U|E>e4$wB48jh?8+~ZAe-nJS7Z^;z_vuR0+7}>l}kv%s%Ea& zsSzmqHha=Ht7jZKTVTQXI10<{yo9rI(k!j81mT?f`FW!l?a7Os2F59mbGUmFjIfow zzL2={Nn;#pyX{k@bD`XZNk!Mknx+;Nkq-LC@r|mFr&*a^{Ren^U7kacY?TZ%+~p`$Qtb2g z)^yIdL@hs>mQk+81-$hZYH;@YoBi;&jEaeJ1L7!|PwHhg%*aRE)#hNnSj(;f2O|H- z7F}CQF~a%0+vYytY8T4Itms4J0DCPcypQInA%N+<#Sl|R=$so()c)ylw9RyJR^BQ4 zmq^8g`wwFMd-f@~8cyrw2<$=`w$t~bO{GLLiYVS}Q(F;%S;*!5CY)ZjvR_deC>dtwFIy$CajYYqK_IR0~x48OQ)H3Oe3%yN5B{Y*pAe=LrN zJw2h7SjzGz~+N-D}%V`cNMlDw`0>&iN1kNpF0i8$N6=D0h`I!&39 zWOovf@X34gsKY{&%#cNt(9(E^ow%!_3&gZq^2|Cu(pt3p7(V?Ruu7#&dvszcJmM@WZ zf6TB@eU;L_kYD7!OU9bt-yr7o>~sWCYxG1^%H*d~0EYv* z<_zDM;UrReaJHOTm(a%Cm>f+8>>ij<`+7*C{12w~mIz6pt!j$8;GhMmRrbV0I4t38 zVQ2s_`JEE9xS6u}Vq#eaAXY_2b^;yR=Bb*YvlWev(-T#Cz%cpbdT;$4O%@S*YVj%g zB6qcF5NsFf{Ii{+*N`|i2Dtl0P5f&}3BzqB zGlr-)U#o^FH*qNRIifYcQU}2pP)WjZkxORPP9OphxHM{@dGioRgH#rlb)YYd_vXMs z|3K>La7M?htoUDl9lB)oBTP`PZi%8hAxw}+5b#(jGE~Z&yN$&p=8Ekc_?KZp*}e6A zzL?sR$|l}e%ACT}cbX_Kqegf!hI{c2WXRUnzwqGa?8(B1a;#>psp*0xu@%5>REa;V zVqmLM$<8oEc}xABnrc}Hb;KscYy!6qRLDx42eeLXx8o%k%u>`0&ZqHXUl{yyg+qtD zEh!S%^X9(c!Z_EW(=pCxq;Au@eyGyk*k+WJ4JoOE^P`Vh%#BWl z9`%CC-Iep&Q$%uF>&>BLA8t3DMEW->Rn_p@{hkP0&z#8y)3P0R%#ev4@Xoz(-J01X z=khkX0QFe&3RS|^wbVee=D}HVXN9lN43jIO4IU@IRn-bOh}W0Vf(KQrQhCBZFtnA5 zxTxKu0^A&!==YsQt0)8i6_OlBbyD8tvrH-K>@b^)#9nUql@`{!avQ1fh2!AFPhm_Fm#&kN`HK?-sMbxEYe%jKhm|X+ z#4gNY^&fA$F=(MCMDs?X6Sq_4GA|=P5rI&M;;J$|rP7mg8ikP%2H)5B22fcQ$ zQdQ{s16B5+#-q zc^S`73Zr}zT*c-^TL+5Und0gxVI*D|n^G10avbc&{x!>*VXDtMMAai&bsPes8xyoJ z24SMaHskDKL|Tc=fuW+gCWWOKX37Z>R#hduEwm2~3@4)vezeE}xFyokmU^}CE z*Ji@@@I7s!fxa-kupTc|TNxq01BY&&*zkJt%VdT?Q^Iwn_OeXYL?5?PHOad==XtHv z*<_4<1mDT7IdVo_HrF}O#W>~A)+lLIgysLqiRlrJ2a|F9GCh=8i^uOFt?F4>xjH#j zHd#69>s=fOd~SIl5fm7+ROO;+YRV)n<+}BeGsTCT`L>N{7i8<_t!QR2EEihP#H-s} zPZUO^B&H{lGR`DXvQkys(R__jB+rX>6W90~&gDPNWc-m6ota@aAUoqV*uH1nbU4Xk z*pfF8bVM`b46o#5mIMl;b!wlgnO_Uw%s({vDd6Qj3m^^0VFlkA!)M<#S6U~K&@o3;G$^%Z$>$c2)A0=*yBcw*0YRryiKKdBM zICQ2~EDr`bMrWN(Nq4tB=I?A`0r0Yw-ERda9EytUo`!ye4NDX8J5jq$;H@?lC$Ft| z#}MfTSgWAZ=mYo5k5u#mpx%Y)&eOB+QDBy5_S(}4g`%BZtH6n+I~i}bEP~6$1AesG zwdf2!P^g!xd0SRXa{i1t3OLytmTYfyvpH){|8L+B+V(~uOmJpA`RC)OY+@V37Gw{^ z$%M(I)Jd5SA)6xQmw)4l!iz)o{%*09> z$}JX1XeD06k!Hj)^_EucqV6@T=)DuFQEy{mxJts)y9B>;%gk)4$YI28&}eftM2Jb! zvFreq*5;_0;2lVR3ljNBTzXE`~dG5JyMFNGHFG$+h#rOX-@a%YRJ63 z5-MusqAsRvyKd_%JDWm+lGqw7=CLc9gl<);#!O(dEMA9q}iK@8Skz&Zg8yqt|%O-nMh|^L70=Pj0($;C%ea6=j8IM2aP+X#5WPoI31= z9_Y_xpZ&mK|(d)@&u`jylWq+UE|h27R`&Jpp<6!g|T1LqHAf|hjvM47C_9(QBkAC))2 zh?%9u!~3t-0|+pM?uC1uBTdJS8#*{j381u<3@vyqZq9Y@^O3~eH>Rq!rSZ=00EPvj z(w*qdbf?*YBW1QCIUVB4VH)$fGj-Oss9?~*<=Kax=RXPHwwGpinP!tcxdmAGJoY4j z5cLbEw4G{D0HiW}?di4aT!<}o5Vuv%phv1>-5Ux07$whKVu47`aIJ6dM_N@?sm<*k zC?ywjxcr9oqVXHa66%54Cc9F^v_TFL()!Lg7f>3)#jTkY$Z@ur&cl-%oKe#Rzi6qx~pZ7WE^?W@Z zg`>#FX#2mTv}~QijDM+){-tXW;U{z~V(8&qI_MkYhQFytY8wuko{3(qCKvtcb6pz9 z$bO)5rKog$;{QBTbYwW^JGvD~8V(D>x=$J#Cp76HF2UFi`@fMi@w~s$?HkG5`1z;! zeuPY&7=_zc=WCVnm88w_CtfW*q^J|HEAdh8O}DSL0eva6-glGCTv{CVxXe=xC)Ki- z5H_0@VAoaWt?dE#x;i`?mEes|YGEfMR%1ch(|wd<%DuVnE8oT(bV?LB;k}rXcf{|zprYd!TSgg(zKQAWIzmD0Gb6+J@5e!` zYXAYi83@cgsG$5B6_+s7YOz?-MsS%7#WYTfAfNk5-G6_(++GP`16SJVUHP+?ls&;wS-lE$BQPx@ zWCT>2?@Wrd+Qy%0>bdN;R$f)~@-(1(JsI`txky&qTgU7_EY`bGvJ=~GbI6Zhoc^X4 zNH7d!oV2@Ht;W6&GKRjPA!fg>k~bM{SeVnkSro4zxRkR(Iq-XvF^t1Ss433-?c(U7 zd6wm9ovLKblNt~1#kf84M(5$EBq10>^a;h$gTK??0=a>0xXDMZu*S+K#8BV5Z0a=$ zU_Fs?_CaPJ@U)zEKQe6=mC2RLs~+&~6eUIDvV9b>zJAtIz3x(68)7A|;*5<;l_8_V z#w92DlHng46lnFrlPUtk!J?rCd;HYw7)5F&m*(U`xAI_u31ju5Zb8S_|C^!L-MLwl zhR&}|)jdacxnL)5`FmE)d~BS|xY8tfqtqxV9cbrt4G=$=-Zo`BbtO^HT!eq-Z7813 zShPuDk*k$x{+oO-&Y)mq%3bA}fyvnbL+?A&CvnJPqH>x-MDI5n+r^u)5Upv=m%F*I z;6X2yn(XH`R7I{n!ny1)fNN{_OQMU-Zg1E`mj%mxeE)s=Ue0Oq+f*C&$2z5%im)eo zV*vYoytsnU7M*ZkMYVzhCWttnS#eV}LUo3scCX!epmJ=DQ;SF#k*S-$z8J*^+HHiF zzA`iw#JzGZ-GCm!Qa8o!afmzF@UFU-@aAB26mi!#R53xEqt%a_Dqf-tS+MDTp5~!P zCtt3fI>6b2rq}e%M<88?A|E*h_gVPpx3vAcTE7}5o)}CtQ%{LKoglg{ZiUZuEp-3N zDvWFjZ2}`KjI9Ui(8?Y6l#iR7T=%;pUqgy1e#C^%>AlUj(fCMb?RDqbhL~&u4f~~( zFyq2davG${{{>OFU)Uru${Ij}=4Xq}Fn5jr6=J@ZCVxQl1gjnhG;q*HRm zW_nIBUiG|}-w!Y9<&6I`K<^$%Uhivnc;(rlsfbWk=|DyQq2SZJJHfFDC@1-Vkr$T3 ztE*WoyC!BPUNrrBF2iKlV1)0=`eoGt-o#zWD zXRS2GF&Bx6@k*36h%oWITYjSJ^>t4l?>W%|Ng!za`^j!+vFFT67K>n z1ujgCfuX`W+^nXm5AVS*KiOQoQg?U4(aJ;E)b?$PO)t?68^4rVI`YG)p#;KlgQ8={ zf**fC)Bv8PKc}p4ClX0sEf}{zA0_);HD-?|2l2IxS{I|QIK-u}mvp6q(!Gf2+Pkd& z!bo@S1K*Yjb(1(xjT6M%Y!cGT2snZ$OwITq=}_*pftlRTYyO973MD2g_1;Xu5m3ig zH#X*q8N~&B>9BvL%ngvpustQz_mkk$pOb3$dqEI)`ToE)*wkd}JN|rbM%^{xzqdV% z2iYUq%z>cKqInHZ#1Dsb-V9?lseU8UU8iCn7n4SlmY6RESeKoCTJuekOh>b*P~LXM zxj40z*~DVvcybTCipiKbQuYmU&8R7MNChj=3IT{(Ig_*U02o>(y*)=7^!`iMIo6r$ z+qc%<1{dke?&!O*IR{FUAacqC2X(69NU(C`fzRbNU+R4L{uY$ zig@&_|B{!Z1jBQ8t{PgIrMgCg6sm#7&RKWCc6IPMZv$lVk~A6%0%3P*HpHCgF0GH ztNvJcSl48=x5hQXx9h<}EP5ZM?5Nx$QV$50U4T2*@x2ilIRN`T!1isAuV`c5d-2w( z?MvzS=N7U)0Cj%t)Lu)O-&XKjBSNJ<$p_URZM? zCx{cA6?&2PB=il!t^}v-vOU)+qYFlHz4z0%m@kZ$p{sXZ^M=#}Q0dPa)HBw=#FLuX6r53dcQKOp#3XijVf#aJQ`WXNPGdwP2q^4qcvKd#eCur zng@B(*7mjKF7F3d_;wKgg^*d2IO_p{(5v!aF3$N{(mY(s$!YFy`Img@@mEI(U@77L z&J7_7Ft#MTN!9pI(s<*`NA8sitmG1LJ;f@evSx#8wZ~?nTw{!#X%PXch4hz^)LO_| z(oi8RCvEN(aGvw0OC0P;$<{1fyS`=^j&@Qj%Qu^t%3PfR4+5U{3wZTVbi>c@%G z;hKGwl?>98AodmS9xwXwxrNrUn=ONo%Qnd$#=g*|PS4r8-g_|17ZVrFw%Hl`fd1hN z?1mG=CEMRvV6Vn#iWa*FX4nao(rDnw+xtC}qyF|AD4>S$kAUmW7?SnM!!i4Pmk2l!l+hld}GQv+gW>QQVhkcm4BX7cA8wy1#&l~=*d>1i~fylPG0tB zy<__CVB+TN3C}?O^LK{X5c6RU9ukUk5H7BH7GdY2Kd8fa$Vv_bs#%-d=sXPsXc+Uy z#9aTaob$LIvP^N%gN++QzA;?ApN6m;iJA~>W#Y_F4e65rA%vP067B79_HlT=H}woX z?ngi3XY}OVe+L39Y{KzH#Nzfv#3CjjDaGgF`~+Dut%XZT6;*UA4tQyD<^wpLf?!l> z(3sug#a&@ zSWpqpB*%^2K}VXwm`+H|`Y$hNzfnLvSM+`K4K3Q-Uw^4s`&Rv9);y&qXLmpJ{%WkH zdD+Gpa>IGOC~)S7O=!w<*c-oDgOqz4p#P{^-r*0{q7%OOCbN~knOU|+i$_MH;Jciv z>u#nma^*~dw8`5T;^cLvp>Z`)raYB9ZD{Kl|FLoaFE!m=mjBxOB^>fb-K zd1+(k)yZUJ@%NIhMYgVQo4X$z7}kDpMsw#-L}IzVm7tVRp;-^6a6cyK(5VfLBKLp} z!zkhWV{^Z0RbY?V{L5V<0x$bkBfbY)BRf^Xm?L0w5J|lqhN&$OX>4$HKibv1_XY)n zDRqsfqF~+;B375=iz|T~OnGKR4E3tlTeuI3CqY}VIBoI0y2yZL5>KZB>qKM$VY0cQ z!igp=sp7Py!buTizxYG2xIi#r)WaCf;1AU*KW|^@dQ?xfgn;OFr{Ar4B)_Tv<6hFV zoZ=k%^Nv4<{q~0~cfmlizZb}<Z%tlqj6F!+y{DS^N~Y zQdEjlTG^GDgz`8^l~EIbJ0u2XPT*m4#X5?n76uG$Tu!M#=rH|c6qA&RV=&%n4SOhH z`1Eg1f+;y)7*#kto_It!elqRSTSeCXzexf-5C!0x04nQHT(%gu>JLM(6$8)>2m}VwHSB|%I8J1LZ)0~8w|@FY zP(W{~7~!tltPoRdusu97rL{OU?2)b9(QfDJC3LiHG-0dbwqP$_@hg-~a&IjmV%#)_ zT*g0gJyfRG{FmoKo|a3p+R}zj)E1!8d5Xz7YL$v<26#wNh6rwDIXRz%w%E61g+6hm zk5^(%b)SOu3eiKa8*V#FXY5N^CEdk#!_;ioq8+5Oe6gMoo9ym2M129magTq=H&imW z`<(~Zy@lJKG3h!9)$WAqiqg1b-U9EPhzfx^xBI^rbFjt-lE1dg6CGSihUH7(*Wbd} z%9~s<3EM|J+e)2i;sv&<7d`#>zZ-xR^Vg9|ewk<35_?I=%aDUK&&KgSKlZaFkg%-c@=RXdjUR*lbp?YkOy zrM(#6?^`YTskX^UD6U=!RgU;47uW`GkWFgdmj+*ZUsBc@pM@YEunv?Y#t2;F(we#J z&d-M2`S%Q; z{TzTBk!%B2V3M-1cO&{d@0)(5K8)~vbMDucLIc~_G<;(9L4COOfBe6L{ugPAcNY($ z^%W`U8!1leaSx^belGuJP?E&70&bn4wOOl)XB3vgUg?6#staSY^KNB4_KVXy znz|*0wLW~z1EpbPJ7X(TEZlW;2mDu3g)Y!5g;syBZy<<4dQn6D`!)~*?cB^Cd_T`H znr9J-Gn!OnA)Ag%;m%U-=f^@vsi(hg)IS5uIs_b!v-_XCcy$tzITpu>xnR1%Ci z<)3)wZod2PSuu9 zC@vwlye()HFyodx^8NH7a2?!t5Ejb|w4{Kr${M+vs>|HM6NrfudUm4aNj>Nlh* z12^d&9Q|FoY$%WcHQOw9M}UC`H=%T|Z9Ar-WRz0e|I|=*YE+Mk4^n1FgMlOACLr_S z`C&P}njzsX_-MsMmz+rqYQ(9k$7KnGB8g#3kV({mBun7aH4xR@(LW zd673r7Um07kze`SCynUVc$qSnOW5&t`&Zf4uU6Ccd}@S25M5@xsOd~_FwgPN{`+^7 zkP7zB%4cv~**eVmJwm{gkoMo`!JJb7bh0bOsf^>Kwfk648pkSEdll;Kz;^ITUb9hV zmnB-}q+R!q;m8-p$K>2AHyR!UPsB^UBo9P4fUmM_nWql#-|#2^5%R4mTjN3RYpJ%r zwEf-(ND;FH$B$}##Y1h&sqn1*wJu1c!F`FDF%4M6)sXpoV0M! zv1LjygAqk4d=%b;&~`6eHO0&8xjZPBY9S%FuK$mX^8R$7#aY`{uXfaKHR8nQ)(~2t zufe+|P*=d^QUiUkm*V(9fsEo~lEbBn0R%aa%enN^21%s)#^z)qu0|dhqb3>acd+u< zt^tVO07$Ah&?nsG3((L>*#9OupeE+i^*2BYajN)n_B=n8Q{tSUWVE}lKH#ZkZK&a+ z6*3?cQ|7McDUILd;VBTLOWn*+A?uTp%8n^@YpPGAr1Ib{1VtDyleEU4{YAr(kUR%b zY$XUxY93Rm;_moywUL=(9?nu*sD#^wCzqzXY&h_@Qz-#l26F&5MaD1MN?WPg|L5>t zg6R*u^qV&yO7NX1i2ZQ!jc&G2pKxF_J5Of>A7skIrAZf*kYl-?26ONFSR^G( z9T8=bE<^}L`AH5?(l5yY02p_t`SHT2nlECc7s-va10Y7>w^gID6?nFiJCc%H1&5@z zQ|*e-{-O%rKDB*A7YSEL@Z&E&Xa-Q)ZXV)-R$ET1Ztgm?yc(9s|v2#ufKA#GK9~U_^BtT@{F`1ojH{qr$d3+O8A!EFG;_wVLWn($7KkiQ0k-}Rs&4JT79jKB$ zCn&F$^F@%02H!*J>5D zeTW5X1i2L=$Mis4QUh+ZL%T!1_h5oIIW_&t>a@~1&>?~4)dxLriH27;`Z?@v!F8#o zT&j$P4#60ZVB*XJK^eL||0#rQF+RI@{hO4gC=qvip> zrQVM_V|?io?slS*#D5qh4Gou4v)d_70OnwR`88>dAL6ChWM5pVjZdRv;@4A|Y36S3S+-`xhU#%god%W6hl(Al`V-+R;8@O~KLEI0vZ%z*aLGnc;UO?(6 zs3(jWceksj+h;8RZLDqZ3&E(qOzD($J_;oj75S+&csuA{u& z@-`WK1mwYob?edMtdQiTDH!Rb;oHCIfr7IpnKti)B)c939gD6EC0WkKZ=&?7E=D0TGXxTxpGQpxLwnlf@qKKJuEN zQc(HiiBDnOac-KPXMceVZrM?hv~T+qOf4$;%{{Q^PX-vDpMrmUYS(lip=vIEL6q>( zTkcKJ#ODXh6)ShFcINiv6fr>Wi{f|Pamu@=UNhp^^2@Q~D&q7G?~g2-rmi`7yq@c( z2uamIDCh^>8%@`O``ev3^jy-+o_d{(7%s);NU$6Gq{NM`raKGc`y5PZcZU6x7Z>kR zfA-=^Xt`x1m)31#l&=3pq-*sRSd!3KW?j&W-WN`^K_BS3vxCMe4ZT;9WO;q+QT{@lj{ilg#BLcf;%_NBn-^ zHn5{L%Bi0@{KHo)kS|*h+#BL9#tP2V^(|T_Pc2DdMSQIz^lUq@tJ9hT70J;&UU{#j zj)BQxKnDC|4FFZCK!y9B~tB1hXpt|pQSZl=h(58t?7U{>}`JW+|ty7;i%{^D%%os0m z6Tdi7D;ywv&};Mla~wex-5_qn*`Sk}?_Od0fX;COv7e-G@9o=+Cey3t0|b@L0Pmg* zP*~EL>LPhZ@R~NhhRZ1V{VR^xL!!|#HOG+`+!{P&cevN+q_2{;W9t9xSCTD`oA>$n z@WclTTohkFm(NnRY{-q&DV@#57sMn1Ak55ihU^l-q&Q|mCG8e@o}CNYUQwwvbu-b! za;88l9VvY+9XUpurwZW$)2*PVS?_i>5{PH*2ui4ypW}tHg z&ys(ny+b0Y6a^|uPExmr!|E1#U$*KwFyyb%t~)CGPsc9M zMHpq%frqg|vMB)?xEhv!7L2^+cW$yKJuw@3-l*#M&aYq;S31R9B{I(JSRwiQ?0#Gg zCda1COGCuR=A;b7rVZ;3HEh#$UxjO+%~L7&^bUZ==)d{b7C(#U9|Vxv9gMG+z-)Gl znrIpG)UmbrPhJK22hE^mO0$i09?(_WjptJ+^R*ND1-0srus7EkM=1te28WFXulZHW zFB|aQ$9s?WwXos3kc?x)x^k_(_8p=0n8E`j`1gym#5L^N#DR{tV8whZ1#W%j$Y}aL z75zT3Bj1l;hke_InefgIO}|h?7FsZIueC1b(+tQwytw9RH8ep+f;+o++ER?8z0CgT z%2Gca5Ux=B1l&x~j4<)XR1OOVNe2sLPWi{*`SFyHmi&Nts?;48;q~4ga=BpZN5-JL zCn|ELBG(W@MM@^t_PWbGLZPqmtN_UJpBZSYB`*)_mis zcRgWRFU1I_-x1g~jefDy%?s8{ed^l+qokcPieku4rw!0yh3&cSZIbSvLS{{&b!sKv z)p2)v2Vae38NXj%$n1I?@lmyOoDAtsOpN0rZmO6~KSQ0`LZ7pb_?IEOB}?}?=F6snM zvm)*3HD3cly~?9am-UIyaGiMFnS%c6t(bvp!l!`*ub8f*urfbQIO~*yARAW+L!{KC zUue=@n}3vp>{ec;;|R^)lV=uf3J_$tIqdk|%i!f^Is&Q51lz=;ECSPmXNjGk zl}4^dR(iiP$h}M$>mTbh+WsuNC!o)(wzE*Pavz(8_AwtgM)Wto+M#&6qkHVfUgjwB z%5N6)NYZ_rb6TURIdv5FTl)aw)FyP!gwUJ;)k+^^SlN_dPFGAKuvA=esMRA=|}R}z*|O@ikQ z-pt&!^5Bv9Y1H$@CJ{F|jG^N@k7#r(QnfFgElTgWa?D;WBRCAsI?i5El!AJBZC1#F z{XfNATEy(xPCiGUnF~{Oj}_=Xq_uX}ok`UJ_-6VZgI_#01xl|*=+FoK~3niLAB@E$bIgun1t5(Ib1=)EL?jSS8-t)MAku8%jpcI$SrapR+& zfjAj*yAwYPwJoIx+Gi49ILR#RuW*b&GICU2E0(yrdG!u52Hl~{X)b;<$NeDSTDY~3;KfF!QITRJ zLBRP&(hilS0NZRh{^x3|P1c>R&XjQ-NX>gjz-zXY($2#xme)LQ zBrj6k(f>7yqKcv-wCo+7ZGHg*58aa-X%sw(u8P`g6<_K{KiyUIm{Z0NRfJeF+wXh2 z>G~xHoYVF}sPt$tW8&)^OPW~4D}YYXUxLPkC))>WxW z%n&25Z0npgLRgbM2T$SXJp8}~^%MK-SHDNs!_~yrPDvN(WT~1B)PgXT-MU6SQyebI z3Gq71^X1M|lh6Tp(-J<8=t(_gUE=MU zbAsRUMvdUt1DZafQESq;`sy*nwn0dW+U{7XR<)qcJhs@zd;;`|@~-kF-sMB*royN1 zS6L?&KDkwqTVI`rI`_OJm;AWdqP4?!ySy-?2+Cv}FutTb>D6eDJk>!GdcT6>I!n%O zE!fU*tu%pyI^ueOla?W@IeNupM@;*JBxhN~Dl+e9|23KYM#i;@(CE<#U$aLdUu*h_ z6*9_|mBL5m^hEe1MuRrsg?}^>Nm0wV=4c?V!q141lM={B;fSXO8tEbjeS2!)&Wt95LRro zM_pwiM7Cn2^}$Us$p$+DV{;7@`F6MGIqkx)9)9J08AMFP>{MjAn(zHRK*&)vMJ!Ca zQhx^+geOdHE{T3GM;J%uFwZraLnQ!)g_k-U_Na%v9dgq>D|8M9-w{ZOj8SwfKfOI_eWx|!d zrUaGl;nUtVsIcpfvfz4($Z{kr9)Cdxh6A8;$h}^(liLi0jgOq(CVm(8z3D~P(Q}c% z#1eM(PK(n)I7zGDx(id9LrP}MvgWKP64H@(uz>tgh3eRQ^2rK2no|H@HRf+0_Jzg8 z@&+d%%7Yx;>#D7OPMt4dKwNzIX|G1bdwQuyG&+W_iFsu*F;lyfTZRc3Hy^>msK{Mr znd={ZzP8!L9M5#Vr9XWh@-UXc9akewqkqot{H;FO1VCT^BD)mknBi(NoA?tU*FH$%^|N5V0DZjca<;v$e+7lyi4 ze9>evm-inDIoJS!ueQh2yje4}QSb4fxR~QC&iM~pY2PkcU)gy7)P0SOCxL)m4+np} z-tg*wVT>H>1hWAe&dBtw)m)IpNAay!DYx{y*MtPoWa66fu zl@32!=+Z$2osU&0zDr|x{87zmeXl1vAXWwze%~|o_1`J&T4)}vH(0bG`{!w0rdZv9 zzVr=u_7B|PBT3yoRwFh6Mm5@}&battArs}@T-02t`=2tkZ&OfAq-&I-Z&IImN?ypnrZ_0w&~4BerY% zkME6so7`!r7|}{naz1-q37e_ zeatjhj4CgsW)@!VVov&ajANU=M1R{qcZd-ts5Vqg?nPuwiC~sVD;JcIDFiL=Km2{f zga3UT`N1AFsrHk0mGHzVsY1_qelj)EsXL?f6Hxh|#Zwnn*)K09+2Cq@_mE%9Ep%yr zmhF5cuc4@bbFU0wHX97i_q-k!@P$v10UMTEKUrR>=zZ}LF7*E>6$W?l^R?1fySGP~ z%Izlkc`sA&D&bX+-OUdIrehH=8m7$Pll{t4PQ`>rCizZ?p~l07a06XQ*hk`gyrGF|9D5X{&Ox$N$7OhBi7FR5Bdou!=TM<%3AKZ0t z37VjEdQ~QL8hwk%)5R-oFzOxN2MnCKBL_0Dv(5k!K9{_ik6{*GR>?nEWl`R^$hey{+&(AFhmQ$6yNk13+?zNY^TUPn}&19 zs}oaJcy~T8|0BIG!Y#E*0AaD8G9qN#z_ou0l>F&q#H$H!)S47_DkdJi_V})*AeEe< zXjUEhTeK=g*-ru9$`iDF5;~G>Cgn_h@<2*)M86m0{6BWIk#1Uf>KCDm`V}#@JYA&p zim-Kn1p1*{Su#FilT7Mp!mT}GAE0I2>7UlXTF@kOo+LE?{u*#eFtU3=4!YYn|kNPlmg}J84H8O41rMOpZ z@O4kBZs7>8g=E$S0%$VYFl6>UJd>Zj`)VB6xGKTED;*cRshfg#{$#|!W%0Sv-d&>5 zD5ygKmEPOfZlqxs#4B)(xu1Q40uF1--6+!`G?dF>)j)?2Vmm-~f}q{85?WDMs$O$d zXwec-Q*ldeUutRuFK2jEJyUj9OWk*<`TkZWE@#;t`S63 zJtwjpbrSCq`I`^rYt z2!!TkpRCP%DC-D90QtZbPU2&_rtnIp7`Ro_r4=ln{<(Hgs@6NWmuqRZWAAq9HcDF9 z^B8d3ja7%*Og?BO=&Vy$G*?P$ZJx7ERICfmv-QW8CPQvQmfP*2S(00C2nyGy zat>rZJ#R>w9jrJsHmp6^@nX3FVqUZ@JP@aC zgSr%4BCHY~e(}}2!Ti2Hh2b3s5XjJg^bDN| zZyd3~BDUWmqj{(({#ARq#gkJx7FauzO2qdzZTFs}w+R`{LkH~_bHATV&B<|=yVbt}40rk)qKsaD^ zKf2zTs}vk<*&P*N<%=4lt3T_^uJ%rGmNL_}F%w$8{3emg?WP?1%NtnE6V)`W*G8J9 zKlebZmezs&243-1yWh87zXlh~#PU2YUJG?}OBkJ%Iyy z8W+%u5nKS1d4faCL*@)APX)>K4dwjIr#npmLXh8ia~Vjy>_C`3W5V9~pa(1{aP$4% zUD=9h>S*K@dGZcHWN#5~FZqOOI6J09B{F52s>qiNWeNGV{<49Int6T?inR6CNAeYv zxNxg4u02QgN|;Gz8@m~T0a)lmC^qqe4T9MN3?cW9uM(%5Cun{ruta^1K{2~)9LG4$ zmqM!{n_O0e^1A9*)*`3hXV#9j?tXsNje1Y%w>*%*6{(AqL@)M;5CXXFV5!xwCf5ua zzdkDD-i4Enb?rZf)c#$}dh^RaBwYHv83=SN*B7xSz(%{|V?3nzv?g~pJFAXMMwfm< z)w9nm(vyn)TvSBF8YS}ZYG9xBMPqN?Y-$I+y&GJoPAxq}EB`?xh)I{Egvj259&C<= z;dd#>?nWE?dpRLXl_X_>b*|EovA{KBVPK`hk9lt4_u=1Wixr^Znxu>!1D}hcdQXlZ z?JmY+VifX)FqcTuDVk`s(da@FlI?rtBePCJKZKSq7R)5iOM!p*zNv-ja+)`Z1no@? z=hI&)#o<-tk|ZQqt;;siE=|A|&V^%ZD%pD1-F)&o-QS1pQ2;3wjNJc3NVa}HlvD<} zU6rOa&~R=7%Ip70wk!@VBwLUpCJD7==N9|x7mpn@7O~&Tyq0KI7Id&HbL^W+lNKZ7 z8+i};p)&37b3Y%rcuA%&nWMYOe}?i6pLRZ6x7dDOx1acL$y~~gd0~wT)VzPSF!b*O zya)b^kziyGXk>wX%hIs!WQ*nD-(NQT^Iu2*-=F?|ga3ae5uv3;mIjXmAm*!f8sVE~ zFG2$4*Q(Y`NB&g?3~yh!t+u(H4p9LQz@Yw-?KdGyB1ymTEz4JmePvhC0N@}`k-G=+Q%+gPnb1oQl&#m>3p5XNc8RJKxz9y zTNn2~e&EtICI#3h?^&aJDJ}61@sku;UikIX1N&6FY>hTdD zCu#69`Pb7ezIWJlCXA#jOikdbpYmwH=`VmE(Cjcsr#I$eQatt68z3EX0IY=O`}Qw& zf-JT$;Js9OcThI2H8q0z0@k4>=)kvnY{)c~n$;810K|;QB%!Cs^LMp6+DBWZvMvpp zxXk_-4_6P3xP#EsHG`=h_l~u-q@EdczS_h$!593t+W>jMJR4P~=!RGkJzI-d`=&aS zKpmRYnq&Jh6cA5#Es{;+?xn7h{@Z;okEg;41B!*Auv|Njp30E{24NB3&+R3f@=X`Q z2>n%29|Y_tuCQ|V*T-%wKzWGtXVwXx&$v9UKhtYzyYa<#MN&SNuGxYnTK^yB>K70YR4Juy`iY+;n_p+-7nq5pq{;#_3R08 zRpp{G)kiX}PYv1i4Van#YShR^-=fSJzcoZ`$&8lE{N{;Kuad&MmSs3LXjM}+Ikm?B zXEWhP5z)5d1fS!B@bT^?p5UQvz?Al^MxHv&hbmd0Z)I+?P#Et0F$e!{AZvIkLwBsk zQGF3dnrc#5=>8!0qW-sBT{kx6_p;_*|H!b}72ZS#m5jCV6)n8p+)9iHdG3ndNQ0TC zo=dws59;zc1G|W6GJ#`q6(K8u8Mo<|M{>^W{?&t+$f?c-f~b(3sdf7WFaNTjm^=&zp_^Ns5z|)cn^Wmk(&>(50OqvjCWCRE z!Us$FhSYRSf zi9l}V3XFA{s4LR&%a}9G4le)q@*sm13n5EG072e-0pD2Krpn@k1I*JYmbv0f>So4Q0ET7eyNcd` zI9cI3TkBd3*1 zDgLI}^B3w<7V3KK#XQZ$hGzaDZ~Wlg+r;Lh=u|s82sp^F&Nx@IGn=7m@B8t=saHL| zdG5P@+T$YeiDz}-z2>G(_d2zmder{QmcPMaXM9)5$UA&?OjO;{h~P;=z@|29X(!Sy zXX`aY-w8Lj*sBK-D+P2fsS74o*IlzH5cR1$O|i~pQhn&v&Z{WLEK{n4^`h}z^l-1o zF>ngsw9q7rMqg294|Z;n-RCp&9sn05OWWVY(*RTvz(TkIs+CI4@@B<2Jl2PdO5X6a z2WPrmp>%UNqQT?}GWK9!@kxS>k7vcTYc9BC{q2|Yh?6_ENkTHpNqqK_)oqy=IMM!$ zw-})!pQbXI!w~i%VQRDL8M8^YqOmiS{eCp}A=CMBKtz;9t0F%ysPBOcI6ju?NjIi{RSt9`hh5M$nx`ZO>MZMQeS@ik`u+Zrg}rC`4` z<_6Y$%0C7^S@DIrWWl{6)yV+x*17AoM znKja7pr*M8_GoOzV+_VGlj4xldTVyPt^h8G9&nuCbFMUH9zd0BOd6D^ap$+KrWe?8_gYS1YNyAEdb975c6$#XP-vX|+3+rA1|1f4;>2G>=w_MHp`pjB2`~D4=`#gZRmEU(pHbF+uJ15z(1;))&p1(rml;GCXn+P z`=>qvD4IgRE`cft8gdimE{K=}VR|uj z5uJ|hi5#`vJ#x;{v^=$sr>Eb!3e(+e7IZVS6}C=86{@mk=9UrQP1&`E>Th}w!~1G) z=$1SlsvE?e3Kr#4H7i0K)85Ff9Rxck>mU0>s`b&C8l}uPt&6SH%hyCVhWa|}c{c&R znc}bswUA)d%Hy-{!#S8~6M#7_R;#l82iqF*PPBAdr1dWz)=s%~;ssDp$7=kFALikxc6!+ygLZ#?HB?pE)y4Qhc-5?qTC^ z*+iL0mG%yDJhPDgF)l}BC|f5~n&v94r}w0-QSj8_4dIfHM9IXQAW{`a4m*1$E?tD~jz3Hu!sfnek+Bj{Es?w=F)i8wfM!3y(qEAU;gXqiZ zc9Ot-jD-0oLAr6-Z7aVAuRVK1G5qEwx*A5$ISLQyN`tM`I(F?pdy(dj=|WDcxlQXG zd#a%MJerEAt^0ipMx91i8ykc@u z%SgSh=$>@`=Z`YTdX#PDRM(+#ORSmH2?WC~gDw@A)+S*tu@zo;SdqQT3-tpG>QKrmd#rN0*@EpzuR*W&WMn`Wvi(;Uoy3 zE7Tqo6`u+N^%Gk6+By`He6So8MR*#|A6tDafTs!1X3Z1T= zpWnxwQkH?oM4fc&qx!Xlc>i4Rcwq|6*tyO-yA1XciMrI_EG^3z+SRdy2l_$|oCb11m@y#c)B(Q;0GoQGD7HXGxV=IewU z_v@Lf0AmLIo*&$!kUggzo68wBw(sD9TO6Qn&l(@UdOB#yg-vEvEuWr6$~7rCfLs@L z9rLut3p?{(Fj*Urr$!%$NLJ_`gOHhKJ{l~)%{d9sIF5ep-s#n$JmkJsNkmv%6;0KQk%(`ndWZ@9e%ZrCfhWw!%@Dy5fOA z$AGii;i}z4sOp+KFqu>;1m>JNw7E&fY&Zzrwtp_k2e4QDzpZltqp*l=yKwHyy3$G6p= z|14!`51c**;hR30Qmz9E)DX@_?R~Rzu5x90&e6B;Dwa+Kvewhfov_RoXxUFm`QTaW zo4^E1hGVsdN}FBV68YgNY< zC1C|@r*+sHbv~_TJLRvy(PBCNPi0q%5hfPgHRW)ZSdhEc&k%hJ*l=9+)k~shiO0ki zS-RC4nbqOS{F+T__cZ9=bZ6E#e{xFHYlc74oqH;ixm+!wRCUp^Y=e2geo`*omF3lqJa9P z8?)a6jwABqx>x5Rh2~(Bn)`;^zqU1Z?)<7=ozE+-Ce0x@*b2+;8RiTur990bk5NcQTpspOEKrY$041+#Q6vkO@?eW6W30w%bC7Ts%z4?uf%Ahc4ch zHDl8(0$>$UVvyw_TJlGarw{L5et2Cs8<8OAum|@*kd4s>mr=Qs=12|Oi>6z`Bzv~g z?n`^xCl^EYuit9#=NV*qYv^|868I7=V~n(>GXg9$#*_h z{512+%jhqomWN^nAyU6ocyS))mvyZc_(DnM(mu@}|8gRogc3;uGj{HTOFlz1aCb&T zH$7AGyg*=RquvcQy`u_crCpYVb$o!H9p(ovZ7)cNnGLXOpNzCThZ4@370~&4?wR%v z0>&OCU0Nn+?kF*u0wsUrwW2c?u%*+|s_p8oE2vWj7_AR%FBJy_W~BmMIpI%5(3^D% zDH}VU)#EQaa?w!fG}Y^|O7(Gel>*!Kg;p+tk82$;z(}}LdIG}-Xf1c4a0gd^I)*l#Z8!6MD3Z-D<`dPxHdLBITLrl{C(BXYYpJD zBr3o6eMIE=i!Pma!=tHQ4JuQq(Kld~rJsrgA>pgvCaczkMK7z%>j;}g0OOxP!&LaY zxzPTiwknsl?*wXzXiL`@hs^FWu_S?LDsw7t>AC6A;Y*SQpNrOt@3;5i=DowG0*q); zCC!Yyfr0aOzrhoy)%1y;+N7fwB}7DQz^!UhJ24}Y_8Peju!_;8{(K*rNBtXiDWOO8 zQBP|`9rO+Map@$#&`i>#09VAJ`1ss7^AzD9!45Q=@AFP?u`DS4G2{HkvJzxN0BcY` zIiP3(6&?;9H%FJ|oDNVowg5bIZGp9)dMLFO1<+iKEEt*Rd)t@Z*_rCDq%dlmS_)@`TZ8BW!Wi)@3jbgEcp3dqQ%No{ieD*(O{y3 zIBN^*VC~6;oO0`TYR@$2z*cXc;nTE0BiwA(k)ttwt5t9EEz%OfG19IJOTzCBeG29@ zIBKzf@~@$sK1Jn(7y!kBMEW7F*bEX3I(uTGDZ3&mYXw7a;no%5yDsIuCw@XSHbI$2 zm(>;4uD)41!(*ykVwZV^9y@%?Lrf|sC)}m2iDP(u#PL>qdSoSVpH)(?*Es(38wqUg z)#8lT8tJx`dr^#v5UyEq<4ONBh&4CD7kArsTi8(GQbu4GtXAhy`@ax&h1HUQcX_iy zJQ-6cCXs-ClRBPgJY0xwc2{Fd6( z^N$e$!WmBnnyzWSfXc91`#B0$2ue(dH_P1k8I9?y%O;tSILBN<;cp6%)Vqoem6SZb z`K{XaG!qtUKlG#4di$%B%ooEGtEI|DmeJgFdC{U4YYN*}aoLFpOa?Hxu(t+}tQLGnd$P8yP~`T7uS`tX*bb|5ls%kub4?csd>+Qr+iKIt)< zLs4Gu=~D&;MJZpFZE4eU;{Vay$lYf9J`Rp@F|rd{#e+C*7k=n5xcS*j7QU~B?mAye z(ycunsdjh%5$k*A;3Jf{FGgEaRBS{Jo53f@DxKqH_p;)a$E_xsi6jrb(h5-Kp? zS5ySkf0#x0VDzjCZr-h?d5w=^3)6@G{BG*4Bdx!5_C;-9`%Ho1P#&4u!ViMKBzSNO zn7zm35|L?SJ@2xk|0X=}+CX~0<kd0s@*r$vOmcc^#n=N5i>O{PWbThsSLtUv9}gG^r_PibKUKKxZ}^?45TgYnah0vN?RUv<*@qP#?*TZ;}_ z$3jmMx;l&sLkK(YA`JI9-u1&&KrDj9yG|iL%^Od@yD7Ep`P8&9V^ptZnADV* zpr}dI9meu%dh=+4A{>bJTzddw$@02;rVK9uPRlxR?rvbCr!hJ;C+0}#ZRhP*qfvTH z^`>6YK|*qVEP<#&v9`YXS%A9aH-2(jRD-_7{BR*#4h8P;(=QghF{^{L#EOk2)*b=4 z_xzsZsE^*u*VYX0@9VQf^S>fbYuSC$eEi7O#_hfMi3QO0!5(QF+11;Il)9JBmB(&t zp()g(Ufy*g@Se&)AqW(J^4!dW_0VQ!Sv& z#`~H#DBM$cK6*L)L{PYm$VH2Veb!Yaejw%Iu1VQw%(%9L+I&J)5>eh<8Tj>p!0$g7 z7UMyrdE)T^;AWj%eIFV^uTxD|i9;CFdYHk0n(_BYLYw2q4b7!&QJLaZrVe$I&N|`4 zoF9tNBGTw4sJ?J1E_&m5J@YLhR!z$RNdY0Bz05b`NNBxQ%)IKe>zqJR-=a1xE&Nv% zY+JsE-k;zLh@umFt;G7?$BPnA$H!x4qu@gA!d`5&>e^%Y&JA1IM|6P8+f z)9mtw31)_Jd%br(hdv*{Xf2+sOr?w_@hYC$q`?;kF6IWO#J9|TJcT>M`I8oZ!i9GG zAC0^JfNGGtX#~Y`(Hc?%O_+6J>XA9X&)BY+O;5TBW}wFaXf1s_t0*`+kA##4deZ4 zs0NKb=}+{?lWaqPyfh*ZC`?Klu>RP((yW<m`{S28Ct-4M4!_ zRimCTd=|StJ}im)dIkRoDyzLPqqtvs#UqKl-v&Dy8q`BRj&UZ)OBL_DfTh&%hl!`= z(j;Ajb|&sxEOQ;aD}%i-A+DKgEb>#dh!)4NO?S{Vz_SfOH;C*S{kcV5=64P9N6{-( zOZ8nFg`#CVBLQ=_$lTj+6ZcY+X#|PpXmgFTN!p^Xq#IJyGUrpwM6K6cy4Ss5G-T{{ zUg3h+=3#j?x%Y=&ooD(AD+}x_UkVRYTl+_6)e6NF8V5Av&fN8*u?i*u?`|o7VzbXt zbB=Q?svWQR!Ud$GP1M(R)hmVwA$p{EW?%uc44x0H2E-L&I=H+L)|@*MU^yJ}$=Z+0 zjJD15?bnogL2wPOrV3~z`I1>=8=Ba}^z0tHl!4o}eScad6nk%aO3GUH&%P-W$Iaua z_NAIeaA*vbJl618y}=&3=Ej@`l-$=#QvO0#xE{jaSYnRZXv>DiRyEvtDcFH+@pmh5 z^oA|`++t6fiDbOEnJvqBU>;R6FSGpD61g0)*G6Q%F|fA?ww|b_rO#7&-UuFQ+g0xg zoQ2ftgd1)BI>h03;FhHI_;@WXmo~{K1d)bzZoD(4=AdT?DzeQu6K#24$zic`#Lu25 z#qg?SR^K@LnDCRkAuD8LT*P%sMF@ZFk$GGzNV+=b3}iFM=(?T$OTsd`PPiNyTGy&y z139EErC>GC3yFg`8-I$le09Z*!zXJ@i|1m~1Kdy*y)@H4{pp8V$GY-@TJPBlEZO?x z$}O?5B&1cQ5VWc?37&L2u9wb7A$Cf+qBlTuKo^m=bTJZHg`GW3ZM`irmuDp(Dp53bOAT4R#6)t*RMo=n>-{(iDS``? zCRge6-zn*JR9%uxj7o}Cg&*+~x1Y2g_9WFxi@#=oywZKmmTHhF3=RK zTfbqDRR1Dh=i7{k?cr0ImNB87>6-6PLc$aDt_d%ghVEUbW^!DsSO0MV^3}TEs3CU* zPjrbybF-8>9(6O5-V=AFOI~wHC{o|8`S|#_HJh;7dBCWQJ>p_)HflG_Ar z%4C|3XVh8`_iOY5ar@k^>b{c=0{!}6e0$bUCkj(5Q zX|<0y=>OiW;v@^{Ap@w>z58+WFn@5aYOIw$fEDTImhg=$=rnCI{<_zHR0jzuyyMYG z95U;Z>GSUVai*o{+)ue4Qlh!2m|Mf8Pp4pAv9*h_sitYP`L+dt3>|=7WzZ3<{fJ@mI|rXmpI;vK6&nK7Ix4D)o=F9Lvw&d%M*_gHz`- zaHwaWAFmp|+E;X4bsA4M$e!@_8pF|{NXQ6{GH5=)hpER%P7K1B#;BTt8(9CiB_HVc z!SBCpN)Dk%$VJId1idgBe4ET$F}E&;C0=OnXFx`c3}*^kAgSXo>nW`K5*>#W&>t>= za;Kj~aNMEXXI!Iy_F70eGHtNRXaZMGO%yPjkbp8hna_WOY%_TH@8 z6jc&5Xg^6D2yuL3fPN$9pUj?C^f(M ziKi=`bBl-GmlzL>my)mcO>KjltVNl@H|2zbwvK2k?%A-~-9PpqyEugHdC&6|bM0Ht zr46R}ZC?QG#wEr>K?~C0NaL~QQ+i=hV$J_%GQIy~j&!+qcOH|`A#Ci{~esGId$S_zQtsdbD=OvEW$6`S+#6Ui|yCX zLSc`Y*QJ#)ggmOdt+lT#j4x+OmF`?rJfp!WV^4(oXW&+{&HLP63HpJpM2xg;X2Q#{PW9QW5x7FlHNX`q) zQ9-q*sX`}IxbM$?*TFTfOQD zp(2JE*|fs>R(piE*XGXWXc1zP_<}}+8RX!*uhDqb62s%-eT|sQr~ml^L%hC3$(8DN z`-c4MD*ky<|DyvwtZ%vv6eU~ol2|Ban}=O@Bdd@cnm*M4uR-?;mzDqgu`;PY4=?Z- z+={w=pYjh3Cu5th|2tjmzh3%fhcudR`XQ6)?EjdeFZ5k!s@)2=aTY7)pIE2RMi248qulB8Zc{-e<%8OLvM6Ah~5IB`D%kUK z>g}k81{4m2rE~}$*UQ$p`@n3I)HhG(`BjTHYLo;~$fwP6xyt_GYwpHER_`UCran@r z79PUMZo7urImXnVDCJMLAVbUGF}D9$51sg(q)-v5teQfGMn2tar&1X)dw1*n3fZ;G z4nd~_ZgW2r0%^U!z}3h=exKN}wBDymRLNi1ezf;kW~b5L{BeVbyyjt&%iiaL?a>Xn*2l}BUI$3s$^R9a<@<$E9D9_vZw)Z+)oM$HE`&=kxXamKL7u^){!8YOrvTL&`V%(#)MGqjEt z=PxgG#Av=eL+Bf4_KB&8ij0Y8N$5cmUL0|bE*!(6BbZTHWL(){8D%4R=rWm*2s5wn zv1K0(hjUIo(pqtX4l#79vndc2VIRXx zI(v%VqvU4wK%=xR2r}O6t&zb7%iUCn6lcUS)D1Hwz*Ch;rPH6SE75$*=!B-EIMJZu zmF1=;O$i4{%l#~qXg-TLMUJeMLp^WdMDBbpm34HEXq*|%{3=CA6f%<)VYx5H2H^+Y zm`aVCw;t{AgRN4&KTH+U1T#;~1%$U0>l%Vf zuU&Ay{(X4v3#4Is&~3PgI#@a0fq?juE+N!JTb&h9`FkE+B+YMOZ*+AolSZO3UGwXB zR^0V=SV{0Rre`4Yp98OcneF7<4wty}EnSpvc!t!piwTNAWV|w}p!cWc4xtbCO3Fu; z2kxtivyLW;P~}tgCD#5A8R>Th#qeb5n)2uV}~{RP~A_sQ}%&!;sM+3cd9# zvnCM&AZgQ(!Mg3!sxw2(w>iGXeb|S-FeUR&`#ZPtzm~~itsx%oqWG>K;Ppi@;c)Gw z$MY@uF5%fLRqyU6iy2>Gk~SN;SEZ`jg4R2M;--NfwF8(pg~dutB#dwak`29>|llY|0P1j!!>~JtIOQ1XnbMZ9&0;8d#T!*R%vqg zJgfa&_b-r6COSJJb>``V=J~vuSx!|+5YwHD7L*CQmbTTnt#Pf^v}H`}oYu=f3Nqc> zEx5ntTZ4|jwlUz{B(oxSY-mz;U!lq4OXIZKL5bq+k|>5`17tLwg==5iL}jB}>CNoK zS9RMbA(sP8?Tah-^u2O+YW0c>8c}#l?&+Zq9r!(~WSom6a|DqKsvjQ#x_cW3+|*`A zd#xSfYv;^TBCASHdg*DGlR-r{Y~)NV)##CNT39#cw6xIfK14pq5Jp;$P8{eNA}p)4 z^P+;P1Q`!jF#Bj{LT5JharW2Cf$C{N=zpj*hur$~KI*HY^*?Ik2ev7Z?!|GO_eEMVGiQm2pv^lt7>N+y6(tIp5-7=FWaOUx?#)(Zq|v|KyLmu- zGnJ{aA=t!;#JhfqGAaB`1^xc@6T0c&?C(#-fH9WS;yA zpVE3auVpuo_43t3Pk?tM);f+28~N(*df*&(!16_4&?fMqRQVR{@IjasvM{Mp`=Z-@ zK+wbT%|#DT5VbKq;XbdB@X4tq0b2jt;7IbH^0jSiqx5}=JhXyrIAlc52T42dsJR1f zty_y$Br0EKd>g%>S|-q!xGt&HU^a-lqjeDc=|CcXQn;xawXy$F33HpJ{D&DpEHV@& z62li%{Nmll{T9&`$So3Kf4W`xYZA{@)C>Y)U2j!49;dmyUUN9tQRtPsIKa8NY+bz+ z8X~%{cjL~uS!LdW`=Ik40f2u!ggU~ZFA-xUJ)91|GRiNlBcAp40!Q;D9Yx8XnI1bQ zFf@W8^5Z-KMB%Nu`$uyBWwf{5+lnw7Z0Emz&J0_dG@SKFSwEy-N4q7O4Yn;lAikaT;%OhYaW z>&!e1*|q;R(v0r~ zmnwCKN<`YHBv=dZWR1^h*$b%O)Dd!!Iek~{-W2}bWElSTLoUXw$G7>(8XZc&%!S#P z`l$!oUu=!C*G_O%zkllYbwz<3oDmJ~gYFM?eQP}WeSP`VtoEd2pWebUO_9zq)y8w~ zk~_jq+C5LE&9iY^%isne--juod>k`Q+J=VTKNycn^--U9#h%!onz$;1)=SMlx>Xz%s+6VkQqfKkuFCu0`}CY<{OrRI)$Wpvk)R^+ zRL^*~xjj41V{gg^5a8@fxSWgw3fIE)Yu-T$&e>%8ntAf4Cr2_hRXDS$JS=c4BFU1G z?Hl3QzPq%|@^74mRg?SHZX=YJ5ytTi0q0>z2{V0 zC2)t@uc}ayV)p7M1nQ-BMo0fd90Pdr&|Js4a*dvPGmfkMcrG+l;8c}mnXZh~cs8Z8kZzuMywa;b|W_)g~IpSVQ<|Ar;|%5pwC38W|mv7*^LRt6{MzSQwm z^;5i;5LT|TswFnEmwpTy^KEXOp?qUevlbTQDk=z>mNA8v<(%=d@EQrSa&B|)Y;J!k zhvwS{LczB1u&CVTyht90exBJv8&_FLIC^v940|%Ybg#gUC}J$&;1Z6Kq0EPpyT!zs z>t4LhffqtgcKeXT?|bNV3gUNi^v~ZGO;{fcmi$nO6PaJopE?%i*3h&cWN%s08Au!1 zmUEo94{OtVyN5lC+jdMDV&Y?6d-X|2}LqlO{MK~#( zgmC-8i+>^yZD-jL(R@zJ#T8#CNU6X$qDtMp(tbC$E{wFlMq*AK^{>qa7V!qutWJb! ztZ4FrQN*+Sm+{l-@e`{aW(!^esHQ}hfevI4i?tmXxaZvZ$2jZA5qvJCevh`<3~&-~ z-g%b7V;)&0?@ZjHj$YU(&n8+H-QPQ@n%1OTW1Z}+ZUAmM+ zYvd6@ct+-~$s~$X_@^_9{r%=YWdEL0$DIS9got@xtJi7J@xh@T;aMPtqN*z&iV zs(hn+HJO>s9^{^m_1^peMCh|={V6=xY$fs!E>qXnd#tmIcB}@@2CjraLxiYexri=_ z$10l9U&p+b?#74Q|5d+dZ6?4w`GzGdnm^WR*LPj7vbku!Cj14G!m~!`#m>8Ir=e;k z)4+aYP+LOYYR;%51uL0(dPX)pBEeb%jL7U#sj*o07NaHaOpxdtd>rIh54BR%VRc!XWr5``qMEYz|B z)KrZK3p?oc=B-UhXP0DO7r&Oul~7;Mvw=B|#jmi@MM0l_7k}itkz11BE~$LK3Y1Xn zZ1JgTj6Pc&*<~-aBP8LK4<94FN^1dDeg3 zvCVna8BLI!F|dlXnpIDnRCNAC%&yKg8Xh&h^uwU*xy!cw5_~^mJX_?^_3oZ5JA-Dd znQLhE%W=G1Z7a&L4hP=4xBTl>tU=WTJsEq=u*?Rwjb;j0seHiHK5qW|jUSIr?loSK z^W^ST+gdwY8%$10O_!pKwu>&Vd|qr>x=0lbRGh;M;KQVqufPj(K+2ti{js?e&}a`q z%S&(;mua3aIe001JLCyHw|U{d0Mjh{JPVK>e*A81BUn-yla#7P1Y>7xfVH|C@Rl3# z2)h+SB(Iu$l2&myEC=I#Y_VlW%WgsA77J4!D!^~P6SA1vdaajI^YhIAyiR@1;z^RxEZ~}&O$*M!zjp$lNfe#+ zF93dhqyaIevcfq1D=+od&*6AmjgEH`T)-5y#M904<48j=el7Wvab$}^?gYbXUi0$F z*TS#~__V$qisK=tm+$?SqiwJH=l;Gig>JRxy-b_o+evf=j32PDG`E%HWi;bdWm=+T z7%2wLR@>Y9H9q?3`n1HHaLz5JNoZb~i#{ugCVDTN`Y8m1%o{PZVTvh?IESX2mBl44 zI&YV5MDE_BNfGM%MqrFbm$ZFp4r)cI;hvbf?0(lak9^6KXr=A?lLRJwHjJiac4S;@ zyZe0)Jdb7rT6iat=zE^M1E!kq6zrsfjh+_^HI_ze_^bU^Arlo)oD8$}<%ujFkdnti zwn%o(D(4N)TB2`6lFeKP`6tb8S5RBBp46uZzsTFuiq>4ij7A=`u`fki4@F$B)7j6+ zFnv7>v$>z8RPTk<5GGgey4{s_2e1}wNDV2wNh@b0p(@+S8y4hjh{Oa2C$#5T+NqnjD-|n7HoojA_@>fyd_YtWiXFUo!%o9^bCcqsq6wb5 z|JfWTkonEy+4U6zz^^rU)42i8NuFmxGkVWmc;-PyXa!Um0lZ!CElvy~z-0x{T=`eN zI9GL|#b3hyO-arQq7pRmxA^)YasfBkm}?Qw_!K14px!K_{W$oTlQ_=mof!Q3i4HyEN&+qPr;p>wFJ zs8G%sQ)=W~N`n1kc$<$*iqIWbA>I;RV zx`ofvYtYtQd$7D{6bJr`<@=d9YuVg>)x%U19htY3cdsmQ9qAHABIKkHHBBE|+pf}& zNIgSZr@$^=0Rx2@DUvI!n|OM%;Pj&~Kt|4WW{UR+*kmLEb`)f&U=b5BBdwqIAI$FXz_w^lkG-Kk~z`Oz>&OrJ-%C9Jrl5pmgG7_jK;BL7%BTG!NEQ~R`OD=|Zzk$daUrSf$U2%;&w)+BKm6n;6 zLJts|r&d6F$V=VqhB^>-MqaZIErwB(PtMGmeo_91cFP3qisIl1vi2NGZy{6r;-thJ zXq{jyTZQH33b24@WqVQ|BmBPHo{qY;;rW7-Gf1tfTIEA{`hO$h^fzkFFhEyprXdR0 zS`8AJJd>-osuhe482D|{-!o%g8!@FzAKhDDNAX z6iX!kL0jr=P96D~pFFW9B)4^k22}(T31cM_)F%?SjG6&hKPQwD(m(2t@A%MftAi}~ zU^^(pbf3GPkpM4`pI^{deR@z2hiFUMmC{g{dojASJbHSw1m>H*!b+#PbjtK-(B#zr zg$R}O(~>6Xke4lWmqynf>#gnlW`0&8GTbu1u4#^Uh7cXoa^ML5$yyN_m0gsq!Zvkg zSeWh)amC5}pgwAalK{8vD#1b$Hu~&}7fml?S`oeU=bX&n=1w^7f^fo_+0u$khvAEE zXHkaMgJAH4^AB=yUN0N6)8sN^K`VDJS@oGvV`Y)aZMs9`^Xr-Sq_Mq?u>W+-gzuuEPsG_e*1p*^RJ*Jc_+Y6@-r#&Zjy zgk+*Vm+u1CA5%{MG|kKzD#ydAVvrP>jx-gyxE{GpZ~t z9Z8vMwpj~D@Ed&X^95(!dJ3L9WAMgp3h%8+)gv^tPj&L^Nna@EWKGlx?LRwjIz&>f zJ5gBD8M{=b{zH>U=UKwGHSqiYX!5)-+y=Pq#vA_*|Y zzc;r1@iqmi!KGzixv(#()Ml=Z+#zuAqH~&0dNAI=?>Us9{K04es6RSDP9|m8`!-Cn zq_+}AVT}UOC^S(}TevFBPIUyq2DtoJ+fjXP2Fg^aI7M7SQA@FgTiuMlUVOBjr`iXJ zr8n>K&?*xr%csHqs(y*3sr9c)L^4G$L-l*aZ}NxqobDog0oUhj_ns3%2>x%bsoKA zy0=}X>G8^A?LyaGJhOJ8U#uR%IHS{9rxzv3beF^HK!j#BNl;@95`s_&B`+z_N}ISZ z3FV<2@l~@cBDvAiA@ed;j92LX?AJkt1T5CA-P|r=xx~Na<$03W-#_xyY;b~yOvozF z@9~y!8pSq%o|*Ue1ETIgKao4vhcI9?2g8+cvU#SqPkO8UFCxGL)ff0?w3kZhRiKvA zcbV7Vk}|V}1xsv&c)-ZOZc2uTcT(0HI*-uZ8UJ$NBhPRT0nr1j+lMSOM!k9FO_%mn zUK_-PdpHfXpxL-;7+Z*8@XiLC-mkv&c#YgfL0PjqK`L|sgI)z>%)odHvK&1y_&@p&3D#)F1Fy01c7Oqt32p6V&ZcEjLri^Jm zf?kVIWel8ne7p*@?m0v$`bmF$%W~1_oQhdCp6{f)8|mX_r(SJh>VM8H04hhkS#oRIPOPQ^pi>yjK^~pBeRvbvu^6%q)=?i$v#r+ zPNf@}J&+x~L%Ynk$82_?%q-`vhgmzr+Uof&Dx7WsB{r~69LoUqf9$3=-QKxFKNj>~ z+e3eW&aa@jX2~Bb#h*j5t$6QXCkVASX=Zjt64&GJrX(yUk)L>m6s6S>gKyf07#wdg zcRCZ)=WdOXY=~RtJ1t6OO_5Yq`|eVI7J9}>R}&RvwYo6h>wn3$uII0z83(s3ncj+P z^nJzK)jx8#&YnnpY_4&>3{b5Dif7KSs6!u_;Cx;e!O<8{ZvAvNy)MaI@M2Z`+$Far zP4RDPUN@7hY$D^fdh?zm{Bs!Y%z_sii9YYty;@n4@XMuTjBPe>>PVMt<7-k~E}JtnXp1u*&SQf3|u$reU^iytRpa({iz~=Qe)N( z@W#YIYam0)$?H0z-c^8@fzS+0Xz9vK`*BjoDQGPBj1%>(fyg^z97BfVBJ}8vnbY1> z7@#l2sYs%TM~C^W+rBtyJ}she$b~&1o}&Uiz83NdH+-}UG?P`@xu`r>_$|5dlz2SU zsz=w?#Mptl-dG9EvZZbraG>RBbE#N&OD6jH(pupjd>$jfVU+m0g!NABx2(|pdY1Gp z2+^}L%j;($Z1m$BT`Z<|Q|AYSqHY*so;?7=qIUh;5$20HuJqzJP@P>)&W!8W(<`{-LP}Pp@I@NoBFV(3X zSCaJ+XOIje*!Tl2*}%rM;K|!*lf_|9P+?tX$JfG4BFOIhQhv2M^AVY;cj@DijHC%~ zu@3$)&8l+@#E?=lnE`ILtvi*|x8R z@ytHl3=w!CKG4X@RBPyj>*ote3BhZ9lbOKq?x*9^+^hUYkS{91HKT*xiIpU1lwEt%#iDgW@( z_+OYzEr~(h?OfbC-F ztAZAh{tG}?{x{Q04NWl1HqEcFm2ajY8UuF_FJ4Jy4duT!4luBNuIh`7bF+!-w6neJ z_j)nykVqi~JBdxM)}d4Pwh>vo4Ge3PlokD2S7utCh8(mGxCA=Vmcw z3Pi`3@YvLtmOy@aYAa)K2#GCqBzXq>s$NE5iWFZ@ZJ5xQqfRx(SL|AzkCuyaCP7dN zq%q01(Ux`;im-op=+Bww4am@8rC~(*$O5%`B9d-=cF3oN^UpM=Ep;yPOKf>!Ln}CR z8n_7HZAeHLoHLJ1BL4DR3TrW67Np_!m7?k&p~bq$!aN!{f_FhBQcsWNP|6!Ld>I75!SXTs_3Gn#Sa?)dt#5NI-^7^g3$qvj5l6dig5bs->&g*6?Efs0)Y>G`ETpKuSgbQJxY zdz6Wg;m!RTmXym8(1^9ES#m#S($NzMxO$+P) z0`AiP4w!aIg<;nmuX80E-1hsD>Zkr21RGyH0VnSWqpnYq(}_t(bzL)(=a3J*3*xLk z)B{qCFAmyYIBA_exXWf?Yz2($xV+cs==@{KN7VQlgOz!O*bN>CAkG95fcvcna9@3} zo#VgxRJP!SAg3+egqaFJhGV13WFdxagkGf802>TrrmT@ywP$?V zrP~Lwyj%W*t*YaYRTV0{c_?;Ei`5p9WgpEqgj5j}`i$Xy@Qfr=o9#Ex=a!z`OE%zs zC3DrPD!`v~f*^K_Os2E_+KOSNkjP|KoBmBQWAYKj_WZm?FnedV*3@&|v~_erIZ%1G zek;JJg;k?rbj7Xdb^FfW(Ag83PFa3tK)TU6UVH6p{%?3rTakn_oi}8}b5F7xkb~}E z_4?N9l+Z2ApwOYuj{2>$?ZU?6;mFxOqaG7vf+r#Hq36XOFec&t|O75e&NNYowv~D)xPi z7;J5EJ8`{CdE$c>fZpE>5cKTrEFX1=+nvp&I2J2BD|q-;QbZqN$!#WP05?^-4+#4b zd9Qg=J^)R{+i)6O-Z-X=*b5tLB?axkjg><7`|2Rufo6cLi{Gwvx4-R;zcBAzF~rbR zRgbT>LYO4&M*>E={@`hBe{i(lNPf6}`pbS<`u+E3&#pauKWbwe#_WmQ`E{zmzb<#i zJ^xuZzr)U4RCP>Y;baD7z+yc@aQ5;|w+lXYE}eh74b_*YMjmB5X4UkYe|mYyK%)`+ zQKsZZ{ng>scPAvo)(;eRghjeK#?S@IhWGi=t6(NJu6i@w`?A>RP4_bz#xICgEIiF? zt&6g@aIu7LvHAFv{6Tl_AyD!|(aQn;DnG@o4zA?=vmdCkOdafsGpxn?&Zxdb=g|s+ zm2I~kH-m)W1cqdoP_gOYHm$GLAWX)8Jw0}8V}jR<^&6hRJ-mqx#HQTeNEx*Pjr|{L zU;flfpCsIaxI*-BLWIDxi%OMAmK;IW17Qrf#q&5yg(Sr#k$vFLsh`(Ub?Q14Q7OKD zvz?4#P;8cpI*DG4*9{1Q?RDcYbs1g_30^q+sv-J841-k)4J;dVTNfH%+s80h5irsD z-{LCMnDRJo@6UItH2E*V$_-QJ7{=jHPU4dQ+ZfAWp>%ydCs!#d^UtqTKHW$#-7Nfc zvWISSr{&GYjknBv{kT&%6hVtID+Wg9Z=Myk;$qU%@727vL;zv@=1ym8X*qabB>?{C z$m=(K)@Jo*a}C|^JlBBLcH2(u9!>H@ZDVH%LTR9ByDgInQDoE8MyH481~q4o?NAjH z8orKOzM|w^d7JbWnSaChnkkx0V0)9aX(l?oFiT}SXE2e!`>CXrvm*db`9GS zet({s-tv2TdhJ7!&%$EO_q=3K9$?LclNs#g0Zksh6fQUJRFf5}*(tkGprkpYg z-PvfW46S%r_cVXs!?nZ2xaSOkZ14)|zqqZ70wuahzLtVEl}n>fTTr_jQ!GUY#q(VB ztdMDUnil$cfw&8KcHiJVsr9;YdpZxEP?sd`l?S$U97Dtc+uG$UQs@)1!_h$nwR1LzUsy zu-rX}IR9DdA28CTWPfi{M6s!s`zJJ+5ake*h+uJwaXrXHgdTT<6FEtlRtWh#->w0~ z6orjJcD|(-UYfb|T@Mbrr=IWBa#hbV`G)3~j~}}c*hx{2ypw3Pi4zfwpWdjb^$vVe z4*12tpDyKQt%DG6s4(?og~ZF<@f{tb-#{LpJU8{(5D4_}8AB)|&R@+d)<2??Ls$1d zG{yNwo%V2L_~DUZAA)&H#h*D)iY6F8xx1II5#jb0>AL$;vNaPVT^AyUw}LS0daK(g zDk&g;Ng9U84_LOL5qs-1nf6Jfa$RzuHzNY_rapr2Ti z+mwjKg^tP!Is760bPm@L+ln}w50z`S_0Uo-@WdUqaYpBw2gxx#pT{&Hwz(b0X*a;|p6b8@X2(jGXI4NZ3fsE%zeN`*ZE%Y*&ktPuqHL{4V9ln|`)z z^kBkw737K{jR16;xBLy$Esh{ZsANByA1|Kf5T>gPIrRRFOS+EQ*JSDqa}sPURCn2p z7UWFcUo<@c=E(RAxXHM_Nui6o3 z*fy-De`E*bVg|iz}`^+wEBp=QE>|XpU_-i0tsQ)@grn8E*hyTP<5#1X1q4Z@5 zePgBAb9*C_fksybUB~Faq-_UZYSIG~`tjjbjTm&7(!T77$`{w@o+h7HJ?bhL{ln^K zjAFN<^6ogbWnYnn3d!rXstd;KLOhiE_?Ow|jsv`480Css5`=QN}8*51iMQn^W zmau)ihBPea+^2BovuADE_ZPPes`leyIsB?4ilWQ>mJUq6wF}kWS;Wse98ZVFD)olx zK|>CY(`|ntyODTU>skA-l6?Gjug585k(mq|>v`#MtV9YqBrG~R(4FR2+8)7<4Ujsc z2yrRYs8cLU;P&b#XZK#si$>)FqPgp=<8p;z#UKALm#wO9@ON0{h$<|&9w0KCa*v*8gxLCxWtQ6OyK!BtU5 zamQ_H%*3^Ohtx@`R

      RaNlOC#c0_q@qq&~rnIvHW~u%`&F%#zGnaXT^m*<&r*w?|EC||Fl?-R$^aa`BqMYCT0+vKu*BV*`l& zW5jIL)) z`8qB3v~h+Ps^;SuvvR4j7h?2{zU?^|tuE0vsnXq7U{f=I78! zk7pjOr-XRrrps{*m(gP@=zX4yRC!6i8d;@D4insPE}t^9w~dPxAgEoX19!a$Rx&=c zPGWhFVF|!!0G$fN)g+A<3bh($z=~1n9$w!u-ec8`khzx8=wWBnqa^fNxrGbrIIwWw z-ma{=SY$@LE-hHpe8&pu+jjuSKHnYXBzldAyco+!H)S8D^Z?rKHS*;Q* zEX8%D78xxLHCr4ijDOpsKJ!5G-g|J+(EJ<#{goZLz3ohPeJbWh@_w1F+DAPfDu|#O zqdkD%Y3Z3i=3Rhcrls$S7uS6z+ZJph$J&j{oePu z=JvaO%=`LAaD}#;UpLUfZ~JR^D%!)GV}q+ti{{t*_VsHP(|mEmcI>oa6C5M^&ytm} z5BZ$t$Gv56-;sxQ1m(i0Rhc_+A|FMQ*w5-QBJK%+*I8f17kB+MJs&IAJU(#ZOQS^O za9X{9lO~Tz6j5WAEnu6K!R$>+c@j4`INtz=tXJw^9&PaBMVcp`9kHJaq7dYOs%MN zStF*|8a*cCWh!w$;#0=wx>(f2D07CA++3f~^^32C+KcyyZK$O~wg|wSrX6M+_K~m0 zX=!nGa%YxcYRbcTnHO`Mj$)LU;PlR_4~>02llr|ODqF5}MOc9e!mYP8-bu+fQ1zcB z-8Nc-&n1_P7I6LKa@n@JqTcP$4vO-PVzcYb3&?H1%?`je0M`?0vN>~VWbs+iK zMN?lZHr<8!8R6YYT-5;m+6@T$dIynQxNeg+Oi~D8<8DFbBj{rKznhB@KeBck3C}IZz8tpQUv=>0o9~6{i@)x%k#Z zeungg6(YW7xpOi}D3 zesU>Zr-I!Fx7M;*R?o=$kwlfcM(OR;W@-Le<8$@@!|=oOH5q6?ae2O6o{ZHW(PX*V z)i(j41KAVJ1Hz1`#pXU&TWiGnoeC<2v+p!@YaV;j^r~}u)CcpBc_EV;@%Iy`L*$M=PnjUF!Iv(;rS)^wm zJ-LW5$cBg@-h-(JS1s#qJle;d?{^#~`q6;;rc}bXvxXpTr&G3@w49VUARa49c5c0Y z{ijgbvC3%$y#!h6&Q9;l45vsOS*Y~&{5!J;*TjxHKm0nnQxkbP!vYJ3Q`U`S& zKZy3yTKD@|smL+!8~Hc|raT1Y1h5)>)1SJ1h}Uzd!a8wtZ#sKAAZT??-E2XU{oyWE zJ*yp!?9&y;LVGp!UgZ10mAUDY?~26^j{L-NY%B1jw5Xzju;lFM^rtI~ zfk>t5n+2ax+27sMk0^~*?XgH=44iwN&>NNdN@L;&o55>;N0VBZBRfbv1?q6^^JeR^ zokn$YCPxfB&^J?|llGU>KwNsV-$mjk2`kZPHV>wJvKyB8Z;$()d8iFMRlOo5QPJ|A>o89KW1@ErZo7v7ec!Sy`&fRq z0E8TE1gwCP1n}|9I=tpmyLHkdj#7`wZg?{j=D9SM>=v+J7ICW{J07ygHUz3GLysz^ z-NKaNj)&}Ai52={f6RX5d837(Jb&qv)Wo2f@>9VhSgtYf6^cnk!D zf4TktSU+sMi^=>FLb_AvU(rlgsl(@=Z!u?2A*g1VBdK(D9wzuT(89e`?RKS~k_&d+|S98M08)?fARw*l%!?3btVv($g zg&|H$G`sjTzJMmTf870mOfR=oBziSoI2-+R-XBQ#cd@H&UGzF?E*#FaVEvpA~oSJ#V_mYZedXRrq7z#ye@Sk^M%!xJKGU(}2TB*%S>; z>d~FsZDaS`ow&8eWtY))c>6U7hyg5wtR|V^8k$_Z#a+BJ{K5K|7AkY4=C-UkPPaso zyHB6jTsA$ltlr~;GrI(WuW3BSs3}uoKb38z)@Ax!oZF`AOM4&ZEHc`2axyfBiR;{e zq!0b`Q&hhEyx|pn2Obb@bo6PJ?iiM`k^b7iQ)|(z#kEOQ8RIy=YL~U_lq3Sx(q3hw zGo?%A4w2{NVLK7VqELx~@_lTI*a4%?^j1a+?ZnT`tNpFB@2;s>3g6X_cje&V$NKV5P364m$-&JS1pJ~q_% z)*$;1zD8pI5n!rGn*x)rM?~a(6lLc$vOdyj%6Em2g*5jasYF(0EW@qIgqfMb^ch;J&xQY9p} zU;oyT(+lZjE@RegMuHGBKE=9L)>5N5ujQ!oR3Px}1#X1aqHyz5aw#_GelAZhJc4b@GMf zq^}fo0JY=oF^|Aa^`|@uk zL{}z!d(}G5QJKl0uf7BHG-d-K4p`kE5E=$q5J>6GlE zR};OTPJMACX$1W-z6T5zUjFymkk*OPZ-(Io^H+p*P2M0w=oJENviiz>OYQXJ(mX_W zi5%!?JzbC_0hGTeL+;H+_=4`L4q_&UnMQ_A?XZ&spEZtGID|z#B3WMWJ$`HCd1A8d z5K?KXnSvVdJT$yb7k7MNd2Am<6a#NMwEjZXOT^LQYxu$X7jU*yT zxa~v?N@FRGSRQ0$ik?ibc$xF9xWuzKl&y(3l%`eTWs`iwQ4O=fEnHilgvWE$yK6!r z$ydJf2X{L;(v-K;hl#f+zmMJVc$33@S{T#6(xRWiSy0rXP^nhA+!VnZG#W_X*f&kA z!Kl=6oOnv0jTGQMc;kt?j;aqBaNcOWeJ;6X^ipy%-rz2%ulu1qkCo$DFwdXZ06)e3 zxafq~!&B{pfZ}c`CAiCq(i0s6x{Z>#S&(4`2hN}7>PS|uY*(snd;yVC6x-dcYsWoj zq#|E|G3`>r%UuLlgfD`|7PB8E))K)_(YAJOc3ijc zp=7Y(dYsEtdgYf(k8lPaShH#EK;MtySilFQ2p~ zz^Na{dj$9G0O`yHwBDi>FxGe56vF#w?hs+ zsxlw@kUBXyx_!m8@&M55r1zQO8bnLYd6gfwuWu~Gm+jAb%Z;( zyoVN82A^GvW#ZvHo=coqHJRd;kMXA3e>&xp^`l12_h*mRS?mV~G;n%Ku>Ywppu1|S z{^yZKxg8xPjHjVJrq)okqrI^+rMjnfBzHvLEGfV4V#av-x*H^j2V7xSEs@u zn@x=Qczc!IS38w2#B#!Irj3uGXCBFh#0K2M@zqSNH*cMyB6z+*Syn4N1yt__Y{q`P zm?S@*$=*O%>E@J~rKETN9v5-QDJw*-+`geW$_9&(`>Ky(n6Znjck%4WD{%Mos$*Uk zW`(lsG~Yf+r%5LNddP3Xsqapbv~xK;h}}M;tV7lvF7iSVNw0E?Zm%onNWQo@mcC5y zp&PNgzuTHb;of-b zITbZA{O)1|E92z|6zaXcYY-FygzqX^mtx_(kLm?4FjJFXS+jY0PLhl-d`o!gw4?VS z0uu{n1~M1P)8WcqT^^D-W5=AMF=imU;dS&`UxIVeOAg7ebAdJ!7ed|sfSBtZ%+|5) zh@{G~*8p$)TkEJdb|hVbvMw2@zspkm4%^eOQbZm2d@X$W#NXv@7bj zIn?lAM6&3@uKFk{NU=1APL6T^I})dfgXpXUTmj465u{!kg{lfGm6hw^zQ-{ovfm>S>I_U^BYT+4Zr#*-d0#)+N&@VGI8_Tb#d-tTW&Vhw3GJ!4j2&n?VU&D(Pe&5cSo z*Iy)GgYVod_sZg~p$Cv&TY)srUOi&RBQ*dj#*{2Kj{osc<%^H~P~Xz`L?vQWL(=hm z2eC7B@}o-}sHZAo`Un+R327OWl`uwm_V%4ar!@uApC0S3%Io1VDpg7JrjN)T7|mX0 z6N;{TI@QN#P;*UhLNuZ5+1#Al-9C-ATI<8t8pX=%+hV$V)(?cI3vNr4x>R|*FA=zo z+6~?mzWys^sbT^Pw`kwUoJtozY zajIlaOTQ+|Sv36xFyLqcsVqjxIRC?7>5RG+XHTE(=vJ&OYK~W9?DPV?aC=BpPYlN~J#@GEF4{B2e{7dv-9?M)AZ4#hpXG!3BB%GbHapQo-3 z(vx;Wda0}l=Kk41NDcuzh{-q-KB1`5#jgWxA}uM293{yqcBOW$-PLG-ZsnCsTadX^ zV5Qw*ctX>DOpvbvxA6yfD+XD6r_cKnJVP}lbv+IP>bGp|c2AURPN53PR$PQhd8zLDIAQ}!a+6$5YMLKumeBcHIn6b>>ajONipP&O})UPy7GB%>$4l`{y+{_7| zJ?MNoB-ujo$u`EQH|=xte9!n^!ezstET5nAD!M#;eg*xlGlE1>H2tF#WrlzU)$IzC zfS|FP64nPRu*2Hy(m$uDsq5n>HNqy*S1@M_w_kA1d0VD0{7GQ^-F~Fu&smr1mfD01 zXYHFhM#P`s#wU?mg%Nt8mTwB)C&cO?9t}FqnYJ9_h1tWq^Q+3O|?&u{mK$?0m2$U>e zX+gdk_)PxU23cpgfw7~#0b>)57P|tY;h@!+pNEkXVQGneOM$Lv(}XZztraOn+)mTV zT`GKk^~yb>Kc5Zg5MlrQ6&1!vMnwjC64(oX=+!IFpupg14+`kmc0th7kicI5 z;cSuqJA&Y$nQU6VY~vaUf-Cwoe-Kz8MmCd{s?{eDEdX?)sYZ&Q{R5AL*6m;(NqB~` zwJZZLr&_kAAK7Cr(D!@u{SAW0qy@%2eHZ+(k8f)_kzO-|GA{!f8pfhQA}4b06H%b9 zUfaIypI`a>@(<$S1gOv^D3(w;+g*LC0fe(Px3v4l z{y#yq{{INk{!3E#&)@&eY_F7%KeVVuS>csq_)bggB4Xn33KoqVtfJ5t}tswnP| z#9NK*mE>${G{&M&ua0e#4b9u#5nBfM47z8ZnWVI*?_aDwaC!$6<-fmh7{hD?g?vC7 zf^vTTqj!C?uwDh_PCD6RGI_-);|w3kOX zT~Tq%L1VKhIloy~`s{t9fv6vt8I-VF;0`SGH*V>NcN@qSB7ghT*togZH3PR1hZ$ft;dOf$1}fQ zdkEAcA4p<;%$iMRkM%Ir^NA>d(Whv~lVg;ZE(PT&|5y^zb&hceUVlNs`RX!2v8A8u z`voL`@M5wt^KNVoF6Q>%tRaS;g13lP#srDsWp zY?>K<07!xl|LEI#B|JK+Dhmqo)$p%Ap#L%rb}5IOQ89pivBx)=EZ~51KOR856^9oH ztA?X_2V439&Qz<>@rV=0p_FonoD7`-{OdciXg+*%&|^myPb$0v)wp;I**SGAqLcO4iO>iF})k%fA6%I0uK*SCpc$*d^zU+ zg~j{LnzH5qspTJ*0b`7G*@p-2<;vnYeRfSuLn~gQqKn46hVYdK^6himm!5E#gH~&9 z+eoVz18#yiY9H~3W&qs=Xa<67Ivn|L5oALcuBMqBJMG-_PcekD@G+Ngb1O_n#bqg6 zvs=s|WHd}~BE>s{EcC|rCU1F&K-RV!BK}pu`GPPY^{N-h+~!=?LWNtR)m$D2ZYmWF z9QZzq&NaP;&TL&eeXIJU(v73U0Td55cX!;|`NJd#D&V|bxo*UC>p@p_{<|oPI{*m5 z5fZOzLJ?N>v%Gjz`{9=K#%V&`b_XDt)W(-PMvr#|eoS*6OKOS+Gtnf|0ob^npqx!^ zPg@`~f%~`WnO{!4D1a^K+YAK`(KSEs8~^ruKL?_)X@3OO^GC(=T|d?z(&7>yfhpFQ zB$Of-2?YKjWasa6+)c8}HUH5S!@7%lX zv!`_i)emt%yN_OynyEtrOhAC2o<+DSG1n2vJ7~lJ(f=fTgMdFE& zI=gbYM?|IJh>F)3S zgM`l&?&?2dcNSRH#}hLu6U1h;H%9;g+xH&=itmtN83SAm0rZU17SD6fbg+~FKDEC( z_t=sJ(H4IKHCG0)&mW36BZPBdu3ZOd=(RBoE*w}e?lpe`(&!_dsC%`^S#KZQnMvi1 z_+IPF8VZ972>W@z5M{(cV2nJ3RF_-kqON-JZ zfDdT9_@rPpdj)cBApE{vv=CJJzt+NoVef7lfvNTJYJ*cscY%ca1jxGM_0R3UH)>C2 zR3f^r_$pIy4~7XlyfBPLl1KXpT{V++iZ|y!8Ue@R-}ZAjJD=if)Kzp7t{&^YQq^f} z8-V$0;f0eWiw6@<@NIf0{krS~yhEwI(XsI|YLjghm)H_&Unr>5AyfOwIYo4v*rlB3 za|uOFyQOzE1V25^DY7{3P7&8}YjcpNUURMa@!7wrVHnwa z(R6An{UThgE$i9Qyuyva`nTwk!~7;pWBXKQ5qkOH>jfvmjX#pAt-8P+Wjj1Ew$mWU ziQyPxwn0t_Bn({S2OujPwd{JyZo!vE6)&_1SvV$~=J>;TOm1G*;VK^;Z7df%g-XQ< zjPd9?gPkOK>CS;#%4n+^l{?+&8|NvJSKUYf@DK@`+{O(PP*4)?5~u6Mxzv98CLRcm z;hYt&Tce;kE#5)zlR$8{)vF`-->{zFy*7HYSkp&dg96O)mBloOSoaj-6!}B#_T^`) z1@Z$`D(Zx3IDVbzYKCa~SYCZL1ThPaOSQRGY{#Cbht;L6O4h}7>|QJ)sM^7IP38AQ zyAv43XCodp?^MKuJ+r88zIhjA=eDR@h7Ts5zcBvzhVTHkcg<}U8?O#|!nNjo2nEt1 zk3|`4=NuzV`$B)}PCG&i^5j=^&6QA^o)747vXij<0sfXJM`Lwb6T+~k_qpAa$ne!H z&X+7r#h-tOcno{jN@jgFXj?PsvcvDf8UtpEK%1r{;8MiWRykg$9qZW#N8H$;8w*R? zrV~~4j^4+80qBIgMpkgsty2~V#Z>1#EW_Ve62uIR4^byV1$VE9)x>tmb~D}k{`1hg z?aIidY9rsybrxlN4m`F{TKN&@jE&Qv^zW^C1EOygN8`&#)r+O~VA3!FyUFk6nZBF! z9={@!Gp!EkG%o0V$XDjil{;x2)h4{3_vMgM6uw=IPk z$6cqLna%6jPyviP4@cv|f%E%cT|J5PdWTqHRVi@+2Y$yzm|e<*>w?7wUn7tTaZ;Fb zb}rs5Y8QiENWWZkR>hA zHt(A!q(t$K1XucN_!anK?zpnwD;uMSiVt2*ZzC;AzVRjOwLA~~k7vsY>j`_hA>Lz9 z^3`aAdS)V8lGvl3>2Kq)3Dh*o67Cx74Cy7-LG<9T>R<&Z$!QVOYzcLgXBWcdh2Qh?_h*U&Jg70QI;KUV3?QZZ z*M9a2o>mB9P)^#@Y=i&PZsJ0Q2)eF%FAQEi^?fOjV9w#tO=s;YmGYyACL2FL`{Qn3 zBh-T9!9|Oh4oqAGODP4byYt@?jt8D^USk6Wl!w_?FcVve_8w8cROj!>rD%i(NZk_V z3tB=D=)FS)pMYJTML)8oU?uM2f=}iwrGsu4u?)L7r$oAE*I6)PoFzx+Bn|RP=Jjpw zluK7-0X-{thIGo~U8)V&JslCU6qef1T6adRX2&hv)Gw0TSpSz=1n{E$^ZiX=MwbNg zngkTieD^LH{8~Qpp~~WXT)p9XL3UAp9R!d6Y;6q=0&kp0O((L7IibCt&L78+)E3RN zN#jj!uGw$nZ;X=)9}KJkKx6I85fpiM1?|fC@wy1r$uOp6On^C(iB&Dw$mqb$((`c< z2;N!*n-=2@lw?%aF!WZI z83jKk5YPU-#b=taGSvq?$BvdqBEDI!%j$%k9~dvE3@SBq6K~YTv5HF`9M%W?(D9h@ zmO;s8O8TA0;Uz9fLdSZIUE4Jjw$ofm0b%}3$>KL$cZ9(i%@qG)|JqqcH7h6Ok?vYn zP@xJAI}%rdMI2_YO^ z8FYlr+w9JblEk4CO*u?Co~ld(u3aAbaA{^ZXs!YWHQ=2>jv6$rv-v(%s*HCRS5tcn zY{Oa0l-4!Cv%oH;Sb1xo)1p3Xy(WJIIoiy0+M4vdb;wq28AyUTXEY(`1i5`-`ws`H zl`3^6mSI(ZpuBhd2^8t2TlLLK`}q`I@^hS~6FqHWcbSD^Pjf=el7O8YZh69c6|&0t z$1Xn4jQ%WE(iHMCg1MlzJMRPUM{~b)7H^xf-n(GMndkZ4wzOxn;GKCg(l<;|ln-4n z8d>me+d&b+Nz|J%#T{>s^;W+t2wnVl%}J|f7kDB+2JUu6J;eK!!0yVNJY+@!!qW-9 zlbHyn`)yS&KCp&G3*vO=Uo5@ZHJnjm@mP61yZUur6O`7h!1U#s<9(HmuUix8JuP8Y zBA!c<(Fqm;$9pJ^-fZP6h^k+dR{6uH@)zzyLT2k#XwnULg|KUCCBa=!!VQm@hFtIF zg)=vsd0%Fn9ldlUt8&`a)myP;5Z~ld-s{ZniDMY7AC@4=QQD1s_Zof{v>4jk1 zL;OQ~EkAt6FV`5l(Ns5g1F(hPKb_6z?Y@X$=1%%rZ6_k=t=IOf)op2GU>YDDm|YZn zJ|1;}A(HPKhBa?{lsNOPnWL+NP}8lmJP)6Gvw8~I-}Rp}?rszo2;BGu1Uelhll-WG zTE(xM*4N1-nj1o?`|iUW5Z8yC!OfVNx>lMv3O7e`q&oeheNm1O+1>0XL%OD#97*|g-N zg?I+l9H6gj5ql1#E7XoO_J^_%G{>bDWZ4e=>)*%t)if$yp?P+_f=yj4Z3vtY_Vy@L za`TZv$2P8avYLCv`&O7)2)-J1OR+l<PmUf1kpdzCK&prkm zPnl;~%;^_Cfw0V+4r%+!0wHTQ!)35%M15&ig<({b4U)NdI{ zbcKIwBJV6k_qnn5n-_)Rc3XVWxvHG5+ZOw&2A3fOe6+EUxM^X8`-*>l(qIsBl1=-1 z8Wy`=+w_MadX8x(cIVmBNcj*|FDz`eENSv+xOnCB_^u=-j^0yfO(5_7+PhcEG8#n3 z;PT}O|FRm<_s{D?m}%-x&4Op>4D8yM5XbjQ-8uG>CF4^+qbch-cMx|TdTXE_DB>Xn z)D&5*uPSSIptk2GbJBzB2Ty1c&NkRgY|Owvitew2`hau|s5pTt8uEoY2SEJw0n!%V zdY}X|jQ(Z!m04bqrc5bN`w`bE-s^!2W}ad!ZYTSALmMKbSVi>#1fPFqBo7W(UJzLF zzoAYX#e#RuK}N}J$drFukE)i2PP*yI*JF4yP+FsD0he4taYNt=GqOOn3`(*^_?4Wv zK)Y~ey65%xBSTJ)5ritio~8sy-CvGN2kU5Br$L?^ta-7a7{0+ z#;WK~IvL-s`T)9X(a`9l;%@q|i=^0hS(sq2x|_zy{xsCnEI%*n>~C`ol-d*Phbg0t zK$ETGHna~nMHKg>X{pz1)fPW1W0-IC=<%I=i7{~gNnldxxrzab-9%a9$d$lFU5IPv z#$$B6*)9QBAKPQWz<}gQQADVU%20qMEPecdMbMef5f@>s*~SSUdDKbEaSxH_0Ar@2Cch!HdQEdn}HiYpH* z)N|^3MBY)-b(L8JfB!s}73ulP=amM0ze0?+r$I9f-bURX$M^M8fA4s=Hsi^kB!51V z@Qhyve7_!BSd1SvFH&YDv#^qDqTT4Surox+oAlba)Gsyh(P55FS=4&E$C7~_0$%|2k45iRT57y9&Q zzB0V#KI%}S6;I-8MVFUjMY~4*5_WpTbMRInHSA^FTPArR4{kOG zW6?q}M0M$yS7qAWU6`SzO3@?DGZ5o4WzQ63!qu}Wsn0+%N_i+Ts$p$0^Ly@9+a*loj1-0~g}9lvh!m0h{k=-!{EktDc#AYwO!P^Vh8BEi$~L z_;!}wBe&55PV3z?N2fevZJ7!fD(bOa6K6KwCd^v5MGtw>_jyAJT84EoN!p`PZ_i&N9{>d71*sgmD?3;s39*q{Co&7oJ zRdu!n5b20}(b{Rff#(ODoevJ=ELY}XN~z~>IjUYOt(u{Tlf7M**h15LXnuKbYfn?u zN70KFq|_*b5&Kbfq&dJDC=17WK7FgEM;Y^>;1k3MM12m|A)LD(m)EmyQiv9Cd<=K& zHAU$!27H&sFN$8+#JzrfDFa_hL=3p){35hqMAgGB3U@}VWTZ;mA8rXBp%j7ERL!B~ zV+(ls0~6nsj|~ByJu;I6Rz9h9=;By0Ofr1T6ymGw_XhoQD2@K*(J=nyv|9V2MiDxD z2aZPK61ejdVjVn`fGUvqHw=k~Y32iA5tt9r3Cy6U0gz1{cjrZ2K76oYY-?eyfMUmJ z;sLN(`ZisidwF-FGtBH>2O~xE)ARYSrN1RCZWk*zymR~J{Wmz4n_!9Ni~5tyuSVV@ znWKcRpA%w4?Xszvf^RsB`x~A@ZhK!YH1Wt8(t|QDAMuAhLw1jJdN(t@f%J^J=!AGm zilOoIFp1aO%-&k2Bq((dJVTA^7e0ku4>?^01j)FmRl8sQfz^EVah0Ks1LWnGVbd}# zIJN<|f1&U5!$w3W1cUKyssn$cXP}Le{1ThO-}h3NzCgDf$bV4X_TB$}$UY0W_PP4s z|E^rAHT{=uT{{e1lLG&Tbgj?-Z+cMQ3b>Za{hwqZ5ADAVfQkkGbM4>Xzw-Z3bD;lA j^P2x>hb3^4bxA}YtP|ouQjGue&=h4=Wr|~KmhXI1SySux)yF*~Gfj@cozI*e2 z{rX)+rRJRO(|vYtU3+!HKPpI}Arm7*K|!I(NJ}U~LBWebK|voP!b3(@A6SVY{~$R? zYdS+gq4)g$gN|oHCxHwixX8%AN7#jjMS}H|%XXw3#%iGT`7WPh1g=HhskRenT z$dH7ov$2zH%Kch~jhQCjxaIv&C zh2jBWAVFr3e$RZeH*;|_bTWm~b$I!GI?8_*w{$kPF@&7z1XbTr69XAW{5`C0=wxSU zXAadtvKI;&L-_0Z&rZgsP&Y4u$NxP|+}_sK)XoL!b|j%4G6w(qG!;u18&jx)vne_# zC<-VUiMJ~5X(y|mIy0ZwUS1GTxw<G3`(;c!i&a$k02a+{FY0n_*Y*Ys10asF7G!tMFWa6;5qLegBF*=8n|>{E^91@@#A(+__v z?UdYLAS3?%{i}W-p`quMRvX>w@PG{8+`BMX&to-G&If1ab13N2cb2oouyb|1a%#iD zDJg&4Tt_m6`>CLyAamzVCYoHhtBuTK#}*t876Lh*Oem$%eSo4zb5wTy8B~Qs!yiMI zzoWrnYur3p6`HPW&d>(0j|#7UacMbJ81e6#1ExP^x?{TZeYf{V#bV_IZ6s5#RKY5Pd$b6$EQP;PQKl9@g z9@alc?65>!2*6rYuXk=l{)fOYuN6vO2g|42vp!0*0=$Py@SF<-@# z_w7wI0baFbrY;!3(yY5o)jhZ zR6!7QIhN2E{uqrehvUKUMxS6{Exc5R*+a8>0r^x;FQQ;K?>e!Jl_Bcazi zS`bN*m`a7KC=<~LENoY*x!u1nD>1H0`GeQjByW<2(cq+hnzBJppCCB+DUK>M%3HOX z<8?CYVaySHE;C;)+G-;GKsJ`;8d}bw=;7Ti3vQ<;i%JmvMy+!#H1$L=Rw{OZcw9Vv(+Bo=8o(*VG6>I13%%f8V5z8m~R2lY-LCV_9W2Xw!A} zOz^J!Jo%malpTuUFx~pK<{-?_@ol4x3&kEv(R$z=qC&Y=g%1o45I$C>i}&FM0j6nd~M7tQq` z0Z+V=<#(UZiR;yxh*hnh`RG)XQ-*^jc6 zL8kMDdTZZl9N`yzSfqTvsCIed+Z1oi=~M-CN0(PGz`>e&t_3OkFK+zT9A{rVU$fZ| z4{Y!r4=#K}RWf$pomD7ld3+^`;7*rpE^SK1CF6te-E3tXgfDQ)Ew-X;qZ%X8#+VDn^f(#h;u-k+_t^hhyUx{z z0o|(jobnI+M%>Q&`^W_?dCkvY`@4rGk_N|azNi(rZ{paKvoM(ByxZj=-&cj)Sxdk9 z{&=`*2AV~C%pC~Cjz3m|F8a!M??U0P@^kchq;M+_;?qw~Y>b9My(N7y`+y^PWp{F! z@~1vdzi@30?rMUT7c_l+^H2egC!&q`^UcMvG`Zzh#*j5#JN8&slJG_njZc$A;+9*2 zbIvJu`l+6kV8rcDB!&tQM}Abhjp75fl}C=8^dV^7SotOPAyQmWt9;3L% z4W=*g@d=Jyj%i!j=xKE64IhRb1cvEF^xhpJ(e0X+U6XnsSjtcn2{^r`mJ;pWN7%SX zNq(}#ib_iuIuSz+Q3RU%@SZ%XBcs&Sn)eiQdF=H$kOC=ngp#heYmiMyh6aHcIWAG4LkyI*`kQva^_%#)h4(&0uh<^2an&U9n{JPsO@z24kj^MN1 z6uyora7jW%=QI8jwu4QKi)FaSn(fxOyC&L2L{073(wn@^A5A<8l?+?A_-gydJJEDs zxW@y++qSh(y5%32)KIx4UC-(M%kWce zBEJsdBHf_)7xnfz@FxI%tiQr76(3>Gj8|@Cq4SbHmiSF#OJ|0E>WnE5@7Q<~<;O#h z8Q1A(^+H#F4Th&v*t?cfp4D4$v*2F!Oul=n<~Ad5P9`Du3SV4h9qVoT=gmqG>yi!Y zk?E)gdAuQbfV+p`h1aolDerSG^AQ@+(kFRwPH$$D+WAbWlY!>oho&uie?4cD=TTSt zMsK%VU8>eqU8klVQ&Xp}aR;^3sM|v1k-{@nKr@3x;z_)3iKMm?`w#)H)_BKHKl%1r z>5S7I;7kF#B`zbwwzFW{YqNkqKy7RTl|(Ic?a+@_vJUJ0&KhGiiPinikedVv6^$xK zl^&8X$>IAx!Hf__`6R)BFK?~`tCnOIG^6AU94P!%<(nfJSm2k0J5K5)o3~L24ERU( zll^)l3imMSNcsKz<3tU&{D!1-JF>*-ka01JZbHFd zjfl}Y1-6^NTyzWhwO6Vcx#n$i&80Y4iu5CjwRkH8W&o>y7*RYuFXpUmqX!5-8V->P z+TTT#bEcVeLfg`WTxoAHFlcBmB?VWOQlkTnET%z>Pt0dbPokotXe*y6 z)G-dw+F2=fX)B@P4X- zC_ck0MlkVti8#TP6oBkl>TS{CAoc1kRP;qh03-%oeul*h&qV#iQ&K(gRjQ#wqD*u zuH2j1-HfW-jz8u1&1TX z?^ioYgx>Q4-zP^Xx6uS~M89;<;ec9NMQz3<`UDRcDEk*vmLpG14G-ch4-U>z;ea)t zgjZs!LUE|TJM8RcGJ{U8K{>B{zvpaw3SoB&#TIrL(ewe4cF%CV6^$xG^w)lV zIK9E=TA?iUj-`H#VKe&WZ@xm)z_Le8S7Q_Sby8{KwYYP?u*vQC|jIbD0(Meq_@ z4xbB}QZ4G)OlM44fz@#)?+qOMzvzpH(z`bl9FG#re^Q?5ZenUDtecK zdNQ;&IA_nh&B)S?Z`h4*N6pP029=GaUKz(Jg|thPtMWtrqmmLd9v;NU5yG;*L4Eyi zb>Z|%`{lVlY8~g@P>x_gjI3Oonhz-}ea_v6(v!SoN$I=$v&he0^F8S zla;n`u~?-Ys&C&n3SC_A+-(sU&=%OrYW)i9S(*#+O{)F9DY1C zG&dKEC(XYXeJ!+P5<6Nh9F$IFJ++wL-8x5P`*)Tq5r2IT==YEN2@8`pR=%VB^8~!$ zKSV<1q^b1(pT1nIv(n~_Wc75nUvy*WH-48B@^xp|o+YKNj{VCbBmuV0ccWB$_n{vVO#ycJd@-`(9! zf5&JA6+D4E!E*Z8e z_jvs7_sgoAiO=5;)$#Zf29gepPfSz~2GA)2dzShJKD&Kxpm>aK5`lx#*Vlh~db+s2 z?lxdoL3x84priRe7iM4l0$&7COu7Z(Os%!cfEGEIQYS4+@O}R8cTB7Z zrL3kVX{pID|HMkF-=2p=;RW_O;HF2cUW{sQ7khqwP8v0flBD+W@zHuXLe9Go|3``v z#3Rk?A)u;HZ?R|vSFjgeKSmuKD{5#n;YYrT>miC3{k*qv?t4cdK;)TXmoJLR!;S0f z`(o7@nvy0fZ{^PFM0`A7Zhyw`k8{#du?itKH8u6BcOjV$8Mj{AfVG%imOyE))w(d` zP30i|swzLGdPA8x^oJ)AkmU)CF%FHmzlbSbs4-HHJ6|>kDF|X`#+OZ31svT_uCZ1P z#hiL2++tZ{@PdR{VG!o8V#k92z3b~1afpWZ_Th?0cSI^_gJp>i=(kudntYc?=9xv(TWI1&z$60zWLlZtk3Nq6oiyR zz`a)xZ1Vh>6hovv>S@|8QU1d_7^Lbd66bv`y&pL; z`Ei7Es*f%AZeZ}5eBPjt!pngO`j$(-f+zHD%F;kubvBgl>Ei4r%LlM^TBUbu^|)_o z!u~BssHyp!zbfv0&NkQdBi)wJ2D&k)fx(nR6W_7iZp8i&-EknUa-vC`+YAyd6V@c3 zEMPrF3o~1Co;QAWv-oQS!WJhqS7|WUe(?@-Z?0Oys%u-h z&WLFU#E6XyrcV74N^Uen=OKZrV0Kk=DCf(G^_ZnP;^oE6a7?x@y7z#Kjg2i`I9V>@ zsRo0D#Gq1)a}Yby&y>Jf*e{YVq`h*i1A*`bIZ_`uB$(b2Ma8)aMCa=o4{p z1zak`*favVsy-PnOCG1IZxPAUru4H4c)J6fQXp?D364Cfcf!s;rYfE z=y}%n@dRvVEbU@poMGBnATa3VjC_cYE#q^JCi(u$SqzQq#mA`(a@ipi2AyUHPRE4l zuhdRJ9f6YjuD3m>;^B8j0>g7OI9wZB$X%>S0WM}ELwzofE_-0NlS0Or=gS^Ya%bzb zvdlea^kJawsG$5`2}Eq33dEz`RJXLGLEKDT`EobHCpG1U_JX&@+CuM40+6a_%Zn5d z-gtNjoQd|nRgsMdX@@2GhRm?!Kxo80i^ zr7^WFWc_aR*l~Ysm-*p={dO5Zc_;=jl;D24=;f?aF9j({tg)FrtcfI4VxVW`ulvlI z+95P?2{VNIpZedz$`l!E7N5Djj^(aknMm-LkwHC2UoAfh+Uz(hx=deo{j{+j59A5J zh}mv`mb_yDak!3nzm|A=rapXk7WP=V-ljWp1<2YTsC*6Hr$#-0C8W-5w%U2rkMDTw z{hH?MZd)of|I-as!ugC5t@@AbWM=Kd9+!Q>@{R28lmR`D@czy`nyJNNKiXO2WkBfE zl$8F4*?pYGO04JwMd;G*ykvgA%vWb|iV5T?AagRZP*ce}t8_oj;=}gOOWswj0ef1* zkzT(>-7b4kpgA`9Dj?`2w1v=314=zv#|B=s{ZZ~7Uj}5YO74mAo zYg40|sN15x$n^(Tmp%33fr5E9CWH+-?RB?IsT+VZ< zh1Sxt^92;t(F?P&32)7A9^zXt$f+m|;gi?ANutZlKFp@Iw2$h02xH`ZgWYMl|46n! zFJqVh@-%w))md3=zo|C|P|LNoCKYzRZE~}pJX6AR^@~R{DgFIXj%RDMFOdhU!&A~& zRR5XNdWJh&+}haB3dvxJ=OzKUOPg(va+TA9D|eiuHq~MS!KB`_{nm9MF6oy^&%XRI zUAtNj4{wE|*f`NpQX}av+;wwTYID%k(x{H#Z%pgv3DKR}lQciCiS+9g3-+i=&n@E= zwbxe>aBd2Vx~<_UnR_W_T* z=-Ao6WoBj;rOsN>P*C_O)FT+ws9|v0tjY)J666WXE$eC6j%caVKe%9uyEoz?`hu4MuN@Kj%b}f*=ju1+jIn{>$QwKn`zpJ zrdyf?AZ_`I9A&4;ea=A^GQaA&>`75rmwkP0k27$@5wIf` z74js9-%|aJVS0((UX2P1s?2LDBje3b4DS|s>c~f-9dlNLu49ikBH@$`u>OuX8q%bL zigd>H`~%v+4@W;j2fWS5r_Ynd@^40GW95e$WSBu;jYoVHL0``J)5=GUy`t26y9j&@ zztcoC2w_*cR%3B(d=mBM&-i8D#}UfWa$`k>l|Z}=k3n;PXhOvtdgpp(lPCPWf5&4w zynfcV#rK|qpkV)oOTyXKS0gE2d~KT}URGl_Ep{h?nL3r3iVz0}dKRBO zg3@C%KZ-%xd}`ZyW3t};G#as})$91VE2zXm^6B}#WSrt&e<5=kXFM;U<*m`(p`Iz7 zW^yvW=W84S%WhXGVXk}@V|hbiacexj9nSq=TqA(oUT^biKk%Vfj&>*4cnJkePBI>e z6%TrGM*c*-ciA_92*P4Z=~&=%u3QJhu|?ZLOSPMhmEh8n2D!bYNW<|O0n*2QS$UgZ z4W`9+Rb@}QSm=AGzZJwGm#5@oj^_9+O;V#{vHkB?cN(`XSFGEQ?&&|k*U481B$qMr zd%c(-S3sKplJ!o1)cGfMQ(4i*RI-U&!2F!*f?=51$cmx|6wcg`b0T<8gOTIS}g9>xt!ri^kvKA7b+}xD1=4(XyYMl1SK~`6FE5)^iz!v{k)v*%v-wMs0<-C zj+pd45pUN04}azLK}W43kQ!%Dw><^}sNd_q8cM=#XMhk!YC=0<*0;Xieq_d*dU<_a ztfh9`6ONN4M=OZoPlmFpzjl3doppSgH5(9<;w_5%McO-sWt8!*$sL8M_~+l@r`z)5=9@y zdbJh%RO|?3e;896uj{{`>y*IO_IF+-Rjz;YbZyV!VX$if-VP5Z99{q^a-Hp|<^Y1S zru9u!N*>D=+FT>Z$@)WOxfn>(!b*XS_+{FX2^(HzrzfH10g`2RR&7 z(g(j$$|;g4M$P+cv8a{Mf*R(E9MetO`QlynKjyWI#x4w<8hgIlY;a>_cp0I5uCyQ} zD*Q}t?@}B}2zm<+B_YE>(f5+Q?R>1Phe776GD}6%E`FC#K5FKbK?vosF5V<8LNhSQXqAm9;E%UijgUpS?*j7|LfBd>h47q==a^#*dvMV-xVZiWa>YWWp zZojnOh_OF{CPMhk+Z(#rS7GNlnwHAQs91MpT%Xfl6+vD?OrVjo!|}TSUp(nBWQ(Ua zf;X)R_=+(!rhQ)U-f40*`9|9ka2PGu@Zs?L=_?k)C!F!#DEuoo=j|fya}{Uwyj^|g+HMXrL(lU?bIVO;>(R>U zj3qosL0i|8&irmg)wpu*5h$AP{5JrkE_}YRy>p2@wSJf4JH9N@SbU4EVm{oDK?VOX zRh5YKyWRo|3eS=NFS2WDY8WRhmX|}j$Q01+T&MENUuidITK%WOF)t=cY~?iOCEvg3 zd`R%%H0FHwvHXRCfuV58)_s(xgji{rJRMQ6BK@5AERUiBXVN^?`(sBIq=rv+1ZZQm zpMper>Duwg%fGCc1g#_AsslDB4B1oI`NpyaXfi7H1xKSZu-IojYVyON))jRxUD zg)9mFwzxcG=a&_^wF&M#OoKvul-_2OsR`Eb#B+SVLAde3DeaY-NvyiHwU827Q96YU zuU~3dvD$kBx+aVb7|>dF<4d~7h-b;eW7pgi`i}F#M>3q{jIpSC=Z(2Rx%TR-Rv)TJ z9;WnKeL8VC@w14)>|xF8?0K**Jk~Mzyq+eaOt)iE8g2NxO-oLXEaSa(23C{>$|BL( zZspZ{Ib{reNS``JT*>N}IZeRlyzx~{f%$)w;xz<1-gQ!fpdx2|-Yri6K-HJCKKNGv zXj|`t2fx_5`B&Jaq;k^Ih*?=#LBYX>)r*KIC=hh^$Hc_PckkXIA|X-o^CxX=7z6|a z90+ixW!BL)t6 zVJX6Zy4{Nn9D%i1NWacW;rd;xZ`Xw^9FH--0N-0mIAkIrD}LN@F}meaI(}@KGmv}g z3#Xz}s78uIvY3r4m?*VbLCtEl7d^eweBaDh)v7MMTFQ#-qtQQxll3bK8782CS1{~l zwIS;3X{fVpQe*%ip>ngH;tTo#TnEqm!s5fMx`_+nSVuH8F1RM4+%*8aXRUJM_^NV| zD)Z{fEk3}7R^`_1BFtx{HRz)c@NtbO8#~Fd(@b;F;MW6nMvG3S6z;7v_||;~lUD4O z1!s+@UpGUeQr`_Ha0`cslO1_^F-rAYZ`z`>MjJ!oyK^9s$e1HJdHZhcFN*iUqLLW1WQq6(p6Wj3Z6R59;&PbOt!*p3P)=O=FChSmdzh{@i&6K$CdhXk& zjg6YvD5i|y@|=cZd|;Fi9vmstYd}SP5gBiC)6MIY*&Xl}|LJ4LOqln|YNsi4-M5q& zl@Ku^p+RbLb3OEL(leR}hdhL1Pao!-=Jr3x>i?Cp>KqDhN@-dW$*$}46IibEH7sR+ z_62C^n|Imps;hds!$fs-bQI<70z-CL6C;MVZ;YD(OlDZEL6u*itTB)`!Z5g=uHf(F5-BL` zAx7~qw`K(z50V2`hY$E8(l^5Q1B{8dY?~fo9M53#S~7IEH94Y^d7H-Uzb*^% z?Ank-#us?%86T#5?3kET2|MGV=;`;RwM%mB&GI$8a1WzjUcc*uU^|BECcuZ|NQwFy z7$6V<4ac!xqHlfT=Pm5>?X+5UT5@_4Ka(@3^ML0}XG*PFNDDFACNKPrwBcJbau8@q znzmB-^XRLmr}I&x#qo_N55{h_IUo0Xb%EC)izxQKw|mDRPM&Ust+;8T_4X?-wcFf6 zhVyKO9J}h+yAR4YMZwdK0*Ziww0K0pUr=c`F*`2&4n|#8BH&|}6v`C+>@=poO6kTQ zvnQvO=CY#KK<&$ho*0RpCoa(@eZlPZl8qBKRLS9~8^lWV9TF*oM z{Rn}bev=2!oS88(inSZ!t)e?RItv%sj}G5k5=*Yoa`#U`lhdB5?&o5tH77hlo?m7K z2)pBo%6(_A`W~g5CXb`%z>Vf5ZaW-)kKf_lPsP%nv-{?d-;bDa)tvS4m?LVU)>#vA z2xkGMU@O-70}$*>_6;exzaWBU-E1pWzcvo-7B1KJBu@>FjC65STxp*rAR0ZWv*sE< z;q&A9G%&rVI4ROFB5{4+=1*1O#?`s+IpF4KH~YIgo<>_j>H5>YJ>y{c+s@1%7KL-5HpSZut>OuFU)!lnh3m*RyABYt%Ao$7K!s;Kpmg|)#FQz;tOWjbVM&1^y z{bB99D)uoD>$buJ07U_`afOUM7eN3BDhmaHiSvebNg#Sq1cP%(R>QRBCP!a!iF>5998cq~HH672zc(SsVf9^eJnWc~#BLo=r{s z_-VYwE|6GlV|(MVZ(FQcsH{7NfZ;e_z`%TMH-UvMe)8GrzLOFY_O%(vnLSClGmH;$Kcx zs^=x2$9afn_^V`+>%MiVWxHR3IBH+OwLMPL1~}1d37<}B9CoXprsWWcy5!Y)Y>Fns zjl*bDYd}?2@9Cp!BW1*_sBYEV6wx0?sVm}ox8i3XZ~5og%r1Sxhz{1q@SSm7oitj0 zK0NkR8Z&)e_?h2?;!yTi{jxKqR6UhlQWDj=eC+}DSJX(UDtp@*>dP+y9*eol)`_)a)(T&?4Nq2!zV@3G^Xxc(JCM8CT ziCDjCq_CEICB2k6Bim&S_kv`0#Dr6TlnxgCFnd1V#Cy)yw`!YD^P}C4_#?<~Mc1kk z5t$+RVDPLa`qs9QV)}J7M^EsG;ieu__QQfAU%=z?6Yap06;Uzu7o&E@go5jmXU8&U z{Q&@HCUEZ;**4*lE4p(+36)33#PxExlshWl=b#x7El01T81+f6jZUNAFXr=!4w>6W zE@?3fn%hYrf7>wCuxFIo**wEptjSL<<)nv4s=g?)h*hVs(wDU1Q03gnX1e+hx;*uHbttZo0@w=IPUIUC}LvmMQ!B3i!L0KySqCTRUdc8w|+(Y z9s$^|08VwdKJG}TZU7nZnB6i2>zo9Sq=u&@L-5B#08T6C*BK9#ByessWz8V|`w=o6 zkK?v1300P2W177|H;-a%;==P>&TSMr4V#{o2RM6?qgve^OyCy>v`?Zkh94wRarXPz zXJBrHfLqV@c@-C<3?{e911(8e`|IOfm~Xdg_zdPymDiKs<_$)8cMz_*f5F(+6CHJ1 z>c;Ufwu5sv%jJBzVc<_QsOn`uIINd$0;@oM+}A;nGh1^Z`Sg;e009Ts7mcL7?8uEd zA-x5H#+`IWBvu?p43YOw(d`$T!=Kn!!SJ%p3z?^d0=eTUU7-p%bI}~H6+9C;fHVVR zAb02r>{UMEs*+#DbMw?Gsdn{M4obq{v0w6DvZTh(LckSG0Oz&`PWE%tFX3(s1WkR@ zEpD{Uyf0N46*!5QooOKTYun9_Wg;1??q7M1%IytPcmiiI%)ajm*xL)<4{sOlJf&fH zQ`m<#D0e9Gze>ElGE<0uQIQ$=iMU0%^{ zfz|CTA|hhJ(J7=mcZ|yRJ2E_Y-8}%cG6!({++Ru~Fa!Xikai&6s0dPQR`-LRzW86PKxqzpgYV!@UEUwQ$qk6zf)6CWLhONou{_9H*YpV8q-IU zO4Uo*wC9h)vlKVB*&E_x!H}+~fS8o?ViRxh%xL55_2aXz-|CIfo##@+e4OAWM@7V9 zBmJ2&R&EYQ?l}`5MZhLi`|OVy=r+_+I0R06lz+FW$9kH-bXAY2_KERcw)>9RIMjxo z5(Ac2EPAjH(0L(k&eAn<;G;b4r`nLcHCe56h6euCZDf%hFN;N{*y)KXb#n*qL{o^# zfrf366;*Br-A@?$dVp?p5ROI+Q$`7fvb64Z`8B2d=Kj&_!Pl$g!AwfJ=8sa zBqm-jvq{}q99cPW-f~;$7}HCj-%|ISmEB$hkwembcl{ zm+-6PZ;HUpO=*+=I}A%bt=qqmJ%~Vdu$8Op`zytJM|^!~QrlNnGabLaov^F$pNQTo zg5<9^w~%BNvf#Y-Y1V`|EBv1X2v%sw^xgCIsh9BSIxaw9F|)F}>^93b4J)$NwN`2r zB1Y3PRCriO8M8mLEWY#ZPbQ30Z1Ljq_Cl7C=+ibMZ|TBprXv_8>y!evj@5jAxf@az zY43fQC3mX)lU?H!TU5McJYA$C>g9;{K2(9*;^dp%#2JK!)wx$>71Q(%<2OLlDuN0h z7=Y1u0O{IW(*AExeBk}ar$gwEdU|6rQVi=)-gJ%02qfHPG3_YBJpJr7Zc6SW5{`p~ z!n*F+&pYX){!s%Q6Dv?=~gmqn(GNqT7Y1 zS;d_8iim842oi4Bj|6}vj4Dh*Y&AUhnUmAa!rO~qw;yXmbt1gjcE+mAX}*2iXhS36 zNg#@Ja^yBB`O(zI-!2*)q`8QeytfF!t-In5clf}-zqJ?ptUBV z-X~)%bEA6$Uu)J2Q)MS373AzxEE(pd7X-a93Z7})&ue4M$_<9Xc}nf$Q9j*T6{aRyE+I{N+; zAHR&z9EoIau5{qEetyT1P85Ugtezt*7&kJcYd%igKf*`H!Au!!({Z`|E-#8$va6yw ziPN4bSl%n*UtwMCug+&f8k#u0boU3jsw2eLmJprL|Mbch;eO&?!MDWlY_~KZFtE5t zq^qmzH(vAlbx>v|g{tR(Y3_X&29!3*$s>jmB7bDM#0pP(E|Xe?(HbmntMED*zgO}* zs~(etGL6ouM0=|JX`cLdp$gd^+tYYn4?2noz7!LvEch(S5nh!fWwxEfWwjEG&VCR9$2RqNm1g6KB@Zx{sSih-d{|%m zP0x$hNJMVN_Z0^HKL{mheB;>akT?M8jSmeC-CZ^do2`JctVNerGAm()-pnJ&)ilm& z)waabom`-cl&D#&#$cR3lNa57lU;p3eX%k#6|%j`uyW%Ub?1|XM&RMuU{46tLKq28 z%8Z+nLsS$URZnNy{+ZF#I68>XExI5@U4@|eF)?tlgd@t#sRR$obA{q(o7Kbhzht?@ zjFe%WbYZ=B4&aw zR(y6cpUCqGXwxZR(}e{0`|}cMNlfeTltyZ^;lmO@WL;oHn$Nr9YtM;OsN{;g$^#5KjRS-M~s?LGc!j)5Xs+4&+<8U zjohiRX(JvWU@t1sm1=+-ZZ=_T&knvtgrc$oD6VipP&cTPdUPtP9Jqd@utw_Sf_*yn z6M2Ln39h4<>2UZe#p)RP$MT#tp{SB<%$p7CmN{4h+-X31=Z{eAq^&A!?|l=!mg&}W zO2rtEH>|LiD{-H`4RKQisZ#8oFR-=XbOI~ z`2|Ue8uS0*WF{6sa+;wJ!*^Th%n4&-Rv+y#0I)SDC|H$yf}Wo4K3@_VIf=hQ+EzEW z-9iP(?l0hpU{z})t-JL*#9%8%SjW0EO3`Oy4KR+lrTDNUyF)=Yn zm{mEYR7d@jr}lM3=#Kt#LY37Syr`_ERPyxaHRA`uOw|&M&G}SFdQxbdy8RhxiNoE*ogtJe|Ca72@S^YKbe}#XXf@K*0CuFLAE!aTgS2X^ zh#W0WTU(pf-iI>j|GE0@sA-wni#P0{?<4$v_|!FE20`ogGHVpAwpav0u+d<~hnN`z znJB6c&B)NN?GWz_)sgv=Maca|cb5FGybZ)>p`%zU<iQ)!>CM{I# zF|hu;CapeYmfZTKG5FPVyVajLmcDsyDBZ6MkQ-azF4FH%{lzmZ^A8f?P8uY+;jek2 z2gvKnEA#>3zgnXP4|MtjEhwsbrj^HG;s=)Phsh6$&DPa20=B!Z1 zfi^B2GBTMfo45!3@0V!YS&(Nr#3L*+|IIa zy}}@j)7ZXh>v`6Qh=_ybdNv5#5mK)~Xw{CrPr@EouZ3Js4Cc#pk>C8SBdp>)#UjyU zjCtVL`iF`%Ch?(=OFCvus zh+_4k9Aq`kcAwV&CU>#Ja-&u;=VI$){nO9#m$7kZ#C$abHO+%Tz6Ri|-$|8ZHkQ8r zdQs{-jMycJz@@Vt1=Ard*1fVGi|7oq>iY3Imt#KiSu<8IC{YnH9R?#OC4Y=KX5(Qup+7_oq|nqf<&J!J^;$ zR@KwfyJ^m+`nmWl+7?K2?TUS~;n0MjcL)CaJC}jn!ZNFvV6JC*wTEc{Fz#NIp2@RPk?8b)$<%C^-a-XR&tW^6o)ELl+GwzuGK97_EtRRd<6!K)@j; z{-B|uG0OsJ^!&z$iZJ2^RZ6!Y#xt<^X*X2b*;?pF`1Y2?ThU^(T=tv8myFitn8>2B zN3rLvGly-82)Ces{Z#cP(`Kr}4)k}Hm zhpXgmRUeX@=u0DPr@pHQmWALM@UCtCr03-4Y8TrJfu3wZI0SnM?>P#akKF^$)3|ih zJ=dG&AWjz1%uAm{-B10TKd3(|#=)G=P+zilG0Xa@o?nX2WUw{tF z@z-I7G%lv~>YFtkl-|&z5Wwy$l%(4a=n2Rql5(6l`YBP36oDMhEPlZ<4D23W9GXnF zZ^$)cl9G~B6?Rxj1#ADy1?YsqZ%KPUcKacWoog$YDCdT=v8_0G5VesugJ+T}Y4A0z zW(fPwZC)o{O-jo2LU8@}8#Cy5=*yh(3>m9mjozf=<c=|0_XAVjm~8P6=3_gcGcY`o{L|h`Wm8%>uGd09J^hQ$+CT~t`3>w`wX2K zKRs#S8}np~Z0Rcu7PASk^Nto1^F%QeQ~vee;8n)jHm$RG>iT?RiF9sKmhZJ*8EM7W zQVdA{9*7v}fX4$0B89kog>(!>+Ze8|zb3BXW3Sy_<+m2SKA)9gULxu(SZ6iaj4Vv5 zGl}Ei11!fM2T4zxmgm$o;IbPcUwUW%_{nC|6O%C-vCBndI8J>$elM}c73dMu13f6G zCmOxuX~yn>Il=SQW4IqHCO+*jnYkXrtWO&y*}XcRW_*;YyleHO&8y9hBT21U)}6)y)0qX~+4 zCk?BQ!x8o;t9P?ZY+OHwedbd4Lc!J3@z34w5MxlU6@Gto z{O46&=b8wmwPsI)IMzoIb!BNoN^m6VT)vZh_&f#~c0er&vNeKYf(%3f6X z1v&1fyqfmAN?N7{M?3*U)6?vLaY|zs-dK=W&`mZC?sB%YH!Yg+C38aJ+Zk`JBtB8{ zPlmh<;{;e47TwAQ!FCuN*KU?c$1(H_+TwFFV&Bx&9*^&L4w}4cTGD0qlu_c7*u~fb zi7-+*W{>qxI>JZXS(6K(D$2&GoE6A(dvJV96+hv5PSo!|Y$jn@i=}H?0l4O(OkG9ao<{E6-TBr&B1- znvQt|B_AjAQFczs(z}Y5TNN*QL{1l5?+l}zg$CU|=TWCOidiDD`Bvf_qn%v~4c%W= zw>orZqc*ltmr^xNhmZ1;jdA_r`=J+Oa(Uo}a|g*>C<;ho+V1E@#L4*6(=M+qkN!q} zV~a!WZ81W--#TvUttD6a!>*Gz7PxA=geVNYO4qH==`RFFlb9zw&+jKQhuw# z_I_WRF0q^1&v|9>TcpAMNJ5vh>BGr^7pS;L>)OxKWfLeyU%8nWKRV6z8DeG%^IT^; zAoV@r<36bQHk6j2IuBCsgTP*(kGzP9Gr=FeAgK&aN8~c2`0wu2O6&W1l{@xZkIBBG z%rfZfu%Rq(5r6;aof*GTS8hFF*QFaX@n%#<6=!4=C?cCL>rv^Z_99e_cr%(UdbVY) zIlkXbRqQb1-B2Avl3Z;#+vQ!OJCyPv1qCp(p7eLceFnorZ;tbAiw10zHrxhKsTxjz z0|>sSDG5tNm2&>V`mS)iGgQnAC1^q)T}MJ!w05s4z)yMATp9*l>eM`?@EMVLO3!1# zD(@r>zc#jxH@1QoCgNrnTv1fBK@SS3HsAJ2{xF?&K_9kSyEF=sVBn^QKsBZ!EOqLi z;+@>>LKfe2Iql&CxZ@g{40rq`hz#1_dSl%U;+U>_*{_f%aoX^Ynp;+)rIA^pr0d1UtZM(0| zjWdbhb~FbS1Ht8r*_r0&fsV;53=%YPqP}sp#Cc(NTRN@k%G^8;znzWVO&h-dNJm$C zvf_o;F2S!TeZD*oEooO{_MK|`d{eT%5yMB?9pnSa0y)!<%`F+r*2kbEWLo&HU-hnD zOcyvzzf{IF_Uu0nD!PM-`_e6NI(H50D$?&4u%jp=Cn#02^Q852wS!6R`@rn)JQp;- zsD(i&cs+^vUsHBJ zK2gxYrVBIFtln}ckx}K0m9x5^;4Eo0C)EF#gn+%ypVo-1D2LgkZ)LQ+dh=!-^=3j= zdbs5nx5Lu=v(%_dskl=*f&u<={POo83fwD+8LCB2FHhfQf}F=0V!*Q}X zvf&yW(pN^BgL=>0r5JC~;42;&Fwfb-2te>BkYX@+2>$?kLbFqI%to^3j_VBrZ(X|z zANq=;?^7qP@M&0jP3dflnnf}*uFNQwp$RTFXcI4%aha>z2}&MKf*Ef+EnJaDM*{%; zYKi&wsyE@%Hc#uIEPDQH3Rs8kL19bYe~faC80S50i=yQmMJKBT23*%0(8X!H%@XZ( z1O_w8$_k_#Ey-ku6@0BPDD%1e^cz?PYLbL<_-XxBR32)R64$&OGxxpYcY0^X^>e}v zoe8p+R}yvC^+8TKr$L&}2ckR7R~o6y3a_)Vh)}Hyy(M{2i%$}*KXPzZxi!W4;p+zj zOWoXZ7l<5^Cq&Af?b=!K*{KPePx2GtO)6Z+O|BD-o~nB>_gQYSR;c5n{CAyN!5mLi zNqwY!NJJl1OpNb`d&g5QRimxTIo^mpnS5lqab&r%^UVh9*?MvHQJf5S@=tefVY_LP zS0wgkwOcQ(H%_ZWSd)$5=s8X?;t2`kQ8DzDoCI8wGV1h7H+=9UyvF zH7<1|9z2d=L?Re4Ut)LKh*Z7Nh`5>%&bI-b_?OHU)~&sovN4-dQ)dsiFDmzkE@r&p znM+$|BI-$UBvLM8so+e%1hAa5mJ}E&Z2fo3gHbqZG!vryRI+||&hzxkENSFPj?UA& z%ZP{9NlCc`1a_-NnKOT|OG(jnid-il;Sdpdo+GbP62LEo&=p`e$#{>LaKP>jicX7! zN3pa=nQ~g#CHMWr5cj2vCzXr7PbnqjGj4TI1aTD`R(P)*ztC$x#H@Zj#GK%XubMzV z9niwfCfR++6Nc(GSDV_20$dGc#MNx#&wlA2h`eEzPdJ(*AsI`NZiz2G(-Nr}xa+lK zX&nIP>sw#n zY?|iwbgsiaW^wK!@_#pzD`)!bT(1c`WFKbZso6Q*M|@Xu02 z_S+Jbl4AbX0A%w?@x#TBzJKc2;(FF@D5Pt07uac*`)jin;mQ&}{nDYG&o{-ZQa{S+ zgwkCNOE+{R>lC5(4ZrtggTkL9Hz5tP+W5Y29VBgMYvic@#|x~0;A-o~x4WEb-9H~) zkA!9nW_I||PI$Q(hBwQ`?tOJHMJ%Uo3`ib5-(z*Nx*r1o8K16pihM08=@E(I61|cm znk12St5d}P!u+35SRd!Q?6B@4uHFtjU1%rNq@-w@w$yvSmX5AHRB~xA>PRYimO1k` z2-BAc+Fw?)m^>$sjb@bdj;(Q=qok((xy3G0ax`XL>ALlURmN-AyCnJ9A4DR^ zCKte0q?$^D6crnh@lhw?^wcWeRmhS>-Rv+-VQ*u z;+WHhC;OV~4@f#c14AwD-2F$+B**;6&S_5~t2vy4JAU~!{YWlhFSyTJ@ryGt8^^tn z*w|Q^KmZCo2xY!Caq`2KEG}OefU1pN7&m%NbVC1Zqyt2mtZ`vv+3$9fq#)T~ete|e zlr2K7*An{L6T3gl43LtiD)>~>J@1Ed?%RJCiR!&OA2)Km{LwMC4Q)LgWtKd19saHq z5<&-&$8nSkrV!)T5q&9#bJW*S|- zAp;@)gqyY{0}gHM=fA3qa6(=`@V^$)391TPaI(3~A~x86ihWc~KYis3 zisWuZn*B|F_}dbQJs3z;r2v)zWWD?@cO@kB+422a6V^BJ?}l^tZX5@b0nNNjJoYF? znZBSzuG`Za6@0FDb_6I%#F+=6#kE`VkYE6iXVd$4q4U_*FD*}99UWyXW=^=SIeG9(}17PUT(83xZhBkiDLDqPS;hO3L3(#NGRb?d1=4bCWor1C%hmVkIT+r+d z)GxJywYwc`K|9Y}*D-(;ISge6%xXHi#}6I^sDi`qQDOBCEGHA`EsLup_A~(uVTRf` z$entaMRPJ~;84*8N=i@VX8RTN4^gwRxt;l_`lZWwM*R9^m#(?#!^A>yA z=bT2{Ob5+BgAy`=zB*b8OO{8sXdR)RLJ$Z+)?3(=tuA}%{Om&9s!$DZf7Mf?3af+UnogO$@$ zz+lIC`5gf2Xf-ti2*5-SBfrjPDXR`}xb?k>m&N1#lAx3D{jdJDnstAqTQH?~i2DyvzR**1bhp60!Kq;(7A z2<3=u@+%pB|HBsGyAUyt0xC+Hv`oyj-B#&gA#E6NR@04Qn{$v~MI~VCQAn#C=B*HDDG}4~$`@xrCI@-5N&69_iz|E3CgDYLr)?asIUzhl{5=tf+Z83xo_et(#l~wscW&-B zNoG@Dz(R2?kAr}GsyfjB4=^8oPv=-UwgjZILi<{|pZj*Y0BFfWM)b9kB?^zNu|6U( zEHuAL~E@$mSAa(_O1!A;-tWjkBK<%Ht5KCV#m!S_z^PGAlamUQM4Kc1?t&sKf zn)v=uV0mQohMblec^2K1Nxd@_CN1-q4{cif8^bTWXjYt=H)r!Y$*oK3h<89VHQzJ3 zQ;yjUb)!hYU!{n^yHHXz_M zG;aNV|LRq8An*$SpfuCMM-kCerrybhPZhwmOL z^J^Qg(jOeYqy+hWNR;wj+-RVYkbSQGOiBAJ#?S1J#EP@-mAtrq^Ja$#$v;I40s_S& zThV)aE~tBYw=_Jh#8QDcxelPJvc9U`R3wRKPJ6aFp%oi1_AyE@aq*lXKaeVwzBM&! znKw5#niZTJNa0dbW4`S(cTJ2a%Y<645Gm!MExaCx&1zGANiT9imb*xrHOLAZE0%#Y3S!0?Gm(1*LbNTH36m3&W7Pix#zYT z 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 XNvyzkp-GHSoB)KbkxrqO?fw4)Y4q{> diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic1.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic1.png deleted file mode 100644 index be885fae48e401ba5e5e96a3d07339be77ce4a20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21966 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 WJKpTJqyBFQcqgqWRr=Z};Qs*(r5D}+ diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic11.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic11.png deleted file mode 100644 index 45885f62f77383dffb0d1bd05dda6c7ca596e7f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17110 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Π3JT-?*2V{>bNC+j6wn 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 diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic13.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic13.png deleted file mode 100644 index a04dffaf9b44a95edcb4ef7c8e1f4714c35afb2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25567 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 {&`l9m8MrUmvX&{yt4BsPGH8= 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 NYHVRtZE*GO{{YBUn3@0p diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic14.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic14.png deleted file mode 100644 index aed1ee1f6a05fc1da66e66416c20b7542b773688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15916 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 diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic1a.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic1a.png deleted file mode 100644 index f7104b72cf7d36c3ee3b1b5a954ceed573a01ad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20037 zcma%jbzD?iyFVS0(jgMU&@pt1fb;+g2m;bE3@I($Ee$fXhzwltKs z*w#0^Z}`5Xqo5ut;VH(*M%$_iq6sAi-xpqF6489%R(C%}-==<};Bm>w#@VR3u5XF^ zwy)7erWQ2kJ9NZmyZBsZq*={hdiLTpyV(Dw`IBr3my=V00$DMqjkD;~iqnTE0qa!H zA>H?V7x#SUMwhcM=*gtc98dz-pEtr^cy3G}AEKd{kZ_V{X(TZEy=>oU^EVN#-`te@ zx$0Pb8pY~P2#+M(%G@KU{#l^(+@d*O;4BQ!e*t;*_#*CRIg7ymdR0;5+-hOzhxE<2 z?q9z7GGCGy^$=^}ceZ1~yYSZX1 z_={4HB!R}H#H@mf1nt9DBj(WvWuN2*WrOv*(J?uF^JY;uU%3~ITO7V$x2e{y*Dmbe zyjx9sOKF2+f3ny*fVBCpNCPi>NQOSpv4x`S|=hye8x1)*su+;tl1jA%`B5^hW@bd&GOT^A3{$mhRI2T zPU!uojnd@Pm2mkqBZTN?OS9`d`ilJSaKB}KSTwO|1KDF&KxO4dZbQkq+;5a0W=bXaF!J_qIc zLhoLEZwPO`2g6a;T+_z2z`47^Ur$x|AP1NdbBH#z_?^yeqD+gwmcYjQqASL@){*lpukwP?#4!E!1&V^w#eG>-4Fh! zjQ%8$m*PCME8@`;NG=QZnp)lDSu^pK+K zTLBW7l;C&GZ(wZFn|TsJWc$7y!d=cSQ$~%HK#o*G;1ZB*9uj5xP3JA2NI1qS;;fYU zC|X(Y=yOigW(?Y_sU4MC57U8K+e{8wnt51%?YUX^AWf2C zBTz+qp>(-a7{3~(`EWfj*3QZ_ss|}!C?p_y65@`WPOl!J+HEGLUs3T_(Bhnplo8LO z7b>0$-=v;#6SkGr$l31gtYIMSWF|Z}cGswjrg!YQrdz#v?d#DOLMkEg(RNZ0Zwc4@ z>(r%SdAVbLLkx)DH$@`BU8ENGm)+MLiPEBAvkV)x0!`$p>evtb+S&m|tg&^Q{;Pt7 z@^k{cEJpDgM!84G!LG}xK9^!hq8tysPp9VB{&>=?h9B8o2?R>WF#*#9SBN6Fq4a=u zCNNz8C3l}pF(c{&C13Mxy#tVel$W-Kwd11oI&UH4tQDTX999IoMX1Tmaku{&0goVE z>T>iZ{)BlCCI6EBb|=PE#xHoo$UC()8aIn4wEN8BUF2S;a3|afM4=BHG-} z^Z$t{wTT z>g5j$bv)*t3b+Vvujt*8gQYOFX^Na2tyG6qw6a-m3K2hGn?@iwvm2*#MK$Qwq z(7t3�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 z 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 W#Gsn5+|t*K9^ZKHF5h|V`~L;k5R9P! diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic3.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic3.png deleted file mode 100644 index b39e0062f3adf3e7da3eb7160978015ac7fec358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108519 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%0A2>em#l(P)kEa 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 E8%c8``2YX_ diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic3a.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic3a.png deleted file mode 100644 index 759b20c052a7c4c5dd915294469bcc42fbec9b4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91852 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 z 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�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�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

      w6AhCfQC_ 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 diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic5.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic5.png deleted file mode 100644 index c0cd20bda282ea725186e49fd18334f2ca926b07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55216 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

      wAd(FnYzP~kkG^`al=jMazZ=H(}NZq9I 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 IOLrgtKVSin+yDRo diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic6.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic6.png deleted file mode 100644 index 88e132ce523a4cca73626865d0b585809612929e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25521 zcmce-2UJsQw=Rq#T?7%NNeAg5NKp`w-lR9F0qI@ogr

      UZqR#L_!Y`M3i2nh9X6g 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 E57w08VE_OC diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic7.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic7.png deleted file mode 100644 index 70cb4a9f2000873c4e9837e5aad2ba45baaaa174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50610 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 diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic8.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/pic8.png deleted file mode 100644 index 10e05e2e143a62d8f33fd9fdd89c130e8a7f74c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11103 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 Z13FXxdnj9o_rl*B<)oA(OT`Vp{vUBW@zMYQ diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/project1.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/project1.png deleted file mode 100644 index b5d59a4daf37f0f2650209fadf8f0393bb2c9c5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14994 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 diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/project2.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/project2.png deleted file mode 100644 index d397711c1ca3f733452cec827e27af18496b14a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25541 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 diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/images/worktable.png b/javascriptv3/example_code/cross-services/ddb-item-tracker/images/worktable.png deleted file mode 100644 index 46c83fd84865f3f58597a4d87d35b76fed1fb8bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65117 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%0A#QsYGk=AXhbUjO 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 N%1J9p6$8@Pe*l_*<&6LU diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/package.json b/javascriptv3/example_code/cross-services/ddb-item-tracker/package.json deleted file mode 100644 index c704628fc0e..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "@aws-doc-sdk-examples/example-cross-item-tracker", - "version": "1.0.0", - "description": "", - "main": "app.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "node server.js" - }, - "dependencies": { - "@aws-sdk/client-cognito-identity": "^3.32.0", - "@aws-sdk/client-dynamodb": "^3.32.0", - "@aws-sdk/client-ses": "^3.32.0", - "@aws-sdk/client-s3": "^3.32.0", - "@aws-sdk/credential-provider-cognito-identity": "^3.32.0", - "@aws-sdk/lib-dynamodb": "^3.32.0", - "body-parser": "^1.19.0", - "express": "^4.17.1", - "jest": "^26.6.3", - "node-uuid": "^1.4.8", - "uuid": "^8.1.0" - }, - "author": "", - "license": "Apache 2.0", - "type": "module", - "devDependencies": { - "prettier": "2.5.1" - } -} diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/add.html b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/add.html deleted file mode 100644 index e17ff1abff7..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/add.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - Modify Items - - - - - - - - - - - - - - - - -

      -
      -

      Welcome to Amazon DynamoDB Item Tracker

      -

      - Add new items by filling in this table and clicking Create Item -

      - -
      -
      -
      -
      -
      - - -

      -
      -
      -
      -
      - - -

      -
      -
      -
      -
      - - -

      -
      -
      -
      -
      - -
      -
      -
      - - - - diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/button.css b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/button.css deleted file mode 100644 index dc7a8a7618a..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/button.css +++ /dev/null @@ -1,136 +0,0 @@ -button.shiny-blue { - background-color: #759ae9; - background-image: -webkit-gradient( - linear, - left top, - left bottom, - color-stop(0%, #759ae9), - color-stop(50%, #376fe0), - color-stop(50%, #1a5ad9), - color-stop(100%, #2463de) - ); - background-image: -webkit-linear-gradient( - top, - #759ae9 0%, - #376fe0 50%, - #1a5ad9 50%, - #2463de 100% - ); - background-image: -moz-linear-gradient( - top, - #759ae9 0%, - #376fe0 50%, - #1a5ad9 50%, - #2463de 100% - ); - background-image: -ms-linear-gradient( - top, - #759ae9 0%, - #376fe0 50%, - #1a5ad9 50%, - #2463de 100% - ); - background-image: -o-linear-gradient( - top, - #759ae9 0%, - #376fe0 50%, - #1a5ad9 50%, - #2463de 100% - ); - background-image: linear-gradient( - top, - #759ae9 0%, - #376fe0 50%, - #1a5ad9 50%, - #2463de 100% - ); - - border-top: 1px solid #1f58cc; - border-right: 1px solid #1b4db3; - border-bottom: 1px solid #174299; - border-left: 1px solid #1b4db3; - border-radius: 4px; - - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -webkit-box-shadow: inset 0 0 2px 0 rgba(57, 140, 255, 0.8); - -moz-box-shadow: inset 0 0 2px 0 rgba(57, 140, 255, 0.8); - - box-shadow: inset 0 0 2px 0 rgba(57, 140, 255, 0.8); - color: #fff; - font: - bold 12px "helvetica neue", - helvetica, - arial, - sans-serif; - padding: 7px 0; - text-shadow: 0 -1px 1px #1a5ad9; - width: 150px; -} - -button.shiny-blue:hover { - background-color: #5d89e8; - background-image: -webkit-gradient( - linear, - left top, - left bottom, - color-stop(0%, #5d89e8), - color-stop(50%, #2261e0), - color-stop(50%, #044bd9), - color-stop(100%, #0d53de) - ); - background-image: -webkit-linear-gradient( - top, - #5d89e8 0%, - #2261e0 50%, - #044bd9 50%, - #0d53de 100% - ); - background-image: -moz-linear-gradient( - top, - #5d89e8 0%, - #2261e0 50%, - #044bd9 50%, - #0d53de 100% - ); - background-image: -ms-linear-gradient( - top, - #5d89e8 0%, - #2261e0 50%, - #044bd9 50%, - #0d53de 100% - ); - background-image: -o-linear-gradient( - top, - #5d89e8 0%, - #2261e0 50%, - #044bd9 50%, - #0d53de 100% - ); - background-image: linear-gradient( - top, - #5d89e8 0%, - #2261e0 50%, - #044bd9 50%, - #0d53de 100% - ); - - cursor: pointer; -} - -button.shiny-blue:active { - border-top: 1px solid #1b4db3; - border-right: 1px solid #174299; - border-bottom: 1px solid #133780; - border-left: 1px solid #174299; - - box-shadow: - inset 0 0 5px 2px #1a47a0, - 0 1px 0 #eeeeee; - -webkit-box-shadow: - inset 0 0 5px 2px #1a47a0, - 0 1px 0 #eeeeee; - -moz-box-shadow: - inset 0 0 5px 2px #1a47a0, - 0 1px 0 #eeeeee; -} diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/col.css b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/col.css deleted file mode 100644 index 2d172226c15..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/col.css +++ /dev/null @@ -1,43 +0,0 @@ -#container { - width: 1300px; - margin: 0 auto; -} - -#primary { - float: left; - width: 500px; - height: 1100px; - background-color: #d3d3d3; -} - -#proside { - float: left; - width: 700px; - height: 800px; - background-color: #f8f8f8; -} - -#procontent { - float: left; - width: 800px; - height: 800px; - background-color: #ff0000; -} - -#content { - float: left; - width: 800px; - height: 800px; - background-color: #d3d3d3; -} - -#secondary { - float: left; - width: 300px; - height: 450px; - background-color: #d3d3d3; -} - -#footer { - clear: both; -} diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/common.css b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/common.css deleted file mode 100644 index 6a894201df9..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/common.css +++ /dev/null @@ -1,48 +0,0 @@ -body { - padding-top: 40px; - padding-bottom: 40px; - background-color: #eee; -} - -.form-signin { - max-width: 330px; - padding: 15px; - margin: 0 auto; -} - -.form-signin .form-signin-heading, -.form-signin .checkbox { - margin-bottom: 10px; -} - -.form-signin .checkbox { - font-weight: normal; -} - -.form-signin .form-control { - position: relative; - height: auto; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 10px; - font-size: 16px; -} - -.form-signin .form-control:focus { - z-index: 2; -} - -.form-signin input { - margin-top: 10px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.form-signin button { - margin-top: 10px; -} - -.has-error { - color: red; -} diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/styles.css b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/styles.css deleted file mode 100644 index ffd74ad014d..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/css/styles.css +++ /dev/null @@ -1,29 +0,0 @@ -body > header { - background: #000; - padding: 5px; -} - -body > header > a > img, -body > header a { - display: inline-block; - vertical-align: middle; - padding: 0px 5px; - font-size: 1.2em; -} - -body > footer { - background: #eee; - padding: 5px; - margin: 10px 0; - text-align: center; -} - -#logged-in-info { - float: right; - margin-top: 18px; -} - -#logged-in-info form { - display: inline-block; - margin-right: 10px; -} diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/dynamoAppHelperFiles/create-table.js b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/dynamoAppHelperFiles/create-table.js deleted file mode 100644 index 2044479310f..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/dynamoAppHelperFiles/create-table.js +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/cross-service-example-dataupload.html. - -Purpose: -update-table.js is part of a tutorial demonstrating how to build an Amazon DynamoDB item tracker app. -update-table.js creates and updates an Amazon DynamoDB table. - -Inputs (replace in code): -- TABLE_NAME - -Running the code: -node create-table.js - */ -// snippet-start:[cross-service.JavaScript.ddb-item-tracker.createTable] -// Import required AWS SDK clients and commands for Node.js -import { CreateTableCommand } from "@aws-sdk/client-dynamodb"; -import { dynamoClient } from "../libs/dynamoClient.js"; - -const TABLE_NAME = "TABLE_NAME"; // For example, "Work". - -export const createTable = async () => { - try { - // Set the table parameters. - const tableParams = { - AttributeDefinitions: [ - { - AttributeName: "id", - AttributeType: "S", - }, - ], - KeySchema: [ - { - AttributeName: "id", - KeyType: "HASH", - }, - ], - ProvisionedThroughput: { - ReadCapacityUnits: 5, - WriteCapacityUnits: 5, - }, - TableName: TABLE_NAME, - }; - await dynamoClient.send(new CreateTableCommand(tableParams)); - console.log("Success. Table created."); - } catch (err) { - console.error("Error", err); - } -}; -createTable(); -// snippet-end:[cross-service.JavaScript.ddb-item-tracker.createTable] diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/index.html b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/index.html deleted file mode 100644 index f71b60a689d..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/index.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - Modify Items - - - - - - - - - - - - - - - - - -
      -

      Amazon DynamoDB Item Tracker

      - -

      - The Amazon DynamoDB Item Tracker sample application uses multiple AWS - Services and the JavaScript V3 API. Collecting and working with items - has never been easier! Simply perform these steps: -

      -

      - -
        -
      1. - Enter work items into the system by choosing the Add Items menu - item. Fill in the form and then choose Create Item. -
      2. -
      3. - The Item Tracker application stores the data into a DynamoDB table by - using the DynamoDB JavaScript V3 API. -
      4. -
      5. - You can view all of your items by choosing the Get Items menu - item. Next, choose Get Active Items in the dialog box. -
      6. -
      7. - You can modify an Active Item by selecting an item in the table and - then choosing Get Single Item. The item appears in the Modify - Item section where you can modify the description or status. -
      8. -
      9. - Modify the item and then choose Update Item. You cannot modify - the ID value. -
      10. -
      11. - You can send an email recipient an email message with a report - attachment by selecting the email recipient from the dialog box and - then choosing Send Report. -
      12. -
      13. - The Amazon Simple Email Service is used to send an email with an Excel - document to the selected email recipient. -
      14. -
      -
      - - - diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/items.html b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/items.html deleted file mode 100644 index d0572703bb4..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/items.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - Modify Items - - - - - - - - - - - - - - - - - - -
      -

      Welcome to Amazon DynamoDB Item Tracker

      -

      Get Items

      -

      You can manage items in this view.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -
      Item IdGuideDate CreatedDescriptionStatus
      No DataNo DataNo DataNo DataNo Data
      Item IdGuideDate CreatedDescriptionStatus
      -
      -
      -
      -

      Modify an Item

      -

      You can modify items.

      - -
      -
      -
      - - -

      -
      -
      -
      -
      - - -

      -
      -
      -
      -
      - - -

      -
      -
      -
      -
      -
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -

      Options:

      -
      -

      Select Manager:

      -
      - -
      - -
      - -
      - -
      - -
      -
      - - - - - - diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/js/items.js b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/js/items.js deleted file mode 100644 index 76698905aea..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/js/items.js +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -// snippet-start:[cross-service.JavaScript.ddb-item-tracker.items] - -$(function () { - $("#dialogtemplate2").dialog(); - $("#myTable tbody").on("click", "tr", function () { - $("#myTable").DataTable().$("tr.selected").removeClass("selected"); - $(this).addClass("selected"); - console.log("Selected"); - }); - // Enable the buttons. - $("#singlebutton").prop("disabled", true); - $("#updatebutton").prop("disabled", true); - $("#reportbutton").prop("disabled", true); - $("#reportbutton").css("color", "#0d010d"); - $("#singlebutton").css("color", "#0d010d"); - $("#updatebutton").css("color", "#0d010d"); -}); - -// Populate the table with work items. -function GetItems() { - $.ajax("/request", { - type: "POST", - success: function (data) { - console.log("it works"); - console.log("data.Items", data.Items); - - // Enable the buttons. - $("#singlebutton").prop("disabled", false); - $("#updatebutton").prop("disabled", false); - $("#reportbutton").prop("disabled", false); - $("#reportbutton").css("color", "#FFFFFF"); - $("#singlebutton").css("color", "#FFFFFF"); - $("#updatebutton").css("color", "#FFFFFF"); - - $("#myTable").dataTable({ - bAutoWidth: false, - aaData: data.Items, - bDestroy: true, - columns: [ - { - data: "id", - }, - { - data: "guide", - }, - { - data: "date", - }, - { - data: "description", - }, - { - data: "status", - }, - ], - }); - document.getElementById("info3").innerHTML = "Active Items"; - }, - error: function (_jqXhr, _textStatus, errorMessage) { - $("p").append("Error" + errorMessage); - }, - }); -} - -/** - * Used in ../items.html - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars -function Report() { - // Get the email address. - const e = document.getElementById("manager"); - const email = e.options[e.selectedIndex].text; - - $.ajax("/request", { - type: "POST", - success: function (data) { - const noOfItems = data.Items.length; - var csv = "Item, Guide, Date Created, Description, Status,\n"; - var i; - for (i = 0; i < noOfItems; i++) { - csv += '"' + data.Items[i].id + '",'; - csv += '"' + data.Items[i].guide + '",'; - csv += '"' + data.Items[i].date + '",'; - csv += '"' + data.Items[i].description + '"'; - csv += '"' + data.Items[i].status + '"'; - csv += "\n"; - } - console.log("csv", csv); - - // Merge the data with CSV. - - // Upload the CSV file to Amazon S3. - $.ajax("/uploadCSV", { - type: "POST", - data: { csv: csv, email: email }, - success: function () { - alert("Email message sent."); - }, - }); - }, - error: function (jqXhr, textStatus, errorMessage) { - $("p").append("Error" + errorMessage); - }, - }); -} - -/** - * Used in ../items.html - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars -function UpdateItem() { - $("#modform").show(); - const id = document.getElementById("id").value; - const description = document.getElementById("description").value; - const status = document.getElementById("status").value; - - if (id == "") { - alert("Please select an item from the table"); - return; - } - - if (description.length > 350) { - alert("Description has too many characters"); - return; - } - - if (status.length > 350) { - alert("Status has too many characters"); - return; - } - - $.ajax("/changewi", { - type: "POST", - data: "id=" + id + "&description=" + description + "&status=" + status, - success: function (data) { - alert("You have successfully modified the item."); - console.log("modified", data.id); - - $("#id").val(""); - $("#description").val(""); - $("#status").val(""); - - //Refresh the grid. - GetItems(); - $("#modform").hide(); - }, - error: function (_jqXhr, _textStatus, errorMessage) { - $("p").append("Error" + errorMessage); - }, - }); -} -/** - * Used in ../items.html - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars -function GetSingleItem() { - if (!document.getElementsByClassName("selected").length) { - alert("Please select an item from the table"); - return; - } - const id = - document.getElementsByClassName("selected")[0].childNodes[0].innerHTML; - document.getElementById("id").value = id; - const description = - document.getElementsByClassName("selected")[0].childNodes[4].innerHTML; - document.getElementById("description").value = description; - const status = - document.getElementsByClassName("selected")[0].childNodes[3].innerHTML; - document.getElementById("status").value = status; - $("#modform").show(); -} - -/** - * Used in ../items.html - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars -function addItem() { - const guide = document.getElementById("guide").value; - const description = document.getElementById("description").value; - const status = document.getElementById("status").value; - - //var description = $("textarea#description").val(); - if (description.length > 350) { - alert("Description has too many characters"); - return; - } - if (description.length == 0) { - alert("Enter a description."); - return; - } - if (guide.length == 0) { - alert("Enter a guide."); - return; - } - if (status.length == 0) { - alert("Enter a status."); - return; - } - //var status = $("textarea#status").val(); - if (status.length > 350) { - alert("Status has too many characters"); - return; - } - - $.ajax("/add", { - type: "POST", // http GET method - data: - "guide=" + guide + "&description=" + description + "&status=" + status, - success: function () { - alert("You have successfully added the item."); - console.log("You have successfully added the item."); - location.reload(); - }, - error: function (_jqXhr, _textStatus, errorMessage) { - console.log("An error!"); - $("p").append("Error" + errorMessage); - }, - }); -} - -// snippet-end:[cross-service.JavaScript.ddb-item-tracker.items] diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/ddbDocClient.js b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/ddbDocClient.js deleted file mode 100644 index c2ac49f4d7f..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/ddbDocClient.js +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/dynamodb-examples.html. - -Purpose: -ddbDocClient.js is a helper function that creates an Amazon DynamoDB service document client. - -INPUTS: -- REGION - -*/ -// snippet-start:[cross-service.JavaScript.ddb-item-tracker.ddbDocClient] -// Create service client module using ES6 syntax. -import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"; -import { dynamoClient } from "./dynamoClient.js"; - -const marshallOptions = { - // Whether to automatically convert empty strings, blobs, and sets to `null`. - convertEmptyValues: false, // false, by default. - // Whether to remove undefined values while marshalling. - removeUndefinedValues: false, // false, by default. - // Whether to convert typeof object to map attribute. - convertClassInstanceToMap: false, // false, by default. -}; - -const unmarshallOptions = { - // Whether to return numbers as a string instead of converting them to native JavaScript numbers. - wrapNumbers: false, // false, by default. -}; - -const translateConfig = { marshallOptions, unmarshallOptions }; - -// Create the DynamoDB Document client. -const ddbDocClient = DynamoDBDocumentClient.from(dynamoClient, translateConfig); - -export { ddbDocClient }; -// snippet-end:[cross-service.JavaScript.ddb-item-tracker.ddbDocClient] diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/dynamoClient.js b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/dynamoClient.js deleted file mode 100644 index eb2b82ffcfb..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/dynamoClient.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/cross-service-example-dataupload.html. - -Purpose: -dynamoClient.js is a helper function that creates the Amazon DynamoDB service clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[cross-service.JavaScript.ddb-item-tracker.dynamoClient] - -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon DynamoDB service client object. -const dynamoClient = new DynamoDBClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { dynamoClient }; -// snippet-end:[cross-service.JavaScript.ddb-item-tracker.dynamoClient] diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/s3Client.js b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/s3Client.js deleted file mode 100644 index d9b603b9faf..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/s3Client.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/cross-service-example-dataupload.html. - -Purpose: -s3Client.js is a helper function that creates the Amazon Simple Storage Service (Amazon S3) service clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[cross-service.JavaScript.ddb-item-tracker.s3Client] - -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { S3Client } from "@aws-sdk/client-s3"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon S3 service client object. -const s3Client = new S3Client({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { s3Client }; -// snippet-end:[cross-service.JavaScript.ddb-item-tracker.s3Client] diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/sesClient.js b/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/sesClient.js deleted file mode 100644 index fe00f3a1317..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/public/libs/sesClient.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/cross-service-example-dataupload.html. - -Purpose: -sesClient.js is a helper function that creates the Amazon Simple Email Service (Amazon SES) service clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[cross-service.JavaScript.ddb-item-tracker.sesClient] - -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { SESClient } from "@aws-sdk/client-ses"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon Comprehend service client object. -const sesClient = new SESClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { sesClient, REGION }; -// snippet-end:[cross-service.JavaScript.ddb-item-tracker.sesClient] diff --git a/javascriptv3/example_code/cross-services/ddb-item-tracker/setup.yaml b/javascriptv3/example_code/cross-services/ddb-item-tracker/setup.yaml deleted file mode 100644 index 9bc63cba8b8..00000000000 --- a/javascriptv3/example_code/cross-services/ddb-item-tracker/setup.yaml +++ /dev/null @@ -1,186 +0,0 @@ -Resources: - mybucket160F8132: - Type: AWS::S3::Bucket - UpdateReplacePolicy: Delete - DeletionPolicy: Delete - Metadata: - aws:cdk:path: SetupStack/mybucket/Resource - table8235A42E: - Type: AWS::DynamoDB::Table - Properties: - KeySchema: - - AttributeName: id - KeyType: HASH - AttributeDefinitions: - - AttributeName: id - AttributeType: S - GlobalSecondaryIndexes: - - IndexName: idIndex - KeySchema: - - AttributeName: id - KeyType: HASH - Projection: - ProjectionType: ALL - ProvisionedThroughput: - ReadCapacityUnits: 5 - WriteCapacityUnits: 10 - ProvisionedThroughput: - ReadCapacityUnits: 10 - WriteCapacityUnits: 10 - TableName: Work - UpdateReplacePolicy: Delete - DeletionPolicy: Delete - Metadata: - aws:cdk:path: SetupStack/table/Resource - ExampleIdentityPool: - Type: AWS::Cognito::IdentityPool - Properties: - AllowUnauthenticatedIdentities: true - Metadata: - aws:cdk:path: SetupStack/ExampleIdentityPool - CognitoDefaultUnauthenticatedRoleABBF7267: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRoleWithWebIdentity - Condition: - StringEquals: - cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPool - ForAnyValue:StringLike: - cognito-identity.amazonaws.com:amr: unauthenticated - Effect: Allow - Principal: - Federated: cognito-identity.amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: SetupStack/CognitoDefaultUnauthenticatedRole/Resource - CognitoDefaultUnauthenticatedRoleDefaultPolicy2B700C08: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: - - mobileanalytics:PutEvents - - cognito-sync:* - Effect: Allow - Resource: "*" - - Action: ses:SendEmail - Effect: Allow - Resource: "*" - - Action: - - s3:PutObject - - s3:CreateBucket - Effect: Allow - Resource: "*" - - Action: - - dynamodb:PutItem - - dynamodb:UpdateItem - - dynamodb:Scan - Effect: Allow - Resource: "*" - Version: "2012-10-17" - PolicyName: CognitoDefaultUnauthenticatedRoleDefaultPolicy2B700C08 - Roles: - - Ref: CognitoDefaultUnauthenticatedRoleABBF7267 - Metadata: - aws:cdk:path: SetupStack/CognitoDefaultUnauthenticatedRole/DefaultPolicy/Resource - DefaultValid: - Type: AWS::Cognito::IdentityPoolRoleAttachment - Properties: - IdentityPoolId: - Ref: ExampleIdentityPool - Roles: - unauthenticated: - Fn::GetAtt: - - CognitoDefaultUnauthenticatedRoleABBF7267 - - Arn - Metadata: - aws:cdk:path: SetupStack/DefaultValid - CDKMetadata: - Type: AWS::CDK::Metadata - Properties: - Analytics: v2:deflate64:H4sIAAAAAAAA/12OzQrCMBCEn8X7uhoKgjd/Tp6U6gvEJGpsm5Vmo5SQdzdpL+JpZz5mhxEoqjUuZxv58XOlm0VU1BuMZ5aqgT05z31QDLXxFHplYH9zx8CvwEX90pzVli25BKUr+grjLqjGjMlJJdCDkx3pK8aLvLbj4ygSKLo7y4Qxo4M2ji0PJ6IW/nxNrdlynvfoMkxgZYexwHFQuSdqrRqKnVRKCRxpg0+/eIsVCoFi9vTWzvuQazuD9XS/fynOcA0BAAA= - Metadata: - aws:cdk:path: SetupStack/CDKMetadata/Default - Condition: CDKMetadataAvailable -Outputs: - TableName: - Value: - Ref: table8235A42E - Identitypoolid: - Value: - Ref: ExampleIdentityPool -Conditions: - CDKMetadataAvailable: - Fn::Or: - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - af-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-east-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ap-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ca-central-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-north-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-northwest-1 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - eu-central-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-north-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-south-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-2 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-3 - - Fn::Equals: - - Ref: AWS::Region - - me-south-1 - - Fn::Equals: - - Ref: AWS::Region - - sa-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-2 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - us-west-1 - - Fn::Equals: - - Ref: AWS::Region - - us-west-2 diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/README.md b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/README.md deleted file mode 100644 index c1c32406c63..00000000000 --- a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/README.md +++ /dev/null @@ -1,455 +0,0 @@ -# Creating an example AWS photo analyzer to detect images with Personal Protective Equipment - -You can create an application that uses Amazon Rekognition to detect personal protective equipment (PPE) -in images located in an Amazon Simple Storage Service (Amazon S3) bucket. - -![AWS Tracking Application](images/readme_images/dynamodb.png) - -In addition, the app stores the information in an Amazon DynamoDB table, and notifies a specified used by email -using the Amazon Simple Email (Amazon SES) service. - -This tutorial shows you how to use the AWS SDK for JavaScript V3 API to invoke these AWS services: - -- Amazon S3 service -- Amazon Rekognition service -- Amazon DynamoDB service -- Amazon SES service - -**Cost to complete**: The AWS services included in this document are included in the [AWS Free Tier](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc). - -**Note**: Be sure to terminate all of the resources after you have completed this tutorial to ensure that you are not charged. - -## Prerequisites - -To build this cross-service example, you need the following: - -- An AWS account. For more information see [AWS SDKs and Tools Reference Guide](https://docs.aws.amazon.com/sdkref/latest/guide/overview.html). -- A project environment to run this Node JavaScript example, and install the required AWS SDK for JavaScript and third-party modules. For instructions, see [Create a Node.js project environment](#create-a-nodejs-project-environment) on this page. -- At least one email address verified on Amazon SES. For instructions, see [Verifying an email address on Amazon SES](#verifying-an-email-address-on-amazon-ses). -- The following AWS resources: - An unauthenticated AWS Identity and Access Management (IAM) user role with required permissions (described below). - An Amazon DynamoDB table named **PPE** with a key named **id**. - **Note**: An unauthenticated role enables you to provide permissions to unauthenticated users to use the AWS Services. To create an authenticated role, see [Amazon Cognito Identity Pools (Federated Identities)](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html). - -## ⚠ Important - -- We recommend that you grant this code least privilege, or at most the minimum permissions required to perform the task. For more information, see [Grant Least Privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) in the _AWS Identity and Access Management User Guide_. -- This code has not been tested in all AWS Regions. Some AWS services are available only in specific [Regions](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). -- Running this code might result in charges to your AWS account. We recommend you destroy the resources when you are finished. For instructions, see [Destroying the resources](#destroying-the-resources). -- This tutorial is written to work with the specific versions defined in the _package.json_. If you change these versions, the tutorial may not work correctly. - -## Create the resources - -You can create the AWS resources required for this cross-service example using either of the following: - -- [The Amazon CloudFormation](#create-the-resources-using-amazon-cloudformation) -- [The AWS Management Console](#create-the-resources-using-the-aws-management-console) - -### Create the resources using Amazon CloudFormation - -To run the stack using the AWS CLI: - -1. Install and configure the AWS CLI following the instructions in the AWS CLI User Guide. - -2. Open the AWS Command Console from the _./photo-analyzer_ folder. - -3. Run the following command, replacing _STACK_NAME_ with a unique name for the stack. - -``` -aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM -``` - -**Important**: The stack name must be unique within an AWS Region and AWS account. You can specify up to 128 characters, and numbers and hyphens are allowed. - -4. Open [AWS CloudFormation in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the **Stacks** page. - -![ ](images/readme_images/cloud_formation_stacks.png) - -5. Choose the **Resources** tab. The **Physical ID** of the **IDENTITY_POOL_ID** you require for this cross-service example is displayed. - -![ ](images/readme_images/cloud_formation_resources_tab.png) - -For more information on the create-stack command parameters, see the [AWS CLI Command Reference guide](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html), and the [AWS CloudFormation User Guide](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html). - -### Create the resources using the AWS Management Console - -#### Create an unauthenticated user role - -1. Open [AWS Cognito in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the _Stacks_ page. -2. Choose **Manage Identity Pools**. -3. Choose **Create new identity pool**. -4. In the **Identity pool name** field, give your identity pool a name. -5. Select the **Enable access to unauthenticated identities** checkbox. -6. Choose **Create Pool**. -7. Choose **Allow**. -8. Take note of the **Identity pool ID**, which is highlighted in red in the **Get AWS Credentials** section. - -![ ](images/readme_images/identity_pool_ids.png) - -9.Choose **Edit identity pool**. 10. Take note of the name of the role in the **Unauthenticated role** field. - -#### Adding permissions to an unauthenticated user role - -1. Open [IAM in the AWS Management Console](https://aws.amazon.com/iam/), and open the _Roles_ page. -2. Search for the unauthenticated role you just created. -3. Open the role. -4. Click the down arrow beside the policy name. -5. Choose **Edit Policy**. -6. Choose the **JSON** tab. -7. Delete the existing content, and paste the code below into it. - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Action": [ - "lambda:InvokeFunction", - "mobileanalytics:PutEvents", - "cognito-sync:*" - ], - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "ses:*", - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "iam:*", - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "s3:*", - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "rekognition:*", - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "dynamodb:*", - "Resource": "*", - "Effect": "Allow" - } - ] -} -``` - -8. Choose **Review Policy**. -9. Choose **Save Changes**. - -### Verifying an email address on Amazon SES - -1. Open [AWS SES in the AWS Management Console](https://aws.amazon.com/SES/), and open the **Email Addresses** page. -2. Choose **Verify a New Email Address**. -3. Enter a working email address, and choose **Verify This Email Address**. -4. Open the email in your email application, and verify it. - -## Create a Node.js project environment - -1. Clone the [AWS Code Samples repo](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. - See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for - instructions. - -2. Run the following commands in sequence in the AWS CLI command line to install the AWS service client modules and third-party modules listed in the _package.json_: - -``` -npm install node -g -cd javascriptv3/example_code/cross-services/detect-ppe -npm install -``` - -## Building the code - -This app runs from the browser, so we create the interface using HTML and CSS. -The app uses JavaScript to provide basic interactive features, and Node.js to invoke the AWS Services. - -### Creating the HTML and CSS - -In **index.html**, the **head** section loads the **main.js**, which contains the following JavaScript and Node.js functions used in the app. - -**Note**: **main.js** is a bundled file containing all the required JavaScript. You'll create this later in the tutorial. - -The remaining code defines the interface features, including a table and buttons. - -```html - - - - - - - - - - - - AWS Personal Protective Equipment (PPE) photo analyzer - - - - - - -
      - -

      AWS Photo Analyzer Application

      -
      -
      -

      You can analyze photos in an Amazon S3 bucket for personal protective equipement (PPE). You can send the report to the following email address.

      -
      -
      - -
      -
      -

      Select the following button analyze the photos, and update the Amazon DynamoDB table with the results.

      - -
      -
      - - -``` - -### Creating the JavaScript - -The **./js/libs/** folders contains a file for each of the AWS Service clients required. You must -replace "REGION" with your AWS Region, and replace "IDENTITY_POOL_ID" with the Amazon Cognito identity pool id -you created in [Create the resources](#create-the-resources) on this page. Here's an example of one of these client configuration files: - -```javascript -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { RekognitionClient } from "@aws-sdk/client-rekognition"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an AWS Rekognition service client object. -const rekognitionClient = new RekognitionClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { rekognitionClient }; -``` - -In **./js/index.js**, you first import all the required AWS Service and third party modules, and set global parameters. - -```javascript -import { rekognitionClient } from "../libs/rekognitionClient.js"; -import { s3Client } from "../libs/s3Client.js"; -import { dynamoDBClient, REGION } from "../libs/dynamodbClient.js"; -import { sesClient } from "../libs/sesClient.js"; -import { SendEmailCommand } from "@aws-sdk/client-ses"; -import { ListObjectsCommand } from "@aws-sdk/client-s3"; -import { DetectProtectiveEquipmentCommand } from "@aws-sdk/client-rekognition"; -import { PutItemCommand } from "@aws-sdk/client-dynamodb"; - -const BUCKET = "S3_BUCKET_NAME"; -const TABLE = "DDB_TABLE_NAME"; -const FROM_EMAIL = "SENDER_EMAIL_ADDRESS"; -``` - -Next, you define functions for working with the table. - -```javascript -export const sendEmail = async () => { - // Helper function to send an email to user. - const TO_EMAIL = document.getElementById("email").value; - try { - // Set the parameters - const params = { - Destination: { - /* required */ - CcAddresses: [ - /* more items */ - ], - ToAddresses: [ - TO_EMAIL, //RECEIVER_ADDRESS - /* more To-email addresses */ - ], - }, - Message: { - /* required */ - Body: { - /* required */ - Html: { - Charset: "UTF-8", - Data: - "

      Hello!

      " + - "

      The Amazon DynamoDB table " + - TABLE + - " has been updated with PPE information here.

      ", - }, - }, - Subject: { - Charset: "UTF-8", - Data: "PPE image report ready.", - }, - }, - Source: FROM_EMAIL, - ReplyToAddresses: [ - /* more items */ - ], - }; - const data = await sesClient.send(new SendEmailCommand(params)); - alert("Success. Email sent."); - } catch (err) { - console.log("Error sending email. ", err); - } -}; - -export const processImages = async () => { - try { - const listPhotosParams = { - Bucket: BUCKET, - }; - // Retrieve list of objects in the Amazon S3 bucket. - const data = await s3Client.send(new ListObjectsCommand(listPhotosParams)); - console.log("Success, list of objects in bucket retrieved.", data); - - // Helper function to convert floating numbers to integers. - function float2int(value) { - return value | 0; - } - - // Loop through images to get the parameters for each. - for (let i = 0; i < data.Contents.length; i++) { - const key = data.Contents[i].Key; - - const imageParams = { - Image: { - S3Object: { - Bucket: BUCKET, - Name: key, - }, - }, - SummarizationAttributes: { - MinConfidence: float2int(50) /* required */, - RequiredEquipmentTypes: ["FACE_COVER", "HAND_COVER", "HEAD_COVER"], - }, - }; - const ppedata = await rekognitionClient.send( - new DetectProtectiveEquipmentCommand(imageParams), - ); - - // Parse the results using conditional nested loops. - const noOfPeople = ppedata.Persons.length; - for (let i = 0; i < noOfPeople; i++) { - if (ppedata.Persons[i].BodyParts[0].EquipmentDetections.length === 0) { - const noOfBodyParts = ppedata.Persons[i].BodyParts.length; - for (let j = 0; j < noOfBodyParts; j++) { - const bodypart = ppedata.Persons[i].BodyParts[j].Name; - const confidence = ppedata.Persons[i].BodyParts[j].Confidence; - var equipment = "Not identified"; - const val = Math.floor(1000 + Math.random() * 9000); - const id = val.toString() + ""; - const image = imageParams.Image.S3Object.Name; - const ppeParams = { - TableName: TABLE, - Item: { - id: { N: id + "" }, - bodyPart: { S: bodypart + "" }, - confidence: { S: confidence + "" }, - equipment: { S: equipment + "" }, - image: { S: image }, - }, - }; - const tableData = await dynamoDBClient.send( - new PutItemCommand(ppeParams), - ); - } - } else { - const noOfBodyParts = ppedata.Persons[i].BodyParts.length; - for (let j = 0; j < noOfBodyParts; j++) { - const bodypart = ppedata.Persons[i].BodyParts[j].Name; - const confidence = ppedata.Persons[i].BodyParts[j].Confidence; - var equipment = - ppedata.Persons[i].BodyParts[j].EquipmentDetections[0].Type; - const val = Math.floor(1000 + Math.random() * 9000); - const id = val.toString() + ""; - const image = imageParams.Image.S3Object.Name; - const ppeParams = { - TableName: TABLE, - Item: { - id: { N: id + "" }, - bodyPart: { S: bodypart + "" }, - confidence: { S: confidence + "" }, - equipment: { S: equipment + "" }, - image: { S: image }, - }, - }; - const tableData = await dynamoDBClient.send( - new PutItemCommand(ppeParams), - ); - } - } - } - } - alert("Images analyzed and table updated."); - } catch (err) { - console.log("Error analyzing images. ", err); - } - try { - sendEmail(); - } catch (err) { - alert("Error sending email"); - } -}; -// Expose the function to the browser. -window.processImages = processImages; -``` - -**Important**: You must bundle all the JavaScript and Node.js code required for the app into a single -file (**main.js**) to run the app. For instructions, see [Bundling the scripts](#bundling-the-scripts). - -### Bundling the scripts - -This is a static site consisting only of HTML, CSS, and client-side JavaScript. -However, a build step is required to enable the modules to work natively in the browser. - -To bundle the JavaScript and Node.js for this example in a single file named main.js, -enter the following commands in sequence in the AWS CLI command line: - -``` -cd javascriptv3/example_code/cross-services/photo-analyzer-ppe -webpack ./js/index.js --mode development --target web --devtool false -o ./js/main.js -``` - -## Run the app - -Open the index.html in your favorite browser, and follow the onscreen instructions. - -## Destroying the resources - -4. Open [AWS CloudFormation in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the _Stacks_ page. - -![ ](images/cloud_formation_stacks.png) - -5. Select the stack you created in [Create the resources](#create-the-resources) on this page. - -6. Choose **Delete**. - -**Note**: If any of the resources have been altered, you must manually delete them via the AWS Console. - -### Next steps - -Congratulations! You have created and deployed the AWS Photo Analyzer application. -For more AWS multiservice examples, see -[cross-services](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/cross-services). diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/helper_functions/js/upload-objects.js b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/helper_functions/js/upload-objects.js deleted file mode 100644 index fb578ed4bc4..00000000000 --- a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/helper_functions/js/upload-objects.js +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -s3_upload_multiple_objects.js uploads multiple files to an Amazon Simple Storage Service (Amazon S3) bucket. - -Inputs (replace in code): -- BUCKET_NAME -- PATH/OBJECT_1: Relative path and name of object. For example '../myFiles/index.js'. - -Running the code: -node s3_upload_multiple_objects.js - -[Outputs | Returns]: -Uploads multiple files to the specified bucket. - -*/ -// snippet-start:[s3.JavaScript.buckets.uploadMultipleObjectsV3] -// Import required AWS SDK clients and commands for Node.js. -const { PutObjectCommand } = require("@aws-sdk/client-s3"); -const { s3Client } = require("../../../ppe/libs/s3Client.js"); // Helper function that creates Amazon S3 service client module. -const fs = require("fs"); - -const BUCKET_NAME = "S3_BUCKET_NAME"; -const IMAGES = "OBJECT_PATH_AND_NAMES"; // For example, "../../images/lam.png", "../../images/doctor.png" - -const uploadMultipleObjects = async (uploadParams) => { - try { - const data = await s3Client.send(new PutObjectCommand(uploadParams)); - console.log("Success. Object(s) updloaded ", data); - } catch (err) { - console.log("Error", err); - } -}; -const run = async () => { - try { - // Array of relative path and name of object. For example ['images/lam.png', 'image/work', etc.] - const files = [IMAGES]; - for (var i = 0; i < files.length; i++) { - const file = files[i]; - const fileName = file.substring(file.lastIndexOf("/") + 1, file.length); - console.log(fileName); - const fileStream = fs.createReadStream(file); - console.log(fileStream); - const uploadParams = { - Bucket: BUCKET_NAME, - Key: fileName, - Body: fileStream, - }; - uploadMultipleObjects(uploadParams); - } - } catch (err) { - console.log("Error", err); - } -}; - -run(); -// snippet-end:[s3.JavaScript.buckets.uploadMultipleObjectsV3] diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/lam.png b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/lam.png deleted file mode 100644 index cde0ff5a3e537f8badec79a47d74f6d880c69006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6364 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 diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/IAMPerm.png b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/IAMPerm.png deleted file mode 100644 index 77d026d539cbb996922016f6773b0ff8661263d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31037 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 diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/classes.png b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/classes.png deleted file mode 100644 index c3d901bd5019199a326f917dbc0bc91e8ece39e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12757 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 LN)n}F#sU8WdD!#1 diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/classesA.png b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/classesA.png deleted file mode 100644 index a8a51f2a3d831f26338933b90e0c42a1b0b2e94f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10119 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 z%0D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 diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/cloud_formation_stacks.png b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/cloud_formation_stacks.png deleted file mode 100644 index 7b3d853b7a7d9ab1609b94b250daccfb0077f8c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43167 zcmc$_Wl&sC^frhD3m$?6_aw;RuEB$c1a~L6`wS4=H8><_2=4Cg!QBRT28V%RC;7eq zdfyMb-*#)eYUS63`j-c=O{8t?FU*Xm+rnbg#QD=mP&e~WwjQ$taG2M>;27#(vCr17w&n=GPN$d< z5U3I4r6fLkW*)El_>Nyc4?sdsmfY=H+&g1PLyS|^8J!tFpeOq(9Bk+&j2E;^??6wM zCvKMo3Ucuh^4rmAoCn|8rPoZd*H_UAIqNT*L!X@NYUp|_`Y(YkCl>R2-k`OjiM{6I zYp)KmGnFz%JD+VD+W!(yg1(!kxYU1%EeFX5|6huKGpf2uh=-3~toZY1nboprkWSs# zFCJgua%}GbfLMKe9}L`e&DAgQZxjRC!ou`4m+Eni9|op}hK7nye}}=5q;KDlO>-zp zIt|Lh3c-(lYa3envOCFX_m z%MaOJVB?il#ab)MUO39Q!PwDVYv_B$J0T2_+dNYKd6N1(I}m&z_I$n`eE)cB`1~to z7hdt-q~|vKW7pY?12Rewdw%{4-^|Qx>Rl~G)`w+eJjX;TKOeWP zO|{$Cr^^){9!Q7xiP`Z(4O~T^N;FveMa1GY*HS;o$Y{9n$p6>S?ccxW`YunYE^Rl@ zmU}#=noNZRJ!}VN02VGAs;{#I>$e7SG~nfnfQ}c2SSgk!bG`7;aF*7VDJdl)cO@Fr z^zNMw-q(kov5YE6N#*AT2EN$>gGV7-PWgp}8Xj(cYhjbGtB3&IW+4}QBmxdd(|UWe z@_`~Cg!<5ve1|i81lPlbnDrjpF7J_DrJ=#WeCZnMLLiI>4M)Za-i92|odfXEn!#qy z&f+9wY<7-vKCVmn(uzv(t}!kVm~ftBc@Dcs)Xa2vl3m~KQ7#^(gmN&y|Cvooi`3?G zyRjK6>olzd3tk4^n^UM40b}}1iu=>`gC+@7_?V03(}ISS?57 zGs#eB3UbK@W0ADAv762K1KlpWr{m-g4{X|UQQj{!@RaM%R%}2KM$NJn`@Dbl%BTou zjU~@?)SG_g{#3pV0A1ydsQ$oK7J@xtc>>E z&TAE6!C_u$&`O@K2nb&_@_UzrI4fNJ6C)0ah(>+C-RO%l3*mW%IlsPm^7gRoJ9N{k zuBmV?c{tx~xt*fFVS-&=18ha(0*3m!PbG&mGhMvDixfslmhwBkD!XQ({nVZz6m&i? zC&rdu?r}!hdb6Y;B}-*FSK7p)Tc41h|2hPlOmXCUSE+W*>C{W!7kGls^pYX#G8Jrg zkh)lg3oUchFMFg=(e9com&IDTo9=^V(e7!wWtT)lf)(dy`iJ2PE<+lzW>KCPO1GFw zrr!|{yAeyao%<&^mZRGm@+all5!rP2#T;H_L!vHK9T_@P&wW4dWS__5r<2u2eiH~E zYKJ_?61Z=CvfTJw3wXaghUI6Dwuv4@@e@k!~{T>(H(0F75(*%28uNo38W!`90>)+-{Rz}oZ)a+?8#jja7jo) zCyV`<9&YTU`kS+Q4XHzw^@SjNF>RVF22D<1mc#ry)>f@2g~JRyqUdjePPjch_z2lj zJvNM9lcs539j#`0!`jLDNrGE4$UIgB5d3+L_y~8C;ih$bADIdtJJxixD%(xP({>l? znms`CaM?xows%O6u4au7aVMfXaqG@fpifR?3XsMij$|kzZCcA29aZG%4Pq!TSQmAJ ztSyc1x_OffqOxX)z0qB{$M^?)$6aWKGFd47e)Dn2ex7Ir+UwXnNGc++Le%0 zeThpcn9cNnwx#eU^!YAZ-tdgAW;a&EnMxA%nzg}vqWwxGMuw_l<@6PPu?()5aD<4@ z4Wt{hg2+BHY@x5pbing^Hid-S3V~Up^tX{cZUgrIrp=70*FJkJZfl?5#xLNuf& z5qVL3ze&Nm6Fl+9-FKsgpt2|e^H&sA;roM_PhLI@<&|TUtM|)W2DY9)_>;*74J9Qe zdvfh@G*JhM!&k*NjT`(0AU`CmAzR^37=)#tfOoSYcTbZk?KaZT-0FLuEon|D+d_lp zpK>xi=U!nVdzR|1KWWM*Pv_lo%Z5FR*&1^Oh*#uX!D2NgFQXkmrEwTWW2_zx(kgw5p-41@GH{Z%IqE|{kBw= zd6?_LcGtn!5FS`%i`w$*R(B@>H+mD}<3F|(|9&wlvv>5OlGaqz8fPh<*QDzr7&uR5%Np5+AHTkl^XLGjY(`3QIb znRn9&@yCk8ppgyf^9`CS+mmpfuLPLHL5Ua}%h?9sgr?`n5@MyRHurdX3+^XR+f_$( zx6Y3U6?Y3!f^yL5T|LDFUyxQEFOKplC=+a84^3vf`dRV+T(bZgipHMAOCxKG1)d(u zTIn;_Hpa#SK~>%o{I2BU&*e&x+Wu zokY}PIWYYUuq>x8FkSX8zWRa}Jnw;yyo3Tai?M)$rH`YSk4Tbcch`q(S2DUh>hr>B zlE+Y<%+6^&&&8WjeI&eDeCEr|po@49xEKZ5S!v3ql=*A*UdN7PqpD|t?ssq{tdZ0M zs2^=f{VcHPUAM)XdD-L0>l5xvaw90V?%Fc6ntdGvx=i9>WDC*t{ho8{Hdct%tB&F$JcU*Y9>6W zdmdq64?)gfSxgXJqDm9p_uMx<%&f4-do>IF&OeQOPiN>f3sx2b4_>wl#%y2gA(wy;{qWubao=&3VC za#VQXlYg?pd`Uw2&Ix$7I0}|DxMG_l9tpz~2F0A}G^Ap;0M2jCwVyVp;3LLj8(TbJ zx0(UAUK_cnn8UL~Ij6T;!1G4+aXyX0uSm)=H&A_FqF;{>u73C#HStA5dZLFcv`Pi@ z(PX~neFN2MGqlRjYbY`r_+ouJ)`*X8Zkei=i@)?7iWRs&)A9~FcUnOGaPG<{@rh(p z*7iO>yYzQt3hhow{TIkzLky5qv%T}8Ap;r=3OTe5Ga33uhqjQxC)35L(q+X?C7|s@ zM~A2gT_SR5E_&log=25~ni9|#GWm>O=R&6@#8(ZUbYTs)gkrGT>Nh%W3ECB{-5u@A z*k!1f{a1jyi>A}Ysn9<%mi*@f#?@`Y;R23<Ai0ajDFLGPGI#H zN{@b*n;hmFrqhj#^IUURCT?_hKw4LV9oj;h9l>%;O3E{7b&Ux6>GGTPZPU_4y&Ef$ z&cL%2XKulem6a)%=v`1lP;W1DN0zwMw$3IPjMaHCZH_Y?mz^C`QZmA@-I&rg5EX>u z6IXun6rsm+n|Guh`$xcsz-4V!{G+NzGb&KfFwV1%|99Ul!C#Uu+y1Q&+lSe&S`duuCBJ^9drVh>1+wrb`nS zUM8+EzW$x1*c(>zxe`*+g_rje)WLLjOIoTOPc8pb=`w1YoR~W z!}79cS8mjQo+1{a%7jT)2AH3Xj&YW`0?&twN_a9GVzXc;=A!zBF}NWlIpNTeCsdfPmAh3o(_%@U7pShy1wtg7;5Og(YvVvF z%#LMu_doH~A^HAt*X-34nftao~1GM{3Z2Y&UaDyv>>0MhB%N3Nshl__iC(Na~ z6X|Ceh^<~@^oz4`*P|C3@-0l1rg17PCA%!(+i4?Z0qsNbcP;uMm{*cR6SD=Gp?oh1 z>@vLY+dxdvn*lH>d4y&$cX6+MI3qUKBxA3Giph}h<1+x)hBc&5e(;@W6@23005LBDl81uAmi*30yQRTS?p;lr6afl7a zmQSE0HgCFU*s26?+<2Px5@evhfNrJW58)cJFyfrQx#2$fG}fx) zE%BhG%yV@on1?3tv*cTkTaGHzex@MesCKdsO)aIZBKCcU+wvj~VWQ3fKk`3kJnhel z`2YHH_R89B;s+jqnyx$83;Hd{%--Z7(2)}(x9nYF;$&JJqOv_I*h4DL`_)G!ADo+h zX1Z)_>jLPg&B8QyluplpQ0a?Utgg!iUfKYhCRE|JCk}18Fo4Tq*9I1yGb|kzHzd^(5+-_99$e4%QNA^iilw6haPW1Jk1706S}R- zWjpFW6H*s3i}lWdOQyV@CcWbRvEg^f_3>xbM_}2CfxvJ>C|gMbanvAm@+f|4hsd;2 zKkUwLmzGxDcCWT;B(*~%E!tt6Zsn!t)$V3}nk{gGm&?D>>eCsdcN*{Gyg~MH)-%nf znz#c&VG^>`mTZM{%+LAC0Jy=uczuQmV%88MFyKq843Soc>7VRSWq2cIr^ebE!Eo`# zsV!Ybx6Kf;LL4(JUtd1gWP4%-HIrUK>#aJ1raDU9y<7nuR3Cxm=X6E6dz;bS9YQCq zrip!2mQd|pv8<(lt9zi))DE>|~jQv|D#}v0-cAD_TwPyOn&3V==`Ao~kp*QTy zO_S~55KW>;FTLPK+_liO|EH@FW`o?~|ct zR1!I&A}VCv5UP*gEAgDx&Ne4QWZetgUW!T z1+X&HGj@*qT6uSaQ8(2H>#E1~klqQUqljrSkn0iM`dHrfbCtDjJ@-2fDeZtqBW4DM z=FfJmz9JK`2)sD7e;Cpl1KrXdSJ}18QaSK9Y-k0lu3!jimmOx(zIb_z%0^mD1g=&R zae2g910rLRZCQ7I{Y<6N@3kGMPw3?>2-aW$S7!%(YdQ0A7<)%cKT#wsO~YB*V7ySYkm|aB|D0jC>Kx7}VD`C(}b+_s+6eLUc zxcVtP`UN`U4|~RU!I38@VBLm|w%mbYvz*14#NtKqY(EQrrB_6kkf?PIf{E{d-Ky1v zNC?5eqQ%#wygLr;-g&NP6Xb0bkV<>dCF65lUsy?KTBFE)9%rXj&V=wB42`qzQP>r8=y7T2+as0 zFciC%yR-6E$8C8p&mO`4he zXy!n78uP@uXgq%3IF$w0N!i4rBV(9>2y#g&Hm!N_cYJ8f^=PIXA6|-@S6_?3&V^Bi zYY2*^>crShAHP!;p8{>gu4^i+RltTl+Qs&0PDpUu(QHT7cfweY_++z&$zUr~^xkGk zwqiG1K5}G~;i!dzoYEJdbThG+QJQc@xe+P7d~Y>s^Z17qP0nH zR1~kjjNHAa?jF9!dIx-$D^~C592m&ZH1rFH8-TpGw;-!7s;Pqm zt~lHl!Xtifyf;Qg*1CLtd+XRY8z=9Kw9vpAN6wpZFtUaC?F6LnKv1q_Hx%7?JBN_D?Asl1*6Gq8kS-6CA*Ha&x72hA!tIc=gch>Axn)D7K%W>f?FumCN znJo2ckUEwVDFSKEj23j4`8nJ2v!i+#r;*&^P$sU%k_-Slg!2#^PyWL&UOFyCnC9pk z(HJCjL8{6*9(W~}M_<_kXI0(Tj2L)qIk;4M?$nepjF_s{vK<9UU8=sOSk=^spxSUV z!?(<-p_&Vy9~QhL+u`XNQ&2# zm_66FJ49>41d5;>?lX?C2O|zA^PAAJRRhxE*ElS@hR5iU)w2bf>qej4K_9ARWm}_* zkE31$4hw{4wXqvjn%kj#n+&UKb&jk=>Ash+e+pP3%9Ov8og@*$>GgaMeng=wAuRbu z^9+t*$`V9Ls05J~*M*w0kf_|A$jnnCLrQXKe)$OuR31-!uQM}5n4>$=zRMw(X;R^igNaDfzkCVUd3em1nJ zxA%@KDbYcK4w}gtoP7UaKdn_MKgLwVwTCC~v=y831 zVx#JMT~%y>%H-wnTcPI^DlMh0dcMt6->AXH2v+~w$)Xx7iYYzybLs77iz=;DcH>vy zP_ciQ4rDmFxfw53=V-S*Xg*vW429wMAf|Gd-bh~_UXQ*IY|^gUU4peM;ON?B%xUvQ zAbP9}^t7k(qj)AX8}nlF$vCo~NIY~11T0VG3fR^sWWL6|!{4`|_wsQCmQOymi+r#0 zV>&nCW8N;jfCifLzgAMm3zGg`ss`KtstBV>XX2~6mqY)SLn<5AN08{nB<5RB{D}6- zNYUJdbRK}!Mzy)9ECZhI8d)AL5B8xR&i3n_-)ji{q6ZV> z9_=hu32x!MR2Y_f2eKqr-KMUC*S!;t{%32tcRQ3sdr0XK3CoJ&#Ht_iHJALSVZ zT11`SGk;U!}+U4 zYM=sl+A=Z3=F(}!#n7j4jJZV&{3=1t&2H@1JX74OD*uYa$Me2e0~HY&fCHd3ek85q zJ)!V;LL!;?Gcju7m4v|FdHk4dIO)KTaDx3bn@(@R%;22w>h|%J=vTKv-VGP$>J8u{ zJM*&yFI$xWBaq6c#K_U!mGjqVcXUHq(+LV?SGXbaJiC@kbIFEDE>w=BS`DvYRXDcY}YQI!V&fI-lG_w?JEo9%4;k zUrNv;zDyL!c&>CL^XnC|uTW!79S){s5_xwxe;@@pK_w_$ic9+(z|`32wQ0?rs1sjH zSWH)3AQLrWe$`u3|I>A~O(`x-&v)h`ft2Ikr~AN@6Z5ya#oGPBMS~Z%PkMZaxgwON zx!as%RC?LAQ)@R2q}}54U7*{5Xc+=`F*&avxvExM&$+ejma%@WJbkpm0SRVgnO7`& zI;A+TB^8&#-i{xY?|BV+Ax{GZ!fEmbtBM`reg>T9NL8TfsUE@3KO3QQe7JVu&1N@Z zTLPIA>&d{9K&5Q1Sb&Gc>SXiU-T9U^qkhr-&Z%b>Hi{s_{wj`{n;y>_BtPG-hm>ht zbHDP4>`=n;)$6=ff{N+WyA+mic1=4f5)nwLT~PO>@bjbfpRCYR&MGIct-FEIZ4s03 zm?l?y$?v5h>>oN*9u4$UQd*hukcP}%s?|?-vJJ1h!BM^DBw>o~w496h{*?sv8!Kb) zQZ||w5nlM1Z|x?H*hN>P-wf|cg#=g|*LhhKIBb6QMY)ELPSeZ4dqQRnL;8Z~YggaJ zNE>td#B?=IC&n~+bB6K_SW5AV;P-*d^o}1olZu=}!rG*gxO2g)O%(SKcZSjcOyOP zQo{-RK7D2Fipn=I6|2XrA|Y;gW$>{4CX0r1vFg*=CNVsg{Igo-SlV9rKChGbO>xB) ztx{?$Gv_COv)^=Bn_jUE<3;oc`}tDEn!g=4?7O!`U>nOylGwxPX{v&EJw^ObjG5N) z-ByrG6XyAo_tmFt5thG<>rO0^rg?mt+4oFB_`j6nbd2N32t{|6%n-nTge*MRceA$; z`5%utxT9_a$LEtQ{lTx z;wFE1TVK!p>%d^$KXUkQLH|#6!E^k_I2U)l{-0jY82xWvm>uQjZ=>LeC-r}m)BkT4 zyHJO}pqsEzW6qr6!C+iG6*zToGor!kuqbOXOXTWSFo4%?P8B|PSpL8Cp=TFTqWM|S z=R3>xa`KTtlEv~A^)^R#&P)bsQT@ecn58zyw&{%`RfJ0NEKLL<-KphESW|xAsf&Z2m=ljr&IrnXv$goL~-_{uaIeISXKu>fxsO>!aF}wP%hL0Qv^aqs>d_m)r%aBk}`HYQ9^OZOAFJ(|Enpdgwv$M5_Y6$kQk)W5k3k#=lF2+ z+1GHS`0Wk3+>3QQ9kiyc&sS|%uA}^$o7o*a%vrTA{)s}A!5FOh(kG@W=|W|aY^r~P zp5xCS$ILq{>l`09aAJzQ|NPKre$z-)^1_;ky}4y8D7e-&^5iymnf2hY&I4dgNfU(H zw0!uQpf7vt4@)hfs5Dt}vNCw+Ee=B}#OhDL+;wCtDM61tLP=Wfl`H%x1;i00b|YR9 z#zdlkWoB4=c5&NKpfHfvH^$u-Wa`307}c$k!I3fK&@r$b4%mcimt;nkD$@9IE7q#k zpj=Du1Fb!y=8C>PAY1G22fzKskq`;$XKQf9^e2MJus!LAXh>aRw)sq{*o4C&d-{FO zQ)K%!B5eC|qb0Rlp_Cu;`lt9^6fc%{!+z2g3G8-MKMG1SRNoPM%b;@Ea12e5m2Dea z>ZWmacu$RW?5^9j*!ip*Q}EZC5e{75;!p^r zqqb;VbPNUxMq9v|L6Z$Q^yR+6%l#}Yypcb<@@ll9XKS9vcdyrJ&K7y$Z|s>3-?fsc z{W;Z4k-pRmRoHJ4%_H4w&Yno=+h%G`)6`_!XsVY6AnFOd47^!f_Zr+?Fsst15@mcV>d#h-^ZU+zfVjQumo^CO zG67#?xuWXMaQZ9<^kklVtb>crs0{B=w}5iF*NHV4kt<`_R0g>YUf~`ro0k*qwNEUM ziQEVy8loiEyfy?5yG;(fPF7Ic?4!8er6IuOeN3+Ub>iLrHvz{1DMppUz}Tnz6AV6V zv$>nqV{OiOd-1z&sijt^7>;!LP7jSZSnr0iuE6~(d(s35b4zvG9*!G*q~aH~!N?#8 zkU_q48kW=Trc~junQVCE&p*Z~b6hWr>~h(*y^*pvfhCsti>2M`en#fbFN3$(`4 zGTW+f6aU&wlInH9lYj#3<1Hl#voKy}Z#L^ufQGPuJAIj7tF_3XQ~w>p$Q-`L&q0_k zr3dbr60(PfZ(#aVW$X6QF6aHa!!mHLZ{d*qo@t#C30Gt+(eH3et%J{$lIrEL>FyjD z@%%?h(dB0T0LksPRWo54(I4u3%(A1FEf)o}W@Nk%131?ZN8DU(N6356+QSbG)VGhC z65K}!MqSQ0zX+rn;vViXGN!6*CTmlcJt+3)n9!+iA8LmtgeJXN%UM-*SicfNZy&xZ zEKSmlYBffpiG~@0!F0#NsIZ7!Sar}abDFsf$4|;OoMBGMT7#+fMw-sU*zP|o89M? z&oJq#_whs3+E8ux_s<2f02SPeqUf#JcWs=3K1btJ_Y=d4&BE*74*l43*aaisDmTs}E_6W%{Kdqv1{#p> zHVnF!4YD#n?mC4>Dc7RjNcG1Jj@==IbNC=yo#-sy{v0^p(sih$_2#~$dzLozK!0YB zlSm<7(Ntd7kK}!%o*|$+R!eje_!QEiOc6qgTy>-itlStX;+3)Rjr= z4Wh^@S85C0w-#w(AljT?TTV5&k!cC=S(9hq5CwbK>`P{2FH6qWe&WI0HPOlz?Y zLV}q%u~}sy29W>?uXcCeJXu7I9WAi2CoRv(<+k}&O7%geDVeby$_Azz9*kO}$^q!7 z&kHr7l_EZX`)sIsaWURP^o^S$LStR+la12CPy+U(Bkwm9vHt0H5a5u(c5_|~M*IGT z+-=F#LaRe#rV81aEBwI^(|CY$h=V8J^7)U6d8SBhFhi(*(@DL1W7f)e0*_F5Pvi#M z6KSSl_Fn_ndoJ(ZI$a^Xx(%=IJ6UUsw8w4jN}6cjzMNRwnyqrE1k)RxnPJ{ERG8im z`_Y4y2SoEAG~sFLV&;9{%S!LI2`m@`CnVbrv{=fu2htgI7h9d#F6RkXPn8-1=mO{q z6@lLz=IzW+x*1BFl72TFcCS+So4edOZhG@p=njT*X(IBuc+3w2`~3v1-yww4GZrQi z)g+GzeWWiwQsVPJQMhy8(a<=4YxAxLeRL<-7XN6*@MGj-C~y{KqHu?Z;gU6QEf9%`s(5~jr*3HQY7Qz zMimeS;K1y&Wn|@wtQ}>st?941Gd~6H?s{K7Y>koF$yuB?$l4vLQ6xO9k& zvSnJWb!F8rOxL(b$~3s6xe#@{F7~*$Q`$*9$I=zJ^>MUy!|KQcS2wjZPvxqaI+tqD z-cU8>`}yevs{)(_&RAEv*McsmPqFL1SVp5= zgLG%NY}55a4%qGTK-7_X&eqZH#bn32#YKmh`5Yyt@{PX=v5bfp7d_j~tmb?og6CDn zV8b(|ztfnHupk&nnN>}>6$gTxNWe&zp zcyz&6)ojoP&_I7rDnm5ovs1qxZ-$e;Y3lVO-O5uZ^Jv6DccTCmS9$f8w~o^-CY^QX z`|PvH5DU7!1f7oFeU}aKY)~_%X!ubY=PnRd#nU#L$+qUfqdr137J+h&@-h(moi+W7 z`q*z(cghw$a!9LObuDu7sMX=XKI5rpYAea)Y%(c6hTcAo@8#wdEp+CmWtdCVZ7hY7 z(P_HrsJ=_o`m2CZDWJgV@B$Ecm#$~MHXZ8|n`2@sv9U4}TjWrtGEtaakMEpFCUS8^ zaEytK+-hYoKp4wt?>gL99}}F%gxz+*gmd3AHJ2HRf-IAWNVjpk8xdM{*P9zzSEnu~ zsVe|9xVl182oFb3p%r0{9L$sDAUU>PukI^2IbKb+WQsBNcMvYIcubiuEN7g;;(z1h z!Ry}@mN698g|qT_v}uoK^dmcm7|z~M$B6j+R9IK$E;a2giy?NqaFAxF(jSR3-y;!* z*)L@vM3F>8q(b_f=O(4v1mBeX-LEvo>m~0kAoHVOn_uurre!|+dPInVC_S2$9;h%9 zBTgiaWIL#BYlCaKhz3Es-c`3bkKfPHBE&{uuz_b?`e>n5M&FTa%PIL9qGPf6chWTn z=dUrCvfp=ruYI_@)JQ4{i%bhQysr1|v7muL#swbCZBG{2Lil4Y()B^2R7%~K(l?}c zhTSpB^kdHLnL~Z=kCYoUJIp6ah*&h3GO^6}Tp;bt`Y9JnPG$SEc_S!Ai!IHK=M&)s zOOL2b>Wl}$5>5Il@Yhr&R0rHW}j-CMaW(VfUAT$ zVktD|^50UKri&H6=e0A#5 z7tZfN&k@zhTLuBwh~;tW(!&B&GlqYpAC$lP3${nu#`Vq2hUXLZmp8@vz%&uo5iFPb z&7D~0>mdt}n!5+Vt&AL&*-TStUwUL(^$lV*;1#(~+P;~vf|)I_d4Z*VnbcYg zyd!mV?G3h9vn8F(RfXj8%VU?SdX12e7>AMWMOlc*Mvg2;-^j*te4h57#SOh(4-}pY zQJ9fl;LWh7nR4uY^0~Vr>2YDDyWfvwr6)=ySrN9=l((G ztmLwD14RzcCREz*$iv{3@U>veJ3AVkUK@|PV~(L=KGx>_g>lBW(j#&fyk$AaAUdCX zuQH4L<7W=?dPSJgt+$ZxBSk0Mv*~(o{lv!eqr{I$3OmKR^R|t)H$Y)t?qGbE9&NMQ zty0p5SgSEsO-HXk4Z&!XT)8AJ3jtEdo*SuRCTH@?G90b^%$ZFvxBIU~@mc9f>vO}Z z?<7PV4`VC59F*RS%XHfAmO22kTl#pV*NTAD_GBp+b1fy-BCafap`{zkxRw_giG<&} z(#1?1a!2A|$4?KYYmc*GH1prGV?`9Z++ODx?0Ul)s5z(>DjRN=L3{DWy3DmOE^7L^xQbvq(aT z<0viR_cL&BmMp4KKi_YT%YuFBw5cQMHXZBb%}LsNG*b)@?&#HkmHRby7cE@scW3@uSlFO6>F*XK+D|$L29)rq zj@2UfujZ1!g8=u&`J>Sy^uAqGqTK!m5dZ(xo&O_9#3NYQkge2{U{2G}%=}-oXg?`o zY3AW6%y5pg<;dF$suoedu`pR~TnvlwYq}Tw&jkek z-&9p%4}{t|Vp41rRhWmN`dOaieffxSEqfxIOrVISVdnpJXTsU<_XR$*MlEA74=v;; z0mSO_c62Q}=UfG%@6f&b8*4kNPP(_rQ9Fk5H4eCc5LygWHmCAPWBhsU`KrGI_Vkbz z+$dsg8bbPphhiQBxIm1mC9}w$wbgM=S0dH76oGe*hFP>+Q@I}<*Y^9p2 z?hgCNGE0Ex7L9Z3@+@3Mh1Ji&x1Yn=I8$K#~GnjcW9+Qba(nO891N#CWGJDzEpYIHXp~GT# zu!_JkoEN-K#_LPbzJegS;$+o-amm5D^1~wVybr>yW{Q#3LR_nUtf^N6Yq3pCylw|o z{~UIJu45xen6gZ`vjoll8`RkGy7!McdYzVxJyL29aeRi*i%{9M?z{m!;nRIj;A?gd z;@z~^#62`S!KKvka zh^;yjWQbZ9n7Jxe1+L)aBK&LoP33yYeV14UBIlmJ(V9qGhEkU>kNS5~q0vPe;jT@g z?X=e;x77RA$K>wuDIFpJKG0xW=?I=SXhCK>vNU^dW=r3hV$T@1V?J(wO#_|GIk$D& zAqbTInz>4LM~k%ojJQ5V^5I+cRBwMZTIW|r9uW#AACDD%M3(#_CMRD*ENdAmod(-L zpW@i~;H!MCn4*?x>duy^+e`C;L?BKl#_gljclFRkA9j4-Ky>T*& zMOh#iuM114a`W`zP5DeDG@KCn@pN0c#2r`($iBu$Bb}|i4~EM9om%okN-pqyY{2%_ z;HgTp{CHFOI+RWOcKBj#y4_!3EP(mlG-GhY4{ub9T;?EgUSj$qE}}#*|jeuv)IQ^1hr=srx=@uPMm!eXbr;< zk+dQe^hfk-{!_h(S;}HFDCSP8a(yg5BATe3a{5ARfy0hFYZ=#QAD*{Xg*aVU{l+$6 zMiR|#S(m5KpsQaH`EHNN0dnDoY^6Caa<#_#;T(1RctKV#Sn%UNCG7sb=v;IBO0bLj zCSITkKTSQvY202o26vHCWpCzz@)&D9?oxt|llZK^*x2LiVq2{F2a2h7eV6uxF3`Y2 z0fCo|;POQplx!~|Nv-5Mk{`D*v{fHBp=p<7v13KPpV>_=?GL5R12X@WwfgKB3j+Xf z7AQumDLn!cc1qzpehw+JKNE*88yX!>p(m8ypYa_}bc13mpVpq_+aK-OFwuArS1|nS z-s#>R8$D-JNR5(z^O)ilHOQe_)TK>@&DgMn*-!MGjhp-3Y0Lq<;yw|WR@0_F%wV#} zf1MaHR5sQ^h^viXJhP=cXve*{Tpxb06xuS7x!zLlMfh{Y*l|h5d{MRo4rCHHsXndw zyEMih8NdUDxRffZ9?#0|-_wMJ=y1xFgFz|F_t-ygKq`dtDTsi`YJGPuH-v}%k?HvY4&Q{Q?l9Z-A-kN-!eeWgt zp>M5Z)Nk9HsI$@|1-yF0RX70)aYIXijB|~6THai;WIfYU9CH7(k@IIQ_QCtvuols9 zflTZ4FC-&JN4jW;?`o(I#E_?^+2q$101d z&K04Lzt&fyQP(<`q@DB{?c65ZpHq5A~yf3>H&Zib3>Ae)j02l*x9p8 z_$`kDM;UdcO%KuW(z$DL-~U^p$f-fSYxWxBF~tc-v!KauI~!ZCu7|!rPn3Hk|E`R3 z+z$Eq&~GB|Rp#j>6Dc<}RkSdHs6! zE9xh&b4tQI8!E1-#DIuXjAmTGs&2c1F)}If{MLTN=6ju7VsLZT!0Atyiojlx$PRq4Z^L@QuWvQ zksB-QguQ%CQ9Lm=wzJaYvLG;H(o42_Z*m;*k(r5yre?4N)9|gMBPaVo5!&F`Sl{@# zvcyyL={BI1$Bs(WP6z+fdh}IlG|L@7l9h_p^yAy+dOrOCR?uT_;H&}nb+L+Oq}{Ne z&PQ7LgHw82Xku#aef>cn!HL**8KJr-gu=72g_xdkYtjduB7)wA-Swp*MWp#Y6magE zhtLix6j7F6)~cNS@D26ade^RZsP6I5XTBsB`CVps~`Iwd$7l}wz z{XyS2`4id?;KsvT&00xp`h3Y~s!P;*I>EJ-;$*diy5{AJyaoU;fY0bWpXO#;dEB^9 zioB<<&z_2Lk6B0a8BE2V5_(e%Odo2AwfL~n$-7qABtL%c49A)9?Q9Y9=GuIMw33{Q z8`id?=puMhIMTiR@9XKVBOURZtPsa4d%zLTy#Lt!AtI`T(eZ z$0%$@weF%;3TnbmJ~Z`6h64Biv3UcgR2VLDg(TzAeg{~d49JEYkPk% zg9wGfrpw7le6sRG6XuT3rl3GmV@gLk>iK*ivDalvjjJ!%FZ=9sfHW_Qv7(PRuP*xL zy-IfJc^|@Gn~zUFd|yfo+IlPKoMV}ykirpNZ0>Q5)Xj#=UG!a&O+Y|Et4zb$#pT*l z1hI2ymBPd0HuA-K0dcvjbB7!}F6Uk43(zaVM7cSCpuL_>$)JZxNv+{>tSV$gN| zap33i?%$Rpo-D8steKm8yJTr;xwY0A(0NKpzN&StGIdkBr=I-teR~E4{h!3u{#l^|1 znh?2Qwm-ZU5eM=x*p|LAOg^*U;4d3kwjW5Yi&kw7L7AKvWDtgPbY1;S_Ds4t)S zxheM5Jk@?~42+MLJ5CCt-2dm(&jVIXLBTHrErf)Guuye91O*mlCRm9ui6VoKk8R&v zJ8jJvE@~-%F}ki$*w{7>ZIgtgA)z!Nzx{7xhTjCU?rl$aofUJozaKVf)!Wxsa6T|Q z7QEZD^4{-bI|ENj8CAB~EjTf=M)l59NCd3>&wBoAbCRBTg^^%;O$`@gB8H}>rk=ij zF_{&(P?!1nUe~M1i(HFhB9n<1eyhuPP*MVZ5&Ex6u|EX(F}z1V#VqV2j#?sqal^*O z#(laKP@^*I+QKk0JX|c~xpyjkY~a!8$RSde^dIx@{M77(40W*_kb5cV>5tK$|pFkewhzhkCTHL&^ae<~8yg9bc> zODjIkyCcc8jX&3T>_OCKZ(#$5X=z+GoLm^%=rjS9C~^x(G%wZg5Pzyk;eG!6qHg7@ zt{wCB?-`9UUAwljC;g)~og?Q+4OPA3uphbpw$+T)sBw6bM1%Ckb6i~aPw|SGK`)TB z112sZsc1u)TzkF~>`azxdo3cDgMKUV1eiZrKqd?-qBRLq%B)6`Ue7v%&nMQ+@<8}a zZ~Za9my+d2;iBbF>o6ng!T#IZ^TDL~yNxEd#;oiIM_jo^;t%LFL3kg+F7@VfPEVx- zq(wsFR!2fmDy6WC{o0*znZK8s8-}NO7yv8=gM@~{mwF;pL@k%gk$hKcnsy7d&H51n zKH`+=j$1;RA=22}>DHQmxO}O~^-Dc{a3?jDn1m$mH}Ay-bW=LILNoO9m4{{2Xqq9_ zJjn|KO1t$dioUvQ8)MNM!Y~gQM4z{&5UbziT)p6j2l#)^0(`Gn?Bcs;%MCT>FqQ(a z{6@YF&(kU&?R~EQ_M_uzT_#6&XN#B@a$W5(^mNYu=xoa>@-& z*8!pLW=FiPVjU`PT862zV-+{6N2S6@2a}F0;PvdbfnQ+6n^i`a#OuzVH>f#EwF`n8RY@KDJ^2{eH7M)uE_<+E z2u6VEvQe@}Wi}4TF}K6`!DAZ!Nu0wpy!xjVqVCJ$nM*EUj&`3xc z#EY7>4B&-^sXEF#`cg_}u`>1V*`2V1#aOL2qAZg_%^b>KJos8H7Euv6ZIg->uDrxCBI2o=|0y}4gq#5F4uQJXZLa7Z#zX%KLG!0aKMj$t~0>MR(AOYf}v=D ztiGQNxYhfK`rD%v&ck2FTZtQ=m54PBcwXEb=Y}c%NQih9oL^{f%>Q!XiwRwe&z9=M zf#IH$Q^LoHo3rAl)wr>5npY@#*cy>xj)}L24qjznUng<~Ztn?9V)GdBLOBiyu^2JG z%Mt8mLmeqc1H~@`bSy&_)bM^HLw`^Y@X0z}82w*#y=7FKOVBMGf+a`@f#4ckg1bwA z1cC(!65QQ=7$6Ybg1fuB!{8P?xDGzJI}Gzp&dGW2yS}?FKV|`or@Nl+s_tETS2qW# zV<)$DzB-wthL7bvN%yhVIXRE`M!Dn^qrXA@4&YgqvH4~ z8zY!{6M~806}6EZsg58zGE-TJ+ivMf^r9k0`ezQnPgAx(@~konCs$SN5i^9 zL|BD7&k*`2dfB~!_&gDAC5td0Xj2;9Y3Vi zS&^?*C?{`0x5dehjQWe|`G%0Jw?@)?0t@laH)%{SyEIHi9-rYzEGZ6dXG^hUcx~OB zo+5tU!)~$Ar!qTs{>oYcOs8Rt-hF0_$o4Z?RDS(Q=GY{l*%dl%MXtZT9dbETb#{M& zzF;}FwQ5!vD}2VCp?%4Rc*!V`PHt21DtFRXd@_eOB_#Y%e0+;SZ`(%yV>iWfnn0D+ z=SJE{D?zDBaf>@pI8;G;j(}0@T{h&c;8psip%|sU#l^0^b#dS~-Q4LN%m#9g%3`+r z1H{p}iY&&W@F)11lF~=rDDPIO$G)oHjeM9+!y+v~WK>8jZP06P-dnu)EJ3F;WtJ~1 zXwlYZo4X#cV}Cn?7+M{I8TiYjj=Q`Gd6i%Y&@SfXrS#29r_xCMHUZK7U@(&F~ zlZ{fX+RT^rv+RMzAn+yyADMOOvrVJgbbzBuN^ZSCi$OB^#$mF3kwku=hL>QdG!6Sf zmqT72UDl-ez8zy{AI@nb#7E9jmLuhr$f~|PW>6$HsUs%VX}%q0T>g z5enCg^ybf3YcRv1Y)(#&5-zfovXa_c_(Uxo^&4}nJ2tZsMKrD03Xx%<_$L+}09A2s z`5JhF_sw+{fVS~IFdM3a)v?We0E@}tNcg=i!WVy^b$TXIg@D{Qxm{wij$h31W&SZH z7=5f(53k1AjL>61VMB0q#Qd434HDrBRWdhMecWXZ}a}pC;9;Q8 zk-YEUu24vI9{Lf!`LLyqUSY)!sp=V#zd(9{;(xU?ad1U|ff6ol1RMqKu3vdhntAN; ze9SklmF*iNvV2}H7)W)O|G3@YM!-|dI_1Ni@MD$TynZpv(YO6#1%!xtcX7dL(5RX0 zFskZ#BU?~Y5{jAHSaaDPRa928(_&SS)`!rnPE#K^w#ZrU^r7?totdk zh|8t%S64fV;DJ3UD|Uy#Z1&V`i>mfnboX?3u7s&qp$lBBVDAg=0f27bj|PU&KQY)+ z1kD8XGC~M!Gc(4DFSNL~%1fS?*1NX%oLmf}qBY;uXR_~qX2r#i;|#bb4x~G+{1(XN zUeP+!=_ePP%)^&J-rf|zZ+B?gGtQytQI7PW@EWacv85Q>($ezJfDGeG6~k7HISe?G z;e$mGA?++c8k#eW*{|*o_XD*Vls+~^I&j}_ zmV7u;5qj}=@yF8xpn#v56rDt@_$ur~ND>-K93!lZOcJU3tT~mrD4y(7-%Xki2+@-eZw*NAA zMi3cjS2@#m_+*NxR;U7Gtl{^aqEv6;*L~x~AasEyJe3n8J*U;Ya8NKa zE}k4R;TG^Y!`{PRiJZe^!=1-=LHa2J_#W$;uA~?(<)d7UAr_#eu8N>g1oJ(eJzrOh zKFu26NWzMY{WLwvd|h&=t|o@ui!W+Tsqayv)~B6~CI;6pIn}G}0F)`ZJS3=c>;F%H3owD)NF>%L%UMXzNKhMN@jp@)!mtJi`8?umz+?sUFK3T| zLkgS@)ONh6C1O6toK}n~1iWn7U7r2Bd>kkR(dI~3z1}=03ddm%4hpHsrZCAx!$%)oV%UaIBIHJH}YU!%ef__ zyWWjbwHR?{h-5?&{v1rYrTFv9H;4H+=5%OwG31t!D`*1rYt->nu$pHkl1ymaQyB zuLeLJ*SDV1aa9)wqaQXzo)2WMT_96!oW$21u~j#1KqcSEeXVlbLH%*yaijim2aQV0V6~iApDRP4v3b(m z82)|T9_TzWUFhii^7wtL6DR$w*y>GTWH?I~2q$1}G3cg|mnb6XGwq+fB@1h2nz!QW zl?@!;%<@iQwTn2%cAC~=lac~|QQ@BB$b8^f`zle7>(-aj zWYl&s09{fm_{Y0bnPUnpuTmuJX3Ur4g_9V_WG8qhTl5N`^C@N1urr{@mf91&A#fS8 z54<{&H@pRdf5-C0!%yxOMjJaCMs`WJ=hK56nB({Z&N5IHNYvquXshJ_Fi1O7m-Jf|K_Z9 z6^?yQgo(B`4@^3@wFuuU-rij`T%LTH*Kq42{|6|%|5~51oheU4NBWVxXQb^$LkB}? za1jf0*e&Abm-+%$9Zxi0En?u~1Rh@Ab-^VL2u5~Ti{;gV93l8-t zIh0ELZ~X*sTuF9!bKB@OMoewno)%RyI?nE`s*^_L+j7EAOACc)dRq| zFQ4LRs$=Qj0~4{+U(c)&B2W-XY}9~%_%nV+?3p#cz};hhFZxD>!qWG zEkB?)?&jAmhS8jT>CX>vAraIKPzlM)#1;apt+QWKkQE)p+IA9Iw!7B-*!&)=>IJ2d zO0dNk1f@-XJUztpk(bN}WfV#v%d>n|a(dhOTNouA;V{s!L_xLs$o}ohRE@d2=RGc2ZOtBhk{7-KE{yfH zL>&u1TVFtpouhsp2 zah%F?Z%B&wm71!WdadCMei`@{Gh}6xZ_ioz63PyTQ?`vkF2oJ?3rUmj=NDh5=^|e5 z2Ih7lkthi5AjSB;OT^FZ(_Ol0tq}G0Dhlvo``Ec0`!W%$`xVlDe+s>e2fOrQ>LIJH zR-^DUNY@I~B6ayP}9Ptz@( zuf$1MSQBoM>=U@#Gy4a~oRzk@Cpa69=S!FAl^N#Ga9&sjD-w@4#Vy*P?*F3wgS;A4 z`}c3o-M8|$m*aJBrq>&j?m9gqm)YXOmp}$b-mIK&z6o$-d{47b@mQ}-v@av+nQ=qB zq}ptd;E{=>HmeJ-n#0}!J5qJ%UTQ$cj|^rfnx;@5`j#TkdgDYi(Z zXL?cx-Hqer=V$1tx1I})+Q9Mr@Z@M+Q6@3DD8;(WW?r4~U;{#HaI&K2or7U(9~+Ng zSaeU&X_ODBk5~@ew|T~9(Y;*=R*FXqvdq!TExF2JR0s0SSk}2m0((*hnF!{3{Gvp-|(kyfjCZEO$tvmrnMC{F&pjjoE|}dRC9+Z~G#B?i12TS|bU&Hxa1| z&^^m*qE_tEDg9~<$^tCtq1Dj0_LTM%ili?DvDm%XRcsXfA36+x47!c6m0|tSv6nrW z3n=9X^x54e6ard^?82$5SZbJ2?RgD>pi~r!K?k#y2n4Rn1KW*SsNT6nGzw&hLO4iw ztmp?P42%ws(hX*kr*OAd3Xt!YRS?f816ol7k0;D!mmAJ9s2WSNPuKv#?!eKwsI;w@ zD2MGhqzl1b2I6Xe<+ygkIcqB(2bRB2z#tPwNNVQbZrf5;vbn+Y}ICWLxsa@doJeTZ;& zKaP=ry@wFFOIBiWAHdV+e^Oe}k`g$Zpj(L_HJ~D@7ppsSbb_wH;ptE6Y)3M&-|E{r(L9R<_K+p1ze=K)rm6A1>hN2^b*=pJ z-e9vuD2>4=X<}e{Yxub?-Ha|KUTN{2>47+_nr)Q^MuhDvq%%Injj41ge#OECXkFTV zMRze{p(yAN(1(U>y?@nJ1A&PZLEN*nHM(=aB;z%*rCchsPW@*!8v+UL3F!k6k zf8JBr$4L~ymp*pid2;3XiKLiDKpvg}hZ^BeBWbyL1%MOI=I%~7tiR}0w6X@l6JQ;l zWxYdqI(<8I)Ofx~EZ6LHNORO78G%rG#mwp-`VycKQ!daJUyuBjURZ{Qcpsq-1^t@y zNYO{5rQe@mAN92*)HRR&DIixdJOop8cnh9x zX|~jcw;9o$ArsBk`sln_yXU>>lGF1a4|t<22|ISRZFNNINatx=u+h8i63NSNPOx7>Ec{s+7?tR-7dT}kI@o+DDJqtBG z7WpyEGFo8fbW!2cktUP*ekXolq;S5wB)k+gDKQsuR>+V19j3q?lEZ2WtI7v~G5OSkvwUXDJl zFE{PTA{8cQ#-C3#JxZiSm%C<({9_j-3kpQMiq-5y7T_9U6nfpukI_4Z@&oH z=cV@&trqgXI-ag{sKjxFG8ws@?nv8b+zPV#B#uTjORi1Gu6nq=_n>wh+TtG>ta7>T zat%K9C0V^}cj&aMKoOmWt-^O_;vA}$4%t0kkx08z%3Uj+TNc)`Eg$cD%Kt-na_#zn z|Hn`Vc0olyprr6a{+idri+l{q)#@MjzPj56Y#_;rW(%9>#Vs}?3TJA;_y4K|tIq@r2NMD(HXRRBa^ z31j~m%A!rIIVmJEnD#Az~STpb|D z>fgSv+GSX9HN{_GKZ=7D+v3SEzH;F&Dwrdfu%g0k+@~0Ok zK9zFkhM=*a%`DlWmS>>Q*#Nu$ONJAdmyfvY5cR+GhJHMmtE>(CH}tlLZfG4u1YtXV zC98u6VdzO5+=ZBa!dVeCM&~+0XNM#kqKkvs4f8u56=!ws+4_}p2kb-<8q9d_sHmzJ ztmlthb8>S-LP98MX#;n6%@17#zm~=i4u0JDJ%Z7+AlAK&y*pCQnwq;s9p+OTT4>6$ zvvd{o0_hLu4(G=9$^ZJd13SN><)PczG7x8Uo#9Lso2g$h3mihKizx*{8hi2G(JpgU#g`sTGpdy zP6lop+W3Q?XGeX4GtFK4KlRx@QoQawxydbIgcHz}bKgYgfJI=SI}A`c7d8&rG;U7( zUFok%YMvUEAziwDo*HHwFjj{k<0DP0Zg+8Gmh~gegc8NT$pSkZNdaGqe#awZ_%PtmZ7tjlvY1reRKHN6rB~1-vheN-0RR2$*Hjblm#nG%eILQg~D18 z3{Lv?99-pmn$tgl6k3=5Ii= z^nBP?^b;RF6%`fHFTf&{4hPsnf#vCe)h&~nEKd=iE27Qi5Q*^nh`k#fX=e#l_`KNf z__A_e|LY&Y6$+MzQl$YwTN5wt;mMyqn}(>ouKAW%?qu+gv49B@uyIL;cM*gS{eU?s zsVX~*Y)@(f%v!zd(ro~K>C6+9c7%r^1}zZSi50K@-;%2S=1?jX4Qq%fqTs1nX&#Gv zZVoP1h=a|!cnHM7n`ioL?jiffxjCIOd-oKpIOR-<`&Sny9X7^CF*@28VeD{x8wn>Q z**rl=fA!$ryN@XwVXjUs4Ch`VY8uzWyQ8D)835j3;nYGF zo+$1qP=tJJQ$)7o)fb%!p6%b}+;Gw~ZaGs&Hg9EmjrN1t+&mqP>&XQ44~Brx!IT6-?k*5kx>hsLxIz>725DjZX9MO zNWA)xz~C0~ug?l_5y8W$szFYiZf12UH%Gvv`#$6% zof&fneUJ+Wug0kJh^()T@(YHsHX}_i4(ZSP;}ybykMf_yiDy4_P<5P|W=;Ye0xTlh%7d?pHw;kEOCl`08E$|3XV*nFT?^>lkTeVYtBWZR+ZRLg1(sK4p zpaj;A^uHU?k=T5?kw^B58kjQ1^xpNz91m*!lJA^LK46;_A+nI%3{ASPorG^R2d%Hf z9s&U`|MS;`7=6~3@G1Eye6-ta@yl*_|1a*dckX5eyyD8x*O;wSYxXX+`d0*gFzsLs z=>N`i4Q*?n==v+SO@4vcRbe&Rm!RS0{$8NLwkd1&C5Mj%yse#E`Kyi_ccG$^(EnC@ zxcaEP^7%6efSX&GpFLx_^nO{c>Tl@PsRkhdAldP4Pdl>bk*Ryh9>|SjZGIWj6j>XW zetllA)`d=xO>Kru_u59J(N$#|S+=*`8Xc!ij5?dNZBr9Mpw3I@syU22xJL{4l69Fo z1p^lkQ2FZ)yJb|-I_<0CxZ_g?FF8za^`*FS0L;ANZieQPI9^q>#OK>}$N#KN=Ec|W za+ZgDW>0G@b&+#6C!R;pKcQ;wZJa!we$RRuHun}!*_d&A3jP@i zXeU}~NSE}w5qO2cRKQ`!# zsXt_5zZg5{!$`KL<5vb~oDD&&m(+YK0X%cdTwx;w6iP$cF2i@$J~W`B@7kP4Xr6&5 zJ@sL4?M^7~OZM_I=w(I+X*kDFd}(^Fdpu2uH5-g+N||i5lLdnad#vMZz5IE3{VsaJ z9(S$Qwj-o|Ek+EL@4>-62}AL7WA6$Jxo%FF*Ae)I)~xCmO%c6!!4u=~S8ZI1&^_s4 zTa|016p@`pEn+bT-hrU!F95To+rJM`IUKq^GV>S#JMAi;ZvO73*a{DWR8c~|D*#nQ z#kx<5Pw{SVzK!F4IqYAAyyXn(g0`tA{n8Q5=wBnC(#k})k;TL5k1!&zx;sK;DF~O( zzx0>!cvKQ_s!aWrq)IFxiQA9!P2(P@Xo^L@vn>V7^Za$BJvA5Jw{JMWBzL#PM@^gm zhFo(F1Uh%h@HA%f_c@n4CdoC~thHMwa6+~SkuGWUirD$3$8i($fjNWq?!qbl^WC`M z5NSfFnpLl149|V~dm-wepqSS#)GuJEZPRYvOjpC zrDkS&S}94dzu%;Fa`)XXKYhXr`CbNInlZ~%-`tweTiX>ab-sVsfnH?Asbc`!tMy1x zSV#c>>C6Qd2PAR4rU7XprTPOyR#NqcnJc@-{GXPU<)n?&g+KS5*YkYk^}6Z~Xk&@Y zdfp^{++BV4zlw88OOvC9w?pvBO>NJySG~4ucZ42M9<!aI~7sAs^Y-T+4=;&y;a194e zuC3{C1O1h|FzbDe67^V?mf>__w4NVQ4n+Mx z48L~g4|fZi6%jgwyYzj^{pr(9whVkp{q>r45~?QKapvIl4O3k2AZ0w0PpePV8{`)P ziyrC~l%8(HeG&id?>4sh1 z=-p0M7=y!3AnR`W@X0Zw>0}PL2M3FjCVTR!uKpo}i?P@31pOczQf0j{K3yZi7?5^A zPGPo1{CHcg!^a{o1TDJHQQ?|{>E=#O^R~mQ4X(KF*MTR*Hyt;Ox}Mr4G@ezmd(xtj zE7J`@b^&Uz)_7gX&D~5j!FNA?{I_QS%whUIYur0f6Du1|x2P~QIUX!wjw)BpbFrEz z7L!R}W~}QG;xad5Y+HxWU@mZk?=3Q2vTsBhyvF^uuiPu4Vb)dV0YemRmNa0&#YjHS#F(K$CfE@sY*kHw@Fux=SA@2g`Zrxq z|G_w`aVdW+0Ke~i>_mM-E;2tSD^2d$^RomHe@?a2&H~f>_R_r`@z8@^{(90T=~s2V zcUnL>(~=o%USU7@81o;(@z3Df6ie<@)BQ>REgxnwEyg@&0&qAJXuqoHu&^bK3xT~l z1E%t4ufe=Li$C|f_Ym6exR#2UDp#4EmNF|Ppo?(i_%GI1g#*%=KUFFQtJ{tp}x;dF9;>N81_cBDz;=Vw78(cV|womK|m@iv}ldBgtcgdH$@t+Ssd^V2f(38Dj;3VGN%LAS^ z7E-hADXfeAb!NPFzK%(csb&G%dGyJb5(Xf6go=Y7lwu$IfyX_P-sa5<*8S!jZ$!2G z78SQ|uZc=7{vge-fq9g!s%m}k1c+W1$n@MI1{~gFSA9Ck&1TM*8^q|F3JoeDNS($! ze~J=>ea6uffvc+$sc9Vp8h1eh^Ue!)9?ph0kqnKmN%O2{RG783Uo;p?o8@Q6oop*1 z+u$57-4hWmk1>h*AVa%5*jY&_{P#ptrLkz_B%mGzO=aPJ-MOPIC#lP^y-f-g=cgnl zQzfIgSK}0g_#|4@;qi7pBU=GcoUG7gM(45K3?L%<^MPIP!DlNT5Q__y*%$`>C#rfK zS=VEDl7z17-h_1}^pf0~mCHsKp27Kd`7RyN{<7@Bv*?0c&iX(CAozj!ZJWvu2eN%Is_x(?ZaM27?QKFD%BZ;i+~BK9O(p;cMtn3diL znnr339UU3+ks6M6spDI#v_;EffRhTtsbj~q9gTinUO3Ct%I!YdLQ^_eh*fJADYFrqTZ5V>2N|3;l^{0yD#pY)<#% z)sXofz-{`7(cJ^;o-l)d4eMN%wm@ce$iTwW**9j``HL|!swCkXlt3AODj!0*uiMeE zc67O24|yEOJcU*59Le0V$>U9oJl`P|K^BkNJmWc7w~v;>bB3wSlR9icMTMS`aR(6U zfVnT-cdvfSmDJ}xTYKB%&t}e8%c`<)shn#?w>IA#-p9mKJx=O+gi9)Y^}tYBWbW!A zYdCk;n#|>iazX1Fl=|v?)ehDh!z*g~dz15HPV$LT*QT`(>}`TIeGr+2w%f(yBC$!K z7go3lc;Ljo=|=T;ROLGQD8bGZMd4F}G`Ew>B zN2Nk;bL~L_B$}rbogSVXn0Yp-KDO4<;#6MrB(yLRGXrp-4maysX1KI1Wc4``jcR|b zBjzLyukA79NDdAUr-qj?q>f5EJ9DwKvwx70F{;<9UO4)oS^hzbIcdc7-DWtod}!9d zjQ8c)DC*Vf=8^MwaPP?t&I=@>%LjbNM`is$>H&f<0n@S;(%S;a#5cZK1Q7g^}OBG z(Xz)K^CO-={aJE8kcyoJ30*AHGAE81Kh^hCyQhApmvF{Jy_nCF@PvzY*<|~cOzNk- zb{U&1qW}iSuBXP#t>l@XE>oZTiFnRNhD+_AMV>ou$S9aRg-_07m93AH+uGfeSRJRR zfc!)sJ>CYjM$q28As)k#f7|e8fI%geR|uaJm8bUns?oi%2Fqyb?fG0=UnZDe;WrH- zb$pPHAo|mgq>nCYGH0?+adNzmcQh;GH<)W^g50Oi)I2SFu6Wgxu3z4?uGOukh!{sS zNKERUD_)S6?8bJSj+mMDuX4pMP}$tJaa{;kU0<}`CJ(qjLT#)cKsD=EdA4^kH@us~ zT+z$k+g@jlqBTuf#Rp$jAU-pzRpYmep)C=RmPxb&-6tHM+sApVgZ3x9ldrU#JS)z^jvHbBWUL9QpXWpr31A{T3v}`Nr&YKy=K^vn8a*N@Ohr)|Ln^7eM*6 z*<@RX`H}W!=Wgp&jf6AaR3)j*2|W{(m0a8|@(lQruc5-MbunT=v^{Z;A17IadoxJO z;fg};=^h~nptw2NI)FX5rPp~Jo+<2qwy;T%`W&gaoqYoE4xKi#lWZov+UVZTGdu?; zLN}JPrQzk)Y4OMyVb44zk63_Mkv5QEQV~JYEoNio@Znga6_hUFT=X@wNzcXe|oRB$e@PFM~JC)WfVM~t<9KU**&$Pk0pbNcjnlAKxO4Lm)(VR zRNZRd4%nGR2K?r`z4TWkJzIy&wBzYR8q3zdSVcEo82&VmVRrq<5T5CY*vwD`J2m!Cah~>u#x2A5MOy ztZqn%l*vFN<-+(Hlvk)lX?6z zr9iN70v`qJRGeTDg2D74jtseZn6F6kwf#IcN|C`h3%%(P@~INslyMz!c#(22KC{d% zBkY`FWej-ntYQ=1mn0UoJc*2_1nSYZX-?t@jQyn`od<7oM!q6D@)2nxx`cga)mP+v zD8KAu3{zl2OAk+eqKxEKx6nrSU4OSEFWA&p#xX!&j?fa-$<0&ib@xI4O36wlVJoS< zgjpSBtUfE!^xSIDT$vRYQF#9%k(Zf?^%7vqn6h~78j$B!1r@L6$SU2MhY zHbFz*k?*N_;{R$Z+S>4=etS{c>;Cf&W~1K?U!?Dc*ADCEVHdo4MOy?Fu{?1TFST?+ zIE!*rn|w5e)B-qZ!xnBL4GzzP?yeqE7u=izF)A2Z3i8;uu66oK$=e6R;7fpR%nKR- z17`vI@`U@g$fZKiI8Zp53qbTq>#ce{ae)6JOgjHY{z8*&a-^lh##KX%fN#m#_rm@4Z`i>2Jcy=dt>r%X~@BIlFvwk6Qj#Y{gyxM=glC|Yb z_ln-8=ca%L4*$Y*-IK5)G%9B-U!wREV4}d4jF-1i0xywp6hyL0d^i{!*z7uT-Mn%? zMSTwE;un=~>K7M5w|MCAV|VSkQSiFw99v`WNuhj0&M47l&=X7Ho78?q{AqbbUT3a7 zJD<){EaA?L5Vwm(8jD^AEB76ESzO6f&2iFN(z?AP{)Rz)vL@QRyxSph!a*-&GqgeaF^fq z*vB;$JEzn#_9Bt1hF0s&YbI>DnK9V|c11zePg{F?#VzDK;2Bf%pycxl7uf0Vqa7uO ztn@KcP)(wJx4VV&4&QC__CStV?~z20xdO-oTs$Z7n{_+9q_R8xTH%kkN2HGS0N>J@SkF zjlw3UPk3RvX`Tu)HsqX{9;umzXLiRX?7lH0exgEyw<@-#!I3}t-Pyi%KpTd6xMao^pIlbYT)# z{5sJEu~vqj%S8vxE>aIh=yR#NiWoP~eB9yfp4v`lMwKHief}or`>FVG!}fM;%rv5( z_~Z9yaAy7quB@EGS$QweJ;HgN)_bjTJowDRb02t>HvB9v0mhZeQGK4KcU3{4qzu|8 za{H$|5g8Zm>!PArJNhDct+u#Pw^u<(nZK=e$*bDzkSjk%miU6ibf%dIbd`ghxvwit zZCOe3q;t4mf;o2`A$CUa{56Gkrvd9|oZ@0N?0U)+BJ*)2?ZOQ7YI=;OlCb~<60+~; zUmY;_bEks8gjj9q`y8d+TNbr0k_8c!#E`M69mv2Q*OiCuF{k%eFk)2o`PqOww+VvX za*Vevn7m!B>G}Jn>w2ou`i!4aBlp5w13?1M7~ zdm-K%LeaUC?~wbJoeCAwkACg1N6m#|fVUs-*K_v{4t9#Lke(NY*HzNX`YZjXWy!WU z^;Krj$^g6@>7(^odo89>@2fK5f|zP5Ttkv%BPct`B*(`7PW#R;xW&cT_^P7DgH4D6$IGl1KF(qcyc;8b)V+n zudcU>4rQknqiJJ%p9enkkK5CKvmnVp32Z_#gv}q z;fGlekJ8xew%zG^itOQLh5k-2iD%09+{}xeYLIsE!eCGzVlsb84A$xj;!J$o<2`mw zWvYVZ-TzPUAIbhZB0pXqeVk%%Ej9+vMp&=3M3;X z1kprcG_1Z-Y}LaQU)Zia3Ji6Bm5U>=Q}kE-k_f(@HR$rTTV-k3 zJ~I5aimmWmpBC^$GEylrxN_3#I2VyDI=zcEMq3+%DW|Gek<9a>T+gmgvpv4j6~kbM z8!;rRCR)IQBk@RMI1tCBawubLdAN3nBrP~6$?9R2cvK^2gkI~fobNkjo@ebQ-< zgB;%p?yKFL_FjG;tn&OzzEh65k*XSj>vGAT;xTi{*0Ob(JZw$Qu+W9}u?|T1{AkKq z&)`Q1!vwlPx!K6bhhN_85l(fdTNwRAwF(Ia-A3^^7L7*!*W8a?A$WTo@iKOIXILEy zZDIMF*QbS;$;@6ktitV$laTNDw`>>e6$pF{F@@gEak))J6tO`W1TQ*AGOxFv=#EY5 zHM<~wa>syh44YU%YS6gYM&e_7<}pWX?HbQC%p;<0OM@A?&wdjT!~Dhw@4tQ*^*+eM zzs&G+zPI5g)zhTrUj$~gh_UlpvXLt}w5VR1a>{aMgDn2a+gIpXQc>evr-zo0T4eO@& zG3k@qs($NMZM+orEc{dYXKmwmCUjwU&L+ zJ-S|_A^|k&cyy!ei7{#s8wLLS=|V8YDHrW^330M>Ad5O*b`o$e%vgZiVvC72cbM9`D(7MqUSP`zdg(!OSgb+iMb4r)L!(WeQC z7k*d*V(+rUM{G0}pQ}{Wa9}a*wy<1&~y($i%AlW_Ai zt*_JzjveLc&i!2U1U&Rn>pJpqr>cWQ; zZpyx%p3m(X{w^Qn`3pViqMr+|o@j6o;fPVs%JAWSpz@`Wa@ug*Q0C0NTe|zK`MtBb zmzQfDYtDcRFr@Ns5rfa_qfA2kJ+EWO%AK)WnvBCL#_HpM_0GuqLY>NtG`E?%%P>{z z|7roK1CHB#%D-Dy6`a@CdR&YK^nT5hq_WuuoH)<3&&vf>%b0qr9Xtp=xKg~QOgVfT z@F-$sQV!K6^!VuyT|^E~Q5yVt&~oM|NB`hTWwI>>-|OuVjv#$XTtWs>Sl@VVI6dX< z#?Xyg94yi4wbecnzV5VV;hvEhe$ph}AIN-w=rjzFtu)+UsY66$GI3C5s+l{&Jz%`P zf;_st-3MV^jO*~RY+|`>Oz15 z8H%%#XZZMzUvAjmDYgZNMIk2j=w&32TFikJ)O{z+Z(V7~fjFb1>e?T!?0P2xC4f-w zT2l@;&?8z1G;^!E_S@GPAj_~Ecyn>8+t*H`ZHt!nE$!)SQSE~6d0?`e6EvoHdAXWn z-cAF`85;G#s!k_kR>k=a-yRFLd~#i7PxZ0EH2> zFEzM~P%c|S9)h~M@hdk&3v&lsa_O>}O@76@{aiRky0yaoezA{rjd`Ufa>HPohC4id za!)lEB;nv8yqyR+A2AunzB=X02xZ;q0aWaKrz&t7_oWX$8Co+~c}D-V^~pAgY(Udx z`paXNyR>jaM&wJm6bSMj+wbjbSt-qbny@zBIG-}(RmGmIj&Idw-;SN^|KLPy4M|BcFu<&s`srh zDjg_zDkd#6CLg-~Jv?%Gp;0pZfs~7Qc*uGo^!SMCxNMkv;BIn9;{gyT9o zir``Y-TAL9>ypniJ7 zP;4WxhWO;{ul7*Tdo!IN0#8`cdDB4pa^$SF>55siP$QCKjg!ZDdL@G)=YhzBAD!MK zzCT%VPwWCL+xj8fdwx*H4#IJ~O_JdSK$a3r*V0^lo{&*kc-q4UVXY9@ ze^O(kqDk42;*FX53$3)#4&0GYNq1Jr4LM!oZe-7LdLI29NkIUbx8Erjmhb^3C*)Jx z&-Ec;ciX#VQk&8S8yKtegC4JmrdQMTJ6j@q>{`&EA&%I5B($3^wDa24K+PtFTuL

      rYbib@2%K0j=cLs{gHV*kXBG8lZL^^}`Tv)k6oVE%#=fE(%tniFnYM948N{ zx&1va_=|!KTKhZjcT=$~cO%N9DCR_xnN;b>nKxkuOy3{VNOj3m>%MFG#`ESrW1i6C zC~Q>&1sm^)C{U|1+tb%COPyQ1_UHKVZLj0}eMW6<4Qs1wd%#yetIZ+rrkoLvk)f^H z0j=v%Bg6VOis~iczb)5+6}Nfa9Dhpkuw~z&Cq?UzjNE1H4;yefgR{-;mQ47)v7p_C zog=MKyZM;}t-PaAgBL)!B=Te_2fo!>11TRQjQs>4t3SYduaO%mRBs70`r@s>;_Tn% z$+N+`yH#yy@|hdO znYPokWP}@@>Bc{c1=W2jn(0^g1#%6Ijg16R61-1!y;L$dAMH^_)p%BpVjKf&#o$m= zwCtDIp{x*%pB3Uv3v0U(mG`RKVX*il?ncLXUd8Or#_z7E)}ODrf7y7nTMQ)nahmar zWZnSzZciJ>z6A>V5gCfTYBT{$0e*0D;^#NdSIBVb*i;(4>MX}x*1RfI3q@~MFzufS zP^-K!dz@>=N6R=P7hDdaQWV5D_DOZVwi=PeXW~qf_iB?K80p`K>NmU6&^24^Mdaj= zcjsA(q22G9Z})9^)>8Xphw^2=Br9mZq(6cGM>-@c9Xos(gZ5TNEBKsd_WM*KO zdU84)3xUwd2CIuR@*YKc5aiJ+d4J?b9xdCbAnbyn|g3Ej=0!r195E7P!h`xaPHe!IufNtX(EjrY?6kSC3E$5?&AiK}t}+3L%-!e6tM$omSQ`Uh*t+ ze?O%qyrH2lfkMNxgYzMd<|(7#_cm{?@pI7W*&?aJ>-62me;K;;fog$nN2f5EI=cnD zQ2>A`#K^>zy1Bjce(=ED{H}~I*O9&uDi35pt&)k=2 z4!@Ai&kMG*C4}yBdo*tMcc~eMauYN}FK8=2Q?>0qd)~sLx3bxUi9v&;_!LfF?NIYMG8#spW*jsKX;s4Z*(5xv3gTwSvAIob(DnH&NABO7@VlL z=su~`QLd93S=*<95i{rS3!oL3T|Z1^awU9%fS$mSo;fwZW4y6?ct2(deR%ihAfySskr zu0^A*#dhBdDCtz$qYv@5Xi@p5Dm5$;*jJz5QGrvmh`dE!+ENT_(Q6Ie*FXz_Kk!ay zD@AwAO`Q5Uj&Qv-L(7mIV_CrFgSzUe3ky<8Svm7?P^X$u$!3!XlgTOhV4O>0Hku)^=!sK6o{#>FQeH$+YH#hKKwqg1vIy>hlGf*g_l}9?EMYLXJ<>)zJvsv zB;_V(?j)iiRF|e3LuYCDULP8&s9@?4lWh*R2V}uBU~u(OD9Sc(b|7eY*+cCax7W7( zg+@#DD0qcSI?IseIK?@&GI^Bq3s7|@oVuywH>lajhBvY7EQ8j8b|9|`{khRc;}3>yMM72RuC?QNof7U%5P9Q@nrGDtpJ8JGn87_YT52=hsz`FiTI;I}@WIYg;Fn|udI!CDiagW=_?MS}-h&GL>GS%%YC zd{p$(#3Elqx?Pt+4kw`=O%rzImEm69UL>{f`KV0Z1X^HKAUsgZicetnhC+wkn z2X!prYN@l#xJqj%)p@Ij8ThZL8gUcKp0ItKI`~8{?M@-GY)>#v{BCe>_mYd(KuGaf z%qMb$hWvJehqqH2Dr%P?{H%3PkVr((z<+A#ze13KW2wr&k~r35BC_^dU9_+CA%qg{ z*iWsC#DG<|14FXtVT)guiA;Ag@T1Te0t z$eU@7F@xJ}DH>F)NnHHr;#!&!VAdbZUH?}78xRufCA^Z;NvZiDV!9s_9id`66eg0T zKzQ0W-3?Y27`+!n$&TqxP2~+XyNrVEQP8$#>!NVxNNZG+g2_@q=JR>$p*(FCpFZ-d z#UND9UaQ10E=oLu8Vh7p-c-k-RSVzJ;Nug$3jO1a3Au~)O*tl+^4!7`x|H$Vg9c#x?_Ety_+?M1 zC_YB?4(=sLB8aSRB8t;?l9EuBumnr0EI$0j2TA2D8kkiPgPDi__mEJfvS4@BFFIr9 z`4*I)cP8ZD##OS{)a8q zeU=VkB4n3}EcoPG)?1}Xw_Gf9MZ2I;e}8|;Qjm{SO-n%VET-j_F8JE)w&jkW5Zw4O zvajSa4AE&O_c2x?^y3J9xC9%TMp`JRU;-WBX8V`F_@=#WD)!X_$dY9;|`_($N*B=M6UYf!fQ1V%J z*OkTH0djK~!yNKZKb%_m{IO)h@5^R{j47ihaXjPn0^%r?l$`85Tw=4+*d1nTp}`}dLJ?a9V{ulc2Zaq_*5ug zR2CBSj?_rM>oG@PgK1EAnX$EY=E0=0T+HVR!_sJb?kJ3b1l4!_UtbHLxIfV`T}d){ zV9XEB>?B4CMcTwSXlOD$Wa+Hs>S<3x>N0$Y@WKmggqI2k%oe}sIxcvv#fD>$QCb&< zHH4-=bgDTk9f2sM&C#^KDO{YOkrY$5nV1o;c!`{Ff!m(cPetLVYFNBR)u5+P^|S)g*!X;a$PM3oF?5LWE$L27gCu`1XC$K0lk@oL*{++| zId(?}OFs~skt4qBf}ppbR2pSnPbEmE2P8i?=$Fs}*nv#z=ZL2G9tyr!_e}78OeEB~ z7Ie<0ubx}en>S2E;O$e`l(GzM0Am9+xt?{1C&hLrFInPS_J?*FvXqzlY20>8QE!zB zeShbqJM`5+9!d|c5(lTgqv=X6pLxp}c}Djjq>WLqkil`G#iO2<5o<1DPA6Ape+AU= z2HcMiuA3fs+hv&uUoe!7e8#!4{@`MJ=sc<8ExAE3j(06?-(s;%DmTPU^vYWj$Iy);67@^%VP<{Zs=bYghYkWe&5igNkukl+ z@B)9Y45Gre+Eo!Kp6$KJuvqq!ZF#3-Y0dp<{i)q%Sc^NV4RQ7+DJA)?iqOL;`oL+o zA1rr@uG9UHpN`jz@ug#CYlKfiKsN$bb$0mm?Ie)*v z0-AAg6LQxcvXW7Ce_CU)Q5E1AacUMoDSB zXMb5ZGH#CSJni_h`YK5LWFS_rS^;(RT9e)Q<#gnVcWqs=gxJSV1JbVeYcgb9Ow0Yf zHx(a#q_AFbg#=l=D=&|&jKKu2?@#?Re}{?f>#tn`37=bmSAn4FbLoe^!fz3YI8iw_ zUdKDB4=4To4aHtOd#2myw6MP`lNL#KHQD$5@f!)wGk9XDjt|O0-ajJuEhHd8J&B%6 zwTAZjoP$30BrjA~3JZ4!%>(LJsOVbgKt=4u`Vs8J=5C7qrrfG>g}dk>v|1#6DJ<^MH8A=ZD>munKL~k z=*H+O>EL~$Z_RuzguGYdNH*>KqgRY@_A?S>ma7$ve*e<6=)FbelenHc)BYVNkt;dB z=%z15(lXKW9qAq!B9A_J`x2zrEYg-dGM-}jGvteSveSpn5Tw0;z1W_3KW^|&(6x;jZM2g zy_P2i$Np8AF!50Wal-xm#rD>tj)J0!1SRnoSag+BOa>?C4Z8P=e_ea=O?mH5F`!U8 z6TETX9M$jw1gSd?dcD6|^aDax!)0|&EX_T~AT_QkVE9xu!1<0oG&QQ5haAkhlR=Kp z$%^`Xs_@;WG-9(_L;l;Wv#kf~ieTRRCb|6WytJmY3;*vCl5kMKm&7Zgk`2a`P!gPO+-9UqgUmV6V;1pwJgt|%?{3|~0wYOeUOwtG z`9I9PbyU?|x3H~rcXu~PND4@9*@SdRr*wlT(w)-XozgAcB_&8ogM=a}A@MD|@B4Y~ zljEHCJ!ib%82q;#Z1#5j)>?DUYhLqGVk-A)CE1&2@$Br(@sW32O4RWij;+SmS_?x~26F2+cs_&2*l&xX7HhxA#*!Y2g9x{VD?Nat{ogDCh^GnMuS`iiJT*Juw|?{f*Na}U3rm`>hig4_()WGV z<;ucfG>?dgh<1%i&{^rW)E8sJ3UCY*g(c|hN+fB-f1$q&>NElm8MHJnDJp=Qp25BQ z3IA0f|AfvPYtQsaf#S)Ewt-+e+#Xv;{mTzE?;6Ocnz4_yeBnHN`KF7{UHk)#fEbHT z@5!rg#gXNH#Kb46429q_2){>*udHEUQGiOWqZ}q9x~j^%hF&AO#fR(2w4T8CUW#zm zf(-ANI=i}x>Qnd%jloDyVn1;&Sg9np#VGe@>L_4Z>(SEwI0fN zEp{3|1jEI|O7p8r>AH7Axs@S$=aCbYiYkR&rAxnVEigCh}_QnCx9s<)6+YY{khNf87kC%Cdhi zc;l4h0NctP2zz3@P}F$fkpen zoTER*v^5IpFMWo3Y56Tjec3ju2i~_Y{a{(k<)TPfj66KXu$As)HFD?Zls_PN zeg)-y{~GnZ3&@*W5ZpN37c|_%Rk-Txxn!}jkyJsIRj=AuntPO^Vp4#qJQc-qB%)(9 zWFyw#Q}k9=diDKnc8K`Lqh%SbP$mBtgt^(6b-8b>)Ed5y&ke&1?y&G%QT5XI`ZdY( zMht>9Al}h+>hoU~!(h&!*jQFig&0ut9>GvN$ z7|W9x(+R@f#2XxasZBpc$UWr=BD0W~qM`#PG5KIAN$uU;U8Aka`>lN;X?K7B zlN1f<8L>Y#HEcEMQz#r#@-En_WiYT%sVF6?BA-vDRR36Njsre~w+A^{4HB$%sFa?k z*y>!S2kZKf$ke7U17GSqtp~JAI%7mm1K4+YTTio{9L<>(`Q#Etw#DugQZzF4^QSwYlvhDP z=uz*+qke7|o9r?#Th?N|=@!Xhf=41t#fC+;(5(j37mEZfmGx2SJ#1GsppdvtZj@+| zAHZARDUCu)?Knhj-RSg%MH_h16kr&W1&w@#UmSOdit^q9A%_LNvu0^Q+lW{)Fw&jy z@|UhA=4G!D6RK3lPKzjSz_M`_Z>WBvlp|7{50u-V4_hEOEXAszahKmre3_qywgJY2 zs=kxW(r&TAb`HTi^n3b?MmxP4KbZ8uQ7e$A9U4LPktd=JuPcq}nfS5V5Q_0hug(HH zvE;i?sLwUhW|X@thGzFx43rvC#x6iugX$r^lF`X$xWJnJ&Os7n_(>PfZ*!oA_R%s@ z!DiA5WtQPXqLbyjx9rEo__2+$%FKGgZE~zW4%b3{#&`_B&Wt8{I>F{7VJ9!7mQ}j5 zPGXxY>9`aUXEj4LQ>P%J*H15({l39Fl|#C$dlT)YVd*)zegWinwqNHmp5GA6f>suz&fADD}&y@E_QWX$!9{=h!kG0VA4Z~l)v95 z9Fb^wzrX+477B)7Xt1i`^Rtt0i4Y{?VcwpVS(qAVtk+V)hbBV$ z7xnt*ena@o`vNMcf4yu${vQ;}ENKhv55*eQd2 zs6woEp`Pi~X)j4WWx^;#uWL29++M$#QKWbNI_3#T8ks(U{Dq~#2e{_>cnmI6iu1(` z{&3TEZaDN?_u}Q_v%I$(k^I2GFOxOX2#RP!irEtthCZVq zQbu+~bXF3B1pB_FU_MmAm9O}Vm3;2sp(!u1<_iN`T9!tnW$tS8Z!1#12p^}9;1j#} zE;22Eog#Quu0<$PEF|h zJkY~ca4$}thGY!lmRx;N4+<9w?CMN*u;yy|T;@ zUA3d5@w#QH%O&nbZDwoi*HD8NRJ;@lJGTyfyv2wii8)7_rJQ#~fAB0x{BjE124WbG zpQU+)DYM4D8VeaSj@Q8^%M|sz0<6)13{$^>s51jI!(%KP<`n}m2K65#(ME()MTiY9 zxiJ3HCI?#0Jr+>406;@;u}>{-t=aJ;&Kq?aS4a3C|GGXyW zmWN2gYeNSI2XJ-1LNEW}@%71&;>UMStNU>O`i$Via_;{1yZrv(@1Tl*{)K;j6Y}oH z;fzRsz6kz_;nd$hIQRzQGUwKj|M@yq@@X%D;y=DdEV!01z2G{F^U^_cIYT^+PXaW|0;JUOwb9_>~JCP#^Os-{71BBY%V4yZ3o0bC@ z{cTJK0u7xHuh=sx9~n@9jA#arImS$GxUa9TJ+R5&kKNw4?rC1XVsQYwy{X?XkCU{O zbbkBaht9;FwSmVG*pnXVwczb~?(3{*H#tyKe63{AQXhmH%64NNMYKw6D*g^i)`!|n zua9V8(uG{DylAg~t=xfXY~w+J6WR|jXJC>(?4G0qkxtRu(>u`gy}|io?OwJCq>ne} z-goCu?=J6?R4H8#IANCr`H?%*1xy$sv)rG2Gv=Ir1x%vr4QGz1fkDE+so1maeY0;c zJ0QL6zW;uCd6_P@u9;dy3dVNM#rb#>3Xx^p-2<`|4&A2g6CdaAK(_N_INn2}GGqxH=^}4m0jH*n&CS)BZrlC9aiB@%yECTm zw+XPV(o=` za!TQI#VH;Z2QOHBiQO<%$xDa646QK3NmtGdGBTuS34Ux6b$;F<~pW3cmtJ=@< z16lnrI`J{8)qYLiJ%a=zjRQroliBQg0{7K2u;c7#q5d?CdsvkBHz_!X?GOnXLkF8N z$ONcn7XgD>puux{G4ON>y`>REhP{C~6S5L7>;g3=9+kaww~?%(kR-V;g2|Syu}H<) z*xTE);|1G@RUKw>o1uK}D@~}k21$3oE~~!m*OSt=GhL>$Nj1mUesd2#-n8>UY~VvK zLD4rozZuv7jrOkFwi0y&BtI7oR?eKo(#yH*82t?wB(-ZY0?D<#BE*%PDunx?d)izw z%%NznahG!}EoicNi#{4JaPKrZ3TqTk0th*{9*aDdk%}uok&6r$e?Px#2Jk%au$}eL zg|@m9xEa;L2^8$kZ~0s|*LHDGb2@}*KJS5zR{Oraw?JKE~%#2u$JZ*dcYE%NXb*5_P&|Dra?AzgT-lW#{6 zN3jDgPh|&xR+E&DW0NUFCOGx&U{nlFRzh)xsHe6jHuERwVqPz#W4f<}z%xkf9t95q)%mFJcq7 z@JObJmGDyeY)J_8^&{43A3r;I{z0^D=OAc$yba3gB>BUAFw#y=qe)QogX0E7Fv)#n zIOWV){pXz$KWNH00ruM+w3{5w*CJUX@9FS1HSFl0hS$Ts${*~bM6Z~hXZ+|I${Rvt(|9l}{hmpaSv*N&*u@e)Dm$*1W>hhV z5vdQ5^jLj(c}TTziyl-c?kKw8-fFAlghF;gd3W*5vowQaqlFA|N(kGN$H=FsK$idL z>4-IIkb`d`?-tib>c@KYW?S+b1o|-DS)!iq+_OrG8+eK-4Z0E--J@onN}@KO=!f+> zyhOO7NpW2PNg3pEk<@W*=1HbYJsh4|mRLQ%&Me$1KHL-_*a@J*clp1e!u}F4x2G1= z&KaoHk2JlW*Dp5O4}5P9?|_AcEmrMwP}?gavV+uv5>BoJH%=SR5OGa$e^UKpMB$57 zf4pt|)+D0M4h@L#-j5&lHhAB@xE_4@;8xipo!GAIBKC1*d+(CCHpE5r`>>H&Su9T*8%ym=B7j;f#bcsKRkcDy_L2o(2xD zV9U~3!4(4qkV6chl!Y@=o}$arW;lIR7nJNY!uyte_6< ztwee3!sp;bpb@&1ZTXPnr!p0`Y;g!1Q)cBSBZM{(MQM&QxFUV*wi{8Xe5v-YNWu;0 ztukB%vaMzG9WdWgNtt>&J73i~`MF)u4U;OIElbhy^q2sh@OurSEiTuSW#QHtR9s6r0h z0>gWRsjP{M^-qqtca7gd!&_q3R1-YSLM;@J%jE(CwH^+o2o{J|i1}|`%Y?2C3hbjM zs6iE8R3xzuywDntYvh@_QgaN`1)IIBiF?qyB}vJ}B}`V8;z+4wzgp z>Ex?xk*on0WxT*2AAX3+Aqvt7Mwh~=d?vKRCR0Wr$Kr@#^S+F@lcU7T!?{kRIs*yS z^@4P9dbPI~hemCVe^7-xQA&MRZ$NHUKrjoml-O3NWHJ;7ZxD7G_I z8WlOdUMl@hkixBqe;|d!{~1z<>EKs2$R3|BJc58h3ZE>+<@kt;s(0x5ycZUnr3uN zFehTqxMP9gEFMeJ8?>HC;16r^7uOM zE!~;Y;up7-8_>!s3Y1&~NdZd+9}IE)`a?_$6|*wyWFpLXpC2+e=292u)Bpe-RPL#? zXo^}th`QF(C}6MeZ7_t4YA?!=-?DRx5Xdt4rT<1~QB-xPKhTDEPStry{@B!pwiLKN z@t>h?Q(zO$0q2I{R=`;aYa|}yN*B2UZfjvj2jvf1J3N5y%BX=sqI{Y|tcQ-D7e^;S z$J4WEAo-OjT{u%+&*HQ3)9 zTz&)Tk8ChlCLDDG0~L*tho3fwb!7{ng$5*w$1K&XUe8o|nc;^0Y?aZ)CUF~zDS39H z=C*jk?nE1uW9z=vgO`mXfs5~CVnog0J3=UMDl-Oskh8eQ-UE&2P<-?ZS z<_)_vOtqV-PTqx+5LF9eRC}QLmpM@y*DUFhNBcX__U-88Z7IUtUv5~lgk1N)v;^=y zV+pCE)=W?YjG>{SS#*^%N;kD}P_s!DPC$2ZoR%O-t3W;dH9`Vsm}-w)z(Fj@g|?KJ zasx;7(Z=E6c!~z{C!rohjI&;q-Pw_YU) ziTain<31EiICyGw8d}H5ogg?FsHF_4Sj$MBg+&Pw>q8t=dZSbg#+O=X9EkFPRYA45 zGbcW1%b_?p{#=`(k&PkPq$-qHQN#bDXsZ?pR)99H~mlHLy3O@A8y7xqnM-)jT3>v-h7Gz zFC@j_N*HXS@Hp&Uv|mUFn*2xkiL-gu$ass~M5fUdR6!rR{3`k$T?r(*ERu{@#38wa zkMz}y-jt!doo4DTiQ-WcE2%F%-Ysr_nM=M2Q!14z%S6;XS%4pbrD{XUz?2S7`nYk~ zTF(XM(0T6iKl#Ja=qaqJ5wC~j1L|5An~6S}V;N6o^M?`RLg}brdnO$a3r9+)=@F@I z3n>u#){1S$8;b*z&$%^pK-O&|M>1IEXK{`#cwEwKL`t1^rwU#{AFUQQx*#h@%cs`W zW3g(%Y~BRCQ*CXra-WsNK;a?y7Q9ye-phK5;F{v#n7n6B>q#~q`$hf6>KTrURKu4B zGRU_Yf{OJsB20#SV=Xy*`$}%espxtxBw~(C^O7}f^HIzT_ksS9tXoJyd1T^K?0X(D z*B?)bl0QeYz1|u`{a3pW3n{lgCLSrxfNDH8e>eTX#vvjGnOMBU4{Ij6l!LOXz3Vid zcrNnCG*8blA5Rl(AFl;d;zX76NR$@bEx5=abYqR4Ah&;}k6dUpHZ+x|yG8d1)E-I1 zA!23-7iWbqGW4lax}#XE#?Knjhz*w2@T5+Gt|?9HT$r55V$ZWTy%ZFcUhoL!V5^8O zYPg(n&WhcOVC(WmAWho7<@*PBTURI-QGQzulk6Pae6KWPqk>KzI z-RL@-p#I%d4{?4kU4D_|n|c%@qT2UOV_8q5m|0kj1p*|b6ws$l#;tBauBoKTa7dgo z`4Gtn#frqM<`+~mu1-H&!QFatf}(1Ng;v%^;DSV~8}vtFzDV@n;}SfP^)=@uu{GwT zAlC2l97c~pGVa%?9pm5j7Q|D1Tpab}LyiZhC48`~6>Q7L9Rx(gp%=JChYtr%KCIke z6v?p^!Irj8px}cG;Gg`t$}3aj#T`w-DUt<6PC;uU6P*;<02^PH%dfJEN~~~iY@Qf_ zXZJQdAQJFgFwN}5p`JCRrsBou@JgReH(+GB9SWyg@+9Y?Ko#oUb(%X{Z59$;O7bSN zIrG;CEtB@!EE;qAEVV2&HL0k@%AtdjtSml}m-8t$VRdo(yGq}+*Z8JU-l)B2M`T@W zQF@}M9V37Iz^oWkW5{`2%%&<%#2oAGrv6Vyb~#oW>xeXxCty z&`y$$1gC>WU^%)gayjfJj`{(^d5NL|9XJ;llVsjq4{v+r#D!spq?O1}r=gr}4lF%F zG=C{*lv}y?0S=N~Ig}&e(g4y2{W38Z&8yLHfeRLok%tKo$1|QJVFq0G3mdHI@S0$; z&0gvxkRU)3PnS}o-y7Bhg#LvmN~!)EJaMNsAj_vXg>-LUFF$6b%K_F-CtQM7n-wB9$z9-3W456{{GMR`r%z8lHMpA1K=Z}%0_ zOpW#$1jP*xb51ToFh-QvLZc`8(6{{m1j;*ih-fK2j?oDm_BN;=2Ru3_Q1sMQPSk0} zCueDd?9$x`;mTM`snKmrx)Uis{W)jiwf4RdCuB(KC5G$U-1v09#T}Uejbx#=7TkE} z#a760oz)CW8fXpOpt>!XhR~iCYYHSK#<+80{G96Q6>o=4?b~EKc8knSJyDHTccR^_ zh7rGnu`QnTIFY_gZkRjOeYVAWW@59@J@K79wpQLf`edfN2mKpplK|CVD(6n#*okGSv|%rp1hh@> zNJz0%5?VruHSs$FW7lQ^C6Iy+-d1~h16qOh_wTHbRHqfMvkg2aEvbGDkw#I-y)Fv^ zt9a9-zdVP2<$+m-pX=7HkQ=@b15;e3u^+bu3zx8cVxkih(&JKBweZw;A7^HD$0RwX zlV9xiU%jT`0_{kZ>MH|3pXl@>QhJDOegTzYR85b(KfuJ;dH^Oi?TX4?xIe)0(mP$ZL%2xOcVa`fy_h>y;5jAG1Ci7Qd>x2h$X3dIZa5YOOTLyyE4P+ zl8_R^pJ1Y7)~-sPe}*l|BfWOb;A6CBo-T=IpRjz%@OGw zlSx~Xe*YG&${@;gKCX!!8C4sCvjBP2sFGC*z?dbJECsjgty%!CGK-bGi(nW3ah8qx zSR(&SaW@i7*7^cGLm+=@*PMV2;BF0tfn#O})A=VL99{g}MFDcGapk=`_dPwA*{3h9 zO$gk~VjhUM=e<#SuBoALzwG?pdiwIk4)H%^*LD8Ln_!0C(?EE%4&rr&=89D`=*4

      *&I?!R+D}9Sk+#9=Y4%WdhI)&kw!?p5rHUu$abSVf8{;&oB~}D%lCd zD$p=pfgC>!W@sOcit^`I=2rJJD~>J-Y&(!GA|6R8{zS<7D3zU0Ev4rpL5 z?YzDD^%d<7hxc74itNF}>@2_ctw)DRa+#uq+0Gq42B&ug!*y}htz;Xa zd7B)e%^m+a`TGtX`F3U2B~zujS%0o{IGBzypa;@?Hk{gHnIhpw4=4dbXs8+5RYg^2 zS@Y2lXVZGs9}o=GBCMMCMk(S}KDRB22oo6SR~( zTWDW1Cnm;|r(c-e0~J9D9eVpX`$Mb${-htDBM1qLf|!`VLJdYb(LR3?=zI7{Y7CT7 zpkWkV7e+7gUIPy>C?D6E7NG5`e++Huo7j(L0oP>I-(8)_-Ro7L!$VMSXdqf#*Y-Zl0k^A_+WIa) z@!w_s15(`l`X51xIRGU5j{o}01pF$-6YB(QB5cD%0*K8A|HQP zDK>ug_&E*imqh0wuJ1{rTe|Y}@=WUUcm6Q);Ba9(#97%X(wN@Tz!^qispIA%T*meF zSm&%0R_!cTRF|2C)89q%rF~_(Y3;n2n-wgo}9x~UkB_YWuqt}n;E57>44b{uYd z>e9`}rjj1T8cpe3$&c@EMD&X*Kc)6-Sn!&?3yU^2hN_7p*$Rr?@6EXz*ToQ0SXv>o zl+*!wvlj&Fr{g+Mo@?3Uz&I}zg|eGJfXGzo4zl~q^>VJ-=vO+w2hz#fz!e7UVX;Q9 z?w7gIjGBzj%WE?TS<-cC5Zm2m#9zz&2+}PZKr-5b1@D=S|4|imm3jATa14rTHY>wY zb5IlXnw1(!HDIx3hkTuNsnqxzt~gUT3x~1;y&h0liR8pFKON+2U9NAmSUJi;uDD`e zUTwuRs1bV#d)$R%nStCwwb($9%u=<*862Y5!0!927lMooKO9by!3B2kgtmYT<-^|D zolp*DnAgFnO7|sHmd>l2I?U@2{Itp|lfy1P*=>cfHcGq-`FLmz+1JWUe zz(-?J&q0cIM(6IE@*jf`<9tFm`ewe`FjIlOk(?WBh-w| zbP1Q1i-1+Xa!fc=CsJy@cev{QSTO;8|y0$)oBpeg-QM*$U)z^w9H!tL)pcZ?!O z@I%FAIPcCY^R?MKuZ!PvN}3oKzEzP@N$8iRY&{y`{?1}95QV^N6)Kk~DFOg-&MkDD z)Fsp=&+ec;Lp7VZs)s$2Y4z>F0@^nea4ZbHLkc)?2X>stA0SCwD1XpXwni+z#?Sz^ z4>{D{qdL@jg(fJDE;G*%J{m~L6h^@!VsMf{XN}d;DR=zK$mO#u>g?`JOsRSX!DOX*)_}{OkGJyfVDDs)|XDLpT;?-?IwkCQCU5{fU$J+G41fY>>lgEL0i8 z^*JU3wo8=fGoMNZ@A7@giuPQtQW=h3=c2ru3Q&E9cue&)q0FmnMI8Yf>>xfJs9iY{A?|K7i~>fSJ#yjd~kYi4>M=c)tjHa;aKy$JqFpo;l#Q= zy(Kw!)0ypILnkwsPnCyM?o)ohF_-P=thid1Fy+{S`rHJn2iSd}S&bRWzh^yfzmC&@ zGtP))EOweNIu;$n6=|vH%OK;(rXvKJCijYB!7cNCq-nk}nacYJUM^<&^ca=o3FuR7 z)C7J6f&V(5XvyF&@xkvQH!TiUb4F}2GPO=QVkyX*#_u5_n0dwxdmMiSL~tB<&Sv;> zox)eyao_geD&Sd6$delw65I5|@9pMb;4(qZ!EjG;R4`|;O32sO!a%sswqvmQ+3JAa`MK5dk>%~Wx?_@=|e}ke9>zG=;2+(6YU=F zQgXr3BLb-D?lB86o_cnh8=@nL902bpNiF||De>8$A1TT4Kr4PrfGTU}lsduCEi&i3 z!dc3u*(ZcDNXyn1NuPINIpo8>eXW#WO%-pA22Yobbb{KRRbk%ijzk$%uXWB-pSB}n z-co~gFBf7?9)=i@DW*}}jN-e&%hRCyo{pW-$J9t8AnbW{3dCPgF-j2~9^3LN@)lHc zD(xLU@}$uR!v0Se-Q~ep<>+@ez1Ky4fupcqYgiul48Xq3NXH zJm1Y9g5WITn|$~)Dz1h`OjJc-J`J2ly7Gx)YK?(W@vPEircMYvoHL9NV{sj4ERoau zguL9?1QQOXBzB)*d~UP&*%~Q* zCjG`AgE%&xNpCf|C7x)iI2G1ANFxN(3O>&hTwagb`9?a{Ben<>SKk1LBzd8Gpvte=-BGrZVR?;{%{9hH{!io&*Vj=W!+Uodh|b#5 z?Aza*Pec{?-4H2x3U>j%k!u^^R^UcAp;LI-A$}B5tAKbi5|%JfRrm4q>lWV@TmfTN_(5D2u`H2! z8pb^axN5a}0=ONWv#6QHZdab%f46`AbkQ*`|Gy_G|Mx$3zf<^EumYaC?o9)X2;8c!>^(L} zuiF4g-Q`T)AuyA=Dg&Qc5x_%zm7+YOk4MHacy~`al1K+a? z0T>QouS!u01B)9l6jiUvua##?+_E((`eALm1~h6&JDc0d7Lye1?l(G!$I5f%GKw_=%2@1BX`G1 z9n*wtRpgXgB6jW*xExKn(w?-q1VDM{qJ0NB>(-ua4BabAaHV_ zxCH}WfBXd@hQ9oD{==TkkLk(loP>b;PK-&i(j0m`;~z6(;@qNJhV8dqm|hMad1vp3 z8kZ=dBi63eS$+Zo3MWwyjX+xB?rOHf#kG9Xz)so_vq&+EA+JZKIIF|d{pC*wP!m7! zJZS#vvIAm;+ggx4EWH5(U5MJeIUqz)CdLSd`^;1&HSsAyJTq z)eE;25Y;v|OeXICoJbSvfAh`!X&NY_@~`jqMuI`D^YJ?WbNJzA-M^0?77FX?lsv&T z01f_%6gaOAmfk=WG3~*IR^-XY9)7u$229@ks0?s>jwhY*kFM~M#l6nQyE})BL4M)}{?bTBdHG?f|mK|N3o=H57MW6&K;nOPiwz($QDFX1W}I2nk!OM_6UxAq5kx z6_tF^Xo3TOauuJ8$Tm5UqSXs9Qs!g=9jiTr@+la`zz`Q;1Vt2bzB;wc-2^E+S0XqQ zc)`Z&7SY>vRQY&1=t!vFBn+j%rhkQglf&BBlOK=c`Xf?uUdYETNC;ZF9$`r50HnDZ zhv`v2Xm^!y-aM$=|AhL6z}$f;BjJr zA5+Q}P(E*da5qa4&=KD1EdJ66C>gw>vGdiSI*D6D zmN=5c6p`ZUV`}@Ah$$tm=v(&N81>xODVvk*V% zQZV~ve`Bv&-PnG8BkE~8P?ojL42`f+qWe|nR#raZ8UdYVXQ!vDW*!_w>|Vj%K+IF$ zt|V@|ofe<73G}%#SAr!di$s%84&k|L@A1KVRq0ot$6V-k2BKDu+_*}qHA2nq92bNT zA~^oHHXL~Iu^Oikf65TInWc;SlF5;|JT^xXo%eB?rbEy zP&eHd*ApHH#;`Uc4_#b2 zOxwP-mDs0IN%Amx2aglV`V*S^! z`gv;q<1!h0*i@|VTo8$KOG3=Hld&f+*r@a~jBL}ENIj4_VSDEQWwD_@DF65prMi4Q z06VS6329Ip-xygSRbzz;anku&F27emq$PopFLK|#08In(B-f$dE!;HAeUBMs1!Mpc zF`Q(a4CSoFhMCansReS;gs60BUfdqf>u=@}B~&3$$%uemHecZ{@{c69c~iV1`Y!LO z#0)@8+`cbJxA&R1%|3gRnoW_KN1-MIwT}0Bt}U6@5+lxaZXv5AkcX*Gn`EezK2*yT z*Z}rCY;Gb^^vU!#xjQglm1lAHi*!W=fclMCKB`0%K6L}LH^AZf^Wck|(Kek>hxgs> zrhhH)n{_k_2=Zw?n`NFB`Pq^Ozn9NoEWhki)jkMCq&5Jm3;hcBEC44jhad zKC3C1d6e)mT`&$FImtzx88s)Xnuo(9wmTW!6Y>oO1>V!Ko)gp%brWK;kw#(3hh!)` zPn8Rqu6RJ{MtiBoEPOudy@v(%_X$Z+MhlF$Km~9-(G&2@8OkJ{DZ}d>8(F{=~v0K&nc`{9R21C-7o#2dVu1IN9PBy2qr&^ObFbllXC z>q0>x(yKo8;!2V$oG$xN4kIjWAFVhi|Lt$OZ|0HhW!$jE+4?eVl(4ZQ)Ph#*H`k|i z{{WHrk+6)|su@Y;q%9oJ|Fn`!rTI2Hpis3lwE)>OjH%pW-KmZ?sCYb8kN`ujV`Rl@ z>Sl_qmHOF!CqtJN+E{02UL}-&?>PYyKZNr1DpA*hnDxykO|W);v#00h8=k%BV|80V zlUB_A_NPrntmf)Qc_UOV@sYv1V$Jv3fok>pMcuX%Be-L5l*;OJPhYCOhUUH)3wa;E zJ0~kBo$tDc8m+wbA=lJr!FCt)1^dSu%#o>OZ#1ExX7%F4dpqI#i#rnGAiu|XOOW1i zHB)ILF_}qtNiDI#A;^7Zk-2C0wq4q;m$Ocx(jys0O~N8q!VX9!=o~I#f+>ask*QpC z+ROw(r?z$@5xhb7hlV_xy4Kt$C|#bQwk9Tpa7f^endEkTBq_g2ZG)vn;CA#{XQ$Y$ zREO|)_bP&Ifx9o1!&O4B!8mZO@1N-7aXRjf>BYqF*$w_hja1)u8|fh8Dw{`T0!F>t z0=>tMWEI1nAwy2iu3{M7k$8DuAR}2w_gQX@ck+%MS53$fnI-TqEHEX^m4g0M3F351 zn4)9^P_PWxx*!AByXzPeT@G6AGFaFyQ2r~z%cg+JVF6(jsC=0~?bxBOq)4^e)!Ffc zCZ>R-NO1~;7pr{OOEd^+d2z9fDCgh8eP2O3+piCFx);k0K15Z;C82$|1p<{86p;M? z&S{{Bgq{u~BoBuKRW~$`@5vzyFC8TYbvpT)7P5dK708l-nCu|Rc-_J+2+mXyC1hj4A0{tRjRtXwu4Frc{$2SzFhVqQDEDkQi#WxcX~j^3oLF z78Kn5S6LtE^cg$8%DpO%Ab9M_(EMZ&m((7cmM=eDD=NgbolAIIY4mNR#1ZfWd~1BU zdC~lA<0u?cre4ELTi$H3)^^Gc|}zqA6* zIa9raE-@<0zSHjNcQT~|G=xxtikBONpqm8xmlco+ZwKqYs|Bo4QU7Yu*Le`3pk0h$*|C}Uc17!!NN<0WmR^1jV^j`@h>H)rS9a$a(bY#O{NmsfY3BN zhx(}^1{Kl7rvO zTZUcvCQ|kVDZ4ifC%`~n`@tvioenp?vITYNl|<7k zVm@sTS{ipTn9=;YlAaR*W^Gd;kdy{TeP zRs;y-^>HN(%d~bwe5Z_kX?sWoQARSJ=6hJP#}32$oY+*G>hr`3miwRIm+>n5PC%yH zuY`>;!R_K*(z*>eP>-kiI@}LbRWf4eFUAcwrj}Ozun6Tcp9X$*8Jb9Xk974ft$}l} ziHdK?r#KR$GN|CB`AM_0<6L+ve}aK}&y(`&HJ_* zs8L)cTER5(-h@bb_?^5B=?%*>ZOLEA4Cd@MHms_l(di#z&P-G0SjUM-xxb;hi?kObU69A|H}NQF!OKBe+7X;*9vF;#(Wh(nZh8nxBKHq zqq!G+OGH`g;SjsHxmf9dfjooNyAE*N4xt35gsgEEPcCHIAMH%$38We%AQ77yQET|T zy-5=Xb$vcPtiWuYWaY{!O1exG)%1ORV0%Z&82s8-DtKeZ+;FIIX&SYM(3g* zPZ#{8BAGF8?y41J+&nv1={ETlG(olk_j7(G^qkEB*u(B+tVdE{&lSB45{5%YUmI!b zQ>E05-vTz`;NeMSA!x@K+?2L`L-+LGxj7lq>sfiAVXd2oJQD)1?apLmr!Q{vsxYWn z{fb4Edqmc|{M_#!)SPyyZ<`CJWAqOnrw4-J*Lryq`B^^Yv82>d_(;R|N}uhtN5cbk zeGQ#$-*dm=nS3G$viosCpop{5@~HsdR)?yNZ_!Z7)XY5`@l>|&YHz@0OUX-*{W3{U zvaS2p%<@WQ>VJrw>i`hPXRN~FtPAmuMs))h5+b51<)j!CtV;PWnd=WIk!Vl8jx(}% zxmaqiFygx)&*0`ZV^c>7d{-g$+SDsSUl`Wp5+^Pf`irHz5U`9_*UciyHE}-UO*)B2 z<$bBqQZ1T!Plb$I&zx7^j3pj{KEKu1Y5evSWMsYO3pC_eTeF+gv8D1_ab1_f#)IKfgQ))WM6y63uz4j$|R^Qh%Cs-1lPnkbWH;gv@Gh>;LR<*Y- zl0^f%R|;H?Syq^E-R;Pk;?RT%4fPW;a>iXsCc7X3vI{Vjj7L3$`mcRc2h765MCZk!0&lR$1g#_+BAE=^cX0tvIDIvnhR^njplyliijQmTW${3D0o%XfE43B55ZgA zFxUBpcYBR)>)GMfoBrLMoV5oleBZh6rES5PbeBc0kANQy&5Vipw^K4-Z?oV1w-WW5 zIDb-Le#=dd0ZGb0wm6C$Oev`EE7;tUQtLGBH6$%ET#pUPquRbfm2c21)N6A~`S9SC z#mXYiXxbYcapK+tqD=YcBSt)O&b}?tdFAU@uS4z`%_XN;jf#GD3ftnvxQCcH)Ub1H zZ{5~Br3GUp_>dopr`M_cP#RiXG=5kYNGG0gKfJ()@0UoJ|E+MKW~IIYVrQYzPwJ69Uo+ zIorJpyz>(TS^r;YXC4jp-p6qr7UTXZERVtWeANe+f4R|86$;AvSpc+WGA|# zvW_K7QTB^Lh{zt3ifdoSc9m@;&v!h}y>&b1KIb{-`G3xtGw1x~`}=-B-`D%~E{`MV z&z5OShJTRRw^rQ|kYkX|e1YwqmD#ILXM=10{qzasWM#3xWN4`$-aB_u7%0uIf!Tg?4%lnk3`=Byk{{5(B4aE0 zG6;1o$4eeI0@~TF+FqCXWm9vB0#-JH{$M^zP!HNcNLab#U}q-{h->sgQr@Lhx0&*2 z<<>T!glc4Zq{6I+`_t$Sp2fs)xxPCB8yQ}SYbAD-_Xw9kIH@uTmALF2`nnYf?azYW z1QV|BbbUorf7A6fa2^H`Tp#m}sPJ|p@74#(SzR>%^JmQVJd#QEOO82pBS0>WlPu~v z{6U^-m+WxH$5d`}0AJtdb=?x06oxw2G$5X@-uBvXQpWo%UOqz>)?Q%vm>O%$_ywHv zyX-aU7OyX3NSIO25TYUUzO;}k`p`phU7bTE0ud^*Q9H4dVqd=C2LTKR;w;^0qj+m` zpPL@wAzk1g;X|Sq<7%~(lc*UFha|S9iU{F)`(*dc%}owrHlaB@k}aj-Y8M`;UM3~$ z`uST`z|WoOda!H$G^At1gauSwlPWH8W^!WK%)E(v{-4pedr|w1Bd>U~)xuY72eOoO z6~|Z7GVO6@h;ynOUs!c+x{bQJ&KT?SUyTBs{)+hF-3bno>YnG^P41|dlEs$ z7;k(qdry`5ey{8c{LO2~#qi0CcR#NMg4TJk^pzyon?K$}JR&l;4mCSL++_v=(Qmg` zBvf2F#rX4i?Lm9R)z zM4V+1EI(nNqT&2A;&|A_{+^53sqtW-zuhzeuB@(kPn)^P)q}!?z{o=}O%*1X7oG6svr7SnFQL2{8CDmJ7>Tv7C4g;iJQ$8nLaz--geS!MC36#6q(pL!kXSO^wgxy43*wt&LR`9y6k%)VPE_B z*W0o6c3Nfr9gk%tPP{i*QqX{S0aIVO`nxK~3g^*|%jMK_tQm9`^_?MkkdpWD(eH&)Q; zK$#LeUr^e|wA=#5`+6v5{BJc6EOMbyanrWc)T~ENT}2jryvrRZq%&m`V@D{i{&_!P!?2R1ktU}JojnF| z?EqKMFbz?TJBw<7Vbg1N=k_QY0E=r)V*!p?mGR*L%JzC}LgbrnuT#kk==RKG*9RZ{ zh_uyc#8Xe3cU;Tw7IWbAzdpakYd7J4>Ic=H^(WVED(m?O{+DTQrWuG_U>aOeF#HjO zTOX8m&U`S!Zo!jcYMZzf*8%#zgb*??yJx(>R=Xc>)x`zCl^x&b8^|KA?QBo7@9fZU`7kH+^vcStYU0YXYbUzN~ zUZ>?>hRjzhE%yw(bveb+xK`;^15e-(Q>T4i;eFYRu{>_LYUnW?d8U*-3T*!3?^gLH zolfKbw`6Y@%(DL%kj=i`_%ZZQT+I6gzT0nwQa({5%~H=Fg@{hkMIqbt+FO@@amw(Y z7+f6T08x(g5L0HPOmkxDPeA2*8cL_b|L*iD__jL_-I`nY7T(kNccUwWS3*d+BvPIM zxA>i*2DOP^01GF!*zg`}VvW`otg`*ejqR=qpa}~A?eFZGmIfgvYj>|)y;{}?4q)Ow z7EIkwLNgo{l)q!zG@^iTPrJh78U|LY5V2q#z@~XgXKKIQ8X<~Bapg{fHfb~qjz*8m zD)&pC*vGK#1$=EO??6hRi_ScG$nVL*|(z!EealP z=H6pEu=DOtTCYsX-?(=!FXp`bqfv7Dh9?kK*1tSsBdp5RazDx?Fj6eTJy>8gpKr%? zjLA{mXEKsj+7Xkqlu5%WvO%HS0yUdktJNY12Ca2oL2y@{yaKoNiYqNlHgbI9$F(|= zj80#hKNLKr=z%1*?#(MmIHiMN{kq;)_dzpx5B-52{(jq7Un$&6;LI5h+u!43Y}@X_ z_K3Ab(&J=ic8_!r79HsnmT>c*k!dUM$TZeGwc&MdLW5Eo848Slhg5d`efo92^2o*9VTg?dwq{)2ceAd7VvTKmAAz?Z6j(eD~zC67@gHk z7crg+<-`4Fw9T$pH%v2sgic_2`dXXgs@5c_v*y2JYBMX}VQQH?o)|sxg`!Sdsz(n> z_#Dk6-8;95t|PQnUE)=$YtNcKnl}mv(5mlHH8Q*F+J089Xfr^GGFbEO7GuOOtaUBn5$eQIt5D^A||i@2{!>D9ZT#d-vH)^gGVpK5q(wJ|B~rh zebt>+eed_}lO_-Vvwg{X2wuQjUX44mAKzL#+#ZvWACPhG`3j_#7q=pWm1_%(q1W@TEbW}i!bQPsa4IQKg5Jb=bN^b&& zE}d5 z(Zlt1kmt^ky$5zmYI5LAMyGos@I!VVsi$?WdYF41IG}LVL};En_a^D$vBL%6n8sWG z_Wg6`nEn3jWV0^356+zfeTM63nmw@He7+g<#o&|f*ke!qi(B8)<~a$ERTO!!=Wou_ zPHS*_Q>}js`t;3WuUVG-8I!Jz?FQAS&@GN4haf?^(4&Hw7;$Y(T#PvEf3I<_fJdC2 zo{&g>5fNv^_A_Hx{K3J_>OOI@8gYU>Y zJ6J6c6(D~5ki;7p7$_bkDv6`~U=%0k{ekJD#Zo$H{0@g3>D#wQ6e({6v7y7EYj*A7 zqnW8mKY5JL3h^Bd9)z6-p`k5>@crtb)8TKPlU84hO6kEJT`%i9EAqtlI%!R08--@2 zL@&OWbeq&8bUen#tH%?OVCNh8S3RJ9)0Uo=P|@E$2Cv9UYU5<6Ce;m}i(kX2Pq-(m zzua}r7q3tA{+7yYnferc(b4vMIw*G`3x1pT#N@;tiO*>$gx8)LGnT^dFQpYjJp41Pz>-MiTt+B1T% zR4{qe{rcnkWJJdk@+K*f=G0)xm#*1YX>yhwU%zk<%sMlhnNLlQ-CaavtV&t&GpJ@J zsJc|~GoXehob!uMmv{>(cWPEM-c&k0H;57#E%-)OX2uld5^c;KnOd6c=fdD`qdF-6 zG@9XcG$(EcZz>#r6c#=C5!HmCUNI{c zE(=Q#uW|>82Nxo+qo31NSG7J=l$WvVbt$el?dP*n3OuuFd^zR!O3+1=i=HhX%0-uQ zhy`zEqJCS|2I2xvmdjhMv=B|=CLcN^E#a&Ou_uB)wu=|$#rMPr5Q#-PQV+%L!(AMi zG7{c933D>TBGe6DM6l~x385kz>{{ZqU&bpB(E_g){!CSFyx#?~m- z>y`I`;_2C7Yu{^hd|r!#k2c}J3Ho|JoksgbE4e`jc2(PT9Xnv(o4ji&eY;T3oVIT= zK4bS&rhSs?h!*d)kVoQv^Kw##pFD({NychPum@erCr9gkQjN5x!_*={o~g6SctviRgV2`_ocpdX{razYXjFX zZlvc1T-g(82f1eSo!Q>?M0a+u>^M2u{#8D@ge1KcjkN(yrdMa#-1;@per`^w$+Rgd zdi(yojw#{zUQ$03eMGI&69Jy($1RISBcB4ZBvmXYK~59CIT#6s>kIs5lVmC>=<_MD z*`(05Hb0~l8+uDBV8MofLoVh(1a*C%C4 zTy%3Y$w{@m)%dx{uulKrHTNU&JKuZY-e1t!0V3-uvTypq`mHke`OxPRM3w3a2UL`* zjS6v6bkE;>4=R-QzM}YfFplYdPNE4g!foBm zO??uJUd|U~rf0AWzP>War-BcB6S?`wqD}Qc_vgF&q?t3OWM105OnF9NbmiNi^(Z9k zHHhRVAA^$6GVm`%wKWfsGfo`yK!>b z+f;c!^6V!&Q!qIaFbnmcj`qK9q&k}!-e=EAg_;oDd%3s2lb5{-Tpw$wd7xXt${oB^ zwJ2K4!+q?|XZky7>F!9xn~Y5mG_J43vXrXX7|@{h<8 zJ55#!JZ!kn&`L23y-k5l7FeJe;k^phsQdP_d~#bl4~-0x6!**6O`GcMUy)OaxE(IS zl^vD$Sa<_f0+(bwA`c*Ip({J)eNZuexZhrkA)(d^6&;^3usL_|arT()=QG3K${x%4t0$JDmoXo)Dq-{Wx zJ0>a#!U3yk|CQ}uzkVI<6S4O<&WXUU+rN*Fjt(zKQv+XL?}8i-eKe{fYS`J@imZ>4 z-(k*BG~(kS5{aJbR*?jm$1a6!UlB^E(n<{1MG(&C?hqEw;L3EV;#*l0Bi9Lk)#ul_ zmzPIV#q{mIm>RPYPI}!A2`>F-WOK_F=WJqn3uE7ZG@B?i8-19eVeZG9#W?iUOoh_crVyDxuWonoZ-MyM;^~6+Tl>Q}FhN39VXs<-hd(2`i64dn<#X(lC%WCU-m(Ck!U+XFy zT?o-^5P9(V(dpst#aI&#rYZRxl4IT-WI*@sy>g!Z^0XMQTrPWKGpV(}S`a+qT5g2z5b?L`UGZ)QH6)}L7Tp%)~+_c5>?fpE@u zy-mbGzRr+}7(DXdnzmy24$Z!(03aJV#NqMrv+=e~XleM+Sz(L%K}cFQ5}L{gY_1V% z=`qvtFS9Qvtaw5J6Kv`X1EGR}Ehwn(Y_?#Z3Cz?OWFae>T8R*e#rvTOl5`5gpi_B= zG{#KXwTbXXqpNLO81ejI;;MKJ{B3D?3`%FkYnexwJ2-`hm+7h`DP;e=U(rLWgn~#R^DgGBZ)Y4!UavYN0KKVxzx^S9xg5#E$8Eb2>oqnB0 zjfaw}+e3(GZ094ti1%VDV^}3`0$rN8)Hi{JD=Dwu&|r$Wp2<63VcADy^Nd<-Lg0Wj z@)pFWWWGD7>NS$-d zYzO33?#OYAcTB5Go0+ogEi@uk?X6>_8FSuS@*fRw=tnv@njlAM;NiX>64-WhX5{x?Br6{6jf z)CTOHCC(6-JBMl-V(CyWuG)h7hRkZ?QftXW{EG-J=dKGy0gqtljjAC3GtF)+Y9&s} z?L_DS8#UVnMwO3tr?aj2RZWcTvsy%d;sfHzLioOg&f7uy9LPJqnqx`^D}BmMwxe=w z$wLrI;`lwLJy3GHqTzp23zocItG`+#uPG%R?H|vcEG{}h8Pr3?>~yfVhOmEP^0(#X zr#h#iC;bHm$`@Sl)7vNE2f@MyNFfli%7xHIGo&zc2Z8ibr)pQ<3@5qw$HW{vT(j*k z4QcOjf;kdSO9emA5nY*6lyap+Km7&*Ia}j}Y~r^hVltn@{Rr9mj<(dHd+jFu4Ruv2 zZ^Kv&22w@2Ts`)~Us5wMXJkP56kE4WT0>GK-}i$PdZh3n?YoPYxsFW|!F_LclL`Ks8;KFJw3{3dANCxv$7s_^Hx0u=u_nfD;oRST7ky@gy`F02q>Tq; z{o@=%qV8qS#ic9)TVuTPc5AkzZKk842HJ-Db)vNbU&I(wB}`Hj7sOYzua^x-q$cY5 zncR8D|6zjayZai(XrPUzr%}&E2xR3HhKb5r{#{1YSpoAr#{AvsnZ@_+ay%(!i{>kW zHmoo|${`gUo5!)OZ$8HskMEs|gV#zPnPMhYRI!F0f_MhsXKGG$(9$4ybY&x)_xR5+ zbyyhX46NRTOe>ep_RS+S98NZ$OVk%cM-ZX!B%8;xt_nFLabaC%=?eT`UTtBM{*lf` z)@8#5#4)Q4h(~k+dXwy zjk2F#3t0@W!Q413Ojg+Uw5TXmGwm_T3Xr>!l2H34A0ig3X;5*&qV#*q9ZREr0b7Ab zqXxGGPr0@kMRjf&Jrv*MJv&9Kxf?LM+8Uy>WK_6(O<#DssnRKc1Q*GeYQC_s zXPQ#BYHVuflU`421krI`Z)1BB|G2s2Tjn1@1bxJ^EqY;a0@V>Jo2JlG9rV}fLiqi; z`Tl$JOPdwpZz7aQ#ga11UFxa_A^V_$I4fCE1F`CW0_o;?a#my3@=kv>rUle|asChQ zHtaQ2f-BKlQ2S5hvN(yn`ny?I)PVbg>6ETMr3YoIbP_1ao&tg>)IHb)%xG=!!*oLK?C0vm)v9HZ> zYoaneZle4)VCQ$AUjiBlATYy>4>)M7iju)X^*rDNI40_alKT&%CSEAZ)*rkAEYat~ z>s3xO+>;Td6WE?HJ&A^SZb90IudW`9Eo%V;vbwM$6wOWIUQ zYPiW;tnOnkn^dYYh0;^XW}fyY*Fw?S$W)Ixs;3UAMi0Z>S~vXN$p7lTp4S*PZ1Mg7 zXyv#7)sE}^V>E7W?q!eK-IVfaa;>cw7v9r!kP_vYc@h_DEAK&|u5K6dS5CR?`)q}| zk}fMZHAb#p6~}?47#dBnwZU2YxH3RWJU)vdfvQg+HCpyk2`S{cA2E{r`;S_K>zj|n zT)G-2{`jFTB1a|lfBK7qI6Px7X)`cuYQphd8e{XQ1|W`R?LrPQZY}yqhAD2jSwS(WhobHlh((@|&vJmUd=8-HL??<%dabxpM`P9Eey>FNVG<;@D zxqd$~1j&?gtppC!$teDpW}6j}W6}U{UP@1u7omKHZIo>_On0qyy8SF9&Cbq_H?UpY zw;mpc7j|^U=z8?XpYia_%x#7T#CC7jn6RdNbwXf3WudM!8GY4LNgeTcCSVSJH3vX7t`@47Y&fZW)uM6$#OhPHv5s8t(LN(6WCjel^9dw2Y7gjmv@>sS5@mQT;r$gq)n*_%E? zlQ%?d*Y-cngo;B*2s?mnq_;FDRkp=OvdCWZ(&tvJGco#1`}8mLf_%t=@EI7Sf}!qF zhF922n{9!~05+n%pPPrEQ*;i{v6^xxU*EnQt3CYvXzbEv1~=7l-8e|!PjSN9{= zG%v&rh$ET+IpY0)rQPnB#)<~jz-udhfSuc?ju=ek2HO>`Dl=dN2cQtAU;5^o6)^OX z*8rBSrKvzh1&Qoz9@kHPWw_lji}_H{%qxUwDtyxV9YE8{74WOxKi)v&{kzd_a8c?7 z;B~LEE)V&Sb`*V0xd#N5nCZFMb!5E6QM%lff$&Ss^!wNDUn~xYhdjhSs+5@Wx;_va zX3B14pr=p-D#)BL;)KI8^`rgXAptZy+tfqirO8+-B?$LX%x}sv^yDMcq{x&BFOL`) zCn0P416$S%WPjKUEo;hoQ$!a?J>D$x^>tL0Su~LrPE1pZFS8+m{A7!KiJhEYA73cn z%e{ixj`_sg{sgwr&VQDy71f)Bb|0x)k?r&u-_{?j@S{p`=>OprLviEVB@cE#JQ)1n z^i#bhsc)q0TumLxP^rcQ=!YuuYmcpG$uzUJQt}A{7l^!g_x^zG$Xso=5p*nmuq znGRa?-x|A7?7@?xG$y9ogJ7e>x})rp(C?vQhx%J{2WtHzBO`U{#2rJ>HY-3cKv363 zQj>s}9K@68y^Wtct0SRq2ADWJ|0G0|bBK-a&aqR9h%In}X%gZdQ1bQ6uMy0evIsz1 zXzX@R`xdpNy6x8f*85yAU@L?unk7k!ubYPgH-NA{_q1Q*#6-V8Tg?12uY))5 zNIl?vQC?&sbNvW>d9_XH8q*X5KsPoFE|0tx`U72M72FM~y^w2vClf##vV-35fn@S_ zP#OI6n=ZeO#7S7z4!ht5Z8Skhju{=DAeDKH^7z1vf&K>Y!R{e2nbXIiOv%RWn5=hp z!}dSHg|F{!O4J`m-Tz}8!n4A#2%FA2(R*6K>Hj^QK$@juq@_8V#|d^6ADnPRP^wnq zAHu@@B?I}f!oSR8CeY#T*N!K^e6@xHX`R;L+T{|GCjY&yPgO|6kixiZDYw7qDhE!6 zDijtZUn?Pk_S>SvLDHg04-zPJuQ@mu+`_&t(>(exMVu*jmQLULO(Z@9Pzkh=LyC-n zmk+W!e02NO%4dC9l|8Th+DYP*7%vV)u=KFJsLI0OyRqTp@W%j5{1eN$-zL+2k=!$h zwk5&Jtba!fM-Xk7P(Geu7`$gFS`R0X3iXLtQIR^|vJVL-r*lB@fh1fBeW)iVeLDEc8I-YP(eL z!rNkW&?scYcTAXi)wCG zQO_0JzA)7vMhLyLCNEd_3G1cqsm+PIKC{Amp6S38SUS`EQfi=w{;%emg~3nF5C`f* zD|(v8bOsbfw0m=PHrEJh~fipDC>oMwaEmEr~G}CaqviK&E>q-s;TS?iUAsID;ueuUQQWm~PM4e2br^*vL&oOwWc{ z&)O?RcIH0B9&!PFM(x@IdQs)m!WSF^PKtVuX>$^gz`; z1!sL4a$XdV5)riSb^Zggd@^9=^0}5H`qd*KX{2xuDCI+gm zzB;CZvej9Nygi1Mj0j&~*KgUMi`?4=O0%H^GhoS|0K)r$>uy0rTZ!P@Ip2yi`A=Ao zF9Oig;+9@Q*8bw%T;?Hz6G9C13BCL>cuA*_> z=S8W|&;zW%)Ee_hndH>fO8FU%95I5MLZ#Y~E4dEZ25_}PW;*himB(}anjJEt;eu92 zru{Ez_4mKlXEWNQIvb!Do0YVkRN1pvG*;@>%*68`OY{mPdkgOggn7Q>Psow zpssqL!}~IWIW|Q8a6|Viml*aJkQowOn~3!0V8p)38)^BcYDt&lws zc<9y#1g-VxCl%u?67tB0sSyg)rvgc8qN-46fa~?3qYDb=BFurC3eY|aR=Oz##243z zRt~q@RQ}Ugk}r#xuWXeI@^a*D-yp+`i{7C(i6cuqS*`bS+G$dYC3Ov#rk}tZp2bv& zj%X;RP-0&SErGQYa!viu2WFXD-;PfHf)sWd(oRns+Xp^Qc=7Hx>e^rTNgGolaS!g7 zWUowXSXHi_OhJdf!Cozx@cOmza96(d_J|e1zW)cOUciOU=-Z`aNfd&kjNgV#@tJ#4 ztS3dF7y#T6nDBsw528E9ra^aZp1&)^XB5PApz220QTmGYN?5=3?sD9ZwDM;$p;sa6 z2TKe;INtI3WPc~ f$Jx=`8CgzFpcb{YS|IS@%Q-mASf^Uc{_%eR0z4zH diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/identity_pool_ids.png b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/identity_pool_ids.png deleted file mode 100644 index c29f2fe43036c5f05e0bfb84276598cfeb087759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68165 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 z 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 diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/lambda.png b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/lambda.png deleted file mode 100644 index c752925a808ad277d19ea25e2dd9d637a2b386fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20346 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 QKfVrTCRWBoL(iCh14<4wj{pDw diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/project.png b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/project.png deleted file mode 100644 index eacf60afa88871f2fa39b826fb4b5b75a1ea4757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14249 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 - - - - - - - - - - - - - - - AWS Personal Protective Equipment (PPE) photo analyzer - - - - - -

      -

      AWS Photo Analyzer Application

      -
      -
      -

      - You can analyze photos in an Amazon S3 bucket for personal protective - equipement (PPE). You can send the report to the following email - address. -

      -
      -
      - -
      -
      -

      - Select the following button analyze the photos, and update the Amazon - DynamoDB table with the results. -

      - -
      -
      - - - diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/js/index.js b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/js/index.js deleted file mode 100644 index 4b1f7510f0b..00000000000 --- a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/js/index.js +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -index.js contains the JavaScript for a tutorial demonstrating how to build a web app that -analyzes photos for Personal Protective Equipment (PPE) using AWS Rekognition through the -JavaScript SDK for JavaScript v3. - -Inputs: -- BUCKET_IMAGES -- BUCKET_REPORTS -- EMAIL_SENDER_ADDRESS - -Running the code: -To run the full tutorial, see -https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javascriptv3/example_code/cross-services/photo-analyzer-ppe/Readme.md - */ -// snippet-start:[s3.JavaScript.detect-ppe.indexv3] -import { rekognitionClient } from "../libs/rekognitionClient.js"; -import { s3Client } from "../libs/s3Client.js"; -import { dynamoDBClient, REGION } from "../libs/dynamodbClient.js"; -import { sesClient } from "../libs/sesClient.js"; -import { SendEmailCommand } from "@aws-sdk/client-ses"; -import { ListObjectsCommand } from "@aws-sdk/client-s3"; -import { DetectProtectiveEquipmentCommand } from "@aws-sdk/client-rekognition"; -import { PutItemCommand } from "@aws-sdk/client-dynamodb"; - -const BUCKET = "S3_BUCKET_NAME"; -const TABLE = "DDB_TABLE_NAME"; -const FROM_EMAIL = "SENDER_EMAIL_ADDRESS"; - -export const sendEmail = async () => { - // Helper function to send an email to user. - const TO_EMAIL = document.getElementById("email").value; - try { - // Set the parameters - const params = { - Destination: { - /* required */ - CcAddresses: [ - /* more items */ - ], - ToAddresses: [ - TO_EMAIL, //RECEIVER_ADDRESS - /* more To-email addresses */ - ], - }, - Message: { - /* required */ - Body: { - /* required */ - Html: { - Charset: "UTF-8", - Data: - "

      Hello!

      " + - "

      The Amazon DynamoDB table " + - TABLE + - " has been updated with PPE information here.

      ", - }, - }, - Subject: { - Charset: "UTF-8", - Data: "PPE image report ready.", - }, - }, - Source: FROM_EMAIL, - ReplyToAddresses: [ - /* more items */ - ], - }; - await sesClient.send(new SendEmailCommand(params)); - alert("Success. Email sent."); - } catch (err) { - console.log("Error sending email. ", err); - } -}; - -export const processImages = async () => { - try { - const listPhotosParams = { - Bucket: BUCKET, - }; - // Retrieve list of objects in the Amazon S3 bucket. - const data = await s3Client.send(new ListObjectsCommand(listPhotosParams)); - console.log("Success, list of objects in bucket retrieved.", data); - - // Helper function to convert floating numbers to integers. - function float2int(value) { - return value | 0; - } - - // Loop through images to get the parameters for each. - for (let i = 0; i < data.Contents.length; i++) { - const key = data.Contents[i].Key; - - const imageParams = { - Image: { - S3Object: { - Bucket: BUCKET, - Name: key, - }, - }, - SummarizationAttributes: { - MinConfidence: float2int(50) /* required */, - RequiredEquipmentTypes: ["FACE_COVER", "HAND_COVER", "HEAD_COVER"], - }, - }; - const ppedata = await rekognitionClient.send( - new DetectProtectiveEquipmentCommand(imageParams) - ); - - // Parse the results using conditional nested loops. - const noOfPeople = ppedata.Persons.length; - for (let i = 0; i < noOfPeople; i++) { - if (ppedata.Persons[i].BodyParts[0].EquipmentDetections.length === 0) { - const noOfBodyParts = ppedata.Persons[i].BodyParts.length; - for (let j = 0; j < noOfBodyParts; j++) { - const bodypart = ppedata.Persons[i].BodyParts[j].Name; - const confidence = ppedata.Persons[i].BodyParts[j].Confidence; - var equipment = "Not identified"; - const val = Math.floor(1000 + Math.random() * 9000); - const id = val.toString() + ""; - const image = imageParams.Image.S3Object.Name; - const ppeParams = { - TableName: TABLE, - Item: { - id: { N: id + "" }, - bodyPart: { S: bodypart + "" }, - confidence: { S: confidence + "" }, - equipment: { S: equipment + "" }, - image: { S: image }, - }, - }; - await dynamoDBClient.send(new PutItemCommand(ppeParams)); - } - } else { - const noOfBodyParts = ppedata.Persons[i].BodyParts.length; - for (let j = 0; j < noOfBodyParts; j++) { - const bodypart = ppedata.Persons[i].BodyParts[j].Name; - const confidence = ppedata.Persons[i].BodyParts[j].Confidence; - var equipment = - ppedata.Persons[i].BodyParts[j].EquipmentDetections[0].Type; - const val = Math.floor(1000 + Math.random() * 9000); - const id = val.toString() + ""; - const image = imageParams.Image.S3Object.Name; - const ppeParams = { - TableName: TABLE, - Item: { - id: { N: id + "" }, - bodyPart: { S: bodypart + "" }, - confidence: { S: confidence + "" }, - equipment: { S: equipment + "" }, - image: { S: image }, - }, - }; - await dynamoDBClient.send(new PutItemCommand(ppeParams)); - } - } - } - } - alert("Images analyzed and table updated."); - } catch (err) { - console.log("Error analyzing images. ", err); - } - try { - sendEmail(); - } catch (err) { - alert("Error sending email"); - } -}; -// Expose the function to the browser. -window.processImages = processImages; -// snippet-end:[s3.JavaScript.detect-ppe.indexv3] diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/dynamoDBClient.js b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/dynamoDBClient.js deleted file mode 100644 index 74464fe5424..00000000000 --- a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/dynamoDBClient.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -dynamoDBClient.js is a helper function that creates the Amazon DynamoDB client using ES6 syntax. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[ddb.JavaScript.detect-ppe.createclientv3] -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; - -// Set the AWS Region. -const REGION = "REGION"; // e.g., 'us-east-2' -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon DynamoDB client service object that initializes the Amazon Cognito credentials provider. -const dynamoDBClient = new DynamoDBClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); -export { dynamoDBClient }; -export { REGION }; - -// snippet-end:[ddb.JavaScript.detect-ppe.createclientv3] diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/rekognitionClient.js b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/rekognitionClient.js deleted file mode 100644 index 743156cdd87..00000000000 --- a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/rekognitionClient.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -rekognitionClient.js is a helper function that creates the Amazon Rekognition client using ES6 syntax. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[rekognition.JavaScript.detect-ppe.createclientv3] -import { RekognitionClient } from "@aws-sdk/client-rekognition"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; - -// Set the AWS Region. -const REGION = "REGION"; // e.g., 'us-east-2' -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon Rekognition client service object that initializes the Amazon Cognito credentials provider. -const rekognitionClient = new RekognitionClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); -export { rekognitionClient }; - -// snippet-end:[rekognition.JavaScript.detect-ppe.createclientv3] diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/s3Client.js b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/s3Client.js deleted file mode 100644 index 98dcd8374f4..00000000000 --- a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/s3Client.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -s3Client.js is a helper function that creates an Amazon Simple Storage Service (Amazon S3) service client using ES6 syntax. - -Inputs (replace in code): -- REGION -*/ -// snippet-start:[s3.JavaScript.detect-ppe.createclientv3] - -// Create service client module using CommonJS syntax. -import { S3Client } from "@aws-sdk/client-s3"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; - -// Set the AWS Region. -const REGION = "REGION"; //e.g. "us-east-1" -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; //e.g. "us-east-1" - -// Create an Amazon S3 service client object. -const s3Client = new S3Client({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); -export { s3Client }; -// snippet-end:[s3.JavaScript.detect-ppe.createclientv3] diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/sesClient.js b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/sesClient.js deleted file mode 100644 index e4ee0ca6db9..00000000000 --- a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/libs/sesClient.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -sesClient.js is a helper function that creates the Amazon Simple Email Service (SES) client using ES6 syntax. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[ses.JavaScript.detect-ppe.createclientv3] -import { SESClient } from "@aws-sdk/client-ses"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; - -// Set the AWS Region. -const REGION = "REGION"; // e.g., 'us-east-2' -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon SES client service object that initializes the Amazon Cognito credentials provider. -const sesClient = new SESClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); -export { sesClient }; - -// snippet-end:[ses.JavaScript.detect-ppe.createclientv3] diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/package.json b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/package.json deleted file mode 100644 index 550e0654aff..00000000000 --- a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "@aws-doc-sdk-examples/aws-sdk-v3-ppe-examples", - "version": "1.0.0", - "repository": "git@github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/ppe.git", - "author": "Brian Murray ", - "license": "Apache 2.0", - "scripts": { - "build": "webpack ./js/index.js --mode development --target web --devtool false -o ./js/main.js", - "build-cdk": "aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM", - "test": "exit 0" - }, - "transform": {}, - "dependencies": { - "@aws-sdk/client-cognito-identity": "^3.32.0", - "@aws-sdk/credential-provider-cognito-identity": "^3.32.0", - "@aws-sdk/client-dynamodb": "^3.32.0", - "@aws-sdk/client-rekognition": "^3.32.0", - "@aws-sdk/client-s3": "^3.32.0", - "@aws-sdk/client-ses": "^3.32.0", - "fs": "^0.0.1-security", - "path": "^0.12.7" - }, - "devDependencies": { - "webpack": "^4.42.0", - "webpack-cli": "^3.3.11" - } -} diff --git a/javascriptv3/example_code/cross-services/video-analyzer/README.md b/javascriptv3/example_code/cross-services/video-analyzer/README.md deleted file mode 100644 index 24f58150830..00000000000 --- a/javascriptv3/example_code/cross-services/video-analyzer/README.md +++ /dev/null @@ -1,578 +0,0 @@ -# Creating an Amazon Rekogition to detect objects in videos - -You can create an application that uses Amazon Rekognition to objects in videos located in an Amazon Simple Storage Service (Amazon S3) bucket. - -In addition, the app sens the user results by email using the Amazon Simple Email (Amazon SES) service. - -This tutorial shows you how to use the AWS SDK for JavaScript V3 API to invoke these AWS services: - -- Amazon S3 service -- Amazon Rekognition service -- Amazon SES service - -**Cost to complete**: The AWS services included in this document are included in the [AWS Free Tier](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc). - -**Note**: Be sure to terminate all of the resources after you have completed this tutorial to ensure that you are not charged. - -## Prerequisites - -To build this cross-service example, you need the following: - -- An AWS account. For more information see [AWS SDKs and Tools Reference Guide](https://docs.aws.amazon.com/sdkref/latest/guide/overview.html). -- A project environment to run this Node JavaScript example, and install the required AWS SDK for JavaScript and third-party modules. For instructions, see [Create a Node.js project environment](#create-a-nodejs-project-environment) on this page. -- At least one email address verified on Amazon SES. For instructions, see [Verifying an email address on Amazon SES](#verifying-an-email-address-on-amazon-ses). -- The following AWS resources: - An unauthenticated AWS Identity and Access Management (IAM) user role with required permissions (described below). - **Note**: An unauthenticated role enables you to provide permissions to unauthenticated users to use the AWS Services. To create an authenticated role, see [Amazon Cognito Identity Pools (Federated Identities)](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html). - -## ⚠ Important - -- We recommend that you grant this code least privilege, or at most the minimum permissions required to perform the task. For more information, see [Grant Least Privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) in the _AWS Identity and Access Management User Guide_. -- This code has not been tested in all AWS Regions. Some AWS services are available only in specific [Regions](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). -- Running this code might result in charges to your AWS account. We recommend you destroy the resources when you are finished. For instructions, see [Destroying the resources](#destroying-the-resources). -- This tutorial is written to work with the specific versions defined in the _package.json_. If you change these versions, the tutorial may not work correctly. - -## Create the resources - -You can create the AWS resources required for this cross-service example using either of the following: - -- [The Amazon CloudFormation](#create-the-resources-using-amazon-cloudformation) -- [The AWS Management Console](#create-the-resources-using-the-aws-management-console) - -### Create the resources using Amazon CloudFormation - -To run the stack using the AWS CLI: - -1. Install and configure the AWS CLI following the instructions in the AWS CLI User Guide. - -2. Open the AWS Command Console from the _./video-analyzer_ folder. - -3. Run the following command, replacing _STACK_NAME_ with a unique name for the stack. - -``` -aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM -``` - -**Important**: The stack name must be unique within an AWS Region and AWS account. You can specify up to 128 characters, and numbers and hyphens are allowed. - -4. Open [AWS CloudFormation in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the **Stacks** page. - -![ ](images/readme_images/cloud_formation_stacks.png) - -5. Choose the **Resources** tab. The **Physical ID** of the **IDENTITY_POOL_ID** you require for this cross-service example is displayed. - -![ ](images/readme_images/cloud_formation_resources_tab.png) - -For more information on the create-stack command parameters, see the [AWS CLI Command Reference guide](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html), and the [AWS CloudFormation User Guide](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html). - -### Create the resources using the AWS Management Console - -#### Create an unauthenticated user role - -1. Open [AWS Cognito in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the _Stacks_ page. -2. Choose **Manage Identity Pools**. -3. Choose **Create new identity pool**. -4. In the **Identity pool name** field, give your identity pool a name. -5. Select the **Enable access to unauthenticated identities** checkbox. -6. Choose **Create Pool**. -7. Choose **Allow**. -8. Take note of the **Identity pool ID**, which is highlighted in red in the **Get AWS Credentials** section. - -![ ](images/readme_images/identity_pool_ids.png) - -9.Choose **Edit identity pool**. 10. Take note of the name of the role in the **Unauthenticated role** field. - -#### Adding permissions to an unauthenticated user role - -1. Open [IAM in the AWS Management Console](https://aws.amazon.com/iam/), and open the _Roles_ page. -2. Search for the unauthenticated role you just created. -3. Open the role. -4. Click the down arrow beside the policy name. -5. Choose **Edit Policy**. -6. Choose the **JSON** tab. -7. Delete the existing content, and paste the code below into it. - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Action": [ - "lambda:InvokeFunction", - "mobileanalytics:PutEvents", - "cognito-sync:*" - ], - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "ses:*", - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "iam:*", - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "s3:*", - "Resource": "*", - "Effect": "Allow" - }, - { - "Action": "rekognition:*", - "Resource": "*", - "Effect": "Allow" - } - ] -} -``` - -8. Choose **Review Policy**. -9. Choose **Save Changes**. - -### Verifying an email address on Amazon SES - -1. Open [AWS SES in the AWS Management Console](https://aws.amazon.com/SES/), and open the **Email Addresses** page. -2. Choose **Verify a New Email Address**. -3. Enter a working email address, and choose **Verify This Email Address**. -4. Open the email in your email application, and verify it. - -## Create a Node.js project environment - -1. Clone the [AWS Code Samples repo](https://github.com/awsdocs/aws-doc-sdk-examples) to your local environment. - See [the Github documentation](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) for - instructions. - -2. Run the following commands in sequence in the AWS CLI command line to install the AWS service client modules and third-party modules listed in the _package.json_: - -``` -npm install node -g -cd javascriptv3/example_code/cross-services/video-analyzer -npm install -``` - -## Building the code - -This app runs from the browser, so we create the interface using HTML and CSS. -The app uses JavaScript to provide basic interactive features, and Node.js to invoke the AWS Services. - -### Creating the HTML and CSS - -In **index.html**, the **head** section loads the **main.js**, which contains the following JavaScript and Node.js functions used in the app. - -**Note**: **main.js** is a bundled file containing all the required JavaScript. You'll create this later in the tutorial. - -The remaining code defines the interface features, including a table and buttons. - -```html - - - - - - - - - - - - - - - - - - - -
      -
      -

      AWS Video Analyzer application

      -

      Upload a video to an Amazon S3 bucket that will be analyzed!

      -

      - - -
      -
      -

      Choose the following button to get information about the video to analyze.

      - - - - - - - - - - - - - - - - - - -
      -
      NameOwnerDateSize
      No DataNo DataNo Data No Data
      -
      -
      -
      -
      -
      -

      You can generate a report that analyzes a video in an Amazon S3 bucket. You can send the report to the following email address.

      -
      -
      -
      -
      -

      Click the following button to analyze the video and obtain a report

      - -
      -
      -

      Report is being generated:

      -
      -
      -
      - - - - -``` - -### Creating the JavaScript - -The **./src/libs/** folders contains a file for each of the AWS Service clients required. You must -replace "REGION" with your AWS Region, and replace "IDENTITY_POOL_ID" with the Amazon Cognito identity pool id -you created in [Create the resources](#create-the-resources) on this page. Here's an example of one of these client configuration files: - -```javascript -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { RekognitionClient } from "@aws-sdk/client-rekognition"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an AWS Rekognition service client object. -const rekognitionClient = new RekognitionClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { rekognitionClient }; -``` - -In **.src/js/index.js**, you first import all the required AWS Service and third party modules, and set global parameters. - -```javascript -import { rekognitionClient } from "../libs/rekognitionClient.js"; -import { s3Client } from "../libs/s3Client.js"; -import { sesClient } from "../libs/sesClient.js"; -import { SendEmailCommand } from "@aws-sdk/client-ses"; -import { ListObjectsCommand } from "@aws-sdk/client-s3"; -import { - StartFaceDetectionCommand, - GetFaceDetectionCommand, -} from "@aws-sdk/client-rekognition"; - -const BUCKET = "BUCKET_NAME"; -const SNS_TOPIC_ARN = "SNS_TOPIC_ARN"; -const IAM_ROLE_ARN = "IAM_ROLE_ARN"; -``` - -Next, you define functions for uploading the video. - -```javascript -$(function () { - $("#myTable").DataTable({ - scrollY: "500px", - scrollX: true, - scrollCollapse: true, - paging: true, - columnDefs: [{ width: 200, targets: 0 }], - fixedColumns: true, - }); -}); -// Upload the video. - -const uploadVideo = async () => { - try { - // Retrieve a list of objects in the bucket. - const listObjects = await s3Client.send( - new ListObjectsCommand({ Bucket: BUCKET }), - ); - console.log("Object in bucket: ", listObjects); - console.log("listObjects.Contents ", listObjects.Contents); - - const noOfObjects = listObjects.Contents; - // If the Amazon S3 bucket is not empty, delete the existing content. - if (noOfObjects != null) { - for (let i = 0; i < noOfObjects.length; i++) { - const data = await s3Client.send( - new DeleteObjectCommand({ - Bucket: BUCKET, - Key: listObjects.Contents[i].Key, - }), - ); - } - } - console.log("Success - bucket empty."); - - // Create the parameters for uploading the video. - const videoName = document.getElementById("videoname").innerHTML + ".mp4"; - const files = document.getElementById("videoupload").files; - const file = files[0]; - const uploadParams = { - Bucket: BUCKET, - Body: file, - }; - uploadParams.Key = path.basename(file.name); - const data = await s3Client.send(new PutObjectCommand(uploadParams)); - console.log("Success - video uploaded"); - } catch (err) { - console.log("Error", err); - } -}; -window.uploadVideo = uploadVideo; -``` - -Next, you define functions for retrieving the video. - -```javascript -const getVideo = async () => { - try { - const listVideoParams = { - Bucket: BUCKET, - }; - const data = await s3Client.send(new ListObjectsCommand(listVideoParams)); - console.log("Success - video deleted", data); - const videoName = data.Contents[0].Key; - document.getElementById("videoname").innerHTML = videoName; - const videoDate = data.Contents[0].LastModified; - document.getElementById("videodate").innerHTML = videoDate; - const videoOwner = data.Contents[0].Owner; - document.getElementById("videoowner").innerHTML = videoOwner; - const videoSize = data.Contents[0].Size; - document.getElementById("videosize").innerHTML = videoSize; - } catch (err) { - console.log("Error", err); - } -}; -window.getVideo = getVideo; -``` - -Define functions for analyzing the video, and sending the email. - -```javascript -const ProcessImages = async () => { - try { - // Create the parameters required to start face detection. - const videoName = document.getElementById("videoname").innerHTML; - const startDetectParams = { - Video: { - S3Object: { - Bucket: BUCKET, - Name: videoName, - }, - }, - notificationChannel: { - roleARN: IAM_ROLE_ARN, - SNSTopicArn: SNSTOPIC, - }, - }; - // Start the Amazon Rekognition face detection process. - const data = await rekognitionClient.send( - new StartFaceDetectionCommand(startDetectParams), - ); - console.log("Success, face detection started. ", data); - const faceDetectParams = { - JobId: data.JobId, - }; - try { - var finished = false; - var facesArray = []; - // Detect the faces. - while (!finished) { - var results = await rekognitionClient.send( - new GetFaceDetectionCommand(faceDetectParams), - ); - // Wait until the job succeeds. - if (results.JobStatus == "SUCCEEDED") { - finished = true; - } - } - finished = false; - // Parse results into CVS format. - const noOfFaces = results.Faces.length; - var i; - for (i = 0; i < results.Faces.length; i++) { - var boundingbox = JSON.stringify(results.Faces[i].Face.BoundingBox); - var confidence = JSON.stringify(results.Faces[i].Face.Confidence); - var pose = JSON.stringify(results.Faces[i].Face.Pose); - var quality = JSON.stringify(results.Faces[i].Face.Quality); - var arrayfirst = []; - var arraysecond = []; - var arraythird = []; - var arrayforth = []; - arrayfirst.push(boundingbox); - arraysecond.push(confidence); - arraythird.push(pose); - arrayforth.push(quality); - arrayfirst.push(arraysecond); - arrayfirst.push(arraythird); - arrayfirst.push(arrayforth); - facesArray.push(arrayfirst); - } - // Create the CSV file. - create_csv_file(facesArray); - } catch (err) { - console.log("Error", err); - } - } catch (err) { - console.log("Error", err); - } -}; -window.ProcessImages = ProcessImages; - -// Helper function to create the CSV file. -function create_csv_file(facesArray) { - // Define the heading for each row of the data. - var csv = "Bounding Box, , , , Confidance, Pose, , , Quality, ,\n"; - - // Merge the data with CSV. - facesArray.forEach(function (row) { - csv += row.join(","); - csv += "\n"; - }); - // Upload the CSV file to Amazon S3. - uploadFile(csv); -} - -// Helper function to upload file to Amazon S3. -const uploadFile = async (csv) => { - const uploadParams = { - Bucket: BUCKET, - Body: csv, - Key: "Face.csv", - }; - try { - const data = await s3Client.send(new PutObjectCommand(uploadParams)); - const linkToCSV = - "https://s3.console.aws.amazon.com/s3/object/" + - uploadParams.Bucket + - "?region=" + - REGION + - "&prefix=" + - uploadParams.key; - console.log("Success. Report uploaded to " + linkToCSV + "."); - - // Send an email to notify user when report is available. - sendEmail(uploadParams.Bucket, uploadParams.Key); - } catch (err) { - console.log("Error", err); - } -}; -// Helper function to send an email to user. -const sendEmail = async (bucket, key) => { - const toEmail = document.getElementById("email").value; - const fromEmail = "SENDER_ADDRESS"; // - try { - const linkToCSV = - "https://s3.console.aws.amazon.com/s3/object/" + - bucket + - "?region=" + - REGION + - "&prefix=" + - key; - // Set the parameters - const params = { - Destination: { - /* required */ - CcAddresses: [ - /* more items */ - ], - ToAddresses: [ - toEmail, //RECEIVER_ADDRESS - /* more To-email addresses */ - ], - }, - Message: { - /* required */ - Body: { - /* required */ - Html: { - Charset: "UTF-8", - Data: - "

      Hello!

      Please see the the analyzed video report for " + - key + - " here

      ", - }, - Text: { - Charset: "UTF-8", - Data: - "Hello,\\r\\n" + - "Please see the attached file for the analyzed video report at" + - linkToCSV + - "\n\n", - }, - }, - Subject: { - Charset: "UTF-8", - Data: key + " analyzed video report ready", - }, - }, - Source: fromEmail, // SENDER_ADDRESS - ReplyToAddresses: [ - /* more items */ - ], - }; - const data = await sesClient.send(new SendEmailCommand(params)); - console.log("Success. Email sent.", data); - } catch (err) { - console.log("Error", err); - } -}; -``` - -**Important**: You must bundle all the JavaScript and Node.js code required for the app into a single -file (**main.js**) to run the app. For instructions, see [Bundling the scripts](#bundling-the-scripts). - -### Bundling the scripts - -This is a static site consisting only of HTML, CSS, and client-side JavaScript. -However, a build step is required to enable the modules to work natively in the browser. - -To bundle the JavaScript and Node.js for this example in a single file named main.js, -enter the following commands in sequence in the AWS CLI command line: - -``` -cd javascriptv3/example_code/cross-services/video-analyzer -webpack ./js/index.js --mode development --target web --devtool false -o ./js/main.js -``` - -## Run the app - -Open the index.html in your favorite browser, and follow the onscreen instructions. - -## Destroying the resources - -4. Open [AWS CloudFormation in the AWS Management Console](https://aws.amazon.com/cloudformation/), and open the _Stacks_ page. - -![ ](images/cloud_formation_stacks.png) - -5. Select the stack you created in [Create the resources](#create-the-resources) on this page. - -6. Choose **Delete**. - -**Note**: If any of the resources have been altered, you must manually delete them via the AWS Console. - -### Next steps - -Congratulations! You have created and deployed the AWS Photo Analyzer application. -For more AWS multiservice examples, see -[cross-services](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/cross-services). diff --git a/javascriptv3/example_code/cross-services/video-analyzer/package.json b/javascriptv3/example_code/cross-services/video-analyzer/package.json deleted file mode 100644 index cf406d4d4fd..00000000000 --- a/javascriptv3/example_code/cross-services/video-analyzer/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "@aws-doc-sdk-examples/video-analyzer-example", - "version": "1.0.0", - "description": "Using the AWS SDK for JavaScript V3 to build an app that analyzes videos for label detection.", - "main": "index.js", - "repository": "git@github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/cross-services/video-analyzer.git", - "author": "brmur", - "license": "Apache 2.0", - "scripts": { - "build": "webpack index.js --mode development --libraryTarget commonjs2 --target web --devtool false -o main.js", - "test": "exit 0" - }, - "dependencies": { - "@aws-sdk/client-cognito-identity": "^3.32.0", - "@aws-sdk/client-rekognition": "^3.32.0", - "@aws-sdk/client-s3": "^3.32.0", - "@aws-sdk/client-ses": "^3.32.0", - "@aws-sdk/credential-provider-cognito-identity": "^3.32.0", - "@aws-sdk/types": "^3.32.0", - "fetch": "^1.1.0", - "node-fetch": "^2.6.1", - "ts-node": "^9.0.0" - }, - "devDependencies": { - "webpack": "^4.42.0", - "webpack-cli": "^3.3.11", - "@types/node": "^14.0.23", - "typescript": "^4.0.2" - } -} diff --git a/javascriptv3/example_code/cross-services/video-analyzer/setup.yaml b/javascriptv3/example_code/cross-services/video-analyzer/setup.yaml deleted file mode 100644 index df06b23e5d6..00000000000 --- a/javascriptv3/example_code/cross-services/video-analyzer/setup.yaml +++ /dev/null @@ -1,271 +0,0 @@ -Resources: - rekognitiondemobucketCF294C9A: - Type: AWS::S3::Bucket - Properties: - CorsConfiguration: - CorsRules: - - AllowedHeaders: - - "*" - AllowedMethods: - - GET - - PUT - - DELETE - AllowedOrigins: - - "*" - ExposedHeaders: - - ETag - - x-amz-meta-custom-header - UpdateReplacePolicy: Delete - DeletionPolicy: Delete - Metadata: - aws:cdk:path: video-analyzer/rekognition-demo-bucket/Resource - rekognitiondemobucketPolicyA85D753E: - Type: AWS::S3::BucketPolicy - Properties: - Bucket: - Ref: rekognitiondemobucketCF294C9A - PolicyDocument: - Statement: - - Action: s3:* - Condition: - Bool: - aws:SecureTransport: "false" - Effect: Deny - Principal: - AWS: "*" - Resource: - - Fn::GetAtt: - - rekognitiondemobucketCF294C9A - - Arn - - Fn::Join: - - "" - - - Fn::GetAtt: - - rekognitiondemobucketCF294C9A - - Arn - - /* - - Action: - - s3:GetObject* - - s3:GetBucket* - - s3:List* - - s3:DeleteObject* - - s3:PutObject* - - s3:Abort* - Effect: Allow - Principal: - Service: rekognition.amazonaws.com - Resource: - - Fn::GetAtt: - - rekognitiondemobucketCF294C9A - - Arn - - Fn::Join: - - "" - - - Fn::GetAtt: - - rekognitiondemobucketCF294C9A - - Arn - - /* - Version: "2012-10-17" - Metadata: - aws:cdk:path: video-analyzer/rekognition-demo-bucket/Policy/Resource - rekognitiondemotopic9DBECDA9: - Type: AWS::SNS::Topic - Properties: - KmsMasterKeyId: - Fn::Join: - - "" - - - "arn:" - - Ref: AWS::Partition - - ":kms:" - - Ref: AWS::Region - - ":" - - Ref: AWS::AccountId - - :alias/aws/sns - Metadata: - aws:cdk:path: video-analyzer/rekognition-demo-topic/Resource - rekognitionvideoanalyzerrole316A744F: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRole - Effect: Allow - Principal: - Service: rekognition.amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: video-analyzer/rekognition-video-analyzer-role/Resource - rekognitionvideoanalyzerroleDefaultPolicy9F799B85: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: sns:Publish - Effect: Allow - Resource: - Ref: rekognitiondemotopic9DBECDA9 - Version: "2012-10-17" - PolicyName: rekognitionvideoanalyzerroleDefaultPolicy9F799B85 - Roles: - - Ref: rekognitionvideoanalyzerrole316A744F - Metadata: - aws:cdk:path: video-analyzer/rekognition-video-analyzer-role/DefaultPolicy/Resource - ExampleIdentityPool: - Type: AWS::Cognito::IdentityPool - Properties: - AllowUnauthenticatedIdentities: true - Metadata: - aws:cdk:path: video-analyzer/ExampleIdentityPool - CognitoDefaultUnauthenticatedRoleABBF7267: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: sts:AssumeRoleWithWebIdentity - Condition: - StringEquals: - cognito-identity.amazonaws.com:aud: - Ref: ExampleIdentityPool - ForAnyValue:StringLike: - cognito-identity.amazonaws.com:amr: unauthenticated - Effect: Allow - Principal: - Federated: cognito-identity.amazonaws.com - Version: "2012-10-17" - Metadata: - aws:cdk:path: video-analyzer/CognitoDefaultUnauthenticatedRole/Resource - CognitoDefaultUnauthenticatedRoleDefaultPolicy2B700C08: - Type: AWS::IAM::Policy - Properties: - PolicyDocument: - Statement: - - Action: - - mobileanalytics:PutEvents - - cognito-sync:* - Effect: Allow - Resource: "*" - - Action: - - rekognition:StartFaceDetection - - rekognition:GetFaceDetection - Effect: Allow - Resource: "*" - - Action: - - s3:PutObject - - s3:DeleteObject - - s3:ListBucket - - s3:GetObject - Effect: Allow - Resource: "*" - - Action: ses:SendEmail - Effect: Allow - Resource: "*" - Version: "2012-10-17" - PolicyName: CognitoDefaultUnauthenticatedRoleDefaultPolicy2B700C08 - Roles: - - Ref: CognitoDefaultUnauthenticatedRoleABBF7267 - Metadata: - aws:cdk:path: video-analyzer/CognitoDefaultUnauthenticatedRole/DefaultPolicy/Resource - DefaultValid: - Type: AWS::Cognito::IdentityPoolRoleAttachment - Properties: - IdentityPoolId: - Ref: ExampleIdentityPool - Roles: - unauthenticated: - Fn::GetAtt: - - CognitoDefaultUnauthenticatedRoleABBF7267 - - Arn - Metadata: - aws:cdk:path: video-analyzer/DefaultValid - CDKMetadata: - Type: AWS::CDK::Metadata - Properties: - Analytics: v2:deflate64:H4sIAAAAAAAA/11PzQ6CMAx+Fu+zCHrw6M/JkwZ9AVKmVmA1rNOQZe/uAI3G0/fXr01TyGYLmE1WxdNOsawSj9xq8EcpsFK5tuxa1Gp7Nnsndydqy8ZK61B67zePQUlCbILqd3k7B79xWOlh8s1GOHBN2H3tUQdljQV/4jthnw0kKCoa8DnXw5EBv/VPEfliSBh89HalNkLSHZhr9af7+lria9cmmiEEZbjUcLPJI11CmkE6uVmiaetipdGQj/gC4G8VdyUBAAA= - Metadata: - aws:cdk:path: video-analyzer/CDKMetadata/Default - Condition: CDKMetadataAvailable -Outputs: - BucketName: - Value: - Ref: rekognitiondemobucketCF294C9A - TopicArn: - Value: - Ref: rekognitiondemotopic9DBECDA9 - Identitypoolid: - Value: - Ref: ExampleIdentityPool - IAMRoleARN: - Value: - Fn::GetAtt: - - CognitoDefaultUnauthenticatedRoleABBF7267 - - Arn -Conditions: - CDKMetadataAvailable: - Fn::Or: - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - af-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-east-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-northeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ap-south-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-1 - - Fn::Equals: - - Ref: AWS::Region - - ap-southeast-2 - - Fn::Equals: - - Ref: AWS::Region - - ca-central-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-north-1 - - Fn::Equals: - - Ref: AWS::Region - - cn-northwest-1 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - eu-central-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-north-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-south-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-1 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-2 - - Fn::Equals: - - Ref: AWS::Region - - eu-west-3 - - Fn::Equals: - - Ref: AWS::Region - - me-south-1 - - Fn::Equals: - - Ref: AWS::Region - - sa-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-1 - - Fn::Equals: - - Ref: AWS::Region - - us-east-2 - - Fn::Or: - - Fn::Equals: - - Ref: AWS::Region - - us-west-1 - - Fn::Equals: - - Ref: AWS::Region - - us-west-2 diff --git a/javascriptv3/example_code/cross-services/video-analyzer/src/css/styles.css b/javascriptv3/example_code/cross-services/video-analyzer/src/css/styles.css deleted file mode 100644 index ffd74ad014d..00000000000 --- a/javascriptv3/example_code/cross-services/video-analyzer/src/css/styles.css +++ /dev/null @@ -1,29 +0,0 @@ -body > header { - background: #000; - padding: 5px; -} - -body > header > a > img, -body > header a { - display: inline-block; - vertical-align: middle; - padding: 0px 5px; - font-size: 1.2em; -} - -body > footer { - background: #eee; - padding: 5px; - margin: 10px 0; - text-align: center; -} - -#logged-in-info { - float: right; - margin-top: 18px; -} - -#logged-in-info form { - display: inline-block; - margin-right: 10px; -} diff --git a/javascriptv3/example_code/cross-services/video-analyzer/src/images/pic0.png b/javascriptv3/example_code/cross-services/video-analyzer/src/images/pic0.png deleted file mode 100644 index 29aa51c50e75382c9f9453fb2c30d588e7bbea4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42183 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 QhL-HLEfGkIa=2UMAJwK`5&!@I diff --git a/javascriptv3/example_code/cross-services/video-analyzer/src/images/pic1.png b/javascriptv3/example_code/cross-services/video-analyzer/src/images/pic1.png deleted file mode 100644 index 6f099dabfc9ec24ed6a3be39416948f0cdfa2369..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69151 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

      +!P)}FkxJ8 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 x?nwtKn|P3}!o}Kn#qj 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 &FdP1{&83-z|@|9gESZ!t}~ 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 diff --git a/javascriptv3/example_code/cross-services/video-analyzer/src/images/pic3.png b/javascriptv3/example_code/cross-services/video-analyzer/src/images/pic3.png deleted file mode 100644 index 68fe2c39ad6a4b6017f5ba99cf9bcb6b221ccc21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65214 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 TCV}Vb5eG?$%ZZhWy!QP+4eM1M diff --git a/javascriptv3/example_code/cross-services/video-analyzer/src/images/pic4png.png b/javascriptv3/example_code/cross-services/video-analyzer/src/images/pic4png.png deleted file mode 100644 index fd2f27b6b6cb29775c312f437768554f906b3134..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15683 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 RfQ!!{X>kRylJ|z6{|C$l9IyZY diff --git a/javascriptv3/example_code/cross-services/video-analyzer/src/images/pic5.png b/javascriptv3/example_code/cross-services/video-analyzer/src/images/pic5.png deleted file mode 100644 index 7387a7b39e80396f9e70d509744d081dcec6bd7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20247 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

      _o zcb!!jBR$o0E`dz=!VHIOwNtJCJhz}>%WsFB(-#~#;KuUEc5}B8jT>j2^x-l@V8iut#n`wFP@ z^6JFDn?hnaRA0-7C`<-E4ktOB>FHs>HFNp0V5#ITr23vD_M?JC#zmM(DP(Ha?sL8H#F1Jg1PL^cpS#l zd?n*cb}N!$)1gT$-gck%+#CCDo8p?i)Su$2GD=(6ypLiR=O3^Q10Bdoyot)+z6vqr zNr3vCJLD5belQdc+bNUYP@(btzH0p>dMrg0Q&Zn^GlNM=CN0$6*O|C~wa_TpsIhQ1 zs&+Ubb1PpI(knP|!&2A?D_R^TY1<=bQ=ZT%OakUY3U)$Y24h1+?ptOFAz%(wxb*|!J zLq-~j7I0(#xoUF~r_90c0wHfWq=x0iPUPcrx;L{r*uH^hLLe>%wOnLQL8uMiu7iRK zOQCSpgocd%S`S9(u%`MtM;fP_vNPuhs+`gx=*}8GGMTYA_MkL#jfjpJl`7*}*d^yZ zp~83`T3E`hC)1odH7)WB%1Z;!>7_Uz3zEG^90lF4&>4y8s+DYXGHOF`nXnRs>OWkb#3q3i70K3F**7op)=KCCta%ZR92^x3_(uAS#A0o5gPcd8 z_4N@O2P0IWsY3PrLaH(N8KL;xZVjth24*G;g~{?yO=X%)U6l5}r=%3j;F-7S62{wH zC=Cp1s-JPB3A(lD9mS_$_5vf>29^#|#@rg^78&+aPwL3V+ z09Qf~=<1;*S<~w(q%yNeX_+#PjWi#3gH*piAH6q{YThSqi1Qcvu(9#}mwhYNk%N+y z2?2gK?kppTqFk||&c#XIAiF53<^3XQ%$iUu<%5cp)`|{S+eCGx2|Cl4C|o>N6$*(2FCMM9T^(o$LNWKoJ*TK+6gc@^CLaUP_qpOYeMf>sLOb!&k;Dp^ac{^vV!AKbgQ=5RVcPH zZRc-8U*^0{cjP@upRAGcMYqU(XM&dtQvPReWBJyo8#-Y4QE@Whh%jyR!ar6eKTbF{ z-K_ri>nkk8qBWg0(>E5M5->1Y z^u%CQ4AdAU%cl$;K9U&j%yYHlostm(l~)DR`aZhTG{*p3*FERvsUO#NU}a8xs=xI4 zR)z6#RTT}6DXsoG=J@MW(oS7OA z)xIIqRv)hMqzePq=Bt`8X(((yTQeJ#8NPQjZT|41{b%~^72|pA2>;)O5wm!}lX}j> zgfkgaVRL%i0*XQtVDr|Q?2YS(e@{`8qb&d(jtr3l0|cr;`ET2eW^UGUi&$5}b50Ow zl!uaIQ*fLmQp)@(R*O3hieLMzF*Z>z*K?Gj8ewBf_$$KVDU|51kWPbgEfO){$$ssY zHvjBU!@w~jc%idQ^a%wT*ltk6)5~Q{jN&&rO9_v%AbhSidydiE=)JnSbidzU#@-Sh zhNePihOHKikqv1(J*KMsG2^!54-u;Scn~|X$6_);_u+|O`?djMS*k|W`A_|;e)TqN zVL8jJFPSp9Q*952+aA-U*JEDBJ5wdf$Q%wz%GjxPvID0>f^~&Xid5#?;gj$aKnI}h8GMV@af}b!9I&X#18N09c z?4t`EHZ<|rPB^Xe9dy`kPz8#^4w7^9e2Xtbcj}&_AYjOvCb>^XkCPdezqYlSx=-Q? z^}k&AlZ>a2vf!{(l9p}nhi5V7+G+uj(SO=bWt(x%8Z;Fr41^DIEo zezc`ziVEs|x;b*NOTl3NGL;5S0j*Mv=N-BV-H2=CdwY3Tu$d<0gL_KG1GZWEO7qv} zr@5Nj{92kUaO0Qn4PQcZi>vTFZjXMZOqo~ua@<{RWE9oB{OaqsZ^JDQj&xVsT92Z1CGhFTR76) zpKtKUxHgSMo0orlOMR6EGc^aFngYxMPw6X}i|37p{DaY3BE0H>_wB+LwOZecwrEXE zuAzwZ8v-ZNqS@t@93^NEhj)_?l=s48yj*KFwT9!ClL297lphTj1NaW^v6d*}>ZG5u zXpegz-C{cJn-U=-=^B(L&$+a^(D%V3r{?7ehWnpbzzS`Y^jVb%$Q8O=aje*z4@H(0 z@gbB0AxkMRt8>k&uDVPlDNegeX<39J-C6p?1e5mh7!KL#36VUfG=T+zkby0HTlZ>t zn3QOZUWU-*cJWKilIg-pOXd;EjzQ$gdX011MaLzMhwFosFGlKc0N|I`F}d5BJqpTn zOQk;y(yHlX+P;q%AnMv5f(o}$5S@M_h_lGWh`##D!psIYR@Zfkm%azelZK4KetCp> z{dp}-t#%JM?L6y3itRVZ0J9Di?7ULz3XA;vfaSq>QqDPzgtJW`Wms@)JyV|Vu{N_4 zd=&st69L<}_Aq7M-8C`_i7*OO?f$ygk)glDCqUynFR z#{Ao*#c`0>meb?!e4jVAbrTh8Fnz|5{J0J4x4z#xHEan7+2IT!*IesGTNd_l=y2GS zC70At!igMo0wA$tditM-YPSCWDMB9vI-7shV@~S})S4%N7|$@(ZWz#5#V{dF9uvG@%CTV;IzXQKU8(YWA!X zY=L)vd&}H4q3SHE{D6o1#<2W_+2u(B@tvED@HPP6TLPzMnJ8hVN^oacS@9%;uY^#q zU%N!^@5t_g0yZBOx!!~4bjO%A^?YOt7Yxks8$CWLocU1(7D^S(X!K zv3rkZe4nVNkJm_y`ITWLPae}M*{gp`s~mE$Ay)IV07Lx!P_f4(z4JxbxL;RxjvcSy z`9JywL8PFjZG%9p8I)rZih)_-+gMm+4Q;2cz<$as%Hsvcp<9IWHKp$}L~SYF1VGJ< zw>v^f1wUFM?IC~ixOU))gm}I|HYNsvEQL{_;1BUvx)GU$Um%E}_W^OS79BU3uWy*e z(#U~Zt>O~40^h?BK$#+1jl5|&B^+Ldy%hu(WaU#n%cIaLyKNp2h%h`ZW~*r>5!6+! z3d{J_=(TtKv!P_JJh)4X7ZLO$KYLyl>t6D=rlSTde$UPAy(9?q<4@MEY-CczJtaG! z^@TP58IHJ5KXN}0Db-t0c$sG4Dc|NC*9G|@KRTD2#=gF0=Vb0T=U1pylbWX)nBL+N z@H=H`zFxm6_>QE_?Vw7u(J0fN{X^7q>)>rpH5p3+w3s%o=r`thnC%)Jv1FnqUT?O( z@FW|bkFkqodwpO}z>@Y4El8I045+u9ESxM-hkt0aB_t-+YI0_+!I_;5VlvhWrOI37 zun~`mv{r2tV)qeGHV0GYGpH9?B#VSRc}U$`>J@SuzMjI;+1kyCqv6>8(9}UpLRLDr;Jl#rPkMf(8lP*|{Jz z!1(6zWxwv0DhMP;7S0=)E zIOqn7{fc7}ny^W*#Ws|{Jh;)cJ`@bp#JQi!q#2puw@{he3i8(#5IEsirO)ANBiM@3 z7#5)rD@RfFGDQV~k157f&5Y6T=*Sw-~bmFPH!;-A{4-~aJ+ z?q}29cSw~qa);8^C3$`7EHGa6;JFk;hPhbYJ7ZSh;k@b%2@(Ytc69l`B)qsT70<$_AgSi*KBMbRlmSb2(F>r7Bp z+|EsU^tuA9iQQP}P=Q-DLaLw3Fn%_RON*Bv`w0~M#O9E;TP3{oL+~qEHTI-e0c1`? zJBc5*wkx;kPK)@YZuR)1Rv=N^IBJ@dFL+Q^x00breso8$_SmAz>1mSTonDV^BO?vD z{il;u!*1mGQ^;}sUd_G|bFlIkSZu6{%65Q{|LQm*F2QFwR#ElJcdV~kp zxCVDP^QMQdAPXh_VPRvsv$zsVBjl-S9|Bt&S@?o$ea$P@GPg8!gvf|we{^X58WmId zXvkYOo8_oU>8};)e8wSbpKB|U9qb8R(v>)v=8%rhh*-puo>gmMFTn!MX$v)I0U)#WBQm6zeQA`iZu&; zW4XnB`xMRi)0kO=eFoZ?G=;$ZS49f(2y2XEF*3TNQ9Vcx&b%X%8+Sj08SUu3@vuSV zd~{IV$IAt=p>SDYMPR3{+45UOgN=g^_BWpbl9;4gsxf1U@E(VVLBtZ`7F$haFhdMK zO3BMI92{r$!PJ*fZl=YfQRjlu5VQS(IE$+aDaHM#ZqfxQaC2&Xm{eR{%lUbKOP&$@ zPPCfzmBp)-bqo0%;`CQnCB=P-WeUUf**__o3~+SACRlb?-VP?yI3^FS|4MJB?(jWw ztSOR_DDS(1+E8MR`A1uHnFXZH@VQcaRpEW$q!yhg+kDRV!Ar$WQalRE5H)`gr;3}V z8+wNB636M#I77c;!{!s7m5>_zg}4UuwMG->CXp&%?{+ji0UlSCmESi+KNf0;!=O|4 z%<`Ck?YOa(B{GAfN}^kYLpQ_|Y8xHMAscdgwD|Rxqfb`dKwlyr`S+)d#oB_X!781& z;I??)T;<9m+49?V@s1_RU|R>l8xQwio_>sOR#M+PoZdH+>Z)J}(1%7R@qCrTg^0v* zKNw&_gRo?V=|g{ep{$G$a!b02#r^qsFGMYu{fz&TLP*wc%{wD3S*Ud&Zjgv?A!gMz zaV8$gkTydjmCmtmyC+=WdumtD1PakS7mZk}qqYFS@96J}%8Tz@54#&ZsS3a59gDh! zCcbWx5I=xDEvRnb6HGSIV*2te&QHZ}D)IxjfZ?&Wvg|vxxMwhPRF_WL;wFh9>hq_4 zmj-O92cpfXDoR8>MqJMQ{4$mps~&pNIVxngd~3p+ubNb-CfLoc@`Ob&)d@;=vuPaa zNBobPA`?kF1LxTNb-qweD*g_%O-l7z_-UG9=^8^oHS;y#k zAFLVtzj>9fJ(Y0z9X&X51D6!%LtVY#GxV?&9)v@v5~)b>-9og0Vw|mm-s@)P zLiBe&LMpiJB@w_hnU_6!Y`cqVU_uy!EL?9@+|FnS9Oe(Z$ zH?i$j6#+V&701Q(b&LjPnvK^If2L(|=(bDS`Npw{s9PqKD7{-6x^V#`a1bbeCIimXk{Ma^)d%2sYAb8JM`Avg3V;P>_R7 zjvQaI!`3OHTuxElFf4>0DN@94+1i*4#r5bnww6;RRdPKj3h0X>%3q>|@wb(wf~v{) z4!oaF34CN*DGcu1tp3*>wz|Q8*;fh!3w$>k{yGY%_RVqYc^|8N7%}vI+UIUMJ)K;Y zobli2SFPRhA&FgU?i>h|$)iF8PmQLAA1MRU|E~$31ErTr@4|*4zK~>utXvz=zdt4*oYwQ$({))mJM6?_7MB}GfMRl8r@1VS zVVIaFLL_H*NJYv;t@E2hcplkppaX|2i$?jE(t?A-hJ)6dI0@Xnge_^VWS}oP>u|J1 zSs&%uoOIOyuxGVy!ryniJ`n$JT{b7H^D5<1v%%rG4#H|LK?c?w$Ht8~;b5jH3vm7| zn#P|>^-t5Im8N(zo}YRHG~+(O5kbp@ZXCLJd$AVTH8G`niiUOkakk9X1k+!2yxBlM z2+el?0{ZDUJ$91`ap0`f7rEEYCIDlXKzam6KKDObH;xwTnaZNF*6YG2o;%u0O2o4N zAnU++pLCD??*nVO$Qm`4@#E(IApSA*@F9dpRHA)-#9zsOY>ArwbBKlMLL(?zs%<-A z_lVyd0cmLhvDeYuLyvs)1+amKNC~H7@r+^wfvPiJfZ;`J9$gmWjke2ni{qsdj~3DR z0+(~fDgYu1uC99lSpOr)z`u`6mRDhW8Kc%e#QFm_$KGOhmR^09-egwubv)~?D%&k9 z8}RTT;8rB{?bg;-pl7#!l*U&GIs#8w=k{I&hoE<}d-wPEmensd@6*YFGjf@UldSvM^K!FFS8Rav8)Oud|PV<*GRwN`#9)JLSNh# z=a9qs?#v2rkhUw|r_g{;Bx(H7rNj*L-Az0m@V747?Xg31sLJN^Y7vcZT1NdJc>hGsI z&(E6$GJ!LCkEY`(v~wzI_jr_ZgA85*xN?v8EV#fT+nE1;W znsMV3erC8%I1r6r#;_hg(ZeNDk=G2pfw5=f^*SP_@_%*)_@~vlsdQ<3#;K zv(;sHZoRjYC-WJY{Y<|^eqE=(!vp$}gv6oCuC^!SbP^Fe@9vyF&wrT!B=0amO86Ny zu+=M{@kI&omBd%bbSMjS`1N+yTN3wfX1)1r2;c`|z{cX318`o+gj46}Xq1$Nbh0HUwB?WPG&VpH*XFO^jz<5MekyzB|3EJGThgROuUIQv{IX%U;L$fADqZUaq!SLlSF9=6Ih0=*O!k&{D$Oi6ILv#Ttlm zbOGzMo$dxx8rgFY;X7ckSw_%v_IU9j#wNUf)^Fai>-1N|Arkf3GyDc(|uIu<8*1w2PpSd2v5*|069-^d-(!L zAv6@drwk(VUD)MI(+D65fqzY*|M-0`W=rUD7N77rieHVb&++7qkn5gbg)qzz5XkZW zs^5S<{wRI}^7y0n{V1QqBul(Jk3JHdSy!L;X_H_5XqFXz4*aF<@h?uS4>PF;g1t89 zE)=(GLy<_2Puf6%lGor5R9B+g%@B%p7?ksq7`snsB|tU_0XaMD#m!2oi@x`5!w=1V zhR&t~Oz)${p|2UczCTA=o2*=x{o6xGj2rdNwFySRQSYuMm?fXy}LfUBT5M&BnM9Lk*T7u8cGL}7D=Q5G6$7=UX%M(~zgr0=dM zqBk!}x9|33@EJA_bQ;6Ler^&bZWXnij6O77jtR9G!k1XQPm>Q$wR{Yup!iH5f0b)J zND8_*V8poB-JGvB2CVozkUZ6&s@e5;l3Z2iBZ~AP67&9UCmnZY4Vz`M>403w^=qG+ zy+UrcZT&01*ezG-DTbIbb+LW{VU!oJH{OS#FL52mT>GF)Bu`NMAk)K(pS!V&l^!y5 znSE|zNNObXoo^^~F8s^$Wyb3v50hCxiyz7e-kIKg?dD*u>15d8#av`Fnf=T`L>GJ9 zHK|r)h;1s{Mc8nAH|fVzf~HpZ6Oql;Q^Ca6R)H>!$!6YIoQIEYGDomh6|DH+c=X(e zlHHGlfw>{o*qV&tCv%VJj9@dJq(D0)Ilo(Q!-bWN+5^l!)h5-v#*63NDN2&?sVbI;{RF+2KcT4ee%!(R4yhVwA*EL*DpLEZ zuksO!Um#KpMsuRM4VCt)C^op(HdY`9Co92+Gh#SMSim1)n;c?jR-KhGGCms#9R^Wb z*Rvk)+OF&FZ5Izb&$VUExrh?C*o!Z>ZZ?9O=uX>IYVUspio!Z?r{bt@W^PkZfdCj} zWaQ*)LElS#-U^|Q`FU@E2kcHnZ7Evmz~Xi9(!M>Be>7|E3E%LV&keedC{%7;9rn2r z^bQR=+Iq|}R5sM`hCg~JJ%(Gb%hK*0AJJ~TX5UAja*bbvyuGLSH5xDyElRkth*6kc zlyiO=wqRa!el?TDq%==1UTl$4l4as^1HKZ{6TQm$L0K#j-G~12(`vZ#alA?wg^*Q~ zIo5~)O8f(1y$^XzAFg+8?kmE_;GyG?1>=eRc9dR-RxmD5eE|i3ymHe2UBU75bOJ-V zr1hSMbi%)3Y43>HDqUEWwVz^8Go-92=IS#xf6+|M+~R3@H2ypDslQHBwDNK8#NA|f zZH`k+r0g@Vd>?999&Hq5@k`@%FPF7Hu`w}^+H(#JlJEa{N~n>6oneInJ9X7P_jfl~ zd4EYg>)-a@sFvS&>dnyGCi%3v!+w$r3IWl_jV5J4CuIWG7wPxX%}$4VcFk`bfd%1f zbZj!^BuE9*nE2)Tp8msz)E9XvWdqAI*#641S+2 zI`tuFt!wwLq{}fFEuu~F^i_}a?jVTcYKSi^k0sZ(-s8Rs_l;6l%S zE9^>suPVKJE@HNl<8eVVg7Q#r?c`F>TcT{O4;3m-Yvc@r#b&6piy=Q{#ZtdU#qQLw zQcrb5(?Nhp3Owu%(X1Xx9_qoYEBRU88lcBK_Fhiz1mHO`aBXR}>M6w)v~je0 zx1;fbC}wakcTIMNC<_V74VpzVCguX)qkUSbS-=JB%S}({%Ir70PB{@kpo=YM*pU{O zcv<7xj1H}{c<~ncY`D=eAJlaz?fQqY>3WM1Mu8O^crV4;8OAvG*&3f9ZdvQ6>zH_6 z>rd)a#^F9ulJ)L6Ui}A-so71z4^<^wAEYE~bu0e$?Ju*Eh3r0Yu$ri;yJ5r%;r0gNyV@ipUv zzFvL|b~kY)!`@&yT;0uVD%2Ru zt7v~4ZgfLFyxYf>j({OS7G*J-bg3H@TiRyP5x14ds`GBOwuxS^YB>w4&Nk~E_Ot6i z#2VLj1@&Mm+iZU|g9ap{m~GX= z-6k~1>60^8`iohtK#cz!ue2t~Ej0@LIe8_e)Jwh$X*>awre%bfvD4jL=3X1zc-?O= z&g*mjI@25?0&7bABySDu`)FvIya_Pz-L@aXp~_ z$X;??!;-tHoo9POJYLJzcXoXYrjA6}aQi@7u0*WZxd2&k5iAd-0HqWCe*h@sIbPO; zVrgL^%e)j+4jnda6r1nhOuz$eCaxxa{`Rk5u#T@$wvyeCQ`3Xhm)>~w^^?@rGh0<= z3H6>FFa;%t*waajGagMOJ-(QGZIX5-7-TN=IDgXj&2;j2Vl%p$%H^?oCwN(#v}IT4 zikA%#&aIKH4sfjE&YlD34_(Vwo{#gd_3-hNK03E_D)Iz=L2kPn6z&!P56+je5YW`U z{jS8#%eVOaeIDS0tmQEo&~x-h7&Sr`L!LsPi~|eB)e<(8lO&f>O zmV%NQ3%nlnP(29b2$Yu$Xz5!BKgvN+lz_~EwLs#Munv1!jQ0VLCf3&8He2`#DNhKx z$GQ1!2EbOe--EmSvfG~l$2N#Rvw3?AM8sC@YYI8tkIR%MbJ`q*%tY?5$-X4@%4VQg z9DF(6S~w@@sb831VBCZFYU(jh0T@hmypzR+LE5Z;9~0Fr2p%OP6AU#wjGccJ0DBT- zDJ=AiOu6vuvXFnN06os|^^F%_txE=ncdOuVlYHXwVa>7d0zpP08 zG|T(sc3AC1(;H!6wL`fNfl%%-*<4_y{>Bk7*)MS<8xpJl&VSBiuCdEsd72D|)Fm_9 z>*jcP9_xO~l0yDeH)t2gS*AVs0rQ7F5ai)fy^a?g`@yUU7GL9fK6nO@_UH*yFX9^D zQRPnHYOoImx-RCRn9=7@wBov`io-R;|Yk*j~HZ$GyCMYPCtQ@1zcT&r9`3>QwLDs&Z2C} z{U4|N{|Vd6W(!mw3G>s5G4OA!SMgV|SQPQBc;V09e|yX+si8}Ym8)yT9#isZZKp9s z8xZYgqx0;yZn(&jOAN>KH|Uo;AT6qxEq^)X=RloF^YYQxw`^Tf(@R{2{ig%?Y#E>C z7I4cn?Z*b032cOVK6bcJp>f*`h@K-t@f}FFD@aK=FeF(1(>&XvsiU)Hx|K7k7#{CH z*H+sd>*_Sga;WdjV9f7&Llu1tlQ=zLGTSv2bW^9cQWG2d4f+5W5#Hdl{5)})@v~j- zj`@CYIH0(o(5Y5XqPCr(tt%aG1fbUi|28RcOov=}pf$OJNx^GkfYhfM8-O?z!)`TPr6%@-a> zvqjGWUvqJjf-D|G@<=@hw`>pC|8Z!9?Q1z~c2|`)8T6m-mwa=DT;dsh8D%K27wL|X zUT4;K7Kp6cwr)Q4Y4z(RRis|=JUSIna&(gB(Hk!A$9($!FC97ZYi<>8gry7QnXOFn z%IQ}g2eR(>C$pUSHG{JCMDmJvKc$YMT5G%GinQ*w%zZ|m2xC@c<&v~iXqpcd7WE9ag!s*;JQzEj>0+=@nEJ2`Ev;AdWCT1 z2ED;Yu!ONDr{KIKo1Fmu-be@o7b%Dc2u8)jKe;QH4+fx7oc}k?^N8sPR9RU(3Sb!0 zpE1jjgO=;KGsiN4isOIt1%piDbId(YgM$m76U_Ts8q|x$++sb zvdb71L;$h=T{Em!Z#UVHIb?Yr`bKt!L0k%V|By+eTVdam9zaC?ui4MA+eXF6 z`TcZJdi@owRh<#+PGCgaAE44m3{{KKu>R4bLQ_6zjPMbtKY*k7c|L6!N(^1{OMnr1K@)h{U#9oI_9^ZLd(mDMwx5|WlJIn!_{xh$ zcIkrS-1&@k$c#Lj)ay>Kn~WdJaB$K+mg=b)|||e^8U4G0z#P4V_2a= z_w``?b=E?)E0S2=JKuKdSs(g7qCz*cXpw$0y|6o+lnIW;e4cC_QZD0soEbo$7-UM8 zvSf@~>F|q2SVF#Iq?7m=uLTdPuGK3_LNWl8A8~jEVa`Ky^YZI+9bJqv3ir8?&T?h<+j^?{5qC^MEc}T#%LO!mc3^~A08t? z@+i9$aJa$^$D(|8V})y2vApjD45M!@FmIcujI{BGL@GYI;GdO6O`TWdOSiFp54&H- z*zM6m09; za9m$IorfUlJsXM1_(|6%^;ClMk=|X7Xz%K7(P=xgdl_vWX9!5h6^_0305`B1uN5EoLn|I^DcB*|QjRv*f{`1CbxVM?HXxAN(2(FOU>b74@-OLrsaci{i*8MS23~T~m9S9ArUJzM*kroWa*;M4<^S+&Wnr z6#54^{NRr!a(t!rwbPe~>pTrqm(PsE!kwFfqdP-+SZ%><@(z6cdthqIW?aIW$KY3Y|sY zwzK}#X#Eq_lK-q{<|)NYj2ojaCnelK3<&#NzMp#NhkmT=Q4GvYRyJj<(+^6?K;XXs zl3;aL!{;^~wF?=ja#BH$bHfX{uG%di{%MKPfB zhDlljCp;SwL78a4lw%*^9#{SgUtQUh-6TZbu?<{gJJ8HT+j$vKuel=BR3&x!S-1+t zlKB>u%2n$b!y^p;i$sH0W?LcA{+l-hHBGMGNGrjDZj43TPW|L6IbH+E4aol^5dgLy zi-W})qNMAX;8`94SX~$?Gc+i05|74PX#|H4J-l{pq;cQ7~8vR=$i60&) zwpt9Lg0`s4guNX8nPBqk@@OL<%nh~0yO~9~9A$xO@OjUh$JFT$abaIg|AoUbge?6m zT9s?@hd5-pn%TONv4c$your$-DN#vkt|xEX>A3S4$K9rw)UkrhchI2t(Hg1w)1+B$ zyU%TBgNv8GtjwWy?$~Mx^`|f7N_|oGGc%u!QQztjB(jeg_io`qe63&@FD?xqjY#Je zfdx4ugxUO0)Zi2^OH4+ELA2Gu?a8`GHdwa9?)Xyx#^d86=_{z72(hq#pB_00)P3n~ z`fB5E<>(zX&HG_`B6jl>(tO>sC8M@j-mR+{OXnSx7fp=k$=VywjH5P?V!Y=3SJ<^4Lm7oreEz@W6 z`kmm$+uG5C;0)_EBXe)ww1ok6sYU8*S6v;AeXe}QqEs!#B%-iSA7DVq^;Ocuhh?8R z)|WXEhcWzGlk_p7i_s5Oujrb`tcL%rM>1O0j-6r;c_-1*7%~hA$97-hLJ@+1v0w|h zqkho>NFeGT4mW0UW3=~zK(IlEf7bw;mZ1OkztQ-2-y7^jdMp4jfgt}YNt^-O;Ub3+ zERZE|cG7j!#6dJ%O~SAqhLVX082oc;DxH^=e40ow8P31nDFBz>w?2ZV-}Ysp-D8gp z|DaHnUPjH$WTJ%s`1Ie@g5KFlqgy$S-+=u|J(pZ4GKZ1@JY@gEh7K3R2fT&Gn_wkp z$1eGm$+Zc3;z<48e(*F)z4=CbXf4I+>#-(m8pQ}wslo&c5j{iRK~yM84WOft2J?pM z^MAZoz9}|4s?Dw~X7R3ar5tD`eg-vH5<8HM!zntEvjri z&#RFZ=yHi~3U&@of1 zg1c;^uyhi;d2^^uMY)(JUkjhfH)OxF{FtTbGK={X(oWJ~|E;lxx;lDdgfMTwAHX+b z|1xY5Sc4vF@N1(rZvSLcaYoC>XcA};is*Lk>nEySd!Ck}N9{`*Y>%G-`IA?bZB~pC zM)r7n{nqOmtHllP9carDG9b<@ol+JrBB8B1GQ^N?Vx!?xYvJ@K#L81Qb5JtV|8|HY z*6O$kZ6c|zHW&VViEwVG>6o|d=}rsC$}kr@!LE;h zc1EXFA#&s>g1;4qE-OtKec0sr`vclsdVH)sUuCDmZLOV#a!|V7ed-l$8ov1%A+T1F z{&SiA_W~Yp-6Dq)Ss$GP8k4nZkqpnzm%_b)@>FF7^y#U|bqo~@j-oB{7E9e)G;sC# zYi7S8mi$ZlT&piPS@FL|k9AWJaJ*Pn{To^PGWDY)Trw(`8d>|{>G8@u_4Oj6CuP`o zt=|KW`3f1KS{#P%r;BU^1P>pPdO*NP6=x_yZ(_0!10Y)oIYqn*lr!3$HIZk1r!qK} z3DIyzZo$exQ}3Pg>;I>5vyW$T4deK;;lxrRrH@!tUS<`R&X&>(BiVz^%Z`+g_fjK9 zIVwr1SeCFxN?D5*QgdQna+1QNX=+h?KX!Yh7-~Y)nAyhMwv^9W2ZBuzcq|+8fNQQIfcNAy))^{GnxJqHx$mB~vvIhhk-3uM;oi+MV2SKTHlvCTDdofENgh}VWWX81_h6I_7X_J>8XWRR@ zD}@U*&eZNGNe6-5E$6FAcp0hdAei7PIdeUK2^mRz)^~p2gV+TB?InR@rs%m9GbxG& zV*D2Ehec+JHJ}%{UFLw5Pq1oIuJbGDWN-}0?2gWDDn(nfhGk^2Fv21fYPaF8+obQZEJ387=`xy7F@!H*1*@173Cf!0n5a7wyt}UdGwG1VNZN25~ zJbBm(d(qCJ?#E-p{gNU76MpW^=UFqtqBpylE@F`_Z8V2B8l9 ze zQNVC3_}%X3;dq~B<=5r0xEv99s_Mfq904kI76=WCcIfUQi> zsZbMim?|e)1~$>_|OOs>8XpHI&Gxs z1JuqbWC;96hudR7>kQ-tL+pG^c!yT>{u~%o1n((-M^AsEzy2~RRnuC#x3~JhjB9Tf z5@h!>Xj0Ib5vanHs@;7^a{nf=mddkCscT-j!t>-Iw^9pZl{bn&zv-sB;^h_K+T@2u z4#>8F7SngYHDT4WJWt;a-~Hv&_sNE*J#`$IE*>xFbUQ-e=@T z1^Cd5ci6p((1MwKBQYn^F-fbhe7Ln>A)lv=?cXxaSVK*ls`+iDhL;bY340=~6ZgE1 ze&m`fE%(48`%kXsw$tUav_%Gjl7t1Kbw*5S)si@m(ufyyiAURMS#Q94aVt*dJH90H z#aQPwmm}=P9vr4=Sg@~Zt&_dFbbI^-mRdSFthfUaD7O^FlnP9#zUHDgR`Ii?$8avj zVwY3Qfo0(>DYHNtf6!K4M@;vDYr^$3?fILy**t$z*5khqfJv6e2QRa%!O=9PONoIc z46s>1iWD|{6B|egdu*WLp?h@S(7b!qeNJQAh`<@27d}>D8JxM(x8=F89lvtf=-%eI zIlV~pUd0VvOhbUH{NO8)FZJwhE9|NMOc>c9r{_(vI)v#bn`-wAnZDOX0hhNDkShwG p$Pxw$6fsQdL<3NFWoiG!8`Hsp6dUt@B3>4q$GskVX$BT006v*u)q%h074D?eirI2cxpCZL`N#gO{N#gq5rT0A!m#|8JJ{@ErgEX(P&L$LYcR7IwHJK5c(vN~}7JDaby90pB_bHYk} z`-2S4!s0n;-6%R%yZgehCC+f?PJ<#1p4OTDsa63j{6@mU^H%$o!XPKOGB62L4P%yP zc+WEpCtU4Yva$L-o7JZP%YoLkS1z68w%?w?e>e;P)wB@2cvzeIN{&8n}~dBJ@#VC7?;F*m-?ex6it zXxW$F#D4C_f4*<*pCxlVP^fh)?y9h1CCy{R{A~qU^ajB8v0I~$?KIET^Pt24ljUQ4 zdw!9EnFPxl`@@OlE2di0XRoPGmFMR(vi33dD#kH=7lpYR{pidQk3ReKUQXw;Xot}b z$v3Bh8xIxQ&2O^XP#}WezYq$yxO=JT#?YH;Y9QHU=jxPvzTCnQ(psZsjHgKga6O*# z*E8y+ET3J$J4*!mG~kW~4b5IxQ4GG^x%+jk_rE;AFZdp|PEg24JSnuO--M8=XGV7h z%lAJ5b56JqTFz4?gLDBrB~8!w2Uh)FPG|FQ-^$xtl&=&R)lz1%v5p5qEKtf=ZWaY` zoGpuxYe|0Xn=A0BZ7Ga;MADkP9f5yy75tnwneJE@7TdQ?DNni)%ayKE-*B{{wNa-C zoFcSM$Ez;VcP99_ao5MP;<&J`@zjc+6fP1}c<}uDQPXm|*_a}DgETA%bt85(NKRqa z^;y2N&Nk$hH$MS)`6^!eg?ku3A%=3lROAZhBQ&5*fX;o{){6Wzum;+7%eM*o(QAvN zX@B{p-;Aks%{}|fVze|cy7}>JTczuV!{a{NbtEkU1-Ipaaei*MX=+C_8dEIoek?cL zw~F=ffLsW(y{P_aTkPw{PSYN3YWt#vDOAqOgRUsVIUyJ!Q~H1lXQOS}6^F2h$LpwN zzpk^;qeH5!uu0zLI)UU(MVsQ;MCVl&NsPVCl~dEb$uH~T01xP`uKtw);*OKQRcwT2 z_4^PhEZ*89@L_tO+=y2sLKP-J<6E!#c{iWqF!i1Wrx47>t#!VF*_}7qy*-Z7f&F`M zwMHJdiaBbJ?~J-Bfw=bwSZ*7TE6@3sqj8(GJUG=N#LFkNSsIVW&}4qC)n+ImteT`> zxY2d(-cc|InGT29o4f=3bio9+T8Ve(?hzn82jaa@#!ZXTguGY#b|G{Ay?uC)LjCUQ zqBn#k<=OUrMpv^(V?9^g9uh0bRo-P|b0xrey<9J(u$ zbdMef4sZK!Y#yj6LLk3?DySFph=RW+B6Wf-m8zj9g9>;a#u z7ZfqR#fJ#^jTqi;-k)r)7Y4xm+VvPwj@z+JYLYAl<#fJ z!+R-bRZzdz$xAi;D5~fw!Eu;MLBU0Cbqa0X41&TFT|R>Pg3@|_T)X*^@m{T5@taOv zwj|7#lZs!oIhEF7k7O6p$w($cAe?jh~KYZK0=U*K#uvyOut^ zz8h!eG$<1L2%iq%aki?k!UTzI+OT0hp|M;)?Zz$EhBhpeIhj3>`pvP)N=f>~N^+iN zAMsFOXmRnks`=w(X;;Ax*BR}N0N(puh0*djm$SCxyB=fTdo9kMb?4{J`K1hnJ$oOk zJ`1r_qV3T}iTbLS{qip-gZrt55639Jy!?pbl}#EWpDE6q-3b7n?YcIK)qc|VZ7rTY z=3~!de`y!^RmcGjJ%zCC8sG>2YQ|a!{-Ff*GX!fm00aFsD0F%0&yy9zH_aoUKmg8R z*ZTk-mXHx7tB@lhbzX!RcwG^%k%Pws9D80v#ycB=*ZJrFHKwe7V|v}f!=v@%>zj{b zKL1$p|6RsExP|5p*nAfO;kD5?HPQvKzGnC=(%U^o)V)I&)OLYW+3_Gnc;^z}De zWvv0mSRgPlMsbWv{O<{UKD$PjNai{?FN~9{-#iEEF=_|v2@1iJSTh_Z(gwSc9lh3> zhj|@O2v3{{x$+ZLtIl>c5ED7`GOS&W!1c8l4~s4}biLpqOzllCu^qQa5k8uCXzm0L zA6|D}^S`;}+ZYxCAu!VK1RGkfaMaijOc}Z)5j^A|hR`=1V^7e3Q9D3U83?;%j2U1A zH&+pR^96R<#^x5joDf+ne&*9z-RFQ_|{Zh$6RK+SQ|UgoKjo6Bip*UmdAytn6gfA3xU@M%6O^{y_Z=7b6fog9Jhcvqh+}gS z6vHI@;|t3BfN30GDJ`_C87-TMB@PZabs`;HfD?@e>v1&pe~_)`E`jIhAT8G2^b=s=tdG zwqDgJPlF-~2Ja1d`5-VAgB}%DnT~Z6$yoX*vzl_L+0<)&;leo7ouN`jY4Dv%D+L^= zg=yc2QkQ}zE7C}kEloYz0BAt%X#Oxi=QP<}XriU>v{s@Kn)`D}f}9qFjD3d=!^4Yw z!&+hSsbbVW8_JNE71oe|16UiwM7y_%truDqJ!q2X+3YuqN2h>2tjot%F>Hib?f*DZ zeUBr3OJjX7LTsg-ObloXlXXv>9PC6JrVz6csn0^uq!Ghz9J(C)DN_E!LAso#0&AKJ zF2xS|F#%-^s1dy$WL99~z&y7sMqz$__^sqCbhQEl__25Udm8k@dWeu7H-vM*-re%0Ly15u zH-x*Ua*@G3?K$Pu*OpuN8bwf;8byjRXNz+T-H~RCCt`>2(XmQ%?ohz^#D z2uTf5b}TdNT7=dn%ij2bj_?r{4X0$@db}k#-hlNXL;W*}Ub)oNaP$y-OHsZm2r`Xk zzLNTR_i@tx$Eu?>MhHEhX~(xHWifzMwl>pCItoRC26F#+dnfdQOmYG{l1WL)7QpazyNY4fV_> z5))~i#h+V=g2a5qrRVrKX=Nk*D3_ity8ERiW-@XtPN}>~^a`1LQZ!@!Pd#v2w~OEm z^cZhHcRp{nAZ)zFQttaqs^0ap#U3ThIQ%qzj*reS`K{FHrVx4xE}q-Tp)n2tGQ7T~L928F-YBgqNjhkUx+u7lBEDBZyt zGlm985r`{fSR43+xjRw04rc8d^-9nYcx~GWODfAge7%hk;Sy+7s=4#|fO&nTCdD8D z#bx&cbRBUlp?4s0LNd=!KD4<;qGsM|#PQEsU2`t98jrTHtZ)%eqWEH{8U(|+-==^F zH#L8eDn97-y?2*C>9b*;FyPKGiIXO|AkG#SN$?(;oxv8N3{{mM$!vpzp_j4wowz}f zv=z4^fhDC64Y1Ja6@Pzu3y=RYrLsSu!&jOzN}LU6wN3u!ciy$;SR9*Wcq_vP28j$l z$n3yYFW=uzX{?Q>x{0SEecL24_uLjgq(@hfXo~LRCX)1`aO_}sJfl)uy+{Stg7+p* z?mGhOt@Q>~ea`MV9CF?ClAhtkMOwDqKoEdB3lX2^M*THv@Uv8Lvt6UEbq8~eoRfp| z@mBI$GH=%6dMB8z7BiEO9vV;=F0!}6o=MO|4333~<@c~4G8fBLG|=i$JeTVcZXrz~ zlS~fV#uhDVlKX7Dosa6@n8_9qM8oNHcv}gH7|?b$x26di1aatJ|GK+~U8?dfj#NrI zoBoRvKZgWne1K5Tz1q&IR#F!Hd+TUSEQ8)CfBUu`Z%NN@`RMAqwh(mQ`Tyl6n-ud+l{9Wy#7`5TDIR#5QNF2&s1os-bwFGDyq=tA~(rwP>IphO8DvYoH zY5@MY5w_{XFbY$PRBs1>SZ>=gF;;(Z$Dee3o3PbweRG5R4rCnI53c$NBPx1)*lUSW zs{)fgC&_Lv_PHw>U)@uHejom#ODtbRi3v#5E@$Dje(zcKj)_DE=Gmhn~4A@ zxCh(v7m!%jzqO1xTuA3YgbcB1&oADD9wpP;V&Uuewe0a{!j(SwRyA2*8WfXrG_h4` zR|6qFicKsn)F4com6nDZ62>f!EtAF-Vnw5o45d{%OhQlwp$C%J+HunGd--^Rhn)U0UaugpoT7Q~Ueuy@2?E2M}OU-j>pi&3x)tE#A=B>M&`? z%P*(#P;*?RN+@D)e=RpXVa+jZ&KMutjjIwxZm6mC7if<7ZC$2w*gGk{6f|S2HA1zz zcxqVl9Y+h}bN-BuhQnjs-Dlv78e})f%Mu`gfg{m&RQSjjAUCBFG%jL)Le$LZiwvk6 zs|T$2WquH6L23x^BqDg(p7;om`kfWI_%ta+Jozgl<|?){M@ueQX!GkHgJQKT%=-gO zjq<92-2;0Vl7)%Vp{bToUIMy)JvB8E4N?UU>7(S`g{@Tc^~od)j;*gUnO171(?5H; zYVD{rt;#!N#BhnwX<-6)5+Tt5tKgo>7)Cnc9v|JA_aN^X^bzf$a%%Wgm0k4=(TsgR z8mB0w!dwaGfXa$)v1Q%u<59PS!+2nX?)O6Dh2Z6F`dCAG9tEs)`CI>?3tlEBF{ztU z##j)AGg5U;T=YGMSQ*UNth~Y-fJxs=RJWrHW2+(!h^%5vT%>%X{6ya{4#Y*LL-wgk z%c764K4bo&Ml3P)c)6y119_`&+k25bV*i9PzbW58x=4i(TTr){BTiOF&D7;tM~-4| zQYHhP7z;&NOntt^u4ehNh9dDdNWCs7Zi8I0R%Spfr%UjSn;HNnqOLc>rxN^hr}{1o z+o2>3JEz%@eJwSJ)S{_(u{OW0UjGX=xkAl&t6+q9ShvR4sIZtNlC!bAwq6}31@OSH zViz|FgY|*6?551nCaXJKzR+GuNsy@&8lP%cL7B&Asq72Yj}iFG>S;NEN8Z=$jmvWj>dFDahB``#`za!>SR>G0Iqb>W8witHDu}WJd6i~7yyF9qHRc7B=@C9ZK$9f6-Fj1Q zGD}j8^4)Z<`husm=B2ns3W9)lhcMVe5cU>rGIO}D_NZ9tDGp?qpSC20- zTVFWU3RA3<6-|r`HM-ZDO^q2__-z;~H9sXF_Qup6eAWhKLbUJIr+W)k2IH5LB(6W( zarwH+hUEZB`AKoq)AOz)2!^%9txnBDQH~^HK0QEn##GD6%P!+(E2Y8NnV=;{44?J5 z1Bw__GVEg;RufGsoD>Cinz5zBD2Qh%2?1~ImFo*U9?$?9>nF6)sTV(x69&Qy`3Ns& zHWo)xJ>w9SI(%g0)v4p+0a2Q2yrBJfYZJm~wRg_vnIeVr%%H7~(kc%aN&*$kCF*8Z zQ(Ki{LiwRU+nMakdt$Bu+3sauQ3F-&ebE37(`GclXBglY%dk*>JjX7))W9}H{X?4% z_f-{ADmk#z9GKH?L$}PmK6<%X7l)r3UA-a$vva<}LG_|T4KziiJ?9b@8wuNWRfK}F z#FNy7#~s6d=Rmb|4%tnAIA$!(eFs1hTI@xKktXZ;GilxHY^ku?EOSSV9XIGvA&yNQ z_WOFBwHzI8?9nKxpe*G>{>k*qwd(v7p?3F1>2Q^4Y9EXTY_QEu4g3)!%PjF9UhD0a zt2+1mU|ZueJCO_Qm1@2WCzQbG=PIpBK+(!|feFZv70#>EKl}>rF=65sDe9FVR`jCa zeU^tpjZE*ia_H611px8RZqO&3jdFAZM;g9=&gO^WKd)hH(yci@FB;$zcDA}@vb*k! zr^v3ljrk;{$t|3SYY6@xO|Ykt&un-^-^LUcD_Sf}!vH>p%KkXX+K3pHqM<3xZUH7- z6*>e&W8z64^+rf>5G&=i{PrpD=ZHxp_%hV*it9_#hbPt-kQ-9?u(8y&fknirS0go~ znF~PWJj2%zP92xoi@WvUd!quC4)q>&w~90rL+#+Gjwa;kAm)P9-*e{5vw`GSGkN+4 zr0S7D67mx{=L<3 zoOlJ+x{idY`DVJv-y_u*shBSm?_)(Qr$du7P|tpGn4wO)QH5*#5D0$yb2U{zHF)EZ z^9(;28H8(Uq}m!F=b!R=8v|+-d_aeemcXtb5*+W-R_j0apkons;T zApo!@C1i$lc{?q@6%-5+iz|*DGs(gj3#SGGT2EipXGQZO@NJc<3RL5Ba1BG3PfoQU zgi+~i(P{2F<`R10gunl`K}0ddE%%7a*c60-svp;6g2Dwox0vl(_O6=Ui)@v; zu~BE|=rAL##=u5C8X-S*6jQ`(sIOo%Kfc&jzEgNRsbIotJ}qqOxTMKw~D&W z(R2sTAnPy(CMGb2YcBPxU=9!@nrbM6a_GEY)fH_>1&U{;EKgHPcr|rAcrxx_HMlK* zp!o!Yf&OLhoBg|>jx+83OQkrCW|sltIDPs|Ol?L6cB8MLM9mc!%}ahm$k(G+Ac>=^ za~W@|Y1}3m2L{-ioxh_`5GK;2R&?thG6vBT3GU&074qHxHILT(b6{x`nXKC%9qFY% z>in;2Sl`x3@@AVu^X&b9G-3ug-+9(j#qO@FU~-fhve==JVhmP=>M|LqAE(v5a@EX!VI3>f zDAP^{?ijPI8&@qUwy`FXhk48+*Br9Hui#r+qT96=oqHFZbmjl{qp_8Xqu&~!&JWLJH6r#m=;re@26_9&D>KQl#zcF^BP|8W zSM}m-R^y(!dnzQ(6HzHykK(q1y)!zZdP0@V82CI!a9Msp;iCt-5*O{am z^-tS)6*Q#L;bNlu1d7TM`ag;mWh^TPOEfs^`?Uvo7eVky4%w#rV@=wiq{FfSkd(ewG>KpPS^8x>?3lehf9;Q_wTg=uIQ1 z3z9DZ8=ME5^ppk7D6WmDE^rk4)crqR`SS+Jm!#=~-Ay!@b?pwV&G^+mqkBqou5ji7 z0JLYbK0Q#b!svkkq^byklC18Ue_-2K!C0KHtR+ZDD<-;Y1Xu?D!2xe!##F21$IviU zN^Q%avi8=&*wF};r=9VUBGZ)I>~ef`BHu@kjN-fo9L0P(6 zK9IuUT~-$jgR54b6qP~uYPitO_v+c&S6yvy0e0L%P{dLI4Xmtr7w`k=agC>@>Z1|fg$K%J8twye^E3a~}<>$IaE<3(8;z+hPB>zySCuTmUMfLbabZn`!Mx~RA zB!)Ec%i_}nADL5PEr!Vasj!%>is={W(kvhWW7*B=JYlrhouD=5s77@M6nQXESsM@ZY9+=?3c1}E?9^Mvg=Vwt&8B)b%hp6c}8H^FM1P0n7&E{P@dT^lPrdzp3ACoua zPpq};Fwy2Wk;{@>`WluOLsIBYDWQAPD&MtTi`x=2R!G5E&3h-aYN6Da<*5~}$G0%} z!JDk8b4-=Idxo%MpCT6|(208nprV5NcZ*7WU>5lPfD6QejOAtWhFM?88ItI=G^Uv05y)8(d4V^e^odm;;(_!FB?&c zmJCX?IQC5s8LO2IWuo%uD-MaBs$-JheoY4hVz&wy5M}nVA}=jwx!qhDBmNT)Tf&+9 z*~L3-By8!`BGlxhE|T%aGyWjr&p8eR2KoPjhzlZ`FGWZWE&U{ge%;}K6G0mUaxf%% zzO*IFmjs%YdIcqbWv8v3rfBaR`ptr|zNRbI+Ce^BN0925B=YwhJ<1Ctm8d@1yM;@p zg67tsDsiHL1m}8c{r;E+lb}e~9_Q+E&Hd%7;{SZA$ zY2rz}Az)1rl?xu*B7W|9tu1-`DjM)}-T&d1j{v6o&t!|m^|!+E=e?XRMQq)g;xZH0 zZo}wuwWzjR%2YBcB;S_CLG-&kX28Z@(JmqJ0Qudap$S{tEsoB^_#zF;M0J)jjLU#c zFd`6--eQ9SMlX-a&r*6r?KIowlSgFtN4wnB`EefOLNxD@ z5mq^D4;P+<5`mpv7<}}rKOiSP8=Cw@ol@PRHv}vjdOn7^MQHLCsDS7qvub7iXcphV z(;pr*lIbOVbOC159}zAk!yW4R+M^t$qw1Yo1ZjVXwVEdfydQl}*D{8I`F#3~L8!0u zon+bda5$`XRu#EO<*&QCMkm5OxWmYfeWsaZv#>UmX2QuiVTMFD-Nu0!TTQ6N1np6o|ERKU@= z%)h?%e;486A7J0_tT5%M5ybt~cqF=>zA@qaLk6RZ!dLqzz5Vt2{0Z*HeZGxepUhXD z4A)BbGrq!sKQ?$R5b2NJ`bhdf0FFf9KP^!_o3-Z@eQzA^*9;bbKdtt(4-mD5^)wI| zKk-rfADao$oaD3pmG_$OuJbV`bN>hQVrV(Ze=QZDO;SOl!*|M!x3CfE^$S}Ry)>_0 zi6rSC_8=;2#6}-Oj%4crET!r(kDv$H-+KE-qWwa zN*~YZTEVRu3XbYNGF zaqrkv#m}gAR-vydLe$LQBx+C&egFnVZ%nCa&okybJvB3Cfwhh$mDmgY5ficK8|fn^ zhxsj%yfru7!mA&}4lQ4atCn1dhP@0d#Op{pO+-bv=8x?DP5|~F8eE&% z99g9?314BuyTqB~cDLw8VW0{&eK5Lt)#)hrf2BtvgZ$Ct88H7-qC5QR5D{(**bVqs zSUvqo_wU5I?LtL4h4oJydtQ(q3S%io?VQ%p71&_ce#g4$=3LvtB_LNCY&A4Qwn)%a zX3TSp*NV0Gre!QgQlW_z2DiB3YZ`PI|FoAB5$Okuc00^d@2!w9x-W*kU;w9)V9oiL zCwVK_h1JjJ=Za z+a)L2Dvu#DxdpvT=D2dWa-r6H)**+DqGtc6AYJ`C01#{QrGLGNJVAph4!BqmUfAJ# zpG}{?iWH6v_WuG1_{-DKy!i2w(Wli{O8%$}Ip(wiotVVkNOC}3YLo&5x_+A?X$1}? zueJ+u3d5^3?0vO>9`Bh*>zdN!VwR<{0TR0$^y9fL2bh_o=<`VO@(A~I04fpPtj~l} z9~WWlm#p_|R9QY!m(1pLkyUGd%%6FI40RC@yV1{+wQ3=qky88TR*s=<>9LF7G!(qe1m~4CIYv$PpVfq@^qx4VZt~<)HhPa0~kd zRPe(#(UsNx*>Nr zN7N58YPu=wJVz?K3p1y?1}`sKT3_v5i@_Ge0?TyFSRWsGpCO9fy1)4EhIG5)K<)bx z9Og1t=Od{`ZL=if@70AGU)m4KXA487uH64FQWlXn6`@I=mV zNJ%vLgJ`0izp4-yif?n{H4H2b>})v30a&0j5J}iBWTAJhUqJPp-i85dbS~cd`-)c0 zzuj!3l)@ogUB859y8vL`UGHW)6y7`7QY6bp;vL`jmWGi`MDOYBdUsNyPA{WRkSOJf z#E;}l~%<;pq>=3?o%m#li;N?<8h>%sj?mdQ~748Qk)DT4Z+<(3If%^Ae z=pBkL1TDVSk5VB)RdQXhGaB~=c5t9D)6bSE+#!=LRHZ5NBg8&RTSRBz27MX$qG2Q9 zUV~jx)hR0vX;t|@t|;+eS5&0Z4UIN}zL==M^-Vh@<~8Y!Ee3k~7~coBvyKlJ#LMEG zCA=Nlda&Jpth{!VmouMB%x^Jn0f=O%Wj>GOeAqJkV9&GAQ zs_oHl^7ZQV_x6i_O!vN*U3AP(Sq(9mgd$F2w!0m;W1l-)T7tBCpxb+8DJHolmipVw z^c+~m@kBLA5NlaUw8(S+IJT-EH()~|)(}@1ti3sbr|*nc;Of5$g7s&{y*Na0^N1X& zqlWHO*FHL`X;6NJEr?szzpzC{xr3zMax_m!|6zEiw6D#a$5ocW3R)R$u6bKnth#JG z7Li9&)6ehKB1ND6SBvx`h38z}wRUbF>(8S|UxaOS);lI`POuhcBUNzAVc=g38CVIc zRRf*sZDRH#|Kupp>G{|~bGkKpn=x_o556WDxI@zF_Z*z8Cf|cB?^zg$?-Cw#5x@zi z#Ax>?DL%De0{Mw#?Y?$6ifL`eASk4R46q=G`WMxU?&d!fE{H#Y-6P5W!P$uQ<6l!# zd;8ZvvZa0w{kJ5jJCMDVUA*OSg%X4Ad?&_Eauui){*_q#VMExOi zj5aw!IK0G`f!*p@QA1Bhk%R$L@7fu^{!+W!n)?>FWAXL0oW2}%RCabgIHw?OK+RS3 zp)N`_IDq|UBQ7~M?RyIXD`(`lqwj>!0qmd)njAUAiMn;~P=&q4Yqh6_T5<(DOn ziocrSDp3UuDj`(!K-ep{4R*0Iu(NlxeoNxMS!>5{ec22(#D6%f*B(vgwpHD>{!Kzi zSoK$*1ecHF_#cvB7c`1bu=UO;gAeIeN`K!RBG>I*tIKWSiA1UD#WTvnXsacob^l4f zElv&eg4CzKD4evJ0gIWBt{y9fqrl_X#OD6&LJ}2WCHd9rc&KuPWAbGqZ0dO!q`~bZ z(w$(KT1UySVO1a7$;@W|oJ7?jGTPHsaks6n9XA9IzvAK=2K??-b9FdA07rILU6X)Q zu&=rLU>l%oTU^?&6I$lj&^XMVN!HBF#SV<`fS6X?<+6wxxMuCs zGJ*PR^Gk+dB$YN-1==dsxg)M1e0{@3l3p2`4B_188{b^@Na*!!9jk*6cXP$g)!!Iy zSC&q|-aGSLtdm%d$sgbhJ7T_=rq7%=KCK!Qm+Ew1jEV(G95zq(n$eHWUU@_~1u7Xe zmU}qX>L*SBTXV$U7NtTUgsf0#?D~_2^$X}Ek$Q2)Ipk0=#8HUTxW)1Ki+Q13CBQTY z?-9w;;;2WHb=kW06h%Gte@72w>(gRPha!V~%#J!+UA(*aaR3TV!sfaesGQ__p1UxI z3r^vRiC1AaBHCm}IY&>q*ynR9VZlruP44rTG@cuj{{CZ_-=q_li5@K^VLGITurV3& zuq2gRYq8mhNd-%+Ki$FhL^5PQaL4Xxg4_cJpT=eY&rO0v?JH>dl5a3<*8{J9#o#$Z z$O`lh|7qFpMS;2daK#f15f4fCd6#!%O%m3SH8!gF;ADq%NbtHr%PpM|&>%>H)y6AZ%;_hPxflz_5YCvtQq?DxseEy4W#)?^NRFCK=C` zZQUE+&HrArhxV>#%utt6qWuABZu@cz=^AvrnVGHxy{?pHYP@r#R;q-ekq^H%Nc9BoM6tn5tC6z_iii4Dde3-s2}b|xh^ z=DJbH`*EAK15yd)45`hphPSyli{-oXh2O2TSVy0HfLO|9RniSEn+cNG=J<)~m1djW zq(UR`l`eG1(rwJ+x3K8y8b+6RwoN8NUosp}S5Z9KIONGX;x=26%GosYi!#hxVk80O zCDpy5*d@=I55f3$bCNeHCCnQwOdZvk(ZD?7x?c!(-;z1x&YRyHfSbe**M)(JgjT%) zkt?P9+V$xf?n=?gZvA}U0d<3uA(I!U`hY7sQ=4f!`%+&tj$ch0r7fIkFvc(ZI8}jl zPX{Z;K-UWbS6rx8giC_KZ zw0Nwx8$X;2Ya863b7V+XQ+ElhOLToj|6U<7tO?mkk6wA(L7lLzHp-`h1$KWS59 zU}dZY&nbL=#7^6)7TdXMF1V*wpPx0Ka;;F!Sw}!zR+3f-1So5A5tr=vvlgCl9gmBA z%f=exO@G^Od+Eisq0?)oM?R1xXT@KNKTb2V(!Hxdta0g#>M6m6@maMCRNYNmgjp{d z6|zE{)*t31?o+u_#y|EvaxPwzD7B2;*%=B)%-EKK;qzb5xA_!DKR^q;UoL|c^zdkqV zz!b$}z5WIFr4fqEGry4b*`ZkVs+kzkU72f^{3TIL`8$_!2W&NhVI8=c#T7pd@#QF( zwVHw^_4g(NXB!Y#1dF$`_tqc7%A0T<;PJglf-ep!*$i_4*i^}`V+E&jGB75g@gN1wT}&Y*u#r8#|&RGw0TTl zm1)IhiS7qvDr4+(`c=bkn|(iAh2_HL)3a z`apfG(zxvwu~2G73{2tO;dx>-OfU8^{?P+1jZ>e9$yBite{WoW@{%8=?&8bx`tynK zlfc~}ix=i$W2C-O`tO5gxgJg~KAz~i^|6jt)H9(Q4^J6Mv#0uUiN=ABQqec>4$qQv z?@P1f2yBB>a0(bf;KnIU0}okm=3sI&^IVAaOF(l(j)F5|uLCRuseW}oe^KwNx3&wu zZNA~Y-JA4F;c%&X>CSXcakD(3+_}b0yx$EX9L2dmSxL0)FOI=?r+$iMoW6%8ADX>b zoTTny8H^pi;Ve5jc;pT_v>ZA0COlcZB_@Hgk>!j>E$mCaSk!czj?mtFcBg;(mc`tK z?8n#d7a9;rK9vXm1u}Z{xTX5}8Qf1U({M|zF^yIX><<5~y;l${oQt>?% zW`lfL%e-by!=;#p3~?H?aS+q*k%d?Vm6w^40*z|6=cPn!2nZ+gPd1lqZ@B7L5vq3Q z6tBzX5P2J&v*hnjha@Knt;F4++5PX1ubbLZbPj!;DcvQ+)c3jBOV8P@^FVdF2VNW! zVzA;MiDk#hHRAxIlR+VcWsqxlk_D`(Fqd2ti8oZ*HV6N{!qgNEyW?tY2im3ljeGaK z<&{h0-eSe0K58Qinf%E2m!&Uhr8L+*y$T=+8NAC{HwG6QU7u^tv$enkr;DFxaxOIk z4jbM_=uP84pxv~g9}7?g#_$Fe?vmMnSqaUkMHg226FRH*&;pH&s8-A27cLJdqj3iA z>hn9KAsoT#R=kmeO;I8{i+9$*O=$Ghp|GLb0bC}9;g-X5P~7u#^@W+LqRY`03yqqK z++D_995DI(0)jR)RL`4uL12e=lgi|td$Ym_SPogU&XrF_86^gHKK$F_CJb+fg65X2 zqJC3(E5O-Qsao}m{L8qj%OmEUm0kAG=L#5~E; z#1`~MLX5H6zR)C0DDK^pRpOA<$FW$?lb2Gx&gjIJ>1{G+^a$~@{%#UEN-Hy5Y$0Ogmd_A1?JBXkb=UoTZYTA5nCHHDrTKOt9WxI2@Q5D`EB1=c>AKyaJ1Gbp zKPjQ_~`enQ|$FkD?t>_Fw)ixn_ zF7Q)%fK3H8O{r8?J^Yh$o_dvHP6yKd=T9FPbM~RVmh9BR8m03EWT)^&mm)x`L#&$g4&2(K>2 zE%05P_ETw1p1GJ-wk?k8fbVK*p|;Vl~~> zOhyPKQmfwX2qDT_gD+<4=(tfq((DI>Gxu)>3l;89=+k+0ou%{ILLq|;4%Ju9`yKXm z%SLo>w&Ljf`|=^wyzz1C%0xJ}>UUBTWo}GEKi$DQeuM=e;eP6Dk_96vrx8b6AjLDE zYabI8y=d%nHXG}ZrpWH#-TgX zf=DlX*QDC0H#yqoKU0SUseXBWdG61$7Re+gP<0FPm7HQIp_uSAPVaMT}Y`JsG7 ze7jqC3QdNnB0f?K(Rnh$Kg^$O&%GYcEN~HyXJ}&Ek~`+PL_pJl)79@Q*lh@TIYz1Q z=?R>{9@INg3k+In##+rd}66B>kf{7hECnI~{Rk-yaNSlb}Om{hVm;OO<#8ZMzb)9=#WwFbv5he|HJ z)999B&Y~f|V;%oku<4tccb&-kbi-=bA#Z4P*7(ll0=IIIY4arEKFIew>C>`;Xs&Kk zuSq;G>ZKXisFg{;^_m79mcRsqwa8E)z5qE$}6({}PY=zHt&i z<(vKUMe4n)UjO0V5%Z2AKO}4^t!|i#N;Xps1yWBSBnP@HW%=PCr=`Y@btr}bk!b6b zWmg{M!}_D1=+f+6CM2S(^x1d%+oDZo*N-5Xi?N6YSJ5!d15J&UZHETxJ<|Q>PXJV;Bd}av2?*BzpSJw1OWuXBj_jSDHn& zUmW%CY<=;%dg(x~nZVImrb*De(0LejHq&Yrfb9N#+9gkZt~d+*{bYz1JV1@I8{#>+ zIAgOw<)z{{`6NDtEg`TxCU{O$t0@$G@;h@`3Ee?YlxInHps^U zosM_n57L&=-2tMav-V+*1S&BwZ(7CLNK=!Fx?#PVZ0;I!f&)h<<|a~HGR=lH%24_p z-6q&%9F{O~Bc-e?IoYhYhqB|;DNx1@#W3XtEEj8c{4}0jrnlmTwJ1)LC-GaJjvw%o zFk?@O^pO2o4DN|#XcO-u3QL+yW=@9Fnt*y=pL(=gIc<8?ZYK6WUYY`d*kMmb&GMf$LKM>zdG@Dht(2Rzjq z&4BDy3mu)!`W?5Yg-i(ZEJy}SOd|N7qFSQT{l5;($uz7sNReeaMAsf06mJc_*5lB5 zV36uCIL0gLd5Y+~IGvFsG`7aM2C{>t$wy=%cTK9lId(jr|Hy~~_*4Gh13Cpvdj9^9 zKo{%~$2f!FKYnJQ2m2qxM*$K4gS8y+Ct>fuX8&0R61tx_uV`Q4+dhrHq`%N()=Vb8 ztZrkQL0#;~zUp8!M(3HZ_D6F!+Y7mRz|><>_+Alox0}WlwX^zBwBf|wSY3uLZs?6p zM6TbJ`lHmfi|2zH*Rs@w_fObntCX*jphpU4R|Ht;>=YnSVf{OJC1@)^Gdf@%sHbCN zqvP#Lv~yQG*2thg@;Ib#l;V0l$Fl6eZ}KwQ9DxbD}h1W2rUd{Wz1+asXnpU+LYEYzBXI-m5D*8BQ( zthNSXtasF7kRqj?3FErX!C#h_z0{YxW#{9T`~5=4zvE-ZKF(?Md8c8qegeJv;mz7| z!?_e{85WN}Gh#o&NR^tC$1S`AXU%C=wuo)}`kLdpG9Z{9%uRunKF73bl3CXRDY{n| zb_hv+lrAm;g4eaJF*K@JuZFmjDpbFrcIrrS#WR#Xxv;u%vc_Af0mjb6xWxK+uuBQ6 z_UtgNOc*>wHC%S(XR4@KnZ=*%JFsa>-<~e6s)RE*(F$}9QRb0#hEK7phc>Fym@{gY zrA#SZ@-Kxh5^7&JD5|s^akF3ym#?2cs9>Hgh+XVj@@(K2c3e)GIh+cpf#H-f>xr%I zMcjnkH?H=&vqZhcVZ9mO5fVd9Hvy`Cg`@#Xuu)=7{~^H&@XCbFaUZ&uJOI!1Ibd~L z$Z>7QQ0ixPiH`dAsNCnSf=37TaZMU=3w0^53TGLyOkXuSaAME~7KJ$#v7gq@6PnD1 z2K(9NJku1Dx-oL&;}{Y2!?YPZBR0O?3*n$~)$Kz6UtwJWqO`O9##FWHOUk>)R^HpN@<6HTpA^vdCyNw zOpipG=QmVBk|(5!cuG-Od$|+f!QH-49IDGG3!gleP=RpxJD;|j#P!re`bWmz-k~C7 zsPyOyvf%gTYN#HxS?XWOXeu0m-6G}rW_e4JSo32sE4?FikVV*Gw)gLsptS^PHekWB z`*2n|&>|j~#`w4B5A=*=3#VyRswi{9(uHfrKQTdaWT~%y^F4RkYLPPSyeSy2A*NG zF{-I@d|H!#ku33${v82KxrMsI0N?D%(0o$*TOEQ!z$Rl}nb|8Q{nj;rycWomtO?tS zQY7$*_OQl6r1PS;Yh4zL0UhBU0mmUyI@VL-hsV)Ov&#WS4p*1&wh4X4AfGEo;EkB+ zunOmm#iz2ff?#9Qit};}{dj7;&5&#UhPp#L+A1*cJ3!}2RgQh?pmXs|I##a$YPJ5{ z?3o>LVYjrc>c#hSJ>ox^wEB;~5ssPs_K|$m$JCx5`4)Fs^4_J))RF}EH?$M&X|Si) zP|nvT<9!w-pKp^3tF$K5;spm51^&ej%x~RT%LIxvH3iKdBICDXz&#N#FqOZNqETRQ zd%wFQrb$UOSKpx87;<7Xi79YL*`3SI@~DGDaJg0%+fF&%V#MNp{)vH4(Df&1cM4cg zwH;Tw1l_M3ydnka$iDB(2=C?{V%+B3tuf^!Yb|f~!vo}g5!*=fNbMz!vxe+%y}h-# zYnh4IJ0!=)$uJbT4tcRM7{0$s9@;YLqM9^1YXNiTG}V~%z@MR*yr^>h+iuNpj;nNK z?eTK%8*B^9-OZY$pLoHR#l75xq`T^n*=ATx@m_H?&o>E(Fb6`-jA}wUf6rh7`UZYz zmRvL10{k0ny(A9y1e(7g>27eHUaw^2AJceYY#5d9`@*`Jk@)M2JdW7Fs-Yo=2>mlT z<-FArGmJTrZ|kJ;uEz&F%yjb&@i48B;)P$$Atv|K{wkl3RPc}`w2hfMI`jDtP5q%k zxdUY-pRB0%VB%bj4rM!864-YV$K+HcjHRPejf6$$SS$LDuf5TY1JxG(WpbEKt3YNL z6Jn)Ns_cJ1xga*KEB6c%m2%Q1?oaqhU)1K|vqBeZ5#2+nSPUJUFk1jj$qXI~eXm9e zo;%Ka+4ps@_w{#4m*7Z*q85$F-euyK+$7eHCV+#IpG-xFFRUL2fAQ~n?kaH*O;lx` zVnr#JNXi#uDovJ~|~7;M%QgZ@K%nRGD{!L@kxfk1O4akHJ=Qy59Kb-60S0lhlWK zGlfA?w;`I_trQ{K0z3CHx&r>+UCW6nF$I~s-x-1;vH{8 zo=*|C$%Q5#M5)U()0i05PKh&FAC=OYqn3g>Gx}reXJ$vjtp?sruP=_V46BA|Bcqwf zTyfEEaHCJ*g!s>I#6R3Lq>V(@Otd@cUJi(JXt{o4sHI&Hy?#C<2z3UimX8f%ZWNZH?5!3GPyr= zieXH_wv6z$x{H&Z`A&Bdu$IQk4PMX;dleATyg8{1Lq9~|pf%K4Io+E175beoEMAP@ za9Fm8eQa=-8}M8+M{@k9801%S>=yH0$l7jpgagF$Eu+^llhOx)19rSw6EZx*j88gY zqDjoV*^>OiJ!!Q9!>|Z*LkCLIv3w)bd+1^K_P!!UGyZ7J5n*kfi`KhR_F40abWqSZ zjYac;P#w={$$cxa5z@437N-wtSe{hX$G7qxZ*wTD{6blSl2{?^6h2o#BwIf=c~Lbo z(t$Q+R8aYMA438ftdC^b30QP#XSuf8o;u6ZYZLOdn|&DtpXL{V#6?XHcoFPTl z1#l$=vs5>KJ#I!$&;-K=sQA8i#7+LTLDL1!Rr;coiAF2^5vpdw3#9fIlT;QbJloem z(qZp4Z7Y6>+PQ7``Ii2Wg6p%ZLnYINX!akxTuCazt`h?F%mGD>^a=?+)v6hy!G@b^snZfXmrv@r-_qMU5wCJSXQ z)sb8FCh7etre^lV&|zS}k#rzxLMBMdM9|9dHjHcVX}Z?CF8lP@A4knw$G-SS@G7Pv zS6RX|jD}-Fg>vl~DwG1g(@S46MQ^Y4o=^CJ6lMgd*o&77G>(2(wnEy*uM?TCir>f)bRgkNX_2d5Qfjq)RC`aX0plkph{!5@@9a7u+5 zSy?>NQL#zf_$uO^W7<70{#Z_r**@MH$>W7weSg`jQlq>m*kPmlB|`9hs>O*soGNjA zUTy9q`P6SE&sWd{=}7cz{@F0{wmncckFRn(?66<}|Q+r%jG`!Ixaj7JYPG>HE6`St| zWt-EYFg4+^kR&H<0EUKoGl6eCxjHaNRH0m1-7h7&=!R^D$A^nC{-1GSK$fE*@&3be zur10F{;B&oE - - - - - - - - - - - - - - - - - - - - -
      -
      -

      AWS Video Analyzer application

      -

      Upload a video to an Amazon S3 bucket that will be analyzed!

      -
      -

      - -
      -
      -
      -

      - Choose the following button to get information about the video to - analyze. -

      - - - - - - - - - - - - - - - - - - -
      -
      NameOwnerDateSize
      No DataNo DataNo DataNo Data
      -
      -
      -
      -
      -
      -

      - You can generate a report that analyzes a video in an Amazon S3 - bucket. You can send the report to the following email address. -

      -
      -
      -
      -
      -

      - Click the following button to analyze the video and obtain a report -

      - -
      -
      -

      Report is being generated:

      -
      -
      -
      - - - - diff --git a/javascriptv3/example_code/cross-services/video-analyzer/src/js/index.js b/javascriptv3/example_code/cross-services/video-analyzer/src/js/index.js deleted file mode 100644 index 1b869c36467..00000000000 --- a/javascriptv3/example_code/cross-services/video-analyzer/src/js/index.js +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. - -Purpose: -index.js contains the JavaScript for an web app that analyzes videos for label detection using the -AWS JavaScript SDK for JavaScript v3. - -Inputs: -- BUCKET -- IAM_ROLE_ARN - - */ -import { rekognitionClient } from "../libs/rekognitionClient.js"; -import { s3Client } from "../libs/s3Client.js"; -import { sesClient } from "../libs/sesClient.js"; -import { SendEmailCommand } from "@aws-sdk/client-ses"; -import { - ListObjectsCommand, - PutObjectCommand, - DeleteObjectCommand, -} from "@aws-sdk/client-s3"; -import { - StartFaceDetectionCommand, - GetFaceDetectionCommand, -} from "@aws-sdk/client-rekognition"; -const BUCKET = "BUCKET_NAME"; -const IAM_ROLE_ARN = "IAM_ROLE_ARN"; - -$(function () { - $("#myTable").DataTable({ - scrollY: "500px", - scrollX: true, - scrollCollapse: true, - paging: true, - columnDefs: [{ width: 200, targets: 0 }], - fixedColumns: true, - }); -}); -// Upload the video. - -const uploadVideo = async () => { - try { - // Retrieve a list of objects in the bucket. - const listObjects = await s3Client.send( - new ListObjectsCommand({ Bucket: BUCKET }) - ); - console.log("Object in bucket: ", listObjects); - console.log("listObjects.Contents ", listObjects.Contents); - - const noOfObjects = listObjects.Contents; - // If the Amazon S3 bucket is not empty, delete the existing content. - if (noOfObjects != null) { - for (let i = 0; i < noOfObjects.length; i++) { - await s3Client.send( - new DeleteObjectCommand({ - Bucket: BUCKET, - Key: listObjects.Contents[i].Key, - }) - ); - } - } - console.log("Success - bucket empty."); - - // Create the parameters for uploading the video. - const files = document.getElementById("videoupload").files; - const file = files[0]; - const uploadParams = { - Bucket: BUCKET, - Body: file, - }; - uploadParams.Key = path.basename(file.name); - await s3Client.send(new PutObjectCommand(uploadParams)); - console.log("Success - video uploaded"); - } catch (err) { - console.log("Error", err); - } -}; -window.uploadVideo = uploadVideo; -const getVideo = async () => { - try { - const listVideoParams = { - Bucket: BUCKET, - }; - const data = await s3Client.send(new ListObjectsCommand(listVideoParams)); - console.log("Success - video deleted", data); - const videoName = data.Contents[0].Key; - document.getElementById("videoname").innerHTML = videoName; - const videoDate = data.Contents[0].LastModified; - document.getElementById("videodate").innerHTML = videoDate; - const videoOwner = data.Contents[0].Owner; - document.getElementById("videoowner").innerHTML = videoOwner; - const videoSize = data.Contents[0].Size; - document.getElementById("videosize").innerHTML = videoSize; - } catch (err) { - console.log("Error", err); - } -}; -window.getVideo = getVideo; - -const ProcessImages = async () => { - try { - // Create the parameters required to start face detection. - const videoName = document.getElementById("videoname").innerHTML; - const startDetectParams = { - Video: { - S3Object: { - Bucket: BUCKET, - Name: videoName, - }, - }, - notificationChannel: { - roleARN: IAM_ROLE_ARN, - SNSTopicArn: SNSTOPIC, - }, - }; - // Start the Amazon Rekognition face detection process. - const data = await rekognitionClient.send( - new StartFaceDetectionCommand(startDetectParams) - ); - console.log("Success, face detection started. ", data); - const faceDetectParams = { - JobId: data.JobId, - }; - try { - var finished = false; - var facesArray = []; - // Detect the faces. - while (!finished) { - var results = await rekognitionClient.send( - new GetFaceDetectionCommand(faceDetectParams) - ); - // Wait until the job succeeds. - if (results.JobStatus == "SUCCEEDED") { - finished = true; - } - } - finished = false; - // Parse results into CVS format. - var i; - for (i = 0; i < results.Faces.length; i++) { - var boundingbox = JSON.stringify(results.Faces[i].Face.BoundingBox); - var confidence = JSON.stringify(results.Faces[i].Face.Confidence); - var pose = JSON.stringify(results.Faces[i].Face.Pose); - var quality = JSON.stringify(results.Faces[i].Face.Quality); - var arrayfirst = []; - var arraysecond = []; - var arraythird = []; - var arrayforth = []; - arrayfirst.push(boundingbox); - arraysecond.push(confidence); - arraythird.push(pose); - arrayforth.push(quality); - arrayfirst.push(arraysecond); - arrayfirst.push(arraythird); - arrayfirst.push(arrayforth); - facesArray.push(arrayfirst); - } - // Create the CSV file. - create_csv_file(facesArray); - } catch (err) { - console.log("Error", err); - } - } catch (err) { - console.log("Error", err); - } -}; -window.ProcessImages = ProcessImages; - -// Helper function to create the CSV file. -function create_csv_file(facesArray) { - // Define the heading for each row of the data. - var csv = "Bounding Box, , , , Confidance, Pose, , , Quality, ,\n"; - - // Merge the data with CSV. - facesArray.forEach(function (row) { - csv += row.join(","); - csv += "\n"; - }); - // Upload the CSV file to Amazon S3. - uploadFile(csv); -} - -// Helper function to upload file to Amazon S3. -const uploadFile = async (csv) => { - const uploadParams = { - Bucket: BUCKET, - Body: csv, - Key: "Face.csv", - }; - try { - await s3Client.send(new PutObjectCommand(uploadParams)); - const linkToCSV = - "https://s3.console.aws.amazon.com/s3/object/" + - uploadParams.Bucket + - "?region=" + - REGION + - "&prefix=" + - uploadParams.key; - console.log("Success. Report uploaded to " + linkToCSV + "."); - - // Send an email to notify user when report is available. - sendEmail(uploadParams.Bucket, uploadParams.Key); - } catch (err) { - console.log("Error", err); - } -}; -// Helper function to send an email to user. -const sendEmail = async (bucket, key) => { - const toEmail = document.getElementById("email").value; - const fromEmail = "SENDER_ADDRESS"; // - try { - const linkToCSV = - "https://s3.console.aws.amazon.com/s3/object/" + - bucket + - "?region=" + - REGION + - "&prefix=" + - key; - // Set the parameters - const params = { - Destination: { - /* required */ - CcAddresses: [ - /* more items */ - ], - ToAddresses: [ - toEmail, //RECEIVER_ADDRESS - /* more To-email addresses */ - ], - }, - Message: { - /* required */ - Body: { - /* required */ - Html: { - Charset: "UTF-8", - Data: - "

      Hello!

      ", - }, - Text: { - Charset: "UTF-8", - Data: - "Hello,\\r\\n" + - "Please see the attached file for the analyzed video report at" + - linkToCSV + - "\n\n", - }, - }, - Subject: { - Charset: "UTF-8", - Data: key + " analyzed video report ready", - }, - }, - Source: fromEmail, // SENDER_ADDRESS - ReplyToAddresses: [ - /* more items */ - ], - }; - const data = await sesClient.send(new SendEmailCommand(params)); - console.log("Success. Email sent.", data); - } catch (err) { - console.log("Error", err); - } -}; diff --git a/javascriptv3/example_code/cross-services/video-analyzer/src/libs/rekognitionClient.js b/javascriptv3/example_code/cross-services/video-analyzer/src/libs/rekognitionClient.js deleted file mode 100644 index 1bdda5bc7bf..00000000000 --- a/javascriptv3/example_code/cross-services/video-analyzer/src/libs/rekognitionClient.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/video-analyzer.html. - -Purpose: -rekognitionClient.js is a helper function that creates the Amazon Rekognition service clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[video-analyzer.JavaScript.rekognitionClient] -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { RekognitionClient } from "@aws-sdk/client-rekognition"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon Rekognition service client object. -const rekognitionClient = new RekognitionClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { rekognitionClient }; -// snippet-end:[video-analyzer.JavaScript.rekognitionClient] diff --git a/javascriptv3/example_code/cross-services/video-analyzer/src/libs/s3Client.js b/javascriptv3/example_code/cross-services/video-analyzer/src/libs/s3Client.js deleted file mode 100644 index 710ab48bb31..00000000000 --- a/javascriptv3/example_code/cross-services/video-analyzer/src/libs/s3Client.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/video-analyzer.html. - -Purpose: -s3Client.js is a helper function that creates the Amazon Simple Storage Solution (Amazon S3) service clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[video-analyzer.JavaScript.s3Client] -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { S3Client } from "@aws-sdk/client-s3"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon S3 service client object. -const s3Client = new S3Client({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { s3Client }; -// snippet-end:[video-analyzer.JavaScript.s3Client] diff --git a/javascriptv3/example_code/cross-services/video-analyzer/src/libs/sesClient.js b/javascriptv3/example_code/cross-services/video-analyzer/src/libs/sesClient.js deleted file mode 100644 index f23b5eb986a..00000000000 --- a/javascriptv3/example_code/cross-services/video-analyzer/src/libs/sesClient.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -ABOUT THIS NODE.JS EXAMPLE: This example works with the AWS SDK for JavaScript version 3 (v3), -which is available at https://github.com/aws/aws-sdk-js-v3. This example is in the 'AWS SDK for JavaScript v3 Developer Guide' at -https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/video-analyzer.html. - -Purpose: -s3Client.js is a helper function that creates the Amazon Simple Storage Solution (Amazon S3) service clients. - -Inputs (replace in code): -- REGION -- IDENTITY_POOL_ID - an Amazon Cognito Identity Pool ID. -*/ -// snippet-start:[video-analyzer.JavaScript.sesClient] -import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; -import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity"; -import { SESClient } from "@aws-sdk/client-ses"; - -const REGION = "REGION"; -const IDENTITY_POOL_ID = "IDENTITY_POOL_ID"; // An Amazon Cognito Identity Pool ID. - -// Create an Amazon S3 service client object. -const sesClient = new SESClient({ - region: REGION, - credentials: fromCognitoIdentityPool({ - client: new CognitoIdentityClient({ region: REGION }), - identityPoolId: IDENTITY_POOL_ID, - }), -}); - -export { sesClient }; -// snippet-end:[video-analyzer.JavaScript.sesClient] From a9375541143b2dc4164adf53160954453f1bb85e Mon Sep 17 00:00:00 2001 From: Laren-AWS <57545972+Laren-AWS@users.noreply.github.com> Date: Fri, 6 Sep 2024 17:14:12 -0700 Subject: [PATCH 78/98] Go: Updated Go version and imported modules for demotools and testtools. (#6821) Updated Go version and imported modules for demotools and testtools. --- gov2/demotools/go.mod | 9 +++---- gov2/demotools/go.sum | 8 +++--- gov2/testtools/go.mod | 26 ++++++++++--------- gov2/testtools/go.sum | 59 +++++++++++++++++++------------------------ 4 files changed, 48 insertions(+), 54 deletions(-) diff --git a/gov2/demotools/go.mod b/gov2/demotools/go.mod index 8b9ff5fc8dc..64a5716378e 100644 --- a/gov2/demotools/go.mod +++ b/gov2/demotools/go.mod @@ -1,8 +1,7 @@ module github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools -go 1.20 +go 1.21 -require ( - golang.org/x/sys v0.9.0 // indirect - golang.org/x/term v0.9.0 // indirect -) +require golang.org/x/term v0.24.0 + +require golang.org/x/sys v0.25.0 // indirect diff --git a/gov2/demotools/go.sum b/gov2/demotools/go.sum index 6e0ed57e8cf..b256fe08550 100644 --- a/gov2/demotools/go.sum +++ b/gov2/demotools/go.sum @@ -1,4 +1,4 @@ -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= diff --git a/gov2/testtools/go.mod b/gov2/testtools/go.mod index 24fc84ab79b..48bb0374318 100644 --- a/gov2/testtools/go.mod +++ b/gov2/testtools/go.mod @@ -1,20 +1,22 @@ module github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools -go 1.18 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.16.2 - github.com/aws/aws-sdk-go-v2/config v1.15.3 - github.com/aws/smithy-go v1.11.2 + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/smithy-go v1.20.4 ) require ( - github.com/aws/aws-sdk-go-v2/credentials v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.11.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.16.3 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect ) diff --git a/gov2/testtools/go.sum b/gov2/testtools/go.sum index edea0537135..892ff3e2415 100644 --- a/gov2/testtools/go.sum +++ b/gov2/testtools/go.sum @@ -1,33 +1,26 @@ -github.com/aws/aws-sdk-go-v2 v1.16.2 h1:fqlCk6Iy3bnCumtrLz9r3mJ/2gUT0pJ0wLFVIdWh+JA= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2/config v1.15.3 h1:5AlQD0jhVXlGzwo+VORKiUuogkG7pQcLJNzIzK7eodw= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2 h1:RQQ5fzclAKJyY5TvF+fkjJEwzK4hnxQCLOu5JXzDmQo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3 h1:LWPg5zjHV9oz/myQr4wMs0gi4CjnDN/ILmyZUFYXZsU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9 h1:onz/VaaxZ7Z4V+WIN9Txly9XLTmoOh1oJ8XcAC3pako= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3 h1:9stUQR/u2KXU6HkFJYlqnZEjBnbgrVbG6I5HN09xZh0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10 h1:by9P+oy3P/CwggN4ClnW2D4oL91QV7pBzBICi1chZvQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3 h1:Gh1Gpyh01Yvn7ilO/b/hr01WgNpaszfbKMUgqM186xQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3 h1:frW4ikGcxfAEDfmQqWgMLp+F1n4nRo9sF39OcIb5BkQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3 h1:cJGRyzCSVwZC7zZZ1xbx9m32UnrKydRYhOvcD1NYP9Q= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/smithy-go v1.11.2 h1:eG/N+CcUMAvsdffgMvjMKwfyDzIkjM6pfxMJ8Mzc6mE= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= From c715069d915686a9a9c61c2e5a6c42ca9fb9367f Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Mon, 9 Sep 2024 16:26:25 -0400 Subject: [PATCH 79/98] JavaScript (v3): Refactor integration test names. (#6827) These integration tests were overlapping each other in the junit reports. This renames them to be more specific and prevent the overlap. --- ...ntegration.test.js => cognito-idp-actions.integration.test.js} | 0 ...ration.test.js => wkflw-resilient-service.integration.test.js} | 0 ...llo.integration.test.js => dynamodb-hello.integration.test.js} | 0 .../{basic.integration.test.js => ec2-basic.integration.test.js} | 0 ...hello.integration.test.js => elb-v2-hello.integration.test.js} | 0 ...tions.integration.test.js => glue-actions.integration.test.js} | 0 ...{client.integration.test.js => iam-client.integration.test.js} | 0 .../{hello.integration.test.js => iam-hello.integration.test.js} | 0 ...tegration.test.js => nodegetstarted-index.integration.test.js} | 0 .../{hello.integration.test.js => s3-hello.integration.test.js} | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename javascriptv3/example_code/cognito-identity-provider/tests/{actions.integration.test.js => cognito-idp-actions.integration.test.js} (100%) rename javascriptv3/example_code/cross-services/wkflw-resilient-service/tests/{wkflw.integration.test.js => wkflw-resilient-service.integration.test.js} (100%) rename javascriptv3/example_code/dynamodb/tests/{hello.integration.test.js => dynamodb-hello.integration.test.js} (100%) rename javascriptv3/example_code/ec2/tests/{basic.integration.test.js => ec2-basic.integration.test.js} (100%) rename javascriptv3/example_code/elastic-load-balancing-v2/tests/{hello.integration.test.js => elb-v2-hello.integration.test.js} (100%) rename javascriptv3/example_code/glue/tests/{actions.integration.test.js => glue-actions.integration.test.js} (100%) rename javascriptv3/example_code/iam/tests/{client.integration.test.js => iam-client.integration.test.js} (100%) rename javascriptv3/example_code/iam/tests/{hello.integration.test.js => iam-hello.integration.test.js} (100%) rename javascriptv3/example_code/nodegetstarted/tests/{index.integration.test.js => nodegetstarted-index.integration.test.js} (100%) rename javascriptv3/example_code/s3/tests/{hello.integration.test.js => s3-hello.integration.test.js} (100%) diff --git a/javascriptv3/example_code/cognito-identity-provider/tests/actions.integration.test.js b/javascriptv3/example_code/cognito-identity-provider/tests/cognito-idp-actions.integration.test.js similarity index 100% rename from javascriptv3/example_code/cognito-identity-provider/tests/actions.integration.test.js rename to javascriptv3/example_code/cognito-identity-provider/tests/cognito-idp-actions.integration.test.js diff --git a/javascriptv3/example_code/cross-services/wkflw-resilient-service/tests/wkflw.integration.test.js b/javascriptv3/example_code/cross-services/wkflw-resilient-service/tests/wkflw-resilient-service.integration.test.js similarity index 100% rename from javascriptv3/example_code/cross-services/wkflw-resilient-service/tests/wkflw.integration.test.js rename to javascriptv3/example_code/cross-services/wkflw-resilient-service/tests/wkflw-resilient-service.integration.test.js diff --git a/javascriptv3/example_code/dynamodb/tests/hello.integration.test.js b/javascriptv3/example_code/dynamodb/tests/dynamodb-hello.integration.test.js similarity index 100% rename from javascriptv3/example_code/dynamodb/tests/hello.integration.test.js rename to javascriptv3/example_code/dynamodb/tests/dynamodb-hello.integration.test.js diff --git a/javascriptv3/example_code/ec2/tests/basic.integration.test.js b/javascriptv3/example_code/ec2/tests/ec2-basic.integration.test.js similarity index 100% rename from javascriptv3/example_code/ec2/tests/basic.integration.test.js rename to javascriptv3/example_code/ec2/tests/ec2-basic.integration.test.js diff --git a/javascriptv3/example_code/elastic-load-balancing-v2/tests/hello.integration.test.js b/javascriptv3/example_code/elastic-load-balancing-v2/tests/elb-v2-hello.integration.test.js similarity index 100% rename from javascriptv3/example_code/elastic-load-balancing-v2/tests/hello.integration.test.js rename to javascriptv3/example_code/elastic-load-balancing-v2/tests/elb-v2-hello.integration.test.js diff --git a/javascriptv3/example_code/glue/tests/actions.integration.test.js b/javascriptv3/example_code/glue/tests/glue-actions.integration.test.js similarity index 100% rename from javascriptv3/example_code/glue/tests/actions.integration.test.js rename to javascriptv3/example_code/glue/tests/glue-actions.integration.test.js diff --git a/javascriptv3/example_code/iam/tests/client.integration.test.js b/javascriptv3/example_code/iam/tests/iam-client.integration.test.js similarity index 100% rename from javascriptv3/example_code/iam/tests/client.integration.test.js rename to javascriptv3/example_code/iam/tests/iam-client.integration.test.js diff --git a/javascriptv3/example_code/iam/tests/hello.integration.test.js b/javascriptv3/example_code/iam/tests/iam-hello.integration.test.js similarity index 100% rename from javascriptv3/example_code/iam/tests/hello.integration.test.js rename to javascriptv3/example_code/iam/tests/iam-hello.integration.test.js diff --git a/javascriptv3/example_code/nodegetstarted/tests/index.integration.test.js b/javascriptv3/example_code/nodegetstarted/tests/nodegetstarted-index.integration.test.js similarity index 100% rename from javascriptv3/example_code/nodegetstarted/tests/index.integration.test.js rename to javascriptv3/example_code/nodegetstarted/tests/nodegetstarted-index.integration.test.js diff --git a/javascriptv3/example_code/s3/tests/hello.integration.test.js b/javascriptv3/example_code/s3/tests/s3-hello.integration.test.js similarity index 100% rename from javascriptv3/example_code/s3/tests/hello.integration.test.js rename to javascriptv3/example_code/s3/tests/s3-hello.integration.test.js From c17470c0be5da193d34c733d17db9514af4e8f4d Mon Sep 17 00:00:00 2001 From: Eric Shepherd Date: Mon, 9 Sep 2024 17:12:00 -0400 Subject: [PATCH 80/98] Add Swift imports to descriptions (#6787) Adds import AWSfoo to each Swift record in the metadata for examples that currently exist. This causes the correct import for the function(s) being used to be included in context as a convenience to the reader. --- .../metadata/cognito-identity_metadata.yaml | 10 +- .doc_gen/metadata/dynamodb_metadata.yaml | 35 +++-- .doc_gen/metadata/iam_metadata.yaml | 21 +++ .doc_gen/metadata/s3_metadata.yaml | 25 +++- .doc_gen/metadata/sts_metadata.yaml | 1 + .tools/readmes/config.py | 10 +- .../FindOrCreateIdentityPool/Package.swift | 4 +- .../CognitoIdentityHandler.swift | 4 +- swift/example_code/cognito-identity/README.md | 8 +- swift/example_code/ddb/README.md | 75 ----------- .../BatchGetItem/Package.swift | 0 .../BatchGetItem/Sources/Movie.swift | 0 .../BatchGetItem/Sources/MovieDatabase.swift | 0 .../BatchGetItem/Sources/batchgetitem.swift | 0 .../Tests/MovieDatabaseTests.swift | 0 .../BatchGetItem/Tests/MovieTests.swift | 0 .../ListTables/Package.swift | 0 .../ListTables/Sources/DatabaseManager.swift | 0 .../ListTables/Sources/listtables.swift | 0 .../ListTables/Tests/ListTablesTests.swift | 0 swift/example_code/dynamodb/README.md | 124 ++++++++++++++++++ .../basics/MovieList/Movie.swift | 0 .../basics/MovieList/MovieTable.swift | 0 .../{ddb => dynamodb}/basics/Package.swift | 3 +- .../basics/Sources/basics.swift | 5 +- .../basics/Tests/MovieTableTests.swift | 0 .../basics/Tests/MovieTests.swift | 0 swift/example_code/iam/README.md | 42 +++--- swift/example_code/iam/basics/Package.swift | 4 +- .../iam/basics/Sources/Basics/Basics.swift | 6 +- .../ServiceHandler/ServiceHandlerIAM.swift | 32 +++-- .../ServiceHandler/ServiceHandlerS3.swift | 32 +++-- .../ServiceHandler/ServiceHandlerSTS.swift | 44 +++---- swift/example_code/s3/README.md | 20 +-- swift/example_code/s3/basics/Package.swift | 2 +- .../ServiceHandler/ServiceHandler.swift | 7 +- 36 files changed, 311 insertions(+), 203 deletions(-) delete mode 100644 swift/example_code/ddb/README.md rename swift/example_code/{ddb => dynamodb}/BatchGetItem/Package.swift (100%) rename swift/example_code/{ddb => dynamodb}/BatchGetItem/Sources/Movie.swift (100%) rename swift/example_code/{ddb => dynamodb}/BatchGetItem/Sources/MovieDatabase.swift (100%) rename swift/example_code/{ddb => dynamodb}/BatchGetItem/Sources/batchgetitem.swift (100%) rename swift/example_code/{ddb => dynamodb}/BatchGetItem/Tests/MovieDatabaseTests.swift (100%) rename swift/example_code/{ddb => dynamodb}/BatchGetItem/Tests/MovieTests.swift (100%) rename swift/example_code/{ddb => dynamodb}/ListTables/Package.swift (100%) rename swift/example_code/{ddb => dynamodb}/ListTables/Sources/DatabaseManager.swift (100%) rename swift/example_code/{ddb => dynamodb}/ListTables/Sources/listtables.swift (100%) rename swift/example_code/{ddb => dynamodb}/ListTables/Tests/ListTablesTests.swift (100%) create mode 100644 swift/example_code/dynamodb/README.md rename swift/example_code/{ddb => dynamodb}/basics/MovieList/Movie.swift (100%) rename swift/example_code/{ddb => dynamodb}/basics/MovieList/MovieTable.swift (100%) rename swift/example_code/{ddb => dynamodb}/basics/Package.swift (98%) rename swift/example_code/{ddb => dynamodb}/basics/Sources/basics.swift (99%) rename swift/example_code/{ddb => dynamodb}/basics/Tests/MovieTableTests.swift (100%) rename swift/example_code/{ddb => dynamodb}/basics/Tests/MovieTests.swift (100%) diff --git a/.doc_gen/metadata/cognito-identity_metadata.yaml b/.doc_gen/metadata/cognito-identity_metadata.yaml index 73c84893c24..a6575a842f6 100644 --- a/.doc_gen/metadata/cognito-identity_metadata.yaml +++ b/.doc_gen/metadata/cognito-identity_metadata.yaml @@ -7,11 +7,13 @@ cognito-identity_ListIdentityPools: github: swift/example_code/cognito-identity/FindOrCreateIdentityPool sdkguide: sdk-for-swift/latest/developer-guide/getting-started.html excerpts: - - description: Find the ID of an identity pool given its name. + - description: snippet_tags: + - cognitoidentity.swift.import - cognitoidentity.swift.get-pool-id - description: Get the ID of an existing identity pool or create it if it doesn't already exist. snippet_tags: + - cognitoidentity.swift.import - cognitoidentity.swift.get-or-create-pool-id Java: versions: @@ -32,8 +34,9 @@ cognito-identity_CreateIdentityPool: github: swift/example_code/cognito-identity/FindOrCreateIdentityPool sdkguide: sdk-for-swift/latest/developer-guide/getting-started.html excerpts: - - description: Create a new identity pool. + - description: snippet_tags: + - cognitoidentity.swift.import - cognitoidentity.swift.create-identity-pool Java: versions: @@ -54,8 +57,9 @@ cognito-identity_DeleteIdentityPool: github: swift/example_code/cognito-identity/FindOrCreateIdentityPool sdkguide: sdk-for-swift/latest/developer-guide/getting-started.html excerpts: - - description: Delete the specified identity pool. + - description: snippet_tags: + - cognitoidentity.swift.import - cognitoidentity.swift.delete-identity-pool Java: versions: diff --git a/.doc_gen/metadata/dynamodb_metadata.yaml b/.doc_gen/metadata/dynamodb_metadata.yaml index 10c0d001e5e..15eb296d16c 100644 --- a/.doc_gen/metadata/dynamodb_metadata.yaml +++ b/.doc_gen/metadata/dynamodb_metadata.yaml @@ -173,10 +173,11 @@ dynamodb_CreateTable: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.basics.createtable Bash: versions: @@ -255,10 +256,11 @@ dynamodb_BatchGetItem: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.batchgetitem.batchget Bash: versions: @@ -457,10 +459,11 @@ dynamodb_BatchWriteItem: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb/ + github: swift/example_code/dynamodb/ excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.basics.populate Bash: versions: @@ -585,10 +588,11 @@ dynamodb_DeleteTable: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.basics.deletetable Bash: versions: @@ -720,10 +724,11 @@ dynamodb_PutItem: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.basics.add-movie - ddb.swift.basics.movie.getasitem Bash: @@ -846,10 +851,11 @@ dynamodb_GetItem: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.basics.get Bash: versions: @@ -969,10 +975,11 @@ dynamodb_UpdateItem: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.basics.update Bash: versions: @@ -1110,10 +1117,11 @@ dynamodb_DeleteItem: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.basics.delete Bash: versions: @@ -1242,10 +1250,11 @@ dynamodb_ListTables: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.databasemanager.gettablelist Bash: versions: @@ -1380,10 +1389,11 @@ dynamodb_Query: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.basics.getMovies-year Bash: versions: @@ -1510,10 +1520,11 @@ dynamodb_Scan: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: snippet_tags: + - ddb.swift.import - ddb.swift.basics.getmovies-range Bash: versions: @@ -1972,7 +1983,7 @@ dynamodb_Scenario_GettingStartedMovies: Swift: versions: - sdk_version: 1 - github: swift/example_code/ddb + github: swift/example_code/dynamodb excerpts: - description: A Swift class that handles &DDB; calls to the &Swift;. snippet_tags: diff --git a/.doc_gen/metadata/iam_metadata.yaml b/.doc_gen/metadata/iam_metadata.yaml index c9a9eed12fa..de9da96a493 100644 --- a/.doc_gen/metadata/iam_metadata.yaml +++ b/.doc_gen/metadata/iam_metadata.yaml @@ -580,6 +580,7 @@ iam_CreateAccessKey: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.basics.iam.createaccesskey Bash: versions: @@ -688,6 +689,7 @@ iam_DeleteAccessKey: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.basics.iam.deleteaccesskey Bash: versions: @@ -1023,6 +1025,7 @@ iam_CreatePolicy: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.basics.iam.createpolicy Bash: versions: @@ -1114,6 +1117,7 @@ iam_DeletePolicy: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.basics.iam.deletepolicy Bash: versions: @@ -1211,6 +1215,7 @@ iam_ListPolicies: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.listpolicies.handler.listpolicies C++: versions: @@ -1298,6 +1303,7 @@ iam_GetPolicy: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.getpolicy.handler.getpolicy C++: versions: @@ -1419,6 +1425,7 @@ iam_AttachRolePolicy: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.attachrolepolicy.handler.attachrolepolicy JavaScript: versions: @@ -1535,6 +1542,7 @@ iam_ListAttachedRolePolicies: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.listattachedrolepolicies.handler.listattachedrolepolicies services: iam: {ListAttachedRolePolicies} @@ -1636,6 +1644,7 @@ iam_DetachRolePolicy: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.basics.iam.detachrolepolicy Bash: versions: @@ -1742,6 +1751,7 @@ iam_CreateRole: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.createrole.handler.createrole JavaScript: versions: @@ -1849,6 +1859,7 @@ iam_ListRoles: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.listroles.handler.listroles services: iam: {ListRoles} @@ -1922,6 +1933,7 @@ iam_GetRole: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.getrole.handler.getrole services: iam: {GetRole} @@ -1986,6 +1998,7 @@ iam_DeleteRole: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.basics.iam.deleterole Bash: versions: @@ -2100,6 +2113,7 @@ iam_ListRolePolicies: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.listrolepolicies.handler.listrolepolicies services: iam: {ListRolePolicies} @@ -2201,6 +2215,7 @@ iam_CreateUser: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.createuser.handler.createuser Go: versions: @@ -2344,6 +2359,7 @@ iam_DeleteUser: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.basics.iam.deleteuser Bash: versions: @@ -2467,6 +2483,7 @@ iam_ListUsers: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.listusers.handler.listusers Go: versions: @@ -2675,6 +2692,7 @@ iam_PutUserPolicy: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.basics.iam.putuserpolicy services: iam: {PutUserPolicy} @@ -2734,6 +2752,7 @@ iam_DeleteUserPolicy: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.basics.iam.deleteuserpolicy services: iam: {DeleteUserPolicy} @@ -3095,6 +3114,7 @@ iam_ListGroups: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.listgroups.handler.listgroups services: iam: {ListGroups} @@ -3181,6 +3201,7 @@ iam_CreateServiceLinkedRole: excerpts: - description: snippet_tags: + - iam.swift.import - iam.swift.createservicelinkedrole.handler.createservicelinkedrole services: iam: {CreateServiceLinkedRole} diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index 8237e2e8487..ef698d4f835 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -198,6 +198,7 @@ s3_CreateBucket: excerpts: - description: snippet_tags: + - s3.swift.import - s3.swift.basics.handler.createbucket Bash: versions: @@ -327,6 +328,7 @@ s3_CopyObject: excerpts: - description: snippet_tags: + - s3.swift.import - s3.swift.basics.handler.copyfile Bash: versions: @@ -492,6 +494,7 @@ s3_DeleteObject: excerpts: - description: snippet_tags: + - s3.swift.import - s3.swift.basics.handler.deletefile Bash: versions: @@ -606,6 +609,7 @@ s3_DeleteObjects: excerpts: - description: snippet_tags: + - s3.swift.import - s3.swift.deleteobjects.handler.deleteobjects C++: versions: @@ -900,11 +904,13 @@ s3_GetObject: - sdk_version: 1 github: swift/example_code/s3/basics excerpts: - - description: Download an object from a bucket to a local file. + - description: snippet_tags: + - s3.swift.import - s3.swift.basics.handler.downloadfile - - description: Read an object into a Swift Data object. + - description: snippet_tags: + - s3.swift.import - s3.swift.basics.handler.readfile Bash: versions: @@ -1385,6 +1391,7 @@ s3_ListObjectsV2: excerpts: - description: snippet_tags: + - s3.swift.import - s3.swift.basics.handler.listbucketfiles Bash: versions: @@ -1564,11 +1571,13 @@ s3_PutObject: - sdk_version: 1 github: swift/example_code/s3/basics excerpts: - - description: Upload a file from local storage to a bucket. + - description: snippet_tags: + - s3-smithy.swift.import - s3.swift.basics.handler.uploadfile - - description: Upload the contents of a Swift Data object to a bucket. + - description: snippet_tags: + - s3-smithy.swift.import - s3.swift.basics.handler.createfile Bash: versions: @@ -1700,6 +1709,7 @@ s3_DeleteBucket: excerpts: - description: snippet_tags: + - s3.swift.import - s3.swift.basics.handler.deletebucket Bash: versions: @@ -2188,6 +2198,7 @@ s3_ListBuckets: excerpts: - description: snippet_tags: + - s3.swift.import - s3.swift.listbuckets.getallbuckets services: s3: {ListBuckets} @@ -2995,11 +3006,13 @@ s3_Scenario_GettingStarted: - sdk_version: 1 github: swift/example_code/s3/basics excerpts: - - description: A Swift class that handles calls to the SDK for Swift. + - description: snippet_tags: + - s3.swift.import - s3.swift.basics.handler - - description: A Swift command-line program to manage the SDK calls. + - description: snippet_tags: + - s3.swift.import - s3.swift.basics.example Bash: versions: diff --git a/.doc_gen/metadata/sts_metadata.yaml b/.doc_gen/metadata/sts_metadata.yaml index 60e3b9e2720..3ee7d8b5dc1 100644 --- a/.doc_gen/metadata/sts_metadata.yaml +++ b/.doc_gen/metadata/sts_metadata.yaml @@ -70,6 +70,7 @@ sts_AssumeRole: excerpts: - description: snippet_tags: + - sts.swift.import - iam.swift.basics.sts.assumerole Rust: diff --git a/.tools/readmes/config.py b/.tools/readmes/config.py index 67c125b1a3a..5270f523535 100644 --- a/.tools/readmes/config.py +++ b/.tools/readmes/config.py @@ -184,7 +184,15 @@ 1: { "base_folder": "swift", "service_folder": 'swift/example_code/{{service["name"]}}', - "sdk_api_ref": 'https://awslabs.github.io/aws-sdk-swift/reference/0.x/AWS{{service["name"] | capitalize}}/Home', + "sdk_api_ref": '{% set name = service["name"] | replace("-","") -%}https://sdk.amazonaws.com/swift/api/aws{{name}}/latest/documentation/aws{{name}}', + "service_folder_overrides": { + "cognito-identity": "swift/example_code/cognito-identity", + "dynamodb": "swift/example_code/dynamodb", + "iam": "swift/example_code/iam", + "s3": "swift/example_code/s3", + "sts": "swift/example_code/sts" + } + } }, "Bash": { diff --git a/swift/example_code/cognito-identity/FindOrCreateIdentityPool/Package.swift b/swift/example_code/cognito-identity/FindOrCreateIdentityPool/Package.swift index 8f09cab0636..4b36b4db016 100644 --- a/swift/example_code/cognito-identity/FindOrCreateIdentityPool/Package.swift +++ b/swift/example_code/cognito-identity/FindOrCreateIdentityPool/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.6 +// swift-tools-version:5.8 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 // @@ -23,7 +23,7 @@ let package = Package( // Dependencies declare other packages that this package depends on. .package( url: "https://github.com/awslabs/aws-sdk-swift", - from: "0.20.0" + from: "0.68.0" ) ], // snippet-end:[cognitoidentity.swift.package-dependencies] diff --git a/swift/example_code/cognito-identity/FindOrCreateIdentityPool/Sources/CognitoIdentityHandler/CognitoIdentityHandler.swift b/swift/example_code/cognito-identity/FindOrCreateIdentityPool/Sources/CognitoIdentityHandler/CognitoIdentityHandler.swift index be208609877..7f1d38540c4 100644 --- a/swift/example_code/cognito-identity/FindOrCreateIdentityPool/Sources/CognitoIdentityHandler/CognitoIdentityHandler.swift +++ b/swift/example_code/cognito-identity/FindOrCreateIdentityPool/Sources/CognitoIdentityHandler/CognitoIdentityHandler.swift @@ -3,8 +3,10 @@ // snippet-start:[cognitoidentity.swift.handler-imports] import Foundation -import AWSCognitoIdentity import ClientRuntime +// snippet-start:[cognitoidentity.swift.import] +import AWSCognitoIdentity +// snippet-end:[cognitoidentity.swift.import] // snippet-end:[cognitoidentity.swift.handler-imports] /// A class containing all the code that interacts with the AWS SDK for Swift. diff --git a/swift/example_code/cognito-identity/README.md b/swift/example_code/cognito-identity/README.md index d361e371020..6a091f27686 100644 --- a/swift/example_code/cognito-identity/README.md +++ b/swift/example_code/cognito-identity/README.md @@ -33,9 +33,9 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `swift Code excerpts that show you how to call individual service functions. -- [CreateIdentityPool](FindOrCreateIdentityPool/Sources/CognitoIdentityHandler/CognitoIdentityHandler.swift#L92) -- [DeleteIdentityPool](FindOrCreateIdentityPool/Sources/CognitoIdentityHandler/CognitoIdentityHandler.swift#L114) -- [ListIdentityPools](FindOrCreateIdentityPool/Sources/CognitoIdentityHandler/CognitoIdentityHandler.swift#L25) +- [CreateIdentityPool](FindOrCreateIdentityPool/Sources/CognitoIdentityHandler/CognitoIdentityHandler.swift#L7) +- [DeleteIdentityPool](FindOrCreateIdentityPool/Sources/CognitoIdentityHandler/CognitoIdentityHandler.swift#L7) +- [ListIdentityPools](FindOrCreateIdentityPool/Sources/CognitoIdentityHandler/CognitoIdentityHandler.swift#L7) @@ -79,7 +79,7 @@ in the `swift` folder. - [Amazon Cognito Identity Developer Guide](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html) - [Amazon Cognito Identity API Reference](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/Welcome.html) -- [SDK for Swift Amazon Cognito Identity reference](https://awslabs.github.io/aws-sdk-swift/reference/0.x/AWSCognito-identity/Home) +- [SDK for Swift Amazon Cognito Identity reference](https://sdk.amazonaws.com/swift/api/awscognitoidentity/latest/documentation/awscognitoidentity) diff --git a/swift/example_code/ddb/README.md b/swift/example_code/ddb/README.md deleted file mode 100644 index 95e200c6036..00000000000 --- a/swift/example_code/ddb/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# DynamoDB code examples for the SDK for Swift -## Overview -This folder contains code examples demonstrating how to use the AWS SDK for -Swift to use Amazon DynamoDB. This README discusses how to run these examples. - -Amazon DynamoDB is a fully managed NoSQL database service that provides fast -and predictable performance with seamless scalability. DynamoDB lets you -offload the administrative burdens of operating and scaling a distributed -database so that you don't have to worry about hardware provisioning, setup -and configuration, replication, software patching, or cluster scaling. - -## ⚠️ Important -* Running this code might result in charges to your AWS account. -* Running the tests might result in charges to your AWS account. -* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/DynamoDB/latest/UserGuide/best-practices.html#grant-least-privilege). -* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). - -## Code examples - -### Single actions -Code excerpts that show you how to call individual service functions. -* [Add an item to a table](./basics/MovieList/MovieTable.swift) (`PutItem`) -* [Add the contents of a JSON file to a table](./basics/MovieList/MovieTable.swift) (`BatchWriteItem`) -* [Create a table](./basics/MovieList/MovieTable.swift) - (`CreateTable`) -* [Delete an item by key](./basics/MovieList/MovieTable.swift) (`DeleteItem`) -* [Delete a table](./basics/MovieList/MovieTable.swift) (`DeleteTable`) -* [Get an item by key](./basics/MovieList/MovieTable.swift) (`GetItem`) -* [Get multiple items by key](./BatchGetItem/Sources/MovieDatabase.swift) - (`BatchGetItem`) -* [List all tables](./basics/ListTables/listtables.swift) (`ListTables`) -* [Query a table](./basics/MovieList/MovieTable.swift) (`Query`) -* [Scan a table with pagination](./basics/MovieList/MovieTable.swift) (`Scan`) -* [Update an item](./basics/MovieList/MovieTable.swift) (`UpdateItem`) - -### Scenarios -Code examples that show you how to accomplish a specific task by calling multiple functions within the same service. - -* [DynamoDB Basics](./basics/Sources/basics.swift). Demonstrates a common - series of actions to create and perform common actions on a movie list - database. (`Basics`) - - - -## Run the examples -To build any of these examples from a terminal window, navigate into its -directory, then use the following command: - -``` -$ swift build -``` - -To build one of these examples in Xcode, navigate to the example's directory -(such as the `basics` directory, to build that example). Then type `xed.` -to open the example directory in Xcode. You can then use standard Xcode build -and run commands. - -### Prerequisites -See the [Prerequisites](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/swift#Prerequisites) section in the README for the AWS SDK for Swift examples repository. - -## Tests -⚠️ Running the tests might result in charges to your AWS account. - -To run the tests for an example, use the command `swift test` in the example's directory. - -## Additional resources -* [DynamoDB Developer Guide](https://docs.aws.amazon.com/dynamodb/index.html) -* [DynamoDB API Reference](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/) -* [DynamoDB Developer Guide for Swift](https://docs.aws.amazon.com/sdk-for-swift/latest/developer-guide/examples-ddb.html) -* [DynamoDB API Reference for Swift](https://awslabs.github.io/aws-sdk-swift/reference/0.x/AWSDynamoDB/Home) -* [Security best practices for DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices-security.html) - -_Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0_ \ No newline at end of file diff --git a/swift/example_code/ddb/BatchGetItem/Package.swift b/swift/example_code/dynamodb/BatchGetItem/Package.swift similarity index 100% rename from swift/example_code/ddb/BatchGetItem/Package.swift rename to swift/example_code/dynamodb/BatchGetItem/Package.swift diff --git a/swift/example_code/ddb/BatchGetItem/Sources/Movie.swift b/swift/example_code/dynamodb/BatchGetItem/Sources/Movie.swift similarity index 100% rename from swift/example_code/ddb/BatchGetItem/Sources/Movie.swift rename to swift/example_code/dynamodb/BatchGetItem/Sources/Movie.swift diff --git a/swift/example_code/ddb/BatchGetItem/Sources/MovieDatabase.swift b/swift/example_code/dynamodb/BatchGetItem/Sources/MovieDatabase.swift similarity index 100% rename from swift/example_code/ddb/BatchGetItem/Sources/MovieDatabase.swift rename to swift/example_code/dynamodb/BatchGetItem/Sources/MovieDatabase.swift diff --git a/swift/example_code/ddb/BatchGetItem/Sources/batchgetitem.swift b/swift/example_code/dynamodb/BatchGetItem/Sources/batchgetitem.swift similarity index 100% rename from swift/example_code/ddb/BatchGetItem/Sources/batchgetitem.swift rename to swift/example_code/dynamodb/BatchGetItem/Sources/batchgetitem.swift diff --git a/swift/example_code/ddb/BatchGetItem/Tests/MovieDatabaseTests.swift b/swift/example_code/dynamodb/BatchGetItem/Tests/MovieDatabaseTests.swift similarity index 100% rename from swift/example_code/ddb/BatchGetItem/Tests/MovieDatabaseTests.swift rename to swift/example_code/dynamodb/BatchGetItem/Tests/MovieDatabaseTests.swift diff --git a/swift/example_code/ddb/BatchGetItem/Tests/MovieTests.swift b/swift/example_code/dynamodb/BatchGetItem/Tests/MovieTests.swift similarity index 100% rename from swift/example_code/ddb/BatchGetItem/Tests/MovieTests.swift rename to swift/example_code/dynamodb/BatchGetItem/Tests/MovieTests.swift diff --git a/swift/example_code/ddb/ListTables/Package.swift b/swift/example_code/dynamodb/ListTables/Package.swift similarity index 100% rename from swift/example_code/ddb/ListTables/Package.swift rename to swift/example_code/dynamodb/ListTables/Package.swift diff --git a/swift/example_code/ddb/ListTables/Sources/DatabaseManager.swift b/swift/example_code/dynamodb/ListTables/Sources/DatabaseManager.swift similarity index 100% rename from swift/example_code/ddb/ListTables/Sources/DatabaseManager.swift rename to swift/example_code/dynamodb/ListTables/Sources/DatabaseManager.swift diff --git a/swift/example_code/ddb/ListTables/Sources/listtables.swift b/swift/example_code/dynamodb/ListTables/Sources/listtables.swift similarity index 100% rename from swift/example_code/ddb/ListTables/Sources/listtables.swift rename to swift/example_code/dynamodb/ListTables/Sources/listtables.swift diff --git a/swift/example_code/ddb/ListTables/Tests/ListTablesTests.swift b/swift/example_code/dynamodb/ListTables/Tests/ListTablesTests.swift similarity index 100% rename from swift/example_code/ddb/ListTables/Tests/ListTablesTests.swift rename to swift/example_code/dynamodb/ListTables/Tests/ListTablesTests.swift diff --git a/swift/example_code/dynamodb/README.md b/swift/example_code/dynamodb/README.md new file mode 100644 index 00000000000..bc786d80022 --- /dev/null +++ b/swift/example_code/dynamodb/README.md @@ -0,0 +1,124 @@ +# DynamoDB code examples for the SDK for Swift + +## Overview + +Shows how to use the AWS SDK for Swift to work with Amazon DynamoDB. + + + + +_DynamoDB is a fully managed NoSQL database service that provides fast and predictable performance with seamless scalability._ + +## ⚠ Important + +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + + + + +## Code examples + +### Prerequisites + +For prerequisites, see the [README](../../README.md#Prerequisites) in the `swift` folder. + + + + + +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](basics/MovieList/MovieTable.swift) + + +### Single actions + +Code excerpts that show you how to call individual service functions. + +- [BatchGetItem](basics/Sources/basics.swift#L34) +- [BatchWriteItem](basics/Sources/basics.swift#L34) +- [CreateTable](basics/Sources/basics.swift#L34) +- [DeleteItem](basics/Sources/basics.swift#L34) +- [DeleteTable](basics/Sources/basics.swift#L34) +- [GetItem](basics/Sources/basics.swift#L34) +- [ListTables](basics/Sources/basics.swift#L34) +- [PutItem](basics/Sources/basics.swift#L34) +- [Query](basics/Sources/basics.swift#L34) +- [Scan](basics/Sources/basics.swift#L34) +- [UpdateItem](basics/Sources/basics.swift#L34) + + + + + +## Run the examples + +### Instructions + +To build any of these examples from a terminal window, navigate into its +directory, then use the following command: + +``` +$ swift build +``` + +To build one of these examples in Xcode, navigate to the example's directory +(such as the `ListUsers` directory, to build that example). Then type `xed.` +to open the example directory in Xcode. You can then use standard Xcode build +and run commands. + + + + + +#### Learn the basics + +This example shows you how to do the following: + +- Create a table that can hold movie data. +- Put, get, and update a single movie in the table. +- Write movie data to the table from a sample JSON file. +- Query for movies that were released in a given year. +- Scan for movies that were released in a range of years. +- Delete a movie from the table, then delete the table. + + + + + + + + + +### Tests + +⚠ Running tests might result in charges to your AWS account. + + +To find instructions for running these tests, see the [README](../../README.md#Tests) +in the `swift` folder. + + + + + + +## Additional resources + +- [DynamoDB Developer Guide](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) +- [DynamoDB API Reference](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/Welcome.html) +- [SDK for Swift DynamoDB reference](https://sdk.amazonaws.com/swift/api/awsdynamodb/latest/documentation/awsdynamodb) + + + + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/swift/example_code/ddb/basics/MovieList/Movie.swift b/swift/example_code/dynamodb/basics/MovieList/Movie.swift similarity index 100% rename from swift/example_code/ddb/basics/MovieList/Movie.swift rename to swift/example_code/dynamodb/basics/MovieList/Movie.swift diff --git a/swift/example_code/ddb/basics/MovieList/MovieTable.swift b/swift/example_code/dynamodb/basics/MovieList/MovieTable.swift similarity index 100% rename from swift/example_code/ddb/basics/MovieList/MovieTable.swift rename to swift/example_code/dynamodb/basics/MovieList/MovieTable.swift diff --git a/swift/example_code/ddb/basics/Package.swift b/swift/example_code/dynamodb/basics/Package.swift similarity index 98% rename from swift/example_code/ddb/basics/Package.swift rename to swift/example_code/dynamodb/basics/Package.swift index 8eb80de45d5..e86b5ef2460 100644 --- a/swift/example_code/ddb/basics/Package.swift +++ b/swift/example_code/dynamodb/basics/Package.swift @@ -5,7 +5,6 @@ // The swift-tools-version declares the minimum version of Swift required to // build this package. - import PackageDescription let package = Package( @@ -21,7 +20,7 @@ let package = Package( // Dependencies declare other packages that this package depends on. .package( url: "https://github.com/awslabs/aws-sdk-swift", - from: "0.20.0" + from: "0.68.0" ), .package( url: "https://github.com/apple/swift-argument-parser.git", diff --git a/swift/example_code/ddb/basics/Sources/basics.swift b/swift/example_code/dynamodb/basics/Sources/basics.swift similarity index 99% rename from swift/example_code/ddb/basics/Sources/basics.swift rename to swift/example_code/dynamodb/basics/Sources/basics.swift index 2f2058037ad..e10190ec3a4 100644 --- a/swift/example_code/ddb/basics/Sources/basics.swift +++ b/swift/example_code/dynamodb/basics/Sources/basics.swift @@ -30,8 +30,10 @@ // snippet-start:[ddb.swift.basics] import Foundation import ArgumentParser -import AWSDynamoDB import ClientRuntime +// snippet-start:[ddb.swift.import] +import AWSDynamoDB +// snippet-end:[ddb.swift.import] @testable import MovieList @@ -69,7 +71,6 @@ struct ExampleCommand: ParsableCommand { /// Called by ``main()`` to asynchronously run the AWS example. func runAsync() async throws { print("Welcome to the AWS SDK for Swift basic scenario for Amazon DynamoDB!") - SDKLoggingSystem.initialize(logLevel: .error) //===================================================================== // 1. Create the table. The Amazon DynamoDB table is represented by diff --git a/swift/example_code/ddb/basics/Tests/MovieTableTests.swift b/swift/example_code/dynamodb/basics/Tests/MovieTableTests.swift similarity index 100% rename from swift/example_code/ddb/basics/Tests/MovieTableTests.swift rename to swift/example_code/dynamodb/basics/Tests/MovieTableTests.swift diff --git a/swift/example_code/ddb/basics/Tests/MovieTests.swift b/swift/example_code/dynamodb/basics/Tests/MovieTests.swift similarity index 100% rename from swift/example_code/ddb/basics/Tests/MovieTests.swift rename to swift/example_code/dynamodb/basics/Tests/MovieTests.swift diff --git a/swift/example_code/iam/README.md b/swift/example_code/iam/README.md index 11c9a7e5c50..9b5f5b17ed1 100644 --- a/swift/example_code/iam/README.md +++ b/swift/example_code/iam/README.md @@ -33,27 +33,27 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `swift Code excerpts that show you how to call individual service functions. -- [AttachRolePolicy](AttachRolePolicy/Sources/ServiceHandler/ServiceHandler.swift#L51) -- [CreateAccessKey](basics/Sources/ServiceHandler/ServiceHandlerIAM.swift#L179) -- [CreatePolicy](basics/Sources/ServiceHandler/ServiceHandlerIAM.swift#L204) -- [CreateRole](CreateRole/Sources/ServiceHandler/ServiceHandler.swift#L51) -- [CreateServiceLinkedRole](CreateServiceLinkedRole/Sources/ServiceHandler/ServiceHandler.swift#L59) -- [CreateUser](CreateUser/Sources/ServiceHandler/ServiceHandler.swift#L50) -- [DeleteAccessKey](basics/Sources/ServiceHandler/ServiceHandlerIAM.swift#L350) -- [DeletePolicy](basics/Sources/ServiceHandler/ServiceHandlerIAM.swift#L312) -- [DeleteRole](basics/Sources/ServiceHandler/ServiceHandlerIAM.swift#L376) -- [DeleteUser](basics/Sources/ServiceHandler/ServiceHandlerIAM.swift#L330) -- [DeleteUserPolicy](basics/Sources/ServiceHandler/ServiceHandlerIAM.swift#L253) -- [DetachRolePolicy](basics/Sources/ServiceHandler/ServiceHandlerIAM.swift#L293) -- [GetPolicy](GetPolicy/Sources/ServiceHandler/ServiceHandler.swift#L50) -- [GetRole](GetRole/Sources/ServiceHandler/ServiceHandler.swift#L51) -- [ListAttachedRolePolicies](ListAttachedRolePolicies/Sources/ServiceHandler/ServiceHandler.swift#L45) -- [ListGroups](ListGroups/Sources/ServiceHandler/ServiceHandler.swift#L41) -- [ListPolicies](ListPolicies/Sources/ServiceHandler/ServiceHandler.swift#L49) -- [ListRolePolicies](ListRolePolicies/Sources/ServiceHandler/ServiceHandler.swift#L49) -- [ListRoles](ListRoles/Sources/ServiceHandler/ServiceHandler.swift#L48) -- [ListUsers](ListUsers/Sources/ServiceHandler/ServiceHandler.swift#L41) -- [PutUserPolicy](basics/Sources/ServiceHandler/ServiceHandlerIAM.swift#L231) +- [AttachRolePolicy](basics/Sources/Basics/Basics.swift#L29) +- [CreateAccessKey](basics/Sources/Basics/Basics.swift#L29) +- [CreatePolicy](basics/Sources/Basics/Basics.swift#L29) +- [CreateRole](basics/Sources/Basics/Basics.swift#L29) +- [CreateServiceLinkedRole](basics/Sources/Basics/Basics.swift#L29) +- [CreateUser](basics/Sources/Basics/Basics.swift#L29) +- [DeleteAccessKey](basics/Sources/Basics/Basics.swift#L29) +- [DeletePolicy](basics/Sources/Basics/Basics.swift#L29) +- [DeleteRole](basics/Sources/Basics/Basics.swift#L29) +- [DeleteUser](basics/Sources/Basics/Basics.swift#L29) +- [DeleteUserPolicy](basics/Sources/Basics/Basics.swift#L29) +- [DetachRolePolicy](basics/Sources/Basics/Basics.swift#L29) +- [GetPolicy](basics/Sources/Basics/Basics.swift#L29) +- [GetRole](basics/Sources/Basics/Basics.swift#L29) +- [ListAttachedRolePolicies](basics/Sources/Basics/Basics.swift#L29) +- [ListGroups](basics/Sources/Basics/Basics.swift#L29) +- [ListPolicies](basics/Sources/Basics/Basics.swift#L29) +- [ListRolePolicies](basics/Sources/Basics/Basics.swift#L29) +- [ListRoles](basics/Sources/Basics/Basics.swift#L29) +- [ListUsers](basics/Sources/Basics/Basics.swift#L29) +- [PutUserPolicy](basics/Sources/Basics/Basics.swift#L29) diff --git a/swift/example_code/iam/basics/Package.swift b/swift/example_code/iam/basics/Package.swift index e7b827d0334..84e52f23304 100644 --- a/swift/example_code/iam/basics/Package.swift +++ b/swift/example_code/iam/basics/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.5 +// swift-tools-version:5.9 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 // @@ -21,7 +21,7 @@ let package = Package( // Dependencies declare other packages that this package depends on. .package( url: "https://github.com/awslabs/aws-sdk-swift", - from: "0.20.0" + from: "0.68.0" ), .package( url: "https://github.com/apple/swift-argument-parser.git", diff --git a/swift/example_code/iam/basics/Sources/Basics/Basics.swift b/swift/example_code/iam/basics/Sources/Basics/Basics.swift index 020f047a9fe..5a17cfd31fb 100644 --- a/swift/example_code/iam/basics/Sources/Basics/Basics.swift +++ b/swift/example_code/iam/basics/Sources/Basics/Basics.swift @@ -25,10 +25,12 @@ // snippet-start:[iam.swift.basics.main.imports] import Foundation import ArgumentParser +import ClientRuntime +// snippet-start:[iam.swift.import] import AWSIAM +// snippet-end:[iam.swift.import] import AWSSTS import AWSS3 -import ClientRuntime // snippet-end:[iam.swift.basics.main.imports] @testable import ServiceHandler @@ -67,8 +69,6 @@ struct ExampleCommand: ParsableCommand { /// example. // snippet-start:[iam.swift.basics.command.runasync] func runAsync() async throws { - SDKLoggingSystem.initialize(logLevel: .error) - // Create handlers for the AWS services to use. let iamHandler = await ServiceHandlerIAM() diff --git a/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerIAM.swift b/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerIAM.swift index f9c3003a167..89a67d76049 100644 --- a/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerIAM.swift +++ b/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerIAM.swift @@ -11,13 +11,13 @@ import Foundation import AWSIAM import ClientRuntime -import AWSClientRuntime +import AWSSDKIdentity import SwiftUtilities // snippet-end:[iam.swift.basics.iam.imports] public class ServiceHandlerIAM { /// IAM always uses the global value for the Region. - let region = "AWS_GLOBAL" + let region = "us-east-1" /// The `IAMClient` used to interact with IAM. var iamClient: IAMClient @@ -47,20 +47,19 @@ public class ServiceHandlerIAM { throw ServiceHandlerError.authError } - let credentialsProvider = try AWSClientRuntime.StaticCredentialsProvider( - AWSClientRuntime.Credentials( - accessKey: keyId, - secret: secretKey, - sessionToken: sessionToken - ) + let credentials: AWSCredentialIdentity = AWSCredentialIdentity( + accessKey: keyId, + secret: secretKey, + sessionToken: sessionToken ) + let identityResolver = try StaticAWSCredentialIdentityResolver(credentials) // Create an IAM configuration specifying the credentials // provider. Then create a new `IAMClient` using those // permissions. let iamConfig = try await IAMClient.IAMClientConfiguration( - credentialsProvider: credentialsProvider, + awsCredentialIdentityResolver: identityResolver, region: self.region ) iamClient = IAMClient(config: iamConfig) @@ -87,18 +86,17 @@ public class ServiceHandlerIAM { // token to generate a static credentials provider suitable for // use when initializing an IAM client. - let credentialsProvider = try AWSClientRuntime.StaticCredentialsProvider( - AWSClientRuntime.Credentials( - accessKey: accessKeyId, - secret: secretAccessKey, - sessionToken: sessionToken - ) + let credentials: AWSCredentialIdentity = AWSCredentialIdentity( + accessKey: accessKeyId, + secret: secretAccessKey, + sessionToken: sessionToken ) + let identityResolver = try StaticAWSCredentialIdentityResolver(credentials) - // Create a new IAM client with the specified access credentials. + // Create a new `IAMClient` using the new identity resolver. let iamConfig = try await IAMClient.IAMClientConfiguration( - credentialsProvider: credentialsProvider, + awsCredentialIdentityResolver: identityResolver, region: self.region ) iamClient = IAMClient(config: iamConfig) diff --git a/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerS3.swift b/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerS3.swift index 58d0b7806da..a3f699388bb 100644 --- a/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerS3.swift +++ b/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerS3.swift @@ -12,7 +12,7 @@ import Foundation import AWSS3 import ClientRuntime import SwiftUtilities -import AWSClientRuntime +import AWSSDKIdentity // snippet-end:[iam.swift.basics.s3.imports] public class ServiceHandlerS3 { @@ -55,19 +55,18 @@ public class ServiceHandlerS3 { throw ServiceHandlerError.authError } - let credentialsProvider = try AWSClientRuntime.StaticCredentialsProvider( - AWSClientRuntime.Credentials( - accessKey: keyId, - secret: secretKey, - sessionToken: sessionToken - ) + let credentials: AWSCredentialIdentity = AWSCredentialIdentity( + accessKey: keyId, + secret: secretKey, + sessionToken: sessionToken ) + let identityResolver = try StaticAWSCredentialIdentityResolver(credentials) // Create an Amazon S3 configuration specifying the credentials // provider. Then create a new `S3Client` using those permissions. let s3Config = try await S3Client.S3ClientConfiguration( - credentialsProvider: credentialsProvider, + awsCredentialIdentityResolver: identityResolver, region: self.region ) s3Client = S3Client(config: s3Config) @@ -95,19 +94,18 @@ public class ServiceHandlerS3 { // to generate a static credentials provider suitable for use when // initializing an Amazon S3 client. - let credentialsProvider = try AWSClientRuntime.StaticCredentialsProvider( - AWSClientRuntime.Credentials( - accessKey: accessKeyId, - secret: secretAccessKey, - sessionToken: sessionToken - ) + let credentials: AWSCredentialIdentity = AWSCredentialIdentity( + accessKey: accessKeyId, + secret: secretAccessKey, + sessionToken: sessionToken ) + let identityResolver = try StaticAWSCredentialIdentityResolver(credentials) - // Create a new Amazon S3 client with the specified access - // credentials. + // Create an Amazon S3 configuration specifying the credentials + // provider. Then create a new `S3Client` using those permissions. let s3Config = try await S3Client.S3ClientConfiguration( - credentialsProvider: credentialsProvider, + awsCredentialIdentityResolver: identityResolver, region: self.region ) s3Client = S3Client(config: s3Config) diff --git a/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerSTS.swift b/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerSTS.swift index 11afba676ef..4d961f2fddf 100644 --- a/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerSTS.swift +++ b/swift/example_code/iam/basics/Sources/ServiceHandler/ServiceHandlerSTS.swift @@ -10,10 +10,12 @@ // snippet-start:[iam.swift.basics.sts.imports] import Foundation import AWSIAM +// snippet-start:[sts.swift.import] import AWSSTS +// snippet-end:[sts.swift.import] import ClientRuntime import SwiftUtilities -import AWSClientRuntime +import AWSSDKIdentity // snippet-end:[iam.swift.basics.sts.imports] /// A class providing functions for interacting with the AWS Security Token @@ -56,20 +58,19 @@ public class ServiceHandlerSTS { let secretKey = secretAccessKey else { throw ServiceHandlerError.authError } - - let credentialsProvider = try AWSClientRuntime.StaticCredentialsProvider( - AWSClientRuntime.Credentials( - accessKey: keyId, - secret: secretKey, - sessionToken: sessionToken - ) - ) + let credentials = AWSCredentialIdentity( + accessKey: keyId, + secret: secretKey, + sessionToken: sessionToken + ) + let identityResolver = try StaticAWSCredentialIdentityResolver(credentials) + // Create an AWS STS configuration specifying the credentials // provider. Then create a new `STSClient` using those permissions. let s3Config = try await STSClient.STSClientConfiguration( - credentialsProvider: credentialsProvider, + awsCredentialIdentityResolver: identityResolver, region: self.region ) stsClient = STSClient(config: s3Config) @@ -93,22 +94,21 @@ public class ServiceHandlerSTS { public func setCredentials(accessKeyId: String, secretAccessKey: String, sessionToken: String? = nil) async throws { do { - // Use the given access key ID, secret access key, and session token - // to generate a static credentials provider suitable for use when - // initializing an AWS STS client. - - let credentialsProvider = try AWSClientRuntime.StaticCredentialsProvider( - AWSClientRuntime.Credentials( - accessKey: accessKeyId, - secret: secretAccessKey, - sessionToken: sessionToken - ) - ) + // Use the given access key ID, secret access key, and session + // token to generate a static credentials resolver suitable for + // use when initializing an AWS STS client. + + let credentials: AWSCredentialIdentity = AWSCredentialIdentity( + accessKey: accessKeyId, + secret: secretAccessKey, + sessionToken: sessionToken + ) + let identityResolver = try StaticAWSCredentialIdentityResolver(credentials) // Create a new AWS STS client with the specified access credentials. let stsConfig = try await STSClient.STSClientConfiguration( - credentialsProvider: credentialsProvider, + awsCredentialIdentityResolver: identityResolver, region: self.region ) stsClient = STSClient(config: stsConfig) diff --git a/swift/example_code/s3/README.md b/swift/example_code/s3/README.md index 54b50d7e92b..a360140ff02 100644 --- a/swift/example_code/s3/README.md +++ b/swift/example_code/s3/README.md @@ -40,15 +40,15 @@ Code examples that show you how to perform the essential operations within a ser Code excerpts that show you how to call individual service functions. -- [CopyObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L165) -- [CreateBucket](basics/Sources/ServiceHandler/ServiceHandler.swift#L42) -- [DeleteBucket](basics/Sources/ServiceHandler/ServiceHandler.swift#L57) -- [DeleteObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L184) -- [DeleteObjects](DeleteObjects/Sources/ServiceHandler/ServiceHandler.swift#L54) -- [GetObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L113) -- [ListBuckets](ListBuckets/Sources/ListBuckets/S3Session.swift#L70) -- [ListObjectsV2](basics/Sources/ServiceHandler/ServiceHandler.swift#L205) -- [PutObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L71) +- [CopyObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) +- [CreateBucket](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) +- [DeleteBucket](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) +- [DeleteObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) +- [DeleteObjects](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) +- [GetObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) +- [ListBuckets](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) +- [ListObjectsV2](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) +- [PutObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L11) @@ -109,7 +109,7 @@ in the `swift` folder. - [Amazon S3 User Guide](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) - [Amazon S3 API Reference](https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html) -- [SDK for Swift Amazon S3 reference](https://awslabs.github.io/aws-sdk-swift/reference/0.x/AWSS3/Home) +- [SDK for Swift Amazon S3 reference](https://sdk.amazonaws.com/swift/api/awss3/latest/documentation/awss3) diff --git a/swift/example_code/s3/basics/Package.swift b/swift/example_code/s3/basics/Package.swift index f1f2036f480..3b788f34001 100644 --- a/swift/example_code/s3/basics/Package.swift +++ b/swift/example_code/s3/basics/Package.swift @@ -21,7 +21,7 @@ let package = Package( // Dependencies declare other packages that this package depends on. .package( url: "https://github.com/awslabs/aws-sdk-swift", - from: "0.20.0" + from: "0.68.0" ), .package( url: "https://github.com/apple/swift-argument-parser.git", diff --git a/swift/example_code/s3/basics/Sources/ServiceHandler/ServiceHandler.swift b/swift/example_code/s3/basics/Sources/ServiceHandler/ServiceHandler.swift index 3564cc9e517..fc966a7f085 100644 --- a/swift/example_code/s3/basics/Sources/ServiceHandler/ServiceHandler.swift +++ b/swift/example_code/s3/basics/Sources/ServiceHandler/ServiceHandler.swift @@ -8,10 +8,13 @@ // snippet-start:[s3.swift.basics.handler] // snippet-start:[s3.swift.basics.handler.imports] import Foundation +// snippet-start:[s3-smithy.swift.import] +// snippet-start:[s3.swift.import] import AWSS3 -import ClientRuntime -import AWSClientRuntime +// snippet-end:[s3.swift.import] import Smithy +// snippet-end:[s3-smithy.swift.import] +import ClientRuntime // snippet-end:[s3.swift.basics.handler.imports] /// A class containing all the code that interacts with the AWS SDK for Swift. From c656718e1a6204acdb88a1b9cdaf07e6e627cc53 Mon Sep 17 00:00:00 2001 From: Rachel Hagerman <110480692+rlhagerm@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:12:46 -0500 Subject: [PATCH 81/98] Python: Add additional snippet tags for setup. (#6828) Adding additional snippet tag. --- python/example_code/secretsmanager/scenario_get_secret.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/example_code/secretsmanager/scenario_get_secret.py b/python/example_code/secretsmanager/scenario_get_secret.py index 71147dc2e9c..231e659a0d1 100644 --- a/python/example_code/secretsmanager/scenario_get_secret.py +++ b/python/example_code/secretsmanager/scenario_get_secret.py @@ -1,6 +1,7 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 +# snippet-start:[python.example_code.python.GetSecretValue.scenario] """ Purpose @@ -38,6 +39,6 @@ def run_scenario(secret_name): logging.error(f"Error retrieving secret: {e}") raise - +# snippet-end:[python.example_code.python.GetSecretValue.scenario] if __name__ == "__main__": run_scenario(secret_name="mySecret1") From 0844ff81c4da52380d1aa30bf07f13eaf788c03f Mon Sep 17 00:00:00 2001 From: Corey Pyle Date: Tue, 10 Sep 2024 14:32:31 -0400 Subject: [PATCH 82/98] JavaScript (v3): Glue - Make clean up more robust. (#6829) deleteDatabase wasn't being handled, leaving the test open to crashing before clean up was done. This handles that error. There was also a potential for objects in the S3 Bucket to not be fully deleted before trying to delete the bucket. I suspect this was causing issues leading to N stacks being created every run and not being torn down. --- javascriptv3/example_code/glue/package.json | 21 ++++--- .../tests/glue-actions.integration.test.js | 58 +++++++++---------- javascriptv3/example_code/glue/vite.config.js | 3 - 3 files changed, 36 insertions(+), 46 deletions(-) diff --git a/javascriptv3/example_code/glue/package.json b/javascriptv3/example_code/glue/package.json index de2938b5535..b771b70b889 100644 --- a/javascriptv3/example_code/glue/package.json +++ b/javascriptv3/example_code/glue/package.json @@ -1,26 +1,25 @@ { "name": "@aws-doc-sdk-examples/glue", - "version": "1.0.0", + "version": "1.0.1", "description": "AWS SDK for JavaScript (v3) examples for AWS Glue", "type": "module", - "author": "corepyle@amazon.com", + "author": "Corey Pyle ", "license": "Apache-2.0", "scripts": { "test": "vitest run **/*.unit.test.js", "integration-test": "vitest run **/*.integration.test.js --reporter=junit --outputFile=test_results/$npm_package_name.junit.xml" }, "dependencies": { - "@aws-doc-sdk-examples/lib": "^1.0.0", - "@aws-sdk/client-glue": "^3.425.0", + "@aws-doc-sdk-examples/lib": "^1.0.1", + "@aws-sdk/client-glue": "^3.645.0", "chalk": "^5.3.0", - "dotenv": "^16.3.1", - "inquirer": "^9.2.11", - "open": "^9.1.0" + "dotenv": "^16.4.5", + "inquirer": "^10.2.0", + "open": "^10.1.0" }, "devDependencies": { - "@aws-sdk/client-cloudformation": "^3.204.0", - "@aws-sdk/client-s3": "^3.204.0", - "@vitest/coverage-c8": "^0.25.0", - "vitest": "^1.6.0" + "@aws-sdk/client-cloudformation": "^3.645.0", + "@aws-sdk/client-s3": "^3.645.0", + "vitest": "^2.0.5" } } diff --git a/javascriptv3/example_code/glue/tests/glue-actions.integration.test.js b/javascriptv3/example_code/glue/tests/glue-actions.integration.test.js index e6d2c957e50..520f80abdfe 100644 --- a/javascriptv3/example_code/glue/tests/glue-actions.integration.test.js +++ b/javascriptv3/example_code/glue/tests/glue-actions.integration.test.js @@ -16,6 +16,7 @@ import { ListObjectsCommand, PutObjectCommand, S3Client, + waitUntilObjectNotExists, } from "@aws-sdk/client-s3"; import { dirnameFromMetaUrl } from "@aws-doc-sdk-examples/lib/utils/util-fs.js"; @@ -42,7 +43,7 @@ config(); const dirname = dirnameFromMetaUrl(import.meta.url); const cdkAppPath = `${dirname}../../../../resources/cdk/glue_role_bucket/setup.yaml`; -const stackName = `glue-test-stack-${Date.now()}`; +const stackName = `glue-test-stack`; const fiveMinutesInMs = 5 * 60 * 1000; // 5 Minutes const fiveMinutesInSeconds = fiveMinutesInMs / 1000; @@ -83,9 +84,10 @@ const emptyS3Bucket = async (bucketName) => { const { Contents } = await client.send(listCommand); await Promise.all( - Contents.map(({ Key }) => - client.send(new DeleteObjectCommand({ Bucket: bucketName, Key })), - ), + Contents.map(async ({ Key }) => { + await client.send(new DeleteObjectCommand({ Bucket: bucketName, Key })); + await waitUntilObjectNotExists({ client }, { Bucket: bucketName, Key }); + }), ); }; @@ -113,18 +115,14 @@ describe("actions", () => { }, fiveMinutesInMs); afterAll(async () => { - try { - await emptyS3Bucket(bucketName).catch(console.error); - await deleteTable("doc-example-database", "doc-example-csv").catch( - console.error, - ); - await deleteDatabase("doc-example-database"); - await deleteCrawler("s3-flight-data-crawler").catch(console.error); - await deleteJob("flight_etl_job").catch(console.error); - await deleteStack().catch(console.error); - } catch (err) { - console.error(err); - } + await emptyS3Bucket(bucketName).catch(console.error); + await deleteTable("doc-example-database", "doc-example-csv").catch( + console.error, + ); + await deleteDatabase("doc-example-database").catch(console.error); + await deleteCrawler("s3-flight-data-crawler").catch(console.error); + await deleteJob("flight_etl_job").catch(console.error); + await deleteStack().catch(console.error); }, fiveMinutesInMs); const addPythonScriptToBucket = async () => { @@ -207,20 +205,16 @@ describe("actions", () => { expect(JobRuns[0].JobName).toBe("flight_etl_job"); }; - it( - "should run", - async () => { - await addPythonScriptToBucket(); - await testCreateCrawler(); - await testCreateJob(bucketName, roleName); - await testListJobs(); - await testStartCrawler(); - await testGetDatabases(); - await testGetDatabase(); - await testGetTables(); - await testStartJobRun(bucketName); - await testGetJobRuns(); - }, - { timeout: fiveMinutesInMs * 5 }, - ); + it("should run", { timeout: fiveMinutesInMs * 5 }, async () => { + await addPythonScriptToBucket(); + await testCreateCrawler(); + await testCreateJob(bucketName, roleName); + await testListJobs(); + await testStartCrawler(); + await testGetDatabases(); + await testGetDatabase(); + await testGetTables(); + await testStartJobRun(bucketName); + await testGetJobRuns(); + }); }); diff --git a/javascriptv3/example_code/glue/vite.config.js b/javascriptv3/example_code/glue/vite.config.js index 4840d2c99fc..2810a7be0c2 100644 --- a/javascriptv3/example_code/glue/vite.config.js +++ b/javascriptv3/example_code/glue/vite.config.js @@ -7,8 +7,5 @@ export default defineConfig({ test: { restoreMocks: true, cache: false, - coverage: { - reporter: ["text", "html"], - }, }, }); From be90fca9d59ecb805416430f40407c5c4938370d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 16:14:23 -0400 Subject: [PATCH 83/98] Bump express from 5.0.0-beta.1 to 5.0.0 in /javascriptv3/example_code/cross-services/aurora-serverless-app (#6832) Bump express Bumps [express](https://github.com/expressjs/express) from 5.0.0-beta.1 to 5.0.0. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/v5.0.0/History.md) - [Commits](https://github.com/expressjs/express/compare/v5.0.0-beta.1...v5.0.0) --- updated-dependencies: - dependency-name: express dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../cross-services/aurora-serverless-app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascriptv3/example_code/cross-services/aurora-serverless-app/package.json b/javascriptv3/example_code/cross-services/aurora-serverless-app/package.json index e9a3999ac57..2704310637c 100644 --- a/javascriptv3/example_code/cross-services/aurora-serverless-app/package.json +++ b/javascriptv3/example_code/cross-services/aurora-serverless-app/package.json @@ -21,7 +21,7 @@ "@aws-sdk/client-rds-data": "^3.190.0", "@aws-sdk/client-ses": "^3.193.0", "cors": "^2.8.5", - "express": "^5.0.0-beta.3", + "express": "^5.0.0", "mimetext": "^2.0.10", "prettier": "^2.7.1", "uuid": "^9.0.0" From 6a8500c4d52aef5bbcf954bc22fad7738c4bfddf Mon Sep 17 00:00:00 2001 From: Eric Shepherd Date: Wed, 11 Sep 2024 07:57:34 -0400 Subject: [PATCH 84/98] Bring service configuration sample up-to-date (#6833) Finished modernizing --- swift/example_code/swift-sdk/config/Package.swift | 4 ++-- .../swift-sdk/config/Sources/ConfigExample.swift | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/swift/example_code/swift-sdk/config/Package.swift b/swift/example_code/swift-sdk/config/Package.swift index 2600e991fcc..c5ce45ab13b 100644 --- a/swift/example_code/swift-sdk/config/Package.swift +++ b/swift/example_code/swift-sdk/config/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.8 +// swift-tools-version: 5.6 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 // The swift-tools-version declares the minimum version of Swift required to build this package. @@ -16,7 +16,7 @@ let package = Package( // Dependencies declare other packages that this package depends on. .package( url: "https://github.com/awslabs/aws-sdk-swift", - from: "0.36.0" + from: "0.75.0" ), ], targets: [ diff --git a/swift/example_code/swift-sdk/config/Sources/ConfigExample.swift b/swift/example_code/swift-sdk/config/Sources/ConfigExample.swift index 90e4cff2589..3685f140841 100644 --- a/swift/example_code/swift-sdk/config/Sources/ConfigExample.swift +++ b/swift/example_code/swift-sdk/config/Sources/ConfigExample.swift @@ -5,16 +5,18 @@ // SDK for Swift. The same principle applies to all services. import Foundation -import ClientRuntime +import AWSClientRuntime import AWSS3 +import SmithyRetries +import SmithyRetriesAPI @main struct ConfigExample { static func main() async { // snippet-start:[config.swift.use-custom-configuration] // Create an Amazon S3 client configuration object that specifies the - // region as "us-east-1", the adaptive retry mode, and the maximum - // number of retries as 5. + // region as "us-east-1", an exponential backoff strategy, the + // adaptive retry mode, and the maximum number of retries as 5. let config: S3Client.S3ClientConfiguration @@ -23,8 +25,9 @@ struct ConfigExample { config = try await S3Client.S3ClientConfiguration( region: "us-east-1", retryStrategyOptions: RetryStrategyOptions( + backoffStrategy: SmithyRetries.ExponentialBackoffStrategy(), maxRetriesBase: 5, - rateLimitingMode: .adaptive + rateLimitingMode: RetryStrategyOptions.RateLimitingMode.adaptive ) ) // snippet-end:[config.swift.create-configuration] From f6f6654bf8c4a64c0ca02f75ef1f6fd8c387b53f Mon Sep 17 00:00:00 2001 From: Laren-AWS <57545972+Laren-AWS@users.noreply.github.com> Date: Wed, 11 Sep 2024 06:07:34 -0700 Subject: [PATCH 85/98] Go: Updated Go code examples to use latest versions (#6831) Updated Go code examples to use latest minimum version of Go, latest version of AWS SDK for Go, and latest demotools and testtools. Updated all unit tests to pass. Update Go version in GH lint action to match version in the examples. Fix linter errors found by updated linter. --- .github/workflows/lint-golang.yml | 4 +- gov2/Dockerfile | 2 +- gov2/aurora/actions/clusters.go | 4 +- gov2/aurora/go.mod | 40 ++--- gov2/aurora/go.sum | 75 ++++++---- gov2/aurora/scenarios/get_started_clusters.go | 5 +- .../scenarios/get_started_clusters_test.go | 12 +- gov2/aurora/stubs/clusters_stubs.go | 4 +- gov2/bedrock-runtime/go.mod | 37 ++--- gov2/bedrock-runtime/go.sum | 76 +++++----- gov2/bedrock/go.mod | 31 ++-- gov2/bedrock/go.sum | 56 +++---- gov2/cloudfront/go.mod | 43 +++--- gov2/cloudfront/go.sum | 81 +++++----- gov2/cognito/go.mod | 33 ++-- gov2/cognito/go.sum | 56 +++---- gov2/demotools/filesystem_test.go | 2 +- gov2/dynamodb/actions/movie.go | 6 +- gov2/dynamodb/go.mod | 43 +++--- gov2/dynamodb/go.sum | 86 +++++------ .../scenarios/scenario_movie_table.go | 45 +++--- .../scenarios/scenario_movie_table_test.go | 5 +- .../scenarios/scenario_partiql_batch_test.go | 2 + .../scenarios/scenario_partiql_single_test.go | 2 + gov2/iam/go.mod | 45 +++--- gov2/iam/go.sum | 108 ++++++-------- gov2/lambda/go.mod | 39 ++--- gov2/lambda/go.sum | 78 +++++----- .../scenario_get_started_functions_test.go | 2 +- gov2/lint_all_go.bat | 4 +- gov2/rds/actions/instances.go | 2 +- gov2/rds/go.mod | 39 ++--- gov2/rds/go.sum | 78 +++++----- gov2/rds/scenarios/get_started_instances.go | 2 +- .../scenarios/get_started_instances_test.go | 28 ++-- gov2/rds/stubs/instances_stubs.go | 4 +- gov2/run_all_tests.bat | 10 +- gov2/s3/go.mod | 47 +++--- gov2/s3/go.sum | 92 ++++++------ gov2/s3/scenarios/scenario_get_started.go | 6 +- gov2/s3/stubs/bucket_basics_stubs.go | 2 +- gov2/sns/go.mod | 33 ++-- gov2/sns/go.sum | 56 +++---- gov2/sqs/go.mod | 33 ++-- gov2/sqs/go.sum | 56 +++---- gov2/update_all_mods.bat | 10 ++ gov2/workflows/s3_object_lock/go.mod | 49 +++--- gov2/workflows/s3_object_lock/go.sum | 106 ++++++------- .../s3_object_lock/workflows/resources.go | 1 - gov2/workflows/topics_and_queues/go.mod | 43 +++--- gov2/workflows/topics_and_queues/go.sum | 76 +++++----- .../scenario_topics_and_queues_test.go | 2 +- .../{cdk => .cdk}/.gitignore | 0 .../{cdk => .cdk}/.npmignore | 0 .../{cdk => .cdk}/bin/cdk.ts | 0 .../{cdk => .cdk}/cdk.json | 0 .../lib/pools-and-triggers-base.ts | 0 .../lib/pools-and-triggers-stack.ts | 0 .../{cdk => .cdk}/package-lock.json | 0 .../{cdk => .cdk}/package.json | 0 .../{cdk => .cdk}/tsconfig.json | 0 .../user_pools_and_lambda_triggers/go.mod | 60 ++++---- .../user_pools_and_lambda_triggers/go.sum | 141 ++++++++---------- .../migrate_user/migrate_user_handler.go | 2 +- ...ario_auto_confirm_trusted_accounts_test.go | 4 +- 65 files changed, 1017 insertions(+), 991 deletions(-) create mode 100644 gov2/update_all_mods.bat rename gov2/workflows/user_pools_and_lambda_triggers/{cdk => .cdk}/.gitignore (100%) rename gov2/workflows/user_pools_and_lambda_triggers/{cdk => .cdk}/.npmignore (100%) rename gov2/workflows/user_pools_and_lambda_triggers/{cdk => .cdk}/bin/cdk.ts (100%) rename gov2/workflows/user_pools_and_lambda_triggers/{cdk => .cdk}/cdk.json (100%) rename gov2/workflows/user_pools_and_lambda_triggers/{cdk => .cdk}/lib/pools-and-triggers-base.ts (100%) rename gov2/workflows/user_pools_and_lambda_triggers/{cdk => .cdk}/lib/pools-and-triggers-stack.ts (100%) rename gov2/workflows/user_pools_and_lambda_triggers/{cdk => .cdk}/package-lock.json (100%) rename gov2/workflows/user_pools_and_lambda_triggers/{cdk => .cdk}/package.json (100%) rename gov2/workflows/user_pools_and_lambda_triggers/{cdk => .cdk}/tsconfig.json (100%) diff --git a/.github/workflows/lint-golang.yml b/.github/workflows/lint-golang.yml index feae774c05b..cde3a8126c1 100644 --- a/.github/workflows/lint-golang.yml +++ b/.github/workflows/lint-golang.yml @@ -24,10 +24,10 @@ jobs: - uses: actions/setup-go@v3 if: steps.changed-files.outputs.any_changed == 'true' with: - go-version: 1.18 + go-version: 1.21 - name: install golangci-lint if: steps.changed-files.outputs.any_changed == 'true' - run: curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.47.3 + run: curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.61.0 - name: run golangci-lint if: steps.changed-files.outputs.any_changed == 'true' run: | # If you get a linting error of "File is not `goimports`-ed", the solution is to run "gofmt -w ./". diff --git a/gov2/Dockerfile b/gov2/Dockerfile index 2afd7a035a0..dd24aa64f47 100644 --- a/gov2/Dockerfile +++ b/gov2/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1 -FROM golang:1.19.2 +FROM golang:1.21 # Update image RUN apt-get update && \ diff --git a/gov2/aurora/actions/clusters.go b/gov2/aurora/actions/clusters.go index b3cde5cfb09..5af769c5ae3 100644 --- a/gov2/aurora/actions/clusters.go +++ b/gov2/aurora/actions/clusters.go @@ -191,7 +191,7 @@ func (clusters *DbClusters) CreateDbCluster(clusterName string, parameterGroupNa func (clusters *DbClusters) DeleteDbCluster(clusterName string) error { _, err := clusters.AuroraClient.DeleteDBCluster(context.TODO(), &rds.DeleteDBClusterInput{ DBClusterIdentifier: aws.String(clusterName), - SkipFinalSnapshot: true, + SkipFinalSnapshot: aws.Bool(true), }) if err != nil { log.Printf("Couldn't delete DB cluster %v: %v\n", clusterName, err) @@ -293,7 +293,7 @@ func (clusters *DbClusters) GetInstance(instanceName string) ( func (clusters *DbClusters) DeleteInstance(instanceName string) error { _, err := clusters.AuroraClient.DeleteDBInstance(context.TODO(), &rds.DeleteDBInstanceInput{ DBInstanceIdentifier: aws.String(instanceName), - SkipFinalSnapshot: true, + SkipFinalSnapshot: aws.Bool(true), DeleteAutomatedBackups: aws.Bool(true), }) if err != nil { diff --git a/gov2/aurora/go.mod b/gov2/aurora/go.mod index 376b3e970fe..2e4c9e7cd84 100644 --- a/gov2/aurora/go.mod +++ b/gov2/aurora/go.mod @@ -1,23 +1,29 @@ module aurora -go 1.19 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.18.25 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.24 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 // indirect - github.com/aws/aws-sdk-go-v2/service/rds v1.45.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 // indirect - github.com/aws/smithy-go v1.13.5 // indirect - github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230608210941-bf53c23f4b7c // indirect - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20230607202440-f35a0a23ae1e // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/service/rds v1.82.4 + github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b + github.com/google/uuid v1.6.0 +) + +require ( + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect ) diff --git a/gov2/aurora/go.sum b/gov2/aurora/go.sum index af5ab9f463b..d87fab00e57 100644 --- a/gov2/aurora/go.sum +++ b/gov2/aurora/go.sum @@ -1,41 +1,50 @@ -github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.25 h1:JuYyZcnMPBiFqn87L2cRppo+rNwgah6YwD3VuyvaW6Q= -github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= -github.com/aws/aws-sdk-go-v2/credentials v1.13.24 h1:PjiYyls3QdCrzqUN35jMWtUK1vqVZ+zLfdOa/UPFDp0= -github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 h1:jJPgroehGvjrde3XufFIJUZVK5A2L9a3KwSFgKy9n8w= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11XL1VpyDbaEJzWxd4zRiCG30GSn4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 h1:vFQlirhuM8lLlpI7imKOMsjdQLuN9CPi+k44F/OFVsk= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 h1:gGLG7yKaXG02/jBlg210R7VgQIotiQntNhsCFejawx8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 h1:0iKliEXAcCa2qVtRs7Ot5hItA2MsufrphbRFlz1Owxo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= -github.com/aws/aws-sdk-go-v2/service/rds v1.45.0 h1:Yi23UNiGidNfT7tIW0lbE6JtRR1ZN+cNZGRTKLB+opk= -github.com/aws/aws-sdk-go-v2/service/rds v1.45.0/go.mod h1:rS6T0DrjdZ5LDr8ZC/J9iZdD1oSbie5reWWzqv5zLOw= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 h1:UBQjaMTCKwyUYwiVnUt6toEJwGXsLBI6al083tpjJzY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 h1:PkHIIJs8qvq0e5QybnZoG1K/9QTrLr9OsqCIo59jOBA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 h1:2DQLAKDteoEDI8zpCzqBMaZlJuoE9iTYD0gFmXVax9E= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230608210941-bf53c23f4b7c h1:G6/y3JOyzpSkmCPh+9AWFlXrBzT/9GnR8FKqxPz1Fz0= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230608210941-bf53c23f4b7c/go.mod h1:0r22nlw0YYkUMowQkNluzs2dc8kf6s2bg9Oema9TzlE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20230607202440-f35a0a23ae1e h1:OzVa50JLYmUgvOgW82VnMGXAzBQju/++drF4GDDBlNs= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20230607202440-f35a0a23ae1e/go.mod h1:qcs782jWmSQW2exwfKW39rOvOJBZ4xzO8dVLoFF62Sc= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/rds v1.82.4 h1:Go6suRegLmIpQiuiTNyUUyxYrhzbrliD9wD0ZN65hlQ= +github.com/aws/aws-sdk-go-v2/service/rds v1.82.4/go.mod h1:zNFNa99yH2j3zzqZgt3Atu197K1UkE+1sfigpi5+eWo= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/gov2/aurora/scenarios/get_started_clusters.go b/gov2/aurora/scenarios/get_started_clusters.go index 6733ded181b..f48ae18adb7 100644 --- a/gov2/aurora/scenarios/get_started_clusters.go +++ b/gov2/aurora/scenarios/get_started_clusters.go @@ -7,6 +7,7 @@ import ( "aurora/actions" "fmt" "log" + "slices" "sort" "strconv" "strings" @@ -157,7 +158,7 @@ func (scenario GetStartedClusters) SetUserParameters(parameterGroupName string) var updateParams []types.Parameter for _, dbParam := range dbParameters { if strings.HasPrefix(*dbParam.ParameterName, "auto_increment") && - dbParam.IsModifiable && *dbParam.DataType == "integer" { + *dbParam.IsModifiable && *dbParam.DataType == "integer" { log.Printf("The %v parameter is described as:\n\t%v", *dbParam.ParameterName, *dbParam.Description) rangeSplit := strings.Split(*dbParam.AllowedValues, "-") @@ -265,6 +266,8 @@ func (scenario GetStartedClusters) CreateInstance(cluster *types.DBCluster) *typ for _, opt := range instOpts { instChoices = append(instChoices, *opt.DBInstanceClass) } + slices.Sort(instChoices) + instChoices = slices.Compact(instChoices) instIndex := scenario.questioner.AskChoice( "Which DB instance class do you want to use?\n", instChoices) log.Println("Creating a database instance. This typically takes several minutes.") diff --git a/gov2/aurora/scenarios/get_started_clusters_test.go b/gov2/aurora/scenarios/get_started_clusters_test.go index 659e152177b..b49ecf67038 100644 --- a/gov2/aurora/scenarios/get_started_clusters_test.go +++ b/gov2/aurora/scenarios/get_started_clusters_test.go @@ -44,15 +44,15 @@ func (scenTest *GetStartedClustersTest) SetupDataAndStubs() []testtools.Stub { familyChoice := 1 params := []types.Parameter{{ ParameterName: aws.String("auto_increment_param1"), ParameterValue: aws.String("1"), - AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: true, + AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: aws.Bool(true), DataType: aws.String("integer"), }, { ParameterName: aws.String("auto_increment_param2"), ParameterValue: aws.String("2"), - AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: true, + AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: aws.Bool(true), DataType: aws.String("integer"), }, { ParameterName: aws.String("another_param"), ParameterValue: aws.String("3"), - AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: true, + AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: aws.Bool(true), DataType: aws.String("integer"), }} updateParams := make([]types.Parameter, 2) @@ -70,13 +70,13 @@ func (scenTest *GetStartedClustersTest) SetupDataAndStubs() []testtools.Stub { scenTest.helper = clustersTestHelper{} scenTest.Answers = []string{ // CreateParameterGroup - strconv.Itoa(familyChoice), + strconv.Itoa(familyChoice + 1), // SetUserParameters *updateParams[0].ParameterValue, *updateParams[1].ParameterValue, adminName, adminPassword, // CreateCluster - strconv.Itoa(engineVersionChoice), + strconv.Itoa(engineVersionChoice + 1), // CreateInstance - strconv.Itoa(instanceChoice), + strconv.Itoa(instanceChoice + 1), // CreateSnapshot "y", // Cleanup diff --git a/gov2/aurora/stubs/clusters_stubs.go b/gov2/aurora/stubs/clusters_stubs.go index 762ccba8533..875cd3dfcb5 100644 --- a/gov2/aurora/stubs/clusters_stubs.go +++ b/gov2/aurora/stubs/clusters_stubs.go @@ -155,7 +155,7 @@ func StubDeleteDbCluster(clusterIdentifier string, raiseErr *testtools.StubError OperationName: "DeleteDBCluster", Input: &rds.DeleteDBClusterInput{ DBClusterIdentifier: aws.String(clusterIdentifier), - SkipFinalSnapshot: true, + SkipFinalSnapshot: aws.Bool(true), }, Output: &rds.DeleteDBClusterOutput{}, Error: raiseErr, @@ -252,7 +252,7 @@ func StubDeleteInstance(instanceIdentifier string, raiseErr *testtools.StubError Input: &rds.DeleteDBInstanceInput{ DBInstanceIdentifier: aws.String(instanceIdentifier), DeleteAutomatedBackups: aws.Bool(true), - SkipFinalSnapshot: true, + SkipFinalSnapshot: aws.Bool(true), }, Output: &rds.DeleteDBInstanceOutput{}, Error: raiseErr, diff --git a/gov2/bedrock-runtime/go.mod b/gov2/bedrock-runtime/go.mod index 456b48fb19e..ee78b8893d8 100644 --- a/gov2/bedrock-runtime/go.mod +++ b/gov2/bedrock-runtime/go.mod @@ -3,27 +3,28 @@ module github.com/awsdocs/aws-doc-sdk-examples/gov2/bedrock-runtime go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.22.2 - github.com/aws/aws-sdk-go-v2/config v1.23.0 - github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.3.1 - github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20231116013656-9f08f276537a - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20231116013656-9f08f276537a + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.16.2 + github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b ) require ( - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 // indirect - github.com/aws/smithy-go v1.16.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/term v0.9.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect ) replace github.com/awsdocs/aws-doc-sdk-examples/gov2/bedrock-runtime/stubs => ./stubs diff --git a/gov2/bedrock-runtime/go.sum b/gov2/bedrock-runtime/go.sum index d0be52d1a01..d09e50b0daa 100644 --- a/gov2/bedrock-runtime/go.sum +++ b/gov2/bedrock-runtime/go.sum @@ -1,38 +1,38 @@ -github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI= -github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0 h1:hHgLiIrTRtddC0AKcJr5s7i/hLgcpTt+q/FKxf1Zayk= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0/go.mod h1:w4I/v3NOWgD+qvs1NPEwhd++1h3XPHFaVxasfY6HlYQ= -github.com/aws/aws-sdk-go-v2/config v1.23.0 h1:kqzEfGGDIrRJpfJckgwuZfFTbU9NB1jZnRcaO9MpOqE= -github.com/aws/aws-sdk-go-v2/config v1.23.0/go.mod h1:p7wbxKXXjS1GGQOss7VXOazVMFF9bjUGq85/4wR/fSw= -github.com/aws/aws-sdk-go-v2/credentials v1.15.2 h1:rKH7khRMxPdD0u3dHecd0Q7NOVw3EUe7AqdkUOkiOGI= -github.com/aws/aws-sdk-go-v2/credentials v1.15.2/go.mod h1:tXM8wmaeAhfC7nZoCxb0FzM/aRaB1m1WQ7x0qlBLq80= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 h1:G5KawTAkyHH6WyKQCdHiW4h3PmAXNJpOgwKg3H7sDRE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3/go.mod h1:hugKmSFnZB+HgNI1sYGT14BUPZkO6alC/e0AWu+0IAQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= -github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 h1:hwZB07/beLiCopuRKF0t+dEHmP39iN4YtDh3X5d3hrg= -github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0/go.mod h1:rdAuXeHWhI/zkpYcO5n8WCpaIgY9MUxFyBsuqq3kjyA= -github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.3.1 h1:0x8EYVwkE+fXxhsmjuO0rTrQtcik0whm3IFqB+ERxEk= -github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.3.1/go.mod h1:1GvO8YV08YNrHv2sweo8vWDh04+c6zSPqMcf+5q7TzI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 h1:h7j73yuAVVjic8pqswh+L/7r2IHP43QwRyOu6zcCDDE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2/go.mod h1:H07AHdK5LSy8F7EJUQhoxyiCNkePoHj2D8P2yGTWafo= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 h1:km+ZNjtLtpXYf42RdaDZnNHm9s7SYAuDGTafy6nd89A= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.1/go.mod h1:aHBr3pvBSD5MbzOvQtYutyPLLRPbl/y9x86XyJJnUXQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 h1:iRFNqZH4a67IqPvK8xxtyQYnyrlsvwmpHOe9r55ggBA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1/go.mod h1:pTy5WM+6sNv2tB24JNKFtn6EvciQ5k40ZJ0pq/Iaxj0= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 h1:txgVXIXWPXyqdiVn92BV6a/rgtpX31HYdsOYj0sVQQQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.1/go.mod h1:VAiJiNaoP1L89STFlEMgmHX1bKixY+FaP+TpRFrmyZ4= -github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= -github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20231116013656-9f08f276537a h1:tgK0E4LiTS6exOgXmN1p1HQthDDOFcnsG+zZyYdzJ+o= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20231116013656-9f08f276537a/go.mod h1:bcgBgQb+DUAGU6d0P3fokzUUhPz2pHhnsQ9Acj6aUcY= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20231116013656-9f08f276537a h1:+CdtyLyRFidoakauxp1/KAyzPoJ7lpoRUiOHJdDcoWY= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20231116013656-9f08f276537a/go.mod h1:qcs782jWmSQW2exwfKW39rOvOJBZ4xzO8dVLoFF62Sc= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.16.2 h1:hmzsX43PIJ8x+dwJwruqMjE2F8tZuCQMxVz9Vn0EZkc= +github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.16.2/go.mod h1:emMKL0OTFG+l9pW11RMgfvJRxZ5e093OS1o102YEGoA= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= diff --git a/gov2/bedrock/go.mod b/gov2/bedrock/go.mod index 2b0b16d9ec6..0dcde96841d 100644 --- a/gov2/bedrock/go.mod +++ b/gov2/bedrock/go.mod @@ -3,24 +3,25 @@ module github.com/awsdocs/aws-doc-sdk-examples/gov2/bedrock go 1.21 require ( - github.com/aws/aws-sdk-go-v2/config v1.23.0 - github.com/aws/aws-sdk-go-v2/service/bedrock v1.3.1 + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/service/bedrock v1.16.2 + github.com/awsdocs/aws-doc-sdk-examples/gov2/bedrock/stubs v0.0.0-00010101000000-000000000000 + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20231110170957-c3edee1e8c41 ) require ( - github.com/aws/aws-sdk-go-v2 v1.22.2 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 // indirect - github.com/aws/smithy-go v1.16.0 // indirect - github.com/awsdocs/aws-doc-sdk-examples/gov2/bedrock/stubs v0.0.0-00010101000000-000000000000 // indirect - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20231110170957-c3edee1e8c41 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect ) replace github.com/awsdocs/aws-doc-sdk-examples/gov2/bedrock/stubs => ./stubs diff --git a/gov2/bedrock/go.sum b/gov2/bedrock/go.sum index 2a6071ce5c6..ac98897c542 100644 --- a/gov2/bedrock/go.sum +++ b/gov2/bedrock/go.sum @@ -1,30 +1,30 @@ -github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI= -github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= -github.com/aws/aws-sdk-go-v2/config v1.23.0 h1:kqzEfGGDIrRJpfJckgwuZfFTbU9NB1jZnRcaO9MpOqE= -github.com/aws/aws-sdk-go-v2/config v1.23.0/go.mod h1:p7wbxKXXjS1GGQOss7VXOazVMFF9bjUGq85/4wR/fSw= -github.com/aws/aws-sdk-go-v2/credentials v1.15.2 h1:rKH7khRMxPdD0u3dHecd0Q7NOVw3EUe7AqdkUOkiOGI= -github.com/aws/aws-sdk-go-v2/credentials v1.15.2/go.mod h1:tXM8wmaeAhfC7nZoCxb0FzM/aRaB1m1WQ7x0qlBLq80= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 h1:G5KawTAkyHH6WyKQCdHiW4h3PmAXNJpOgwKg3H7sDRE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3/go.mod h1:hugKmSFnZB+HgNI1sYGT14BUPZkO6alC/e0AWu+0IAQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= -github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 h1:hwZB07/beLiCopuRKF0t+dEHmP39iN4YtDh3X5d3hrg= -github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0/go.mod h1:rdAuXeHWhI/zkpYcO5n8WCpaIgY9MUxFyBsuqq3kjyA= -github.com/aws/aws-sdk-go-v2/service/bedrock v1.3.1 h1:lAbJ/wQ96QZPbgMGkwy4MkwYBE0fSkHrsCqpdzKB8FA= -github.com/aws/aws-sdk-go-v2/service/bedrock v1.3.1/go.mod h1:T6sGivDDiUgXY/R3+S9t5oRR0XJiUeKAXyyw3LRdTK4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 h1:h7j73yuAVVjic8pqswh+L/7r2IHP43QwRyOu6zcCDDE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2/go.mod h1:H07AHdK5LSy8F7EJUQhoxyiCNkePoHj2D8P2yGTWafo= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 h1:km+ZNjtLtpXYf42RdaDZnNHm9s7SYAuDGTafy6nd89A= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.1/go.mod h1:aHBr3pvBSD5MbzOvQtYutyPLLRPbl/y9x86XyJJnUXQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 h1:iRFNqZH4a67IqPvK8xxtyQYnyrlsvwmpHOe9r55ggBA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1/go.mod h1:pTy5WM+6sNv2tB24JNKFtn6EvciQ5k40ZJ0pq/Iaxj0= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 h1:txgVXIXWPXyqdiVn92BV6a/rgtpX31HYdsOYj0sVQQQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.1/go.mod h1:VAiJiNaoP1L89STFlEMgmHX1bKixY+FaP+TpRFrmyZ4= -github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= -github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/bedrock v1.16.2 h1:N+E+UCy7YiUT1hu0c0F8DhO9Fdx8KIg/u1m2csGW9Co= +github.com/aws/aws-sdk-go-v2/service/bedrock v1.16.2/go.mod h1:7CCNXL2qhI91wcy+GCt+rg9fzwwET0XlavHQiPSimyA= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20231110170957-c3edee1e8c41 h1:nvpkaKqg/kV+x1kGdAnUiEiFeuzExBlaPCtqxKWQcbs= github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20231110170957-c3edee1e8c41/go.mod h1:qcs782jWmSQW2exwfKW39rOvOJBZ4xzO8dVLoFF62Sc= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= diff --git a/gov2/cloudfront/go.mod b/gov2/cloudfront/go.mod index 1aa23cfdacd..ae7d3c107d6 100644 --- a/gov2/cloudfront/go.mod +++ b/gov2/cloudfront/go.mod @@ -1,26 +1,29 @@ module example.aws/go-v2/examples/cloudfront -go 1.18 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.17.4 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect - github.com/aws/aws-sdk-go-v2/config v1.18.12 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.19 // indirect - github.com/aws/aws-sdk-go-v2/service/cloudfront v1.24.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.23 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.22 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.22 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.30.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.18.3 // indirect - github.com/aws/smithy-go v1.13.5 // indirect + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/service/cloudfront v1.38.7 + github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 +) + +require ( + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect ) diff --git a/gov2/cloudfront/go.sum b/gov2/cloudfront/go.sum index 60c4f5a4bbc..93d695b1cb8 100644 --- a/gov2/cloudfront/go.sum +++ b/gov2/cloudfront/go.sum @@ -1,47 +1,50 @@ -github.com/aws/aws-sdk-go-v2 v1.17.4 h1:wyC6p9Yfq6V2y98wfDsj6OnNQa4w2BLGCLIxzNhwOGY= -github.com/aws/aws-sdk-go-v2 v1.17.4/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= -github.com/aws/aws-sdk-go-v2/config v1.18.12 h1:fKs/I4wccmfrNRO9rdrbMO1NgLxct6H9rNMiPdBxHWw= -github.com/aws/aws-sdk-go-v2/config v1.18.12/go.mod h1:J36fOhj1LQBr+O4hJCiT8FwVvieeoSGOtPuvhKlsNu8= -github.com/aws/aws-sdk-go-v2/credentials v1.13.12 h1:Cb+HhuEnV19zHRaYYVglwvdHGMJWbdsyP4oHhw04xws= -github.com/aws/aws-sdk-go-v2/credentials v1.13.12/go.mod h1:37HG2MBroXK3jXfxVGtbM2J48ra2+Ltu+tmwr/jO0KA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.22 h1:3aMfcTmoXtTZnaT86QlVaYh+BRMbvrrmZwIQ5jWqCZQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.22/go.mod h1:YGSIJyQ6D6FjKMQh16hVFSIUD54L4F7zTGePqYMYYJU= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28 h1:r+XwaCLpIvCKjBIYy/HVZujQS9tsz5ohHG3ZIe0wKoE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28/go.mod h1:3lwChorpIM/BhImY/hy+Z6jekmN92cXGPI1QJasVPYY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22 h1:7AwGYXDdqRQYsluvKFmWoqpcOQJ4bH634SkYf3FNj/A= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22/go.mod h1:EqK7gVrIGAHyZItrD1D8B0ilgwMD1GiWAmbU4u/JHNk= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.29 h1:J4xhFd6zHhdF9jPP0FQJ6WknzBboGMBNjKOv4iTuw4A= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.29/go.mod h1:TwuqRBGzxjQJIwH16/fOZodwXt2Zxa9/cwJC5ke4j7s= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.19 h1:FGvpyTg2LKEmMrLlpjOgkoNp9XF5CGeyAyo33LdqZW8= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.19/go.mod h1:8W88sW3PjamQpKFUQvHWWKay6ARsNvZnzU7+a4apubw= -github.com/aws/aws-sdk-go-v2/service/cloudfront v1.24.1 h1:+JyTKAmvtszyz+LH0ag+Jm1BdcjfyXK3O2KJKSHIXtM= -github.com/aws/aws-sdk-go-v2/service/cloudfront v1.24.1/go.mod h1:SJRh4g8v7lNgjBVlSalPRp7Vfi2PU0LZN0PNEPjm9qk= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 h1:y2+VQzC6Zh2ojtV2LoC0MNwHWc6qXv/j2vrQtlftkdA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.23 h1:c5+bNdV8E4fIPteWx4HZSkqI07oY9exbfQ7JH7Yx4PI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.23/go.mod h1:1jcUfF+FAOEwtIcNiHPaV4TSoZqkUIPzrohmD7fb95c= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.22 h1:LjFQf8hFuMO22HkV5VWGLBvmCLBCLPivUAmpdpnp4Vs= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.22/go.mod h1:xt0Au8yPIwYXf/GYPy/vl4K3CgwhfQMYbrH7DlUUIws= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.22 h1:ISLJ2BKXe4zzyZ7mp5ewKECiw0U7KpLgS3S6OxY9Cm0= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.22/go.mod h1:QFVbqK54XArazLvn2wvWMRBi/jGrWii46qbr5DyPGjc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.30.2 h1:5EQWIFO+Hc8E2hFcXQJ1vm6ufl/PMt/6RVRDZRju2vM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.30.2/go.mod h1:SXDHd6fI2RhqB7vmAzyYQCTQnpZrIprVJvYxpzW3JAM= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.1 h1:lQKN/LNa3qqu2cDOQZybP7oL4nMGGiFqob0jZJaR8/4= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.1/go.mod h1:IgV8l3sj22nQDd5qcAGY0WenwCzCphqdbFOpfktZPrI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.1 h1:0bLhH6DRAqox+g0LatcjGKjjhU6Eudyys6HB6DJVPj8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.1/go.mod h1:O1YSOg3aekZibh2SngvCRRG+cRHKKlYgxf/JBF/Kr/k= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.3 h1:s49mSnsBZEXjfGBkRfmK+nPqzT7Lt3+t2SmAKNyHblw= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.3/go.mod h1:b+psTJn33Q4qGoDaM7ZiOVVG8uVjGI6HaZ8WBHdgDgU= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17 h1:Roo69qTpfu8OlJ2Tb7pAYVuF0CpuUMB0IYWwYP/4DZM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17/go.mod h1:NcWPxQzGM1USQggaTVwz6VpqMZPX1CvDJLDh6jnOCa4= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.38.7 h1:XAIxPw6FUxGv2xCB+7GapxB/H1LxfUogdzHbL6Pn3kI= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.38.7/go.mod h1:R7mWBZ2a/EnExUNP+vkBBQGTz7+ZCcT16Mm6a9XZ/0A= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19 h1:FLMkfEiRjhgeDTCjjLoc3URo/TBkgeQbocA78lfkzSI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19/go.mod h1:Vx+GucNSsdhaxs3aZIKfSUjKVGsxN25nX2SRcdhuw08= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17 h1:u+EfGmksnJc/x5tq3A+OD7LrMbSSR/5TrKLvkdy/fhY= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17/go.mod h1:VaMx6302JHax2vHJWgRo+5n9zvbacs3bLU/23DNQrTY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 h1:Kp6PWAlXwP1UvIflkIP6MFZYBNDCa4mFCGtxrpICVOg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2/go.mod h1:5FmD/Dqq57gP+XwaUnd5WFPipAuzrf0HmupX27Gvjvc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/gov2/cognito/go.mod b/gov2/cognito/go.mod index ba706f4c4fa..07b80f3eec8 100644 --- a/gov2/cognito/go.mod +++ b/gov2/cognito/go.mod @@ -1,20 +1,23 @@ module cognito -go 1.19 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.26.1 // indirect - github.com/aws/aws-sdk-go-v2/config v1.27.11 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.11 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.36.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 // indirect - github.com/aws/smithy-go v1.20.2 // indirect + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.43.4 +) + +require ( + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect ) diff --git a/gov2/cognito/go.sum b/gov2/cognito/go.sum index a6c842cf7ba..1825c38ae62 100644 --- a/gov2/cognito/go.sum +++ b/gov2/cognito/go.sum @@ -1,28 +1,28 @@ -github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= -github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/config v1.27.11 h1:f47rANd2LQEYHda2ddSCKYId18/8BhSRM4BULGmfgNA= -github.com/aws/aws-sdk-go-v2/config v1.27.11/go.mod h1:SMsV78RIOYdve1vf36z8LmnszlRWkwMQtomCAI0/mIE= -github.com/aws/aws-sdk-go-v2/credentials v1.17.11 h1:YuIB1dJNf1Re822rriUOTxopaHHvIq0l/pX3fwO+Tzs= -github.com/aws/aws-sdk-go-v2/credentials v1.17.11/go.mod h1:AQtFPsDH9bI2O+71anW6EKL+NcD7LG3dpKGMV4SShgo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.36.5 h1:JP3CujVmcSm/MlP8oCF/BxrtjVjeh41y3jY/T88q3Eo= -github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.36.5/go.mod h1:TiLZ2/+WAEyG2PnuAYj/un46UJ7qBf5BWWTAKgaHP8I= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 h1:vN8hEbpRnL7+Hopy9dzmRle1xmDc7o8tmY0klsr175w= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.5/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n2HZPkcKgPAi1phU= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.43.4 h1:C8uf+nwieFWZtdPTCYOM8u/UyaIsDPfr95TJrfYekwQ= +github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.43.4/go.mod h1:hsciKQ2xFfOPEuebyKmFo7wOSVNoLuzmCi6Qtol4UDc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= diff --git a/gov2/demotools/filesystem_test.go b/gov2/demotools/filesystem_test.go index 58b89b2ee86..7226c590194 100644 --- a/gov2/demotools/filesystem_test.go +++ b/gov2/demotools/filesystem_test.go @@ -20,7 +20,7 @@ func TestNewStandardFileSystemGwd(t *testing.T) { func TestNewStandardFileSystemFileIO(t *testing.T) { filesystem := NewStandardFileSystem() filename := "test.txt" - file, err := os.Create(filename) + file, _ := os.Create(filename) fsFile, err := filesystem.OpenFile(filename) if err != nil { t.Errorf("NewStandardFileSystemFileInteraction(): error opening file: %v", err) diff --git a/gov2/dynamodb/actions/movie.go b/gov2/dynamodb/actions/movie.go index 199e8dbe244..9d915a99187 100644 --- a/gov2/dynamodb/actions/movie.go +++ b/gov2/dynamodb/actions/movie.go @@ -8,7 +8,7 @@ import ( "bytes" "encoding/json" "fmt" - "io/ioutil" + "io" "log" "net/http" @@ -75,7 +75,7 @@ func (sampler MovieSampler) GetSampleMovies() []Movie { } defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { log.Panicf("Couldn't read body of response. Here's why: %v\n", err) } @@ -91,7 +91,7 @@ func (sampler MovieSampler) GetSampleMovies() []Movie { log.Panicf("Couldn't open first archive in .zip file. Here's why: %v\n", err) } defer zf.Close() - movieBytes, err := ioutil.ReadAll(zf) + movieBytes, err := io.ReadAll(zf) if err != nil { log.Panicf("Couldn't read bytes from .zip archive. Here's why: %v\n", err) } diff --git a/gov2/dynamodb/go.mod b/gov2/dynamodb/go.mod index bf04c1e4ad5..3e7542311fe 100644 --- a/gov2/dynamodb/go.mod +++ b/gov2/dynamodb/go.mod @@ -1,30 +1,33 @@ module github.com/awsdocs/aws-doc-sdk-examples/gov2/dynamodb -go 1.18 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.16.2 - github.com/aws/aws-sdk-go-v2/config v1.15.3 - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.8.4 - github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.5 - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.15.3 - github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20220706224858-5c7f475624dc - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20220706224858-5c7f475624dc + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.2 + github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.37 + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.8 + github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b ) require ( - github.com/aws/aws-sdk-go-v2/credentials v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.13.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.11.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.16.3 // indirect - github.com/aws/smithy-go v1.11.2 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.18 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect ) diff --git a/gov2/dynamodb/go.sum b/gov2/dynamodb/go.sum index e724d9f5ec5..9e5b21639df 100644 --- a/gov2/dynamodb/go.sum +++ b/gov2/dynamodb/go.sum @@ -1,46 +1,46 @@ -github.com/aws/aws-sdk-go-v2 v1.16.2 h1:fqlCk6Iy3bnCumtrLz9r3mJ/2gUT0pJ0wLFVIdWh+JA= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2/config v1.15.3 h1:5AlQD0jhVXlGzwo+VORKiUuogkG7pQcLJNzIzK7eodw= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2 h1:RQQ5fzclAKJyY5TvF+fkjJEwzK4hnxQCLOu5JXzDmQo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.8.4 h1:RFvKYpSTejcSLgtPmfy6jY2vxcAC6y2f+gHD2HH99fg= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.8.4/go.mod h1:N7M3jvFFVC8zayueLESAjrsSiak2yYt/b8p4EPsNbaY= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.5 h1:UHAzjxRwGBdiufi7NBaBHQw6XMnhVZB2P0JeAbbd+wE= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.5/go.mod h1:iqXqwMagYdnvFATn4aGrtYAaTjAYQZSrNrxgEJ+dxZY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3 h1:LWPg5zjHV9oz/myQr4wMs0gi4CjnDN/ILmyZUFYXZsU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9 h1:onz/VaaxZ7Z4V+WIN9Txly9XLTmoOh1oJ8XcAC3pako= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3 h1:9stUQR/u2KXU6HkFJYlqnZEjBnbgrVbG6I5HN09xZh0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10 h1:by9P+oy3P/CwggN4ClnW2D4oL91QV7pBzBICi1chZvQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.15.3 h1:b5+OInu1LyoF4uhFT453MOhbXXaM0YmQsqkxMjFl1dc= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.15.3/go.mod h1:SvbsOiwp0L3NvC+XjgS1CU6NQ3TmArV1bNBlugz2hVc= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.13.3 h1:nPT5ysut/wvhIYyTZ5m6phHS50awx3MVwiB5igAWUH8= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.13.3/go.mod h1:y0rhvvclfOoHPdnMyADj6KKydr0+YgaWmDZFqBi9uFc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1 h1:T4pFel53bkHjL2mMo+4DKE6r6AuoZnM0fg7k1/ratr4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.3 h1:JUbFrnq5mEeM2anIJ2PUkaHpKPW/D+RYAQVv5HXYQg4= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.3/go.mod h1:lgGDXBzoot238KmAAn6zf9lkoxcYtJECnYURSbvNlfc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3 h1:Gh1Gpyh01Yvn7ilO/b/hr01WgNpaszfbKMUgqM186xQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3 h1:frW4ikGcxfAEDfmQqWgMLp+F1n4nRo9sF39OcIb5BkQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3 h1:cJGRyzCSVwZC7zZZ1xbx9m32UnrKydRYhOvcD1NYP9Q= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/smithy-go v1.11.2 h1:eG/N+CcUMAvsdffgMvjMKwfyDzIkjM6pfxMJ8Mzc6mE= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20220706224858-5c7f475624dc h1:GXIhJ+DrwX3Jy97Tvr0RsMSWa71jkZMHEJA906F/dMs= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20220706224858-5c7f475624dc/go.mod h1:0r22nlw0YYkUMowQkNluzs2dc8kf6s2bg9Oema9TzlE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20220706224858-5c7f475624dc h1:so4oHlm/tkXyJLgrGNny31jqppmezivsObRCmHwMCLU= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20220706224858-5c7f475624dc/go.mod h1:eYo61vnozsPsxLFPmQOkdDAvn0K6EX1wDrf+3IZM514= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.2 h1:ss2pLhKcLRqzzWR08Z3arJN1R/9gcjDbzlYHyYNZ/F0= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.2/go.mod h1:luXuuIR1T/EQo8PO3rkxKajO0hMRa7NYUhComrBpgW0= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.37 h1:ql9imbAXp5cNQJMUbc1tiupAAL6sacaeb3swLHPeoOg= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.37/go.mod h1:q6BbA+FDpckWbtxoSEasPYiC1dPVQuQKENYA7SLQJV0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.8 h1:XTz8pSCsPiM9FpT+gTPIL6ryiu/T4Z3dpR/FBtPaBXA= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.8/go.mod h1:N3YdUYxyxhiuAelUgCpSVBuBI1klobJxZrDtL+olu10= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.7 h1:VTBHXWkSeFgT3sfYB4U92qMgzHl0nz9H1tYNHHutLg0= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.7/go.mod h1:F/ybU7YfgFcktSp+biKgiHjyscGhlZxOz4QFFQqHXGw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.18 h1:GACdEPdpBE59I7pbfvu0/Mw1wzstlP3QtPHklUxybFE= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.18/go.mod h1:K+xV06+Wni4TSaOOJ1Y35e5tYOCUBYbebLKmJQQa8yY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -48,8 +48,10 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/gov2/dynamodb/scenarios/scenario_movie_table.go b/gov2/dynamodb/scenarios/scenario_movie_table.go index 455b0f9d20d..ccb7085ee2a 100644 --- a/gov2/dynamodb/scenarios/scenario_movie_table.go +++ b/gov2/dynamodb/scenarios/scenario_movie_table.go @@ -19,13 +19,13 @@ import ( // RunMovieScenario is an interactive example that shows you how to use the AWS SDK for Go // to create and use an Amazon DynamoDB table that stores data about movies. // -// 1. Create a table that can hold movie data. -// 2. Put, get, and update a single movie in the table. -// 3. Write movie data to the table from a sample JSON file. -// 4. Query for movies that were released in a given year. -// 5. Scan for movies that were released in a range of years. -// 6. Delete a movie from the table. -// 7. Delete the table. +// 1. Create a table that can hold movie data. +// 2. Put, get, and update a single movie in the table. +// 3. Write movie data to the table from a sample JSON file. +// 4. Query for movies that were released in a given year. +// 5. Scan for movies that were released in a range of years. +// 6. Delete a movie from the table. +// 7. Delete the table. // // This example creates a DynamoDB service client from the specified sdkConfig so that // you can replace it with a mocked or stubbed config for unit testing. @@ -69,16 +69,15 @@ func RunMovieScenario( var customMovie actions.Movie customMovie.Title = questioner.Ask("Enter a movie title to add to the table:", - []demotools.IAnswerValidator{demotools.NotEmpty{}}) + demotools.NotEmpty{}) customMovie.Year = questioner.AskInt("What year was it released?", - []demotools.IAnswerValidator{demotools.NotEmpty{}, demotools.InIntRange{ - Lower: 1900, Upper: 2030}}) + demotools.NotEmpty{}, demotools.InIntRange{Lower: 1900, Upper: 2030}) customMovie.Info = map[string]interface{}{} customMovie.Info["rating"] = questioner.AskFloat64( - "Enter a rating between 1 and 10:", []demotools.IAnswerValidator{ - demotools.NotEmpty{}, demotools.InFloatRange{Lower: 1, Upper: 10}}) + "Enter a rating between 1 and 10:", + demotools.NotEmpty{}, demotools.InFloatRange{Lower: 1, Upper: 10}) customMovie.Info["plot"] = questioner.Ask("What's the plot? ", - []demotools.IAnswerValidator{demotools.NotEmpty{}}) + demotools.NotEmpty{}) err = tableBasics.AddMovie(customMovie) if err == nil { log.Printf("Added %v to the movie table.\n", customMovie.Title) @@ -87,11 +86,11 @@ func RunMovieScenario( log.Printf("Let's update your movie. You previously rated it %v.\n", customMovie.Info["rating"]) customMovie.Info["rating"] = questioner.AskFloat64( - "What new rating would you give it?", []demotools.IAnswerValidator{ - demotools.NotEmpty{}, demotools.InFloatRange{Lower: 1, Upper: 10}}) + "What new rating would you give it?", + demotools.NotEmpty{}, demotools.InFloatRange{Lower: 1, Upper: 10}) log.Printf("You summarized the plot as '%v'.\n", customMovie.Info["plot"]) customMovie.Info["plot"] = questioner.Ask("What would you say now?", - []demotools.IAnswerValidator{demotools.NotEmpty{}}) + demotools.NotEmpty{}) attributes, err := tableBasics.UpdateMovie(customMovie) if err == nil { log.Printf("Updated %v with new values.\n", customMovie.Title) @@ -122,8 +121,8 @@ func RunMovieScenario( log.Printf("\t%v. %v\n", index+1, movie.Title) } movieIndex := questioner.AskInt( - "Enter the number of a movie to get info about it: ", []demotools.IAnswerValidator{ - demotools.InIntRange{Lower: 1, Upper: show}}, + "Enter the number of a movie to get info about it: ", + demotools.InIntRange{Lower: 1, Upper: show}, ) movie, err := tableBasics.GetMovie(movies[movieIndex-1].Title, movies[movieIndex-1].Year) if err == nil { @@ -133,7 +132,7 @@ func RunMovieScenario( log.Println("Let's get a list of movies released in a given year.") releaseYear := questioner.AskInt("Enter a year between 1972 and 2018: ", - []demotools.IAnswerValidator{demotools.InIntRange{Lower: 1972, Upper: 2018}}, + demotools.InIntRange{Lower: 1972, Upper: 2018}, ) releases, err := tableBasics.Query(releaseYear) if err == nil { @@ -148,10 +147,10 @@ func RunMovieScenario( log.Println(strings.Repeat("-", 88)) log.Println("Now let's scan for movies released in a range of years.") - startYear := questioner.AskInt("Enter a year: ", []demotools.IAnswerValidator{ - demotools.InIntRange{Lower: 1972, Upper: 2018}}) - endYear := questioner.AskInt("Enter another year: ", []demotools.IAnswerValidator{ - demotools.InIntRange{Lower: 1972, Upper: 2018}}) + startYear := questioner.AskInt("Enter a year: ", + demotools.InIntRange{Lower: 1972, Upper: 2018}) + endYear := questioner.AskInt("Enter another year: ", + demotools.InIntRange{Lower: 1972, Upper: 2018}) releases, err = tableBasics.Scan(startYear, endYear) if err == nil { if len(releases) == 0 { diff --git a/gov2/dynamodb/scenarios/scenario_movie_table_test.go b/gov2/dynamodb/scenarios/scenario_movie_table_test.go index fbd9c09368b..ba5dd54fb49 100644 --- a/gov2/dynamodb/scenarios/scenario_movie_table_test.go +++ b/gov2/dynamodb/scenarios/scenario_movie_table_test.go @@ -12,6 +12,7 @@ import ( "github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue" "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" + "github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools" "github.com/awsdocs/aws-doc-sdk-examples/gov2/dynamodb/actions" "github.com/awsdocs/aws-doc-sdk-examples/gov2/dynamodb/stubs" "github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools" @@ -136,6 +137,8 @@ func (scenTest *MovieScenarioTest) SetupDataAndStubs() []testtools.Stub { // RunSubTest performs a single test run with a set of stubs set up to run with // or without errors. func (scenTest *MovieScenarioTest) RunSubTest(stubber *testtools.AwsmStubber) { - mockQuestioner := testtools.MockQuestioner{Answers: scenTest.Answers} + mockQuestioner := demotools.MockQuestioner{Answers: scenTest.Answers} RunMovieScenario(*stubber.SdkConfig, &mockQuestioner, scenTest.TableName, scenTest.Sampler) } + +func (scenTest *MovieScenarioTest) Cleanup() {} diff --git a/gov2/dynamodb/scenarios/scenario_partiql_batch_test.go b/gov2/dynamodb/scenarios/scenario_partiql_batch_test.go index 26f212efc36..ed1b63d2839 100644 --- a/gov2/dynamodb/scenarios/scenario_partiql_batch_test.go +++ b/gov2/dynamodb/scenarios/scenario_partiql_batch_test.go @@ -107,3 +107,5 @@ func (scenTest *PartiQLBatchScenarioTest) SetupDataAndStubs() []testtools.Stub { func (scenTest *PartiQLBatchScenarioTest) RunSubTest(stubber *testtools.AwsmStubber) { RunPartiQLBatchScenario(*stubber.SdkConfig, scenTest.TableName) } + +func (scenTest *PartiQLBatchScenarioTest) Cleanup() {} diff --git a/gov2/dynamodb/scenarios/scenario_partiql_single_test.go b/gov2/dynamodb/scenarios/scenario_partiql_single_test.go index 065fc024c63..cd3f20cac74 100644 --- a/gov2/dynamodb/scenarios/scenario_partiql_single_test.go +++ b/gov2/dynamodb/scenarios/scenario_partiql_single_test.go @@ -74,3 +74,5 @@ func (scenTest *PartiQLSingleScenarioTest) SetupDataAndStubs() []testtools.Stub func (scenTest *PartiQLSingleScenarioTest) RunSubTest(stubber *testtools.AwsmStubber) { RunPartiQLSingleScenario(*stubber.SdkConfig, scenTest.TableName) } + +func (scenTest *PartiQLSingleScenarioTest) Cleanup() {} diff --git a/gov2/iam/go.mod b/gov2/iam/go.mod index 07d47e9cea5..b292b2f2a74 100644 --- a/gov2/iam/go.mod +++ b/gov2/iam/go.mod @@ -1,29 +1,32 @@ module github.com/awsdocs/aws-doc-sdk-examples/gov2/iam -go 1.18 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.17.1 - github.com/aws/aws-sdk-go-v2/config v1.15.3 - github.com/aws/aws-sdk-go-v2/credentials v1.11.2 - github.com/aws/aws-sdk-go-v2/service/iam v1.16.0 - github.com/aws/aws-sdk-go-v2/service/s3 v1.29.4 - github.com/aws/aws-sdk-go-v2/service/sts v1.16.3 - github.com/aws/smithy-go v1.13.4 - github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20221123163453-5922a7465cd6 - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20221128164950-0d7455c51e77 + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 + github.com/aws/aws-sdk-go-v2/service/iam v1.35.2 + github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 + github.com/aws/smithy-go v1.20.4 + github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b ) require ( - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.11.3 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect ) diff --git a/gov2/iam/go.sum b/gov2/iam/go.sum index 1c23a1fbfba..04bb9711921 100644 --- a/gov2/iam/go.sum +++ b/gov2/iam/go.sum @@ -1,62 +1,46 @@ -github.com/aws/aws-sdk-go-v2 v1.13.0/go.mod h1:L6+ZpqHaLbAaxsqV0L4cvxZY7QupWJB4fhkf8LXvC7w= -github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU= -github.com/aws/aws-sdk-go-v2 v1.17.1 h1:02c72fDJr87N8RAC2s3Qu0YuvMRZKNZJ9F+lAehCazk= -github.com/aws/aws-sdk-go-v2 v1.17.1/go.mod h1:JLnGeGONAyi2lWXI1p0PCIOIy333JMVK1U7Hf0aRFLw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9 h1:RKci2D7tMwpvGpDNZnGQw9wk6v7o/xSwFcUAuNPoB8k= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9/go.mod h1:vCmV1q1VK8eoQJ5+aYE7PkK1K6v41qJ5pJdK3ggCDvg= -github.com/aws/aws-sdk-go-v2/config v1.15.3 h1:5AlQD0jhVXlGzwo+VORKiUuogkG7pQcLJNzIzK7eodw= -github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2 h1:RQQ5fzclAKJyY5TvF+fkjJEwzK4hnxQCLOu5JXzDmQo= -github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3 h1:LWPg5zjHV9oz/myQr4wMs0gi4CjnDN/ILmyZUFYXZsU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.4/go.mod h1:XHgQ7Hz2WY2GAn//UXHofLfPXWh+s62MbMOijrg12Lw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25 h1:nBO/RFxeq/IS5G9Of+ZrgucRciie2qpLy++3UGZ+q2E= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25/go.mod h1:Zb29PYkf42vVYQY6pvSyJCJcFHlPIiY+YKdPtwnvMkY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.2.0/go.mod h1:BsCSJHx5DnDXIrOcqB8KN1/B+hXLG/bi4Y6Vjcx/x9E= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19 h1:oRHDrwCTVT8ZXi4sr9Ld+EXk7N/KGssOr2ygNeojEhw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19/go.mod h1:6Q0546uHDp421okhmmGfbxzq2hBqbXFNpi4k+Q1JnQA= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10 h1:by9P+oy3P/CwggN4ClnW2D4oL91QV7pBzBICi1chZvQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16 h1:2EXB7dtGwRYIN3XQ9qwIW504DVbKIw3r89xQnonGdsQ= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16/go.mod h1:XH+3h395e3WVdd6T2Z3mPxuI+x/HVtdqVOREkTiyubs= -github.com/aws/aws-sdk-go-v2/service/iam v1.16.0 h1:A4sCxN1jRqmF90FXjYpai1H4z2jeii4USIh12PAv9VQ= -github.com/aws/aws-sdk-go-v2/service/iam v1.16.0/go.mod h1:Nz3L2VG2bK1gJqZejQpBNpMHORGHre5GRAC2v8v8ZDM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10 h1:dpiPHgmFstgkLG07KaYAewvuptq5kvo52xn7tVSrtrQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10/go.mod h1:9cBNUHI2aW4ho0A5T87O294iPDuuUOSIEDjnd1Lq/z0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20 h1:KSvtm1+fPXE0swe9GPjc6msyrdTT0LB/BP8eLugL1FI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20/go.mod h1:Mp4XI/CkWGD79AQxZ5lIFlgvC0A+gl+4BmyG1F+SfNc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19 h1:GE25AWCdNUPh9AOJzI9KIJnja7IwUc1WyUqz/JTyJ/I= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19/go.mod h1:02CP6iuYP+IVnBX5HULVdSAku/85eHB2Y9EsFhrkEwU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19 h1:piDBAaWkaxkkVV3xJJbTehXCZRXYs49kvpi/LG6LR2o= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19/go.mod h1:BmQWRVkLTmyNzYPFAZgon53qKLWBNSvonugD1MrSWUs= -github.com/aws/aws-sdk-go-v2/service/s3 v1.29.4 h1:QgmmWifaYZZcpaw3y1+ccRlgH6jAvLm4K/MBGUc7cNM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.29.4/go.mod h1:/NHbqPRiwxSPVOB2Xr+StDEH+GWV/64WwnUjv4KYzV0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3 h1:frW4ikGcxfAEDfmQqWgMLp+F1n4nRo9sF39OcIb5BkQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3 h1:cJGRyzCSVwZC7zZZ1xbx9m32UnrKydRYhOvcD1NYP9Q= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/smithy-go v1.10.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= -github.com/aws/smithy-go v1.13.4 h1:/RN2z1txIJWeXeOkzX+Hk/4Uuvv7dWtCjbmVJcrskyk= -github.com/aws/smithy-go v1.13.4/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20221123163453-5922a7465cd6 h1:HLRoAjIrobuLUGOjBzwsCW3YtNy0qhz6ImAs/shK2RE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20221123163453-5922a7465cd6/go.mod h1:0r22nlw0YYkUMowQkNluzs2dc8kf6s2bg9Oema9TzlE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20221128164950-0d7455c51e77 h1:3+pp18MCQon5xN97pxVQlhUX1CdXpl665/QEny4iUUk= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20221128164950-0d7455c51e77/go.mod h1:qcs782jWmSQW2exwfKW39rOvOJBZ4xzO8dVLoFF62Sc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17 h1:Roo69qTpfu8OlJ2Tb7pAYVuF0CpuUMB0IYWwYP/4DZM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17/go.mod h1:NcWPxQzGM1USQggaTVwz6VpqMZPX1CvDJLDh6jnOCa4= +github.com/aws/aws-sdk-go-v2/service/iam v1.35.2 h1:CK5cIZTxza9ki/4eghMeLk32/UeVcPgyDBNiFfbcG0U= +github.com/aws/aws-sdk-go-v2/service/iam v1.35.2/go.mod h1:PpmEOH3ZTQlDAezieBVdFMjPO1jovUMNPA4OpCtnwbY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19 h1:FLMkfEiRjhgeDTCjjLoc3URo/TBkgeQbocA78lfkzSI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19/go.mod h1:Vx+GucNSsdhaxs3aZIKfSUjKVGsxN25nX2SRcdhuw08= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17 h1:u+EfGmksnJc/x5tq3A+OD7LrMbSSR/5TrKLvkdy/fhY= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17/go.mod h1:VaMx6302JHax2vHJWgRo+5n9zvbacs3bLU/23DNQrTY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 h1:Kp6PWAlXwP1UvIflkIP6MFZYBNDCa4mFCGtxrpICVOg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2/go.mod h1:5FmD/Dqq57gP+XwaUnd5WFPipAuzrf0HmupX27Gvjvc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= diff --git a/gov2/lambda/go.mod b/gov2/lambda/go.mod index c5eb5e19192..554f740b03d 100644 --- a/gov2/lambda/go.mod +++ b/gov2/lambda/go.mod @@ -1,27 +1,30 @@ module github.com/awsdocs/aws-doc-sdk-examples/gov2/lambda -go 1.18 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.17.8 - github.com/aws/aws-sdk-go-v2/config v1.18.21 - github.com/aws/aws-sdk-go-v2/service/lambda v1.31.1 - github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230419133539-07e6cbbaf686 + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/service/iam v1.35.2 + github.com/aws/aws-sdk-go-v2/service/lambda v1.58.3 + github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b ) require ( - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.20 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 // indirect - github.com/aws/aws-sdk-go-v2/service/iam v1.19.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.8 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.18.9 // indirect - github.com/aws/smithy-go v1.13.5 // indirect - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20230417183134-8711ccb60255 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect ) diff --git a/gov2/lambda/go.sum b/gov2/lambda/go.sum index 50a0048cfa1..dbd2c14b937 100644 --- a/gov2/lambda/go.sum +++ b/gov2/lambda/go.sum @@ -1,43 +1,41 @@ -github.com/aws/aws-sdk-go-v2 v1.17.8 h1:GMupCNNI7FARX27L7GjCJM8NgivWbRgpjNI/hOQjFS8= -github.com/aws/aws-sdk-go-v2 v1.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= -github.com/aws/aws-sdk-go-v2/config v1.18.21 h1:ENTXWKwE8b9YXgQCsruGLhvA9bhg+RqAsL9XEMEsa2c= -github.com/aws/aws-sdk-go-v2/config v1.18.21/go.mod h1:+jPQiVPz1diRnjj6VGqWcLK6EzNmQ42l7J3OqGTLsSY= -github.com/aws/aws-sdk-go-v2/credentials v1.13.20 h1:oZCEFcrMppP/CNiS8myzv9JgOzq2s0d3v3MXYil/mxQ= -github.com/aws/aws-sdk-go-v2/credentials v1.13.20/go.mod h1:xtZnXErtbZ8YGXC3+8WfajpMBn5Ga/3ojZdxHq6iI8o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 h1:jOzQAesnBFDmz93feqKnsTHsXrlwWORNZMFHMV+WLFU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2/go.mod h1:cDh1p6XkSGSwSRIArWRc6+UqAQ7x4alQ0QfpVR6f+co= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 h1:dpbVNUjczQ8Ae3QKHbpHBpfvaVkRdesxpTOe9pTouhU= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32/go.mod h1:RudqOgadTWdcS3t/erPQo24pcVEoYyqj/kKW5Vya21I= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 h1:QH2kOS3Ht7x+u0gHCh06CXL/h6G8LQJFpZfFBYBNboo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26/go.mod h1:vq86l7956VgFr0/FWQ2BWnK07QC3WYsepKzy33qqY5U= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33 h1:HbH1VjUgrCdLJ+4lnnuLI4iVNRvBbBELGaJ5f69ClA8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33/go.mod h1:zG2FcwjQarWaqXSCGpgcr3RSjZ6dHGguZSppUL0XR7Q= -github.com/aws/aws-sdk-go-v2/service/iam v1.19.10 h1:mNCARLwZyWdk7070h4Sb9plb947g8jthPkC+WUmoN30= -github.com/aws/aws-sdk-go-v2/service/iam v1.19.10/go.mod h1:KeyeWNh9U2iztqp7JsK2PvnAupYWNZFp8A6ItqAQay4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 h1:uUt4XctZLhl9wBE1L8lobU3bVN8SNUP7T+olb0bWBO4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26/go.mod h1:Bd4C/4PkVGubtNe5iMXu5BNnaBi/9t/UsFspPt4ram8= -github.com/aws/aws-sdk-go-v2/service/lambda v1.31.1 h1:Ebkijclfcp9/dqUA33M83Iver44seiYtR0CBLY6GIHo= -github.com/aws/aws-sdk-go-v2/service/lambda v1.31.1/go.mod h1:mITj+2RfksN1tWZYdmH+EWafyHLNAI/I7G5hz6WL8EE= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.8 h1:5cb3D6xb006bPTqEfCNaEA6PPEfBXxxy4NNeX/44kGk= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.8/go.mod h1:GNIveDnP+aE3jujyUSH5aZ/rktsTM5EvtKnCqBZawdw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8 h1:NZaj0ngZMzsubWZbrEFSB4rgSQRbFq38Sd6KBxHuOIU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8/go.mod h1:44qFP1g7pfd+U+sQHLPalAPKnyfTZjJsYR4xIwsJy5o= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.9 h1:Qf1aWwnsNkyAoqDqmdM3nHwN78XQjec27LjM6b9vyfI= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.9/go.mod h1:yyW88BEPXA2fGFyI2KCcZC3dNpiT0CZAHaF+i656/tQ= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230412172136-83ff1a504a6b h1:ASCEHuaHOW62VO7B7K4HLZVLKd0TmZGgKqFATyI/fbU= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230412172136-83ff1a504a6b/go.mod h1:0r22nlw0YYkUMowQkNluzs2dc8kf6s2bg9Oema9TzlE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230419133539-07e6cbbaf686 h1:kTct5hOJvjMkOYwggMUJ2CwwDkxkZhZ0t/4EUIcUtJk= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230419133539-07e6cbbaf686/go.mod h1:0r22nlw0YYkUMowQkNluzs2dc8kf6s2bg9Oema9TzlE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20230417183134-8711ccb60255 h1:nOlgHJbp0Ql1eFAUhslfWHww0FDOgwMQb+R07IpHNKM= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20230417183134-8711ccb60255/go.mod h1:qcs782jWmSQW2exwfKW39rOvOJBZ4xzO8dVLoFF62Sc= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/iam v1.35.2 h1:CK5cIZTxza9ki/4eghMeLk32/UeVcPgyDBNiFfbcG0U= +github.com/aws/aws-sdk-go-v2/service/iam v1.35.2/go.mod h1:PpmEOH3ZTQlDAezieBVdFMjPO1jovUMNPA4OpCtnwbY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/lambda v1.58.3 h1:jG5WkOpwHICcDQfR+o3r4YYCFeghnHQBQyp5YRmKN9w= +github.com/aws/aws-sdk-go-v2/service/lambda v1.58.3/go.mod h1:Y8hbqj7E9G7kQU3Y5btZNVXedcBQ1WVfLRkDSFXDzXI= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -45,6 +43,10 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/gov2/lambda/scenarios/scenario_get_started_functions_test.go b/gov2/lambda/scenarios/scenario_get_started_functions_test.go index b48b4772903..0f79852f275 100644 --- a/gov2/lambda/scenarios/scenario_get_started_functions_test.go +++ b/gov2/lambda/scenarios/scenario_get_started_functions_test.go @@ -53,7 +53,7 @@ func (scenTest *GetStartedFunctionsScenarioTest) SetupDataAndStubs() []testtools Number: 5, }) incremResult, _ := json.Marshal(actions.LambdaResultInt{Result: 6}) - opChoice := "0" + opChoice := "1" x := "6" y := "7" calcPayload, _ := json.Marshal(actions.CalculatorParameters{ diff --git a/gov2/lint_all_go.bat b/gov2/lint_all_go.bat index 98ffabeac65..07f44f87861 100644 --- a/gov2/lint_all_go.bat +++ b/gov2/lint_all_go.bat @@ -1,7 +1,7 @@ Rem Run this batch script to lint Go files in all subfolders. for /d %%a in (*) do ( - cd %%a + pushd %%a call golangci-lint run - cd .. + popd ) diff --git a/gov2/rds/actions/instances.go b/gov2/rds/actions/instances.go index 4f240d7926f..539781d9b42 100644 --- a/gov2/rds/actions/instances.go +++ b/gov2/rds/actions/instances.go @@ -232,7 +232,7 @@ func (instances *DbInstances) GetInstance(instanceName string) ( func (instances *DbInstances) DeleteInstance(instanceName string) error { _, err := instances.RdsClient.DeleteDBInstance(context.TODO(), &rds.DeleteDBInstanceInput{ DBInstanceIdentifier: aws.String(instanceName), - SkipFinalSnapshot: true, + SkipFinalSnapshot: aws.Bool(true), DeleteAutomatedBackups: aws.Bool(true), }) if err != nil { diff --git a/gov2/rds/go.mod b/gov2/rds/go.mod index fbb2ed568f1..4da8e421031 100644 --- a/gov2/rds/go.mod +++ b/gov2/rds/go.mod @@ -1,28 +1,29 @@ module github.com/awsdocs/aws-doc-sdk-examples/gov2/rds -go 1.20 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.18.0 - github.com/aws/aws-sdk-go-v2/config v1.18.25 - github.com/aws/aws-sdk-go-v2/service/rds v1.45.0 - github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230628212925-0fb6bee5ebdf - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20230607202440-f35a0a23ae1e - github.com/google/uuid v1.3.0 + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/service/rds v1.82.4 + github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b + github.com/google/uuid v1.6.0 ) require ( - github.com/aws/aws-sdk-go-v2/credentials v1.13.24 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 // indirect - github.com/aws/smithy-go v1.13.5 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/term v0.9.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect ) diff --git a/gov2/rds/go.sum b/gov2/rds/go.sum index b9a77799e2d..d87fab00e57 100644 --- a/gov2/rds/go.sum +++ b/gov2/rds/go.sum @@ -1,41 +1,39 @@ -github.com/aws/aws-sdk-go-v2 v1.18.0 h1:882kkTpSFhdgYRKVZ/VCgf7sd0ru57p2JCxz4/oN5RY= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/config v1.18.25 h1:JuYyZcnMPBiFqn87L2cRppo+rNwgah6YwD3VuyvaW6Q= -github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= -github.com/aws/aws-sdk-go-v2/credentials v1.13.24 h1:PjiYyls3QdCrzqUN35jMWtUK1vqVZ+zLfdOa/UPFDp0= -github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 h1:jJPgroehGvjrde3XufFIJUZVK5A2L9a3KwSFgKy9n8w= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 h1:kG5eQilShqmJbv11XL1VpyDbaEJzWxd4zRiCG30GSn4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 h1:vFQlirhuM8lLlpI7imKOMsjdQLuN9CPi+k44F/OFVsk= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 h1:gGLG7yKaXG02/jBlg210R7VgQIotiQntNhsCFejawx8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 h1:0iKliEXAcCa2qVtRs7Ot5hItA2MsufrphbRFlz1Owxo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= -github.com/aws/aws-sdk-go-v2/service/rds v1.45.0 h1:Yi23UNiGidNfT7tIW0lbE6JtRR1ZN+cNZGRTKLB+opk= -github.com/aws/aws-sdk-go-v2/service/rds v1.45.0/go.mod h1:rS6T0DrjdZ5LDr8ZC/J9iZdD1oSbie5reWWzqv5zLOw= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 h1:UBQjaMTCKwyUYwiVnUt6toEJwGXsLBI6al083tpjJzY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 h1:PkHIIJs8qvq0e5QybnZoG1K/9QTrLr9OsqCIo59jOBA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 h1:2DQLAKDteoEDI8zpCzqBMaZlJuoE9iTYD0gFmXVax9E= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230608210941-bf53c23f4b7c h1:G6/y3JOyzpSkmCPh+9AWFlXrBzT/9GnR8FKqxPz1Fz0= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230608210941-bf53c23f4b7c/go.mod h1:0r22nlw0YYkUMowQkNluzs2dc8kf6s2bg9Oema9TzlE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230628212925-0fb6bee5ebdf h1:neH4MzDJWEsHKroLSuWMXon0nP+JGTscA05zYncU7Ms= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20230628212925-0fb6bee5ebdf/go.mod h1:bcgBgQb+DUAGU6d0P3fokzUUhPz2pHhnsQ9Acj6aUcY= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20230607202440-f35a0a23ae1e h1:OzVa50JLYmUgvOgW82VnMGXAzBQju/++drF4GDDBlNs= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20230607202440-f35a0a23ae1e/go.mod h1:qcs782jWmSQW2exwfKW39rOvOJBZ4xzO8dVLoFF62Sc= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/rds v1.82.4 h1:Go6suRegLmIpQiuiTNyUUyxYrhzbrliD9wD0ZN65hlQ= +github.com/aws/aws-sdk-go-v2/service/rds v1.82.4/go.mod h1:zNFNa99yH2j3zzqZgt3Atu197K1UkE+1sfigpi5+eWo= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -43,10 +41,10 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/gov2/rds/scenarios/get_started_instances.go b/gov2/rds/scenarios/get_started_instances.go index 1d989f0a373..9707f8d7a8b 100644 --- a/gov2/rds/scenarios/get_started_instances.go +++ b/gov2/rds/scenarios/get_started_instances.go @@ -154,7 +154,7 @@ func (scenario GetStartedInstances) SetUserParameters(parameterGroupName string) var updateParams []types.Parameter for _, dbParam := range dbParameters { if strings.HasPrefix(*dbParam.ParameterName, "auto_increment") && - dbParam.IsModifiable && *dbParam.DataType == "integer" { + *dbParam.IsModifiable && *dbParam.DataType == "integer" { log.Printf("The %v parameter is described as:\n\t%v", *dbParam.ParameterName, *dbParam.Description) rangeSplit := strings.Split(*dbParam.AllowedValues, "-") diff --git a/gov2/rds/scenarios/get_started_instances_test.go b/gov2/rds/scenarios/get_started_instances_test.go index ec3cc4ca347..91440cf6da3 100644 --- a/gov2/rds/scenarios/get_started_instances_test.go +++ b/gov2/rds/scenarios/get_started_instances_test.go @@ -41,18 +41,18 @@ func (scenTest *GetStartedInstancesTest) SetupDataAndStubs() []testtools.Stub { scenTest.dbName = "test-database" families := []string{"family-1", "family-2", "family-3"} - familyChoice := 1 + familyIndex := 1 params := []types.Parameter{{ ParameterName: aws.String("auto_increment_param1"), ParameterValue: aws.String("1"), - AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: true, + AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: aws.Bool(true), DataType: aws.String("integer"), }, { ParameterName: aws.String("auto_increment_param2"), ParameterValue: aws.String("2"), - AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: true, + AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: aws.Bool(true), DataType: aws.String("integer"), }, { ParameterName: aws.String("another_param"), ParameterValue: aws.String("3"), - AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: true, + AllowedValues: aws.String("1-10"), Description: aws.String("Test desc"), IsModifiable: aws.Bool(true), DataType: aws.String("integer"), }} updateParams := make([]types.Parameter, 2) @@ -61,20 +61,20 @@ func (scenTest *GetStartedInstancesTest) SetupDataAndStubs() []testtools.Stub { updateParams[1].ParameterValue = aws.String("5") adminName := "admin" adminPassword := "password" - engineVersionChoice := 1 - engineVersion := fmt.Sprintf("%v-%v", scenTest.dbEngine, engineVersionChoice) + engineVersionIndex := 1 + engineVersion := fmt.Sprintf("%v-%v", scenTest.dbEngine, engineVersionIndex) instanceClasses := []string{"micro-1", "micro-2", "micro-3"} - instanceChoice := 1 + instanceIndex := 1 snapshotId := fmt.Sprintf("%v-%v", scenTest.instanceName, scenTest.helper.UniqueId()) scenTest.helper = instancesTestHelper{} scenTest.Answers = []string{ // CreateParameterGroup - strconv.Itoa(familyChoice), + strconv.Itoa(familyIndex + 1), // SetUserParameters *updateParams[0].ParameterValue, *updateParams[1].ParameterValue, // CreateInstance - adminName, adminPassword, strconv.Itoa(engineVersionChoice), strconv.Itoa(instanceChoice), + adminName, adminPassword, strconv.Itoa(engineVersionIndex + 1), strconv.Itoa(instanceIndex + 1), // CreateSnapshot "y", // Cleanup @@ -84,12 +84,12 @@ func (scenTest *GetStartedInstancesTest) SetupDataAndStubs() []testtools.Stub { var stubList []testtools.Stub // CreateParameterGroup - stubList = append(stubList, stubs.StubGetParameterGroup(scenTest.parameterGroupName, families[familyChoice], + stubList = append(stubList, stubs.StubGetParameterGroup(scenTest.parameterGroupName, families[familyIndex], &testtools.StubError{Err: &types.DBParameterGroupNotFoundFault{}, ContinueAfter: true})) stubList = append(stubList, stubs.StubGetEngineVersions(scenTest.dbEngine, "", families, nil)) stubList = append(stubList, stubs.StubCreateParameterGroup(scenTest.parameterGroupName, - families[familyChoice], "Example parameter group.", nil)) - stubList = append(stubList, stubs.StubGetParameterGroup(scenTest.parameterGroupName, families[familyChoice], nil)) + families[familyIndex], "Example parameter group.", nil)) + stubList = append(stubList, stubs.StubGetParameterGroup(scenTest.parameterGroupName, families[familyIndex], nil)) // SetUserParameters stubList = append(stubList, stubs.StubGetParameters(scenTest.parameterGroupName, "", params, nil)) @@ -99,10 +99,10 @@ func (scenTest *GetStartedInstancesTest) SetupDataAndStubs() []testtools.Stub { // CreateInstance stubList = append(stubList, stubs.StubGetInstance(scenTest.dbName, "", &testtools.StubError{Err: &types.DBInstanceNotFoundFault{}, ContinueAfter: true})) - stubList = append(stubList, stubs.StubGetEngineVersions(scenTest.dbEngine, families[familyChoice], families, nil)) + stubList = append(stubList, stubs.StubGetEngineVersions(scenTest.dbEngine, families[familyIndex], families, nil)) stubList = append(stubList, stubs.StubGetOrderableInstances(scenTest.dbEngine, engineVersion, instanceClasses, nil)) stubList = append(stubList, stubs.StubCreateInstance(scenTest.instanceName, scenTest.dbName, - scenTest.dbEngine, engineVersion, scenTest.parameterGroupName, instanceClasses[instanceChoice], + scenTest.dbEngine, engineVersion, scenTest.parameterGroupName, instanceClasses[instanceIndex], "standard", int32(5), adminName, adminPassword, nil)) stubList = append(stubList, stubs.StubGetInstance(scenTest.instanceName, "available", nil)) diff --git a/gov2/rds/stubs/instances_stubs.go b/gov2/rds/stubs/instances_stubs.go index 1a8f4c8bb03..187d2dcfe6a 100644 --- a/gov2/rds/stubs/instances_stubs.go +++ b/gov2/rds/stubs/instances_stubs.go @@ -181,7 +181,7 @@ func StubGetInstance(instanceIdentifier string, status string, raiseErr *testtoo EngineVersion: aws.String("test-engine-version"), Endpoint: &types.Endpoint{ Address: aws.String("test-address"), - Port: 13, + Port: aws.Int32(13), }, MasterUsername: aws.String("test-user"), }, @@ -197,7 +197,7 @@ func StubDeleteInstance(instanceIdentifier string, raiseErr *testtools.StubError Input: &rds.DeleteDBInstanceInput{ DBInstanceIdentifier: aws.String(instanceIdentifier), DeleteAutomatedBackups: aws.Bool(true), - SkipFinalSnapshot: true, + SkipFinalSnapshot: aws.Bool(true), }, Output: &rds.DeleteDBInstanceOutput{}, Error: raiseErr, diff --git a/gov2/run_all_tests.bat b/gov2/run_all_tests.bat index ad4cdedc887..dfaa91a62f7 100644 --- a/gov2/run_all_tests.bat +++ b/gov2/run_all_tests.bat @@ -1,7 +1,9 @@ Rem Run this batch script with no arguments to run unit tests or with 'integration' to run integration tests. -for /d %%a in (*) do ( - cd %%a - call go test -tags=%1 -timeout=60m ./... - cd .. +for /d %%a in (* workflows\*) do ( + if not "%%a" == "workflows" ( + pushd %%a + call go test -tags=%1 -timeout=60m ./... + popd + ) ) diff --git a/gov2/s3/go.mod b/gov2/s3/go.mod index 69887780861..a8f912e71ee 100644 --- a/gov2/s3/go.mod +++ b/gov2/s3/go.mod @@ -1,31 +1,32 @@ module github.com/awsdocs/aws-doc-sdk-examples/gov2/s3 -go 1.18 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.17.1 - github.com/aws/aws-sdk-go-v2/config v1.17.11 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.38 - github.com/aws/aws-sdk-go-v2/service/s3 v1.29.2 - github.com/aws/smithy-go v1.13.4 - github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20221123163453-5922a7465cd6 - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20221123163453-5922a7465cd6 + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.18 + github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 + github.com/aws/smithy-go v1.20.4 + github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b ) require ( - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.12.24 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.11.25 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.17.2 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect ) diff --git a/gov2/s3/go.sum b/gov2/s3/go.sum index 4dfb4d058ac..5fc541a206b 100644 --- a/gov2/s3/go.sum +++ b/gov2/s3/go.sum @@ -1,56 +1,60 @@ -github.com/aws/aws-sdk-go-v2 v1.17.1 h1:02c72fDJr87N8RAC2s3Qu0YuvMRZKNZJ9F+lAehCazk= -github.com/aws/aws-sdk-go-v2 v1.17.1/go.mod h1:JLnGeGONAyi2lWXI1p0PCIOIy333JMVK1U7Hf0aRFLw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9 h1:RKci2D7tMwpvGpDNZnGQw9wk6v7o/xSwFcUAuNPoB8k= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9/go.mod h1:vCmV1q1VK8eoQJ5+aYE7PkK1K6v41qJ5pJdK3ggCDvg= -github.com/aws/aws-sdk-go-v2/config v1.17.11 h1:9JQUKwRN8oUqeOFIrNaH6RSPmmcNk1+bQrDka/f/bPc= -github.com/aws/aws-sdk-go-v2/config v1.17.11/go.mod h1:cw6HIEr0FaZQfcoyRWYZpMfv4qAH19hZFZ5mglwWo3g= -github.com/aws/aws-sdk-go-v2/credentials v1.12.24 h1:yz4fhoMfgwymG0rU6q5eCydFhYNQxk9yrNjMA7L7xmg= -github.com/aws/aws-sdk-go-v2/credentials v1.12.24/go.mod h1:prZpUfBu1KZLBLVX482Sq4DpDXGugAre08TPEc21GUg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19 h1:E3PXZSI3F2bzyj6XxUXdTIfvp425HHhwKsFvmzBwHgs= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19/go.mod h1:VihW95zQpeKQWVPGkwT+2+WJNQV8UXFfMTWdU6VErL8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.38 h1:FAncZrGqy2l6JLZTP8fDMrF+BT98kCUSJZJ24oXkoFU= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.38/go.mod h1:8+dzbGcWsHbjeMQ/sGlLTtwykuajgdwkJcND5mIZpto= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25 h1:nBO/RFxeq/IS5G9Of+ZrgucRciie2qpLy++3UGZ+q2E= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25/go.mod h1:Zb29PYkf42vVYQY6pvSyJCJcFHlPIiY+YKdPtwnvMkY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19 h1:oRHDrwCTVT8ZXi4sr9Ld+EXk7N/KGssOr2ygNeojEhw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19/go.mod h1:6Q0546uHDp421okhmmGfbxzq2hBqbXFNpi4k+Q1JnQA= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26 h1:Mza+vlnZr+fPKFKRq/lKGVvM6B/8ZZmNdEopOwSQLms= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26/go.mod h1:Y2OJ+P+MC1u1VKnavT+PshiEuGPyh/7DqxoDNij4/bg= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16 h1:2EXB7dtGwRYIN3XQ9qwIW504DVbKIw3r89xQnonGdsQ= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16/go.mod h1:XH+3h395e3WVdd6T2Z3mPxuI+x/HVtdqVOREkTiyubs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10 h1:dpiPHgmFstgkLG07KaYAewvuptq5kvo52xn7tVSrtrQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10/go.mod h1:9cBNUHI2aW4ho0A5T87O294iPDuuUOSIEDjnd1Lq/z0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20 h1:KSvtm1+fPXE0swe9GPjc6msyrdTT0LB/BP8eLugL1FI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20/go.mod h1:Mp4XI/CkWGD79AQxZ5lIFlgvC0A+gl+4BmyG1F+SfNc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19 h1:GE25AWCdNUPh9AOJzI9KIJnja7IwUc1WyUqz/JTyJ/I= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19/go.mod h1:02CP6iuYP+IVnBX5HULVdSAku/85eHB2Y9EsFhrkEwU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19 h1:piDBAaWkaxkkVV3xJJbTehXCZRXYs49kvpi/LG6LR2o= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19/go.mod h1:BmQWRVkLTmyNzYPFAZgon53qKLWBNSvonugD1MrSWUs= -github.com/aws/aws-sdk-go-v2/service/s3 v1.29.2 h1:l29X5biLks99HzZzQgC78plJpwiMv/pGNhmaTM2z62A= -github.com/aws/aws-sdk-go-v2/service/s3 v1.29.2/go.mod h1:/NHbqPRiwxSPVOB2Xr+StDEH+GWV/64WwnUjv4KYzV0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.25 h1:GFZitO48N/7EsFDt8fMa5iYdmWqkUDDB3Eje6z3kbG0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.25/go.mod h1:IARHuzTXmj1C0KS35vboR0FeJ89OkEy1M9mWbK2ifCI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8 h1:jcw6kKZrtNfBPJkaHrscDOZoe5gvi9wjudnxvozYFJo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8/go.mod h1:er2JHN+kBY6FcMfcBBKNGCT3CarImmdFzishsqBmSRI= -github.com/aws/aws-sdk-go-v2/service/sts v1.17.2 h1:tpwEMRdMf2UsplengAOnmSIRdvAxf75oUFR+blBr92I= -github.com/aws/aws-sdk-go-v2/service/sts v1.17.2/go.mod h1:bXcN3koeVYiJcdDU89n3kCYILob7Y34AeLopUbZgLT4= -github.com/aws/smithy-go v1.13.4 h1:/RN2z1txIJWeXeOkzX+Hk/4Uuvv7dWtCjbmVJcrskyk= -github.com/aws/smithy-go v1.13.4/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20221123163453-5922a7465cd6 h1:HLRoAjIrobuLUGOjBzwsCW3YtNy0qhz6ImAs/shK2RE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20221123163453-5922a7465cd6/go.mod h1:0r22nlw0YYkUMowQkNluzs2dc8kf6s2bg9Oema9TzlE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20221123163453-5922a7465cd6 h1:CRMVlOkMFHyKaHVC5aE9K6RzK8qpgEZXMMfVfajusrU= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20221123163453-5922a7465cd6/go.mod h1:qcs782jWmSQW2exwfKW39rOvOJBZ4xzO8dVLoFF62Sc= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.18 h1:9DIp7vhmOPmueCDwpXa45bEbLHHTt1kcxChdTJWWxvI= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.18/go.mod h1:aJv/Fwz8r56ozwYFRC4bzoeL1L17GYQYemfblOBux1M= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17 h1:Roo69qTpfu8OlJ2Tb7pAYVuF0CpuUMB0IYWwYP/4DZM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17/go.mod h1:NcWPxQzGM1USQggaTVwz6VpqMZPX1CvDJLDh6jnOCa4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19 h1:FLMkfEiRjhgeDTCjjLoc3URo/TBkgeQbocA78lfkzSI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19/go.mod h1:Vx+GucNSsdhaxs3aZIKfSUjKVGsxN25nX2SRcdhuw08= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17 h1:u+EfGmksnJc/x5tq3A+OD7LrMbSSR/5TrKLvkdy/fhY= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17/go.mod h1:VaMx6302JHax2vHJWgRo+5n9zvbacs3bLU/23DNQrTY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 h1:Kp6PWAlXwP1UvIflkIP6MFZYBNDCa4mFCGtxrpICVOg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2/go.mod h1:5FmD/Dqq57gP+XwaUnd5WFPipAuzrf0HmupX27Gvjvc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/gov2/s3/scenarios/scenario_get_started.go b/gov2/s3/scenarios/scenario_get_started.go index 78885a189c1..54695790d0d 100644 --- a/gov2/s3/scenarios/scenario_get_started.go +++ b/gov2/s3/scenarios/scenario_get_started.go @@ -4,12 +4,11 @@ package scenarios import ( + "crypto/rand" "fmt" "log" - "math/rand" "os" "strings" - "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/s3" @@ -99,8 +98,7 @@ func RunGetStartedScenario(sdkConfig aws.Config, questioner demotools.IQuestione log.Printf("Let's create a slice of %v MiB of random bytes and upload it to your bucket. ", mibs) questioner.Ask("Press Enter when you're ready.") largeBytes := make([]byte, 1024*1024*mibs) - rand.Seed(time.Now().Unix()) - rand.Read(largeBytes) + _, _ = rand.Read(largeBytes) largeKey := "doc-example-large" log.Println("Uploading...") err = bucketBasics.UploadLargeObject(bucketName, largeKey, largeBytes) diff --git a/gov2/s3/stubs/bucket_basics_stubs.go b/gov2/s3/stubs/bucket_basics_stubs.go index 3b2ff077b27..37ded51750c 100644 --- a/gov2/s3/stubs/bucket_basics_stubs.go +++ b/gov2/s3/stubs/bucket_basics_stubs.go @@ -104,7 +104,7 @@ func StubCompleteMultipartUpload(bucketName string, objectKey string, uploadId s partNumbers []int32, raiseErr *testtools.StubError) testtools.Stub { var completedParts []types.CompletedPart for _, partNumber := range partNumbers { - completedParts = append(completedParts, types.CompletedPart{PartNumber: partNumber}) + completedParts = append(completedParts, types.CompletedPart{PartNumber: aws.Int32(partNumber)}) } return testtools.Stub{ OperationName: "CompleteMultipartUpload", diff --git a/gov2/sns/go.mod b/gov2/sns/go.mod index e080f46bc78..18d121556dc 100644 --- a/gov2/sns/go.mod +++ b/gov2/sns/go.mod @@ -1,20 +1,23 @@ module sns -go 1.19 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.24.1 // indirect - github.com/aws/aws-sdk-go-v2/config v1.26.6 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sns v1.26.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect - github.com/aws/smithy-go v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/service/sns v1.31.7 +) + +require ( + github.com/aws/aws-sdk-go-v2 v1.30.5 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect ) diff --git a/gov2/sns/go.sum b/gov2/sns/go.sum index 989cfc34d8f..7ec4a437db1 100644 --- a/gov2/sns/go.sum +++ b/gov2/sns/go.sum @@ -1,28 +1,28 @@ -github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= -github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= -github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= -github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= -github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= -github.com/aws/aws-sdk-go-v2/service/sns v1.26.7 h1:DylmW2c1Z7qGxN3Y02k+voPbtM1mh7Rp+gV+7maG5io= -github.com/aws/aws-sdk-go-v2/service/sns v1.26.7/go.mod h1:mLFiISZfiZAqZEfPWUsZBK8gD4dYCKuKAfapV+KrIVQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= -github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= -github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/sns v1.31.7 h1:3MWDVQ1pS3e/S4ADKg+mMETqIbOuQDY9FqH7XCb5ISA= +github.com/aws/aws-sdk-go-v2/service/sns v1.31.7/go.mod h1:wjhxA9hlVu75dCL/5Wcx8Cwmszvu6t0i8WEDypcB4+s= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= diff --git a/gov2/sqs/go.mod b/gov2/sqs/go.mod index 5294f723dfb..f26fabfd128 100644 --- a/gov2/sqs/go.mod +++ b/gov2/sqs/go.mod @@ -1,20 +1,23 @@ module sqs -go 1.19 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.24.1 // indirect - github.com/aws/aws-sdk-go-v2/config v1.26.6 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect - github.com/aws/smithy-go v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/service/sqs v1.34.8 +) + +require ( + github.com/aws/aws-sdk-go-v2 v1.30.5 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect ) diff --git a/gov2/sqs/go.sum b/gov2/sqs/go.sum index 5e369db59bb..95dea8e5cdd 100644 --- a/gov2/sqs/go.sum +++ b/gov2/sqs/go.sum @@ -1,28 +1,28 @@ -github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= -github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= -github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= -github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= -github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= -github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 h1:tRNrFDGRm81e6nTX5Q4CFblea99eAfm0dxXazGpLceU= -github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7/go.mod h1:8GWUDux5Z2h6z2efAtr54RdHXtLm8sq7Rg85ZNY/CZM= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= -github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= -github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/sqs v1.34.8 h1:t3TzmBX0lpDNtLhl7vY97VMvLtxp/KTvjjj2X3s6SUQ= +github.com/aws/aws-sdk-go-v2/service/sqs v1.34.8/go.mod h1:zn0Oy7oNni7XIGoAd6bHBTVtX06OrnpvT1kww8jxyi8= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= diff --git a/gov2/update_all_mods.bat b/gov2/update_all_mods.bat new file mode 100644 index 00000000000..d59ad9791cd --- /dev/null +++ b/gov2/update_all_mods.bat @@ -0,0 +1,10 @@ +Rem Run this batch script with no arguments to run unit tests or with 'integration' to run integration tests. + +for /d %%a in (* workflows\*) do ( + if not "%%a" == "workflows" ( + pushd %%a + call go get -u ./... + call go mod tidy + popd + ) +) diff --git a/gov2/workflows/s3_object_lock/go.mod b/gov2/workflows/s3_object_lock/go.mod index 626636c0be7..05a5f4ef1b9 100644 --- a/gov2/workflows/s3_object_lock/go.mod +++ b/gov2/workflows/s3_object_lock/go.mod @@ -1,33 +1,32 @@ module s3_object_lock -go 1.22.3 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.27.2 - github.com/aws/aws-sdk-go-v2/config v1.27.18 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.24 - github.com/aws/aws-sdk-go-v2/service/s3 v1.55.1 - github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240624181422-c113101cec14 - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240606211017-87c20a6538ff + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.18 + github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 + github.com/aws/smithy-go v1.20.4 + github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b ) require ( - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.18 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.11 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.12 // indirect - github.com/aws/smithy-go v1.20.2 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/term v0.9.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect ) diff --git a/gov2/workflows/s3_object_lock/go.sum b/gov2/workflows/s3_object_lock/go.sum index 606d24f14da..b0bec5e5026 100644 --- a/gov2/workflows/s3_object_lock/go.sum +++ b/gov2/workflows/s3_object_lock/go.sum @@ -1,60 +1,46 @@ -github.com/aws/aws-sdk-go-v2 v1.27.2 h1:pLsTXqX93rimAOZG2FIYraDQstZaaGVVN4tNw65v0h8= -github.com/aws/aws-sdk-go-v2 v1.27.2/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.27.18 h1:wFvAnwOKKe7QAyIxziwSKjmer9JBMH1vzIL6W+fYuKk= -github.com/aws/aws-sdk-go-v2/config v1.27.18/go.mod h1:0xz6cgdX55+kmppvPm2IaKzIXOheGJhAufacPJaXZ7c= -github.com/aws/aws-sdk-go-v2/credentials v1.17.18 h1:D/ALDWqK4JdY3OFgA2thcPO1c9aYTT5STS/CvnkqY1c= -github.com/aws/aws-sdk-go-v2/credentials v1.17.18/go.mod h1:JuitCWq+F5QGUrmMPsk945rop6bB57jdscu+Glozdnc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5 h1:dDgptDO9dxeFkXy+tEgVkzSClHZje/6JkPW5aZyEvrQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5/go.mod h1:gjvE2KBUgUQhcv89jqxrIxH9GaKs1JbZzWejj/DaHGA= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.24 h1:FzNwpVTZDCvm597Ty6mGYvxTolyC1oup0waaKntZI4E= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.24/go.mod h1:wM9NElT/Wn6n3CT1eyVcXtfCy8lSVjjQXfdawQbSShc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 h1:cy8ahBJuhtM8GTTSyOkfy6WVPV1IE+SS5/wfXUYuulw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9/go.mod h1:CZBXGLaJnEZI6EVNcPd7a6B5IC5cA/GkRWtu9fp3S6Y= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 h1:A4SYk07ef04+vxZToz9LWvAXl9LW0NClpPpMsi31cz0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9/go.mod h1:5jJcHuwDagxN+ErjQ3PU3ocf6Ylc/p9x+BLO/+X4iXw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.9 h1:vHyZxoLVOgrI8GqX7OMHLXp4YYoxeEsrjweXKpye+ds= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.9/go.mod h1:z9VXZsWA2BvZNH1dT0ToUYwMu/CR9Skkj/TBX+mceZw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.11 h1:4vt9Sspk59EZyHCAEMaktHKiq0C09noRTQorXD/qV+s= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.11/go.mod h1:5jHR79Tv+Ccq6rwYh+W7Nptmw++WiFafMfR42XhwNl8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 h1:o4T+fKxA3gTMcluBNZZXE9DNaMkJuUL1O3mffCUjoJo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11/go.mod h1:84oZdJ+VjuJKs9v1UTC9NaodRZRseOXCTgku+vQJWR8= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.9 h1:TE2i0A9ErH1YfRSvXfCr2SQwfnqsoJT9nPQ9kj0lkxM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.9/go.mod h1:9TzXX3MehQNGPwCZ3ka4CpwQsoAMWSF48/b+De9rfVM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.55.1 h1:UAxBuh0/8sFJk1qOkvOKewP5sWeWaTPDknbQz0ZkDm0= -github.com/aws/aws-sdk-go-v2/service/s3 v1.55.1/go.mod h1:hWjsYGjVuqCgfoveVcVFPXIWgz0aByzwaxKlN1StKcM= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.11 h1:gEYM2GSpr4YNWc6hCd5nod4+d4kd9vWIAWrmGuLdlMw= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.11/go.mod h1:gVvwPdPNYehHSP9Rs7q27U1EU+3Or2ZpXvzAYJNh63w= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5 h1:iXjh3uaH3vsVcnyZX7MqCoCfcyxIrVE9iOQruRaWPrQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5/go.mod h1:5ZXesEuy/QcO0WUnt+4sDkxhdXRHTu2yG0uCSH8B6os= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.12 h1:M/1u4HBpwLuMtjlxuI2y6HoVLzF5e2mfxHCg7ZVMYmk= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.12/go.mod h1:kcfd+eTdEi/40FIbLq4Hif3XMXnl5b/+t/KTfLt9xIk= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240606211017-87c20a6538ff h1:3EHIdWY4iYpgKXO8v+ucs/bTv+FJ7fIMVrfl7EOwag8= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240606211017-87c20a6538ff/go.mod h1:bcgBgQb+DUAGU6d0P3fokzUUhPz2pHhnsQ9Acj6aUcY= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240624181422-c113101cec14 h1:X8+spwxb4ysKbF25pwbJTzGHHLZzvVlF4k3aw+IdGdM= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240624181422-c113101cec14/go.mod h1:bcgBgQb+DUAGU6d0P3fokzUUhPz2pHhnsQ9Acj6aUcY= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240606211017-87c20a6538ff h1:0FdAJSnMMwMvEnB1yi2SBRld8ab9JbcsfouINCa7xfY= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240606211017-87c20a6538ff/go.mod h1:qcs782jWmSQW2exwfKW39rOvOJBZ4xzO8dVLoFF62Sc= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.18 h1:9DIp7vhmOPmueCDwpXa45bEbLHHTt1kcxChdTJWWxvI= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.18/go.mod h1:aJv/Fwz8r56ozwYFRC4bzoeL1L17GYQYemfblOBux1M= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17 h1:Roo69qTpfu8OlJ2Tb7pAYVuF0CpuUMB0IYWwYP/4DZM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17/go.mod h1:NcWPxQzGM1USQggaTVwz6VpqMZPX1CvDJLDh6jnOCa4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19 h1:FLMkfEiRjhgeDTCjjLoc3URo/TBkgeQbocA78lfkzSI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19/go.mod h1:Vx+GucNSsdhaxs3aZIKfSUjKVGsxN25nX2SRcdhuw08= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17 h1:u+EfGmksnJc/x5tq3A+OD7LrMbSSR/5TrKLvkdy/fhY= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17/go.mod h1:VaMx6302JHax2vHJWgRo+5n9zvbacs3bLU/23DNQrTY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 h1:Kp6PWAlXwP1UvIflkIP6MFZYBNDCa4mFCGtxrpICVOg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2/go.mod h1:5FmD/Dqq57gP+XwaUnd5WFPipAuzrf0HmupX27Gvjvc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= diff --git a/gov2/workflows/s3_object_lock/workflows/resources.go b/gov2/workflows/s3_object_lock/workflows/resources.go index fdb22a6d448..f25cff96d4f 100644 --- a/gov2/workflows/s3_object_lock/workflows/resources.go +++ b/gov2/workflows/s3_object_lock/workflows/resources.go @@ -19,7 +19,6 @@ import ( // DemoBucket contains metadata for buckets used in this example. type DemoBucket struct { name string - legalHold bool retentionEnabled bool objectKeys []string } diff --git a/gov2/workflows/topics_and_queues/go.mod b/gov2/workflows/topics_and_queues/go.mod index 30adf7a7df4..6b1952b8eed 100644 --- a/gov2/workflows/topics_and_queues/go.mod +++ b/gov2/workflows/topics_and_queues/go.mod @@ -1,25 +1,28 @@ module topics_and_queues -go 1.19 +go 1.21 require ( - github.com/aws/aws-sdk-go-v2 v1.24.1 // indirect - github.com/aws/aws-sdk-go-v2/config v1.26.6 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sns v1.26.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect - github.com/aws/smithy-go v1.19.0 // indirect - github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240123203033-f9f1e6721c8f // indirect - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240123203033-f9f1e6721c8f // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/term v0.9.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/service/sns v1.31.7 + github.com/aws/aws-sdk-go-v2/service/sqs v1.34.8 + github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b +) + +require ( + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect ) diff --git a/gov2/workflows/topics_and_queues/go.sum b/gov2/workflows/topics_and_queues/go.sum index f61fcc61497..d0db220a0f5 100644 --- a/gov2/workflows/topics_and_queues/go.sum +++ b/gov2/workflows/topics_and_queues/go.sum @@ -1,38 +1,38 @@ -github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= -github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= -github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= -github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= -github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= -github.com/aws/aws-sdk-go-v2/service/sns v1.26.7 h1:DylmW2c1Z7qGxN3Y02k+voPbtM1mh7Rp+gV+7maG5io= -github.com/aws/aws-sdk-go-v2/service/sns v1.26.7/go.mod h1:mLFiISZfiZAqZEfPWUsZBK8gD4dYCKuKAfapV+KrIVQ= -github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 h1:tRNrFDGRm81e6nTX5Q4CFblea99eAfm0dxXazGpLceU= -github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7/go.mod h1:8GWUDux5Z2h6z2efAtr54RdHXtLm8sq7Rg85ZNY/CZM= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= -github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= -github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240123203033-f9f1e6721c8f h1:tpHSgkrb0PeyKO2EEzIaRUNqf8uaySERzqyikgDMFd8= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240123203033-f9f1e6721c8f/go.mod h1:bcgBgQb+DUAGU6d0P3fokzUUhPz2pHhnsQ9Acj6aUcY= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240123203033-f9f1e6721c8f h1:3mZh2qRf7Zo21YPC6GflxI/kBIaUPAJYguA/EfbJb1w= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240123203033-f9f1e6721c8f/go.mod h1:qcs782jWmSQW2exwfKW39rOvOJBZ4xzO8dVLoFF62Sc= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/sns v1.31.7 h1:3MWDVQ1pS3e/S4ADKg+mMETqIbOuQDY9FqH7XCb5ISA= +github.com/aws/aws-sdk-go-v2/service/sns v1.31.7/go.mod h1:wjhxA9hlVu75dCL/5Wcx8Cwmszvu6t0i8WEDypcB4+s= +github.com/aws/aws-sdk-go-v2/service/sqs v1.34.8 h1:t3TzmBX0lpDNtLhl7vY97VMvLtxp/KTvjjj2X3s6SUQ= +github.com/aws/aws-sdk-go-v2/service/sqs v1.34.8/go.mod h1:zn0Oy7oNni7XIGoAd6bHBTVtX06OrnpvT1kww8jxyi8= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= diff --git a/gov2/workflows/topics_and_queues/workflows/scenario_topics_and_queues_test.go b/gov2/workflows/topics_and_queues/workflows/scenario_topics_and_queues_test.go index 46d0abc7f6e..8e4fe149bce 100644 --- a/gov2/workflows/topics_and_queues/workflows/scenario_topics_and_queues_test.go +++ b/gov2/workflows/topics_and_queues/workflows/scenario_topics_and_queues_test.go @@ -59,7 +59,7 @@ func (scenTest *TopicsAndQueuesScenarioTest) SetupDataAndStubs() []testtools.Stu toneChoice := 1 filterAttributes := map[string]snstypes.MessageAttributeValue{TONE_KEY: { DataType: aws.String("String"), - StringValue: aws.String(ToneChoices[toneChoice]), + StringValue: aws.String(ToneChoices[toneChoice-1]), }} receiptHandles := []string{"test-handle-1", "test-handle-2", "test-handle-3"} diff --git a/gov2/workflows/user_pools_and_lambda_triggers/cdk/.gitignore b/gov2/workflows/user_pools_and_lambda_triggers/.cdk/.gitignore similarity index 100% rename from gov2/workflows/user_pools_and_lambda_triggers/cdk/.gitignore rename to gov2/workflows/user_pools_and_lambda_triggers/.cdk/.gitignore diff --git a/gov2/workflows/user_pools_and_lambda_triggers/cdk/.npmignore b/gov2/workflows/user_pools_and_lambda_triggers/.cdk/.npmignore similarity index 100% rename from gov2/workflows/user_pools_and_lambda_triggers/cdk/.npmignore rename to gov2/workflows/user_pools_and_lambda_triggers/.cdk/.npmignore diff --git a/gov2/workflows/user_pools_and_lambda_triggers/cdk/bin/cdk.ts b/gov2/workflows/user_pools_and_lambda_triggers/.cdk/bin/cdk.ts similarity index 100% rename from gov2/workflows/user_pools_and_lambda_triggers/cdk/bin/cdk.ts rename to gov2/workflows/user_pools_and_lambda_triggers/.cdk/bin/cdk.ts diff --git a/gov2/workflows/user_pools_and_lambda_triggers/cdk/cdk.json b/gov2/workflows/user_pools_and_lambda_triggers/.cdk/cdk.json similarity index 100% rename from gov2/workflows/user_pools_and_lambda_triggers/cdk/cdk.json rename to gov2/workflows/user_pools_and_lambda_triggers/.cdk/cdk.json diff --git a/gov2/workflows/user_pools_and_lambda_triggers/cdk/lib/pools-and-triggers-base.ts b/gov2/workflows/user_pools_and_lambda_triggers/.cdk/lib/pools-and-triggers-base.ts similarity index 100% rename from gov2/workflows/user_pools_and_lambda_triggers/cdk/lib/pools-and-triggers-base.ts rename to gov2/workflows/user_pools_and_lambda_triggers/.cdk/lib/pools-and-triggers-base.ts diff --git a/gov2/workflows/user_pools_and_lambda_triggers/cdk/lib/pools-and-triggers-stack.ts b/gov2/workflows/user_pools_and_lambda_triggers/.cdk/lib/pools-and-triggers-stack.ts similarity index 100% rename from gov2/workflows/user_pools_and_lambda_triggers/cdk/lib/pools-and-triggers-stack.ts rename to gov2/workflows/user_pools_and_lambda_triggers/.cdk/lib/pools-and-triggers-stack.ts diff --git a/gov2/workflows/user_pools_and_lambda_triggers/cdk/package-lock.json b/gov2/workflows/user_pools_and_lambda_triggers/.cdk/package-lock.json similarity index 100% rename from gov2/workflows/user_pools_and_lambda_triggers/cdk/package-lock.json rename to gov2/workflows/user_pools_and_lambda_triggers/.cdk/package-lock.json diff --git a/gov2/workflows/user_pools_and_lambda_triggers/cdk/package.json b/gov2/workflows/user_pools_and_lambda_triggers/.cdk/package.json similarity index 100% rename from gov2/workflows/user_pools_and_lambda_triggers/cdk/package.json rename to gov2/workflows/user_pools_and_lambda_triggers/.cdk/package.json diff --git a/gov2/workflows/user_pools_and_lambda_triggers/cdk/tsconfig.json b/gov2/workflows/user_pools_and_lambda_triggers/.cdk/tsconfig.json similarity index 100% rename from gov2/workflows/user_pools_and_lambda_triggers/cdk/tsconfig.json rename to gov2/workflows/user_pools_and_lambda_triggers/.cdk/tsconfig.json diff --git a/gov2/workflows/user_pools_and_lambda_triggers/go.mod b/gov2/workflows/user_pools_and_lambda_triggers/go.mod index 1f8608bb31a..0dd3caafb84 100644 --- a/gov2/workflows/user_pools_and_lambda_triggers/go.mod +++ b/gov2/workflows/user_pools_and_lambda_triggers/go.mod @@ -1,35 +1,37 @@ module user_pools_and_lambda_triggers -go 1.19 +go 1.21 require ( - github.com/aws/aws-lambda-go v1.46.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.26.1 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect - github.com/aws/aws-sdk-go-v2/config v1.27.7 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.7 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.12 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/cloudformation v1.48.0 // indirect - github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.35.1 // indirect - github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.36.0 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.0 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.20.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.5 // indirect - github.com/aws/aws-sdk-go-v2/service/lambda v1.53.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.4 // indirect - github.com/aws/smithy-go v1.20.2 // indirect - github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240313212657-3d2905fb916f // indirect - github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240412104416-2df430557450 // indirect + github.com/aws/aws-lambda-go v1.47.0 + github.com/aws/aws-sdk-go-v2 v1.30.5 + github.com/aws/aws-sdk-go-v2/config v1.27.33 + github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.3 + github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.38 + github.com/aws/aws-sdk-go-v2/service/cloudformation v1.53.7 + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.39.0 + github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.43.4 + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.9 + github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b + github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b +) + +require ( + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.18 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect + github.com/aws/smithy-go v1.20.4 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/term v0.9.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect ) diff --git a/gov2/workflows/user_pools_and_lambda_triggers/go.sum b/gov2/workflows/user_pools_and_lambda_triggers/go.sum index d407a614f49..7d0a14ecb12 100644 --- a/gov2/workflows/user_pools_and_lambda_triggers/go.sum +++ b/gov2/workflows/user_pools_and_lambda_triggers/go.sum @@ -1,86 +1,71 @@ -github.com/aws/aws-lambda-go v1.46.0 h1:UWVnvh2h2gecOlFhHQfIPQcD8pL/f7pVCutmFl+oXU8= -github.com/aws/aws-lambda-go v1.46.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A= -github.com/aws/aws-sdk-go-v2 v1.25.3 h1:xYiLpZTQs1mzvz5PaI6uR0Wh57ippuEthxS4iK5v0n0= -github.com/aws/aws-sdk-go-v2 v1.25.3/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= -github.com/aws/aws-sdk-go-v2 v1.26.0 h1:/Ce4OCiM3EkpW7Y+xUnfAFpchU78K7/Ug01sZni9PgA= -github.com/aws/aws-sdk-go-v2 v1.26.0/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= -github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= -github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 h1:gTK2uhtAPtFcdRRJilZPx8uJLL2J85xK11nKtWL0wfU= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1/go.mod h1:sxpLb+nZk7tIfCWChfd+h4QwHNUR57d8hA1cleTkjJo= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.27.7 h1:JSfb5nOQF01iOgxFI5OIKWwDiEXWTyTgg1Mm1mHi0A4= -github.com/aws/aws-sdk-go-v2/config v1.27.7/go.mod h1:PH0/cNpoMO+B04qET699o5W92Ca79fVtbUnvMIZro4I= -github.com/aws/aws-sdk-go-v2/credentials v1.17.7 h1:WJd+ubWKoBeRh7A5iNMnxEOs982SyVKOJD+K8HIezu4= -github.com/aws/aws-sdk-go-v2/credentials v1.17.7/go.mod h1:UQi7LMR0Vhvs+44w5ec8Q+VS+cd10cjwgHwiVkE0YGU= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.13.11 h1:nyWawIVs7Y75DuNhh6vao/qmKKWS56zUuWt/+dOE5iI= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.13.11/go.mod h1:5WPGXfp9+ss7gYsZ5QjJeY16qTpCLaIcQItE7Yw7ld4= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.13.12 h1:q6f5Y1gcGQVz53Q4WcACo6y1sP2VuNGZPW4JtWhwplI= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.13.12/go.mod h1:5WPGXfp9+ss7gYsZ5QjJeY16qTpCLaIcQItE7Yw7ld4= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.12 h1:FMernpdSB00U3WugCPlVyXqtq5gRypJk4cvGl1BXNHg= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.12/go.mod h1:OdtX98GDpp5F3nlogW/WGBTzcgFDTUV22hrLigFQICE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.3 h1:p+y7FvkK2dxS+FEwRIDHDe//ZX+jDhP8HHE50ppj4iI= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.3/go.mod h1:/fYB+FZbDlwlAiynK9KDXlzZl3ANI9JkD0Uhz5FjNT4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3 h1:ifbIbHZyGl1alsAhPIYsHOg5MuApgqOvVeI8wIugXfs= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3/go.mod h1:oQZXg3c6SNeY6OZrDY+xHcF4VGIEoNotX2B4PrDeoJI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 h1:0ScVK/4qZ8CIW0k8jOeFVsyS/sAiXpYxRBLolMkuLQM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4/go.mod h1:84KyjNZdHC6QZW08nfHI6yZgPd+qRgaWcYsyLUo3QY8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3 h1:Qvodo9gHG9F3E8SfYOspPeBt0bjSbsevK8WhRAUHcoY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3/go.mod h1:vCKrdLXtybdf/uQd/YfVR2r5pcbNuEYKzMQpcxmeSJw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 h1:sHmMWWX5E7guWEFQ9SVo6A3S4xpPrWnd77a6y4WM6PU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4/go.mod h1:WjpDrhWisWOIoS9n3nk67A3Ll1vfULJ9Kq6h29HTD48= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/service/cloudformation v1.48.0 h1:uMlYsoHdd2Gr9sDGq2ieUR5jVu7F5AqPYz6UBJmdRhY= -github.com/aws/aws-sdk-go-v2/service/cloudformation v1.48.0/go.mod h1:G2qcp9xrwch6TH9AlzWoYbV9QScyZhLCoMCQ1+BD404= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.35.1 h1:suWu59CRsDNhw2YXPpa6drYEetIUUIMUhkzHmucbCf8= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.35.1/go.mod h1:tZiRxrv5yBRgZ9Z4OOOxwscAZRFk5DgYhEcjX1QpvgI= -github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.36.0 h1:Y/LhLofWpzHyhX4kJD09ki7QX9dYaF/kZRI4lV4pZ/I= -github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.36.0/go.mod h1:jyiUkrm3YYzUOd+PCQi9q1RFgloXofDEYNDAEoaH9kc= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.30.4 h1:VdtD2r5ZzeX/PvaCUSUsiwu6K0SAhNzgJ50Wu/0KwhM= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.30.4/go.mod h1:HOZYCpIko/NOS693uPQINLs7drzMjRtIN1+XRL8IkfA= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.0 h1:LtsNRZ6+ZYIbJcPiLHcefXeWkw2DZT9iJyXJJQvhvXw= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.0/go.mod h1:ua1eYOCxAAT0PUY3LAi9bUFuKJHC/iAksBLqR1Et7aU= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.20.3 h1:KOjg2W7v3tAU8ASDWw26os1OywstODoZdIh9b/Wwlm4= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.20.3/go.mod h1:fw1lVv+e9z9UIaVsVjBXoC8QxZ+ibOtRtzfELRJZWs8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.4 h1:ikwIKlf0+HbyOhTLo/BRT5z5c8FsjPLPgd75zcRonek= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.4/go.mod h1:Egp7w6xf3EzlnfkfnMbDtHtts8H21B9QrCvc+3NNT24= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.5 h1:4vkDuYdXXD2xLgWmNalqH3q4u/d1XnaBMBXdVdZXVp0= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.5/go.mod h1:Ko/RW/qUJyM1rdTzZa74uhE2I0t0VXH0ob/MLcc+q+w= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.5 h1:K/NXvIftOlX+oGgWGIa3jDyYLDNsdVhsjHmsBH2GLAQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.5/go.mod h1:cl9HGLV66EnCmMNzq4sYOti+/xo8w34CsgzVtm2GgsY= -github.com/aws/aws-sdk-go-v2/service/lambda v1.53.3 h1:KsKBuL+bIKhY7SMk+MXSBAj8PLHsTqlU2d0px98azyI= -github.com/aws/aws-sdk-go-v2/service/lambda v1.53.3/go.mod h1:trTURvQC8AJ41JYhFpVrZKY5tfzGgVUcSijVgfmgl8w= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.2 h1:XOPfar83RIRPEzfihnp+U6udOveKZJvPQ76SKWrLRHc= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.2/go.mod h1:Vv9Xyk1KMHXrR3vNQe8W5LMFdTjSeWk0gBZBzvf3Qa0= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.2 h1:pi0Skl6mNl2w8qWZXcdOyg197Zsf4G97U7Sso9JXGZE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.2/go.mod h1:JYzLoEVeLXk+L4tn1+rrkfhkxl6mLDEVaDSvGq9og90= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.4 h1:Ppup1nVNAOWbBOrcoOxaxPeEnSFB2RnnQdguhXpmeQk= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.4/go.mod h1:+K1rNPVyGxkRuv9NNiaZ4YhBFuyw2MMA9SlIJ1Zlpz8= -github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= -github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240313212657-3d2905fb916f h1:m79Q7NTMOYTUce2MDwYT5+3tPgfGQxJsDpgTDt32AB8= -github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240313212657-3d2905fb916f/go.mod h1:bcgBgQb+DUAGU6d0P3fokzUUhPz2pHhnsQ9Acj6aUcY= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240412104416-2df430557450 h1:4F1WHjh/focE7Lmd0nAjZv9q13nuksMidBjUdHZqYa4= -github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240412104416-2df430557450/go.mod h1:qcs782jWmSQW2exwfKW39rOvOJBZ4xzO8dVLoFF62Sc= +github.com/aws/aws-lambda-go v1.47.0 h1:0H8s0vumYx/YKs4sE7YM0ktwL2eWse+kfopsRI1sXVI= +github.com/aws/aws-lambda-go v1.47.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A= +github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g= +github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= +github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU= +github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I= +github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.3 h1:/BPXKQ6n1cDWPmc5FWF6fCSaUtK+dWkWd0x9dI4dgaI= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.3/go.mod h1:qabLXChRlJREypX5RN/Z47GU+RaMsjotNCZfZ85oD0M= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.38 h1:lAr6FNywaadkLiYlL0RGujsIPnKH0juBjN4RBKSbC4g= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.38/go.mod h1:mQ1Iejq4OTIOBoEBUXGHGfgqWuPyJu8A/viM04PSvzM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/cloudformation v1.53.7 h1:pWuvZn0cGEybhLxYUZBlUQF8vaIcJ11I/8o8i1QjdZ0= +github.com/aws/aws-sdk-go-v2/service/cloudformation v1.53.7/go.mod h1:TXiuXcbBl1rEAy9xhZi2TBZeWfoRhJ6ymMfepMxJnZk= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.39.0 h1:FL5Gfgg2Cp669y7egTKUH6lVHOwFbNdm2VbCZvmzeho= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.39.0/go.mod h1:bDqBjrjbgWKyis9R6mf3NcjoIrgnrBA9L4W724mg7pA= +github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.43.4 h1:C8uf+nwieFWZtdPTCYOM8u/UyaIsDPfr95TJrfYekwQ= +github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.43.4/go.mod h1:hsciKQ2xFfOPEuebyKmFo7wOSVNoLuzmCi6Qtol4UDc= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.9 h1:jbqgtdKfAXebx2/l2UhDEe/jmmCIhaCO3HFK71M7VzM= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.9/go.mod h1:N3YdUYxyxhiuAelUgCpSVBuBI1klobJxZrDtL+olu10= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.7 h1:VTBHXWkSeFgT3sfYB4U92qMgzHl0nz9H1tYNHHutLg0= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.7/go.mod h1:F/ybU7YfgFcktSp+biKgiHjyscGhlZxOz4QFFQqHXGw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.18 h1:GACdEPdpBE59I7pbfvu0/Mw1wzstlP3QtPHklUxybFE= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.18/go.mod h1:K+xV06+Wni4TSaOOJ1Y35e5tYOCUBYbebLKmJQQa8yY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b h1:hht3uw0tZ+rQrgtecFzVsuPmssyIBlqhWWpnui9wuQA= +github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools v0.0.0-20240907001412-a9375541143b/go.mod h1:iBzksyiv5HVU+cymGDQbbvcecca+rsARJlDFL8np8oE= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b h1:UmPy4pArM7SIhTX2Xn5bhOkgI9onSUQ1Y9fxgDJ3pHU= +github.com/awsdocs/aws-doc-sdk-examples/gov2/testtools v0.0.0-20240907001412-a9375541143b/go.mod h1:9Oj/8PZn3D5Ftp/Z1QWrIEFE0daERMqfJawL9duHRfc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/gov2/workflows/user_pools_and_lambda_triggers/handlers/migrate_user/migrate_user_handler.go b/gov2/workflows/user_pools_and_lambda_triggers/handlers/migrate_user/migrate_user_handler.go index 7309f428c96..4290ad2112e 100644 --- a/gov2/workflows/user_pools_and_lambda_triggers/handlers/migrate_user/migrate_user_handler.go +++ b/gov2/workflows/user_pools_and_lambda_triggers/handlers/migrate_user/migrate_user_handler.go @@ -59,7 +59,7 @@ func (h *handler) HandleRequest(ctx context.Context, event events.CognitoEventUs log.Printf("Error looking up user '%v'.\n", user.UserName) return event, err } - if output.Items == nil || len(output.Items) == 0 { + if len(output.Items) == 0 { log.Printf("User '%v' not found, not migrating user.\n", user.UserName) return event, err } diff --git a/gov2/workflows/user_pools_and_lambda_triggers/workflows/scenario_auto_confirm_trusted_accounts_test.go b/gov2/workflows/user_pools_and_lambda_triggers/workflows/scenario_auto_confirm_trusted_accounts_test.go index 7dcb95bbdbc..ff69c4fb90d 100644 --- a/gov2/workflows/user_pools_and_lambda_triggers/workflows/scenario_auto_confirm_trusted_accounts_test.go +++ b/gov2/workflows/user_pools_and_lambda_triggers/workflows/scenario_auto_confirm_trusted_accounts_test.go @@ -54,8 +54,8 @@ func (scenTest *AutoConfirmScenarioTest) SetupDataAndStubs() []testtools.Stub { popTableWriteReqs[i] = dynamotypes.WriteRequest{PutRequest: &dynamotypes.PutRequest{Item: user}} } preSignUpConfig := cogidptypes.LambdaConfigType{PreSignUp: aws.String(stackOutputs["AutoConfirmFunctionArn"])} - userName := "test_user_2" - userEmail := "test_email_2@example.com" + userName := "test_user_1" + userEmail := "test_email_1@example.com" password := "test-password" logStreamName := "test-log-stream-name" logMsgs := []string{"test-message-1", "test-message-2", "test-message-3"} From 6f2c61ff615a85a7588092d38eb8fd8547a196e5 Mon Sep 17 00:00:00 2001 From: Dennis Traub Date: Wed, 11 Sep 2024 19:31:29 +0200 Subject: [PATCH 86/98] Change "Agents for Amazon Bedrock" to "Amazon Bedrock Agents" (#6834) * Change "Agents for Amazon Bedrock" to "Amazon Bedrock Agents" --------- Co-authored-by: Dennis Traub --- ..._ServerlessPromptChaining_Python_block.xml | 2 +- .../cross-content/phrases-code-examples.ent | 8 ++--- .doc_gen/metadata/bedrock-agent_metadata.yaml | 8 ++--- .github/workflows/validate-doc-metadata.yml | 2 +- .gitignore | 3 +- .../bedrock-agent-runtime/README.md | 15 ++++----- .../example_code/bedrock-agent/README.md | 21 ++++++------ .../bedrock-agent-runtime/README.md | 12 +++---- .../bedrock_agent_runtime_wrapper.py | 11 +++---- python/example_code/bedrock-agent/README.md | 32 +++++++++---------- .../bedrock-agent/bedrock_agent_wrapper.py | 26 +++++++-------- .../scenario_get_started_with_agents.py | 9 +++--- .../bedrock_agent_runtime_stubber.py | 6 ++-- python/test_tools/bedrock_agent_stubber.py | 8 ++--- 14 files changed, 77 insertions(+), 86 deletions(-) diff --git a/.doc_gen/cross-content/cross_ServerlessPromptChaining_Python_block.xml b/.doc_gen/cross-content/cross_ServerlessPromptChaining_Python_block.xml index 96288b62f8c..dff4fa5ed88 100644 --- a/.doc_gen/cross-content/cross_ServerlessPromptChaining_Python_block.xml +++ b/.doc_gen/cross-content/cross_ServerlessPromptChaining_Python_block.xml @@ -8,7 +8,7 @@ The &BRlong; Serverless Prompt Chaining scenario demonstrates how &SFNlong;, &BRlong;, - and Agents for &BRlong; + and &BRAlong; can be used to build and orchestrate complex, serverless, and highly scalable generative AI applications. It contains the following working examples: diff --git a/.doc_gen/cross-content/phrases-code-examples.ent b/.doc_gen/cross-content/phrases-code-examples.ent index d305b470e24..a55046f4817 100644 --- a/.doc_gen/cross-content/phrases-code-examples.ent +++ b/.doc_gen/cross-content/phrases-code-examples.ent @@ -89,11 +89,11 @@ - - - + + + - + diff --git a/.doc_gen/metadata/bedrock-agent_metadata.yaml b/.doc_gen/metadata/bedrock-agent_metadata.yaml index d68379072f5..99495ad4382 100644 --- a/.doc_gen/metadata/bedrock-agent_metadata.yaml +++ b/.doc_gen/metadata/bedrock-agent_metadata.yaml @@ -1,8 +1,8 @@ # zexi 0.4.0 bedrock-agent_Hello: - title: Hello Agents for &BR; - title_abbrev: Hello Agents for &BR; - synopsis: get started using Agents for &BR;. + title: Hello &BRA; + title_abbrev: Hello &BRA; + synopsis: get started using &BRA;. category: Hello languages: JavaScript: @@ -186,7 +186,7 @@ bedrock-agent_PrepareAgent: services: bedrock-agent: {PrepareAgent} bedrock-agent_GettingStartedWithBedrockAgents: - title: An end-to-end example showing how to create and invoke &BR; agents using an &AWS; SDK + title: An end-to-end example showing how to create and invoke &BRA; using an &AWS; SDK title_abbrev: Create and invoke an agent synopsis_list: - Create an execution role for the agent. diff --git a/.github/workflows/validate-doc-metadata.yml b/.github/workflows/validate-doc-metadata.yml index 48534c4d296..e5f929c9b2f 100644 --- a/.github/workflows/validate-doc-metadata.yml +++ b/.github/workflows/validate-doc-metadata.yml @@ -16,7 +16,7 @@ jobs: - name: checkout repo content uses: actions/checkout@v4 - name: validate metadata - uses: awsdocs/aws-doc-sdk-examples-tools@2024-09-04-A + uses: awsdocs/aws-doc-sdk-examples-tools@2024-09-11-A with: doc_gen_only: "False" strict_titles: "True" diff --git a/.gitignore b/.gitignore index 981d32d02e6..787544bc724 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ .recommenders .swiftpm .venv +.vs .vscode Package.resolved build_dir @@ -33,4 +34,4 @@ rust_dev_preview kotlin/services/**/build/ kotlin/services/**/gradle/ kotlin/services/**/gradlew -kotlin/services/**/gradlew.bat +kotlin/services/**/gradlew.bat \ No newline at end of file diff --git a/javascriptv3/example_code/bedrock-agent-runtime/README.md b/javascriptv3/example_code/bedrock-agent-runtime/README.md index cac0effa84e..c93565e57bf 100644 --- a/javascriptv3/example_code/bedrock-agent-runtime/README.md +++ b/javascriptv3/example_code/bedrock-agent-runtime/README.md @@ -1,13 +1,13 @@ -# Agents for Amazon Bedrock Runtime code examples for the SDK for JavaScript (v3) +# Amazon Bedrock Agents Runtime code examples for the SDK for JavaScript (v3) ## Overview -Shows how to use the AWS SDK for JavaScript (v3) to work with Agents for Amazon Bedrock Runtime. +Shows how to use the AWS SDK for JavaScript (v3) to work with Amazon Bedrock Agents Runtime. -_Agents for Amazon Bedrock Runtime offers you the ability to run autonomous agents in your application._ +_Amazon Bedrock Agents Runtime offers you the ability to run autonomous agents in your application._ ## ⚠ Important @@ -27,9 +27,6 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas - -> ⚠ You must create an agent before you can invoke it. For more information, see [Create an agent](https://docs.aws.amazon.com/bedrock/latest/userguide/agents-create.html). Additionally, you must grant access to the model you specify during agent creation. For more information, see [Model access](https://us-east-1.console.aws.amazon.com/bedrock/home?region=us-east-1#/modelaccess). - ### Single actions @@ -92,9 +89,9 @@ in the `javascriptv3` folder. ## Additional resources -- [Agents for Amazon Bedrock Runtime User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) -- [Agents for Amazon Bedrock Runtime API Reference](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock_Runtime.html) -- [SDK for JavaScript (v3) Agents for Amazon Bedrock Runtime reference](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/bedrock-agent-runtime) +- [Amazon Bedrock Agents Runtime User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) +- [Amazon Bedrock Agents Runtime API Reference](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock_Runtime.html) +- [SDK for JavaScript (v3) Amazon Bedrock Agents Runtime reference](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/bedrock-agent-runtime) diff --git a/javascriptv3/example_code/bedrock-agent/README.md b/javascriptv3/example_code/bedrock-agent/README.md index 69393ddba82..2c447991e4e 100644 --- a/javascriptv3/example_code/bedrock-agent/README.md +++ b/javascriptv3/example_code/bedrock-agent/README.md @@ -1,13 +1,13 @@ -# Agents for Amazon Bedrock code examples for the SDK for JavaScript (v3) +# Amazon Bedrock Agents code examples for the SDK for JavaScript (v3) ## Overview -Shows how to use the AWS SDK for JavaScript (v3) to work with Agents for Amazon Bedrock. +Shows how to use the AWS SDK for JavaScript (v3) to work with Amazon Bedrock Agents. -_Agents for Amazon Bedrock offer you the ability to build and configure autonomous agents in your application._ +_Amazon Bedrock Agents offer you the ability to build and configure autonomous agents in your application._ ## ⚠ Important @@ -27,14 +27,11 @@ For prerequisites, see the [README](../../README.md#Prerequisites) in the `javas - -> ⚠ You must request access to a foundation model before you can use it. If you try to use the foundation model before you have requested access to it, you will receive an error message. For more information, see [Model access](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html). - ### Get started -- [Hello Agents for Amazon Bedrock](hello.js) (`GetAgent`) +- [Hello Amazon Bedrock Agents](hello.js) (`GetAgent`) ### Single actions @@ -84,9 +81,9 @@ for that file. -#### Hello Agents for Amazon Bedrock +#### Hello Amazon Bedrock Agents -This example shows you how to get started using Agents for Amazon Bedrock. +This example shows you how to get started using Amazon Bedrock Agents. ```bash node ./hello.js @@ -108,9 +105,9 @@ in the `javascriptv3` folder. ## Additional resources -- [Agents for Amazon Bedrock User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) -- [Agents for Amazon Bedrock API Reference](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock.html) -- [SDK for JavaScript (v3) Agents for Amazon Bedrock reference](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/bedrock-agent) +- [Amazon Bedrock Agents User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) +- [Amazon Bedrock Agents API Reference](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock.html) +- [SDK for JavaScript (v3) Amazon Bedrock Agents reference](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/bedrock-agent) diff --git a/python/example_code/bedrock-agent-runtime/README.md b/python/example_code/bedrock-agent-runtime/README.md index 7aa3cd332f9..b6bc29f2684 100644 --- a/python/example_code/bedrock-agent-runtime/README.md +++ b/python/example_code/bedrock-agent-runtime/README.md @@ -1,13 +1,13 @@ -# Agents for Amazon Bedrock Runtime code examples for the SDK for Python +# Amazon Bedrock Agents Runtime code examples for the SDK for Python ## Overview -Shows how to use the AWS SDK for Python (Boto3) to work with Agents for Amazon Bedrock Runtime. +Shows how to use the AWS SDK for Python (Boto3) to work with Amazon Bedrock Agents Runtime. -_Agents for Amazon Bedrock Runtime offers you the ability to run autonomous agents in your application._ +_Amazon Bedrock Agents Runtime offers you the ability to run autonomous agents in your application._ ## ⚠ Important @@ -69,9 +69,9 @@ in the `python` folder. ## Additional resources -- [Agents for Amazon Bedrock Runtime User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) -- [Agents for Amazon Bedrock Runtime API Reference](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock_Runtime.html) -- [SDK for Python Agents for Amazon Bedrock Runtime reference](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock-agent-runtime.html) +- [Amazon Bedrock Agents Runtime User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) +- [Amazon Bedrock Agents Runtime API Reference](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock_Runtime.html) +- [SDK for Python Amazon Bedrock Agents Runtime reference](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock-agent-runtime.html) diff --git a/python/example_code/bedrock-agent-runtime/bedrock_agent_runtime_wrapper.py b/python/example_code/bedrock-agent-runtime/bedrock_agent_runtime_wrapper.py index c50cbea914b..ab15b6a0de6 100644 --- a/python/example_code/bedrock-agent-runtime/bedrock_agent_runtime_wrapper.py +++ b/python/example_code/bedrock-agent-runtime/bedrock_agent_runtime_wrapper.py @@ -4,8 +4,8 @@ """ Purpose -Shows how to use the AWS SDK for Python (Boto3) with the Agents for Amazon -Bedrock Runtime client to send prompts to an agent to process and respond to. +Shows how to use the AWS SDK for Python (Boto3) with the Amazon Bedrock Agents Runtime +client to send prompts to an agent to process and respond to. """ import logging @@ -18,12 +18,12 @@ # snippet-start:[python.example_code.bedrock-agent-runtime.BedrockAgentsRuntimeWrapper.class] # snippet-start:[python.example_code.bedrock-agent-runtime.BedrockAgentRuntimeWrapper.decl] class BedrockAgentRuntimeWrapper: - """Encapsulates Agents for Amazon Bedrock Runtime actions.""" + """Encapsulates Amazon Bedrock Agents Runtime actions.""" def __init__(self, runtime_client): """ - :param runtime_client: A low-level client representing the Agents for Amazon - Bedrock Runtime. Describes the API operations for running + :param runtime_client: A low-level client representing the Amazon Bedrock Agents Runtime. + Describes the API operations for running inferences using Bedrock Agents. """ self.agents_runtime_client = runtime_client @@ -68,5 +68,4 @@ def invoke_agent(self, agent_id, agent_alias_id, session_id, prompt): # snippet-end:[python.example_code.bedrock-agent-runtime.InvokeAgent] - # snippet-end:[python.example_code.bedrock-agent-runtime.BedrockAgentsRuntimeWrapper.class] diff --git a/python/example_code/bedrock-agent/README.md b/python/example_code/bedrock-agent/README.md index e796c7861a5..e5a04608892 100644 --- a/python/example_code/bedrock-agent/README.md +++ b/python/example_code/bedrock-agent/README.md @@ -1,13 +1,13 @@ -# Agents for Amazon Bedrock code examples for the SDK for Python +# Amazon Bedrock Agents code examples for the SDK for Python ## Overview -Shows how to use the AWS SDK for Python (Boto3) to work with Agents for Amazon Bedrock. +Shows how to use the AWS SDK for Python (Boto3) to work with Amazon Bedrock Agents. -_Agents for Amazon Bedrock offer you the ability to build and configure autonomous agents in your application._ +_Amazon Bedrock Agents offer you the ability to build and configure autonomous agents in your application._ ## ⚠ Important @@ -38,16 +38,16 @@ python -m pip install -r requirements.txt Code excerpts that show you how to call individual service functions. -- [CreateAgent](bedrock_agent_wrapper.py#L33) -- [CreateAgentActionGroup](bedrock_agent_wrapper.py#L62) -- [CreateAgentAlias](bedrock_agent_wrapper.py#L97) -- [DeleteAgent](bedrock_agent_wrapper.py#L119) -- [DeleteAgentAlias](bedrock_agent_wrapper.py#L140) -- [GetAgent](bedrock_agent_wrapper.py#L162) -- [ListAgentActionGroups](bedrock_agent_wrapper.py#L209) -- [ListAgentKnowledgeBases](bedrock_agent_wrapper.py#L238) -- [ListAgents](bedrock_agent_wrapper.py#L186) -- [PrepareAgent](bedrock_agent_wrapper.py#L267) +- [CreateAgent](bedrock_agent_wrapper.py#L32) +- [CreateAgentActionGroup](bedrock_agent_wrapper.py#L61) +- [CreateAgentAlias](bedrock_agent_wrapper.py#L96) +- [DeleteAgent](bedrock_agent_wrapper.py#L118) +- [DeleteAgentAlias](bedrock_agent_wrapper.py#L139) +- [GetAgent](bedrock_agent_wrapper.py#L161) +- [ListAgentActionGroups](bedrock_agent_wrapper.py#L208) +- [ListAgentKnowledgeBases](bedrock_agent_wrapper.py#L237) +- [ListAgents](bedrock_agent_wrapper.py#L185) +- [PrepareAgent](bedrock_agent_wrapper.py#L266) ### Scenarios @@ -110,9 +110,9 @@ in the `python` folder. ## Additional resources -- [Agents for Amazon Bedrock User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) -- [Agents for Amazon Bedrock API Reference](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock.html) -- [SDK for Python Agents for Amazon Bedrock reference](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock-agent.html) +- [Amazon Bedrock Agents User Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html) +- [Amazon Bedrock Agents API Reference](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock.html) +- [SDK for Python Amazon Bedrock Agents reference](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock-agent.html) diff --git a/python/example_code/bedrock-agent/bedrock_agent_wrapper.py b/python/example_code/bedrock-agent/bedrock_agent_wrapper.py index e4687d5cc10..5829700bd3e 100644 --- a/python/example_code/bedrock-agent/bedrock_agent_wrapper.py +++ b/python/example_code/bedrock-agent/bedrock_agent_wrapper.py @@ -9,7 +9,6 @@ """ import logging -import boto3 from botocore.exceptions import ClientError logger = logging.getLogger(__name__) @@ -23,7 +22,7 @@ class BedrockAgentWrapper: def __init__(self, client): """ :param client: A Boto3 Amazon Bedrock Agents client, which is a low-level client that - represents Agents for Amazon Bedrock and describes the API operations + represents Amazon Bedrock Agents and describes the API operations for creating and managing Bedrock Agent resources. """ self.client = client @@ -42,7 +41,7 @@ def create_agent(self, agent_name, foundation_model, role_arn, instruction): :param role_arn: The ARN of the IAM role with permissions needed by the agent. :param instruction: Instructions that tell the agent what it should do and how it should interact with users. - :return: The response from Agents for Bedrock if successful, otherwise raises an exception. + :return: The response from Amazon Bedrock Agents if successful, otherwise raises an exception. """ try: response = self.client.create_agent( @@ -61,7 +60,7 @@ def create_agent(self, agent_name, foundation_model, role_arn, instruction): # snippet-start:[python.example_code.bedrock-agent.CreateAgentActionGroup] def create_agent_action_group( - self, name, description, agent_id, agent_version, function_arn, api_schema + self, name, description, agent_id, agent_version, function_arn, api_schema ): """ Creates an action group for an agent. An action group defines a set of actions that an @@ -122,7 +121,7 @@ def delete_agent(self, agent_id): Deletes an Amazon Bedrock agent. :param agent_id: The unique identifier of the agent to delete. - :return: The response from Agents for Bedrock if successful, otherwise raises an exception. + :return: The response from Amazon Bedrock Agents if successful, otherwise raises an exception. """ try: @@ -144,7 +143,7 @@ def delete_agent_alias(self, agent_id, agent_alias_id): :param agent_id: The unique identifier of the agent that the alias belongs to. :param agent_alias_id: The unique identifier of the alias to delete. - :return: The response from Agents for Bedrock if successful, otherwise raises an exception. + :return: The response from Amazon Bedrock Agents if successful, otherwise raises an exception. """ try: @@ -221,9 +220,9 @@ def list_agent_action_groups(self, agent_id, agent_version): paginator = self.client.get_paginator("list_agent_action_groups") for page in paginator.paginate( - agentId=agent_id, - agentVersion=agent_version, - PaginationConfig={"PageSize": 10}, + agentId=agent_id, + agentVersion=agent_version, + PaginationConfig={"PageSize": 10}, ): action_groups.extend(page["actionGroupSummaries"]) @@ -250,9 +249,9 @@ def list_agent_knowledge_bases(self, agent_id, agent_version): paginator = self.client.get_paginator("list_agent_knowledge_bases") for page in paginator.paginate( - agentId=agent_id, - agentVersion=agent_version, - PaginationConfig={"PageSize": 10}, + agentId=agent_id, + agentVersion=agent_version, + PaginationConfig={"PageSize": 10}, ): knowledge_bases.extend(page["agentKnowledgeBaseSummaries"]) @@ -270,7 +269,7 @@ def prepare_agent(self, agent_id): Creates a DRAFT version of the agent that can be used for internal testing. :param agent_id: The unique identifier of the agent to prepare. - :return: The response from Agents for Bedrock if successful, otherwise raises an exception. + :return: The response from Amazon Bedrock Agents if successful, otherwise raises an exception. """ try: prepared_agent_details = self.client.prepare_agent(agentId=agent_id) @@ -282,5 +281,4 @@ def prepare_agent(self, agent_id): # snippet-end:[python.example_code.bedrock-agent.PrepareAgent] - # snippet-end:[python.example_code.bedrock-agent.BedrockAgentWrapper.class] diff --git a/python/example_code/bedrock-agent/scenario_get_started_with_agents.py b/python/example_code/bedrock-agent/scenario_get_started_with_agents.py index 3aa9c378198..03e6d3ce3c8 100644 --- a/python/example_code/bedrock-agent/scenario_get_started_with_agents.py +++ b/python/example_code/bedrock-agent/scenario_get_started_with_agents.py @@ -4,7 +4,7 @@ """ Purpose -This end-to-end scenario demonstrates how to use Agents for Amazon Bedrock with +This end-to-end scenario demonstrates how to use Amazon Bedrock Agents with the AWS SDK for Python (Boto3). It covers the following steps: 1. Creating an execution role for the Bedrock agent. @@ -19,6 +19,7 @@ """ import asyncio +import boto3 import io import json import logging @@ -29,8 +30,6 @@ import uuid import yaml import zipfile - -import boto3 from botocore.exceptions import ClientError from bedrock_agent_wrapper import BedrockAgentWrapper @@ -48,10 +47,10 @@ class BedrockAgentScenarioWrapper: - """Runs a scenario that shows how to get started using Agents for Amazon Bedrock.""" + """Runs a scenario that shows how to get started using Amazon Bedrock Agents.""" def __init__( - self, bedrock_agent_client, runtime_client, lambda_client, iam_resource, postfix + self, bedrock_agent_client, runtime_client, lambda_client, iam_resource, postfix ): self.iam_resource = iam_resource self.lambda_client = lambda_client diff --git a/python/test_tools/bedrock_agent_runtime_stubber.py b/python/test_tools/bedrock_agent_runtime_stubber.py index 97b0a6f3cd5..01baec209d8 100644 --- a/python/test_tools/bedrock_agent_runtime_stubber.py +++ b/python/test_tools/bedrock_agent_runtime_stubber.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 """ -Stub functions that are used by the Agents for Amazon Bedrock Runtime unit tests. +Stub functions that are used by the Amazon Bedrock Agents Runtime unit tests. When tests are run against an actual AWS account, the stubber class does not set up stubs and passes all calls through to the Boto3 client. @@ -13,7 +13,7 @@ class BedrockAgentRuntimeStubber(ExampleStubber): """ - A class that implements stub functions used by Agents for Amazon Bedrock Runtime unit tests. + A class that implements stub functions used by Amazon Bedrock Agents Runtime unit tests. """ def __init__(self, client, use_stubs=True): @@ -21,7 +21,7 @@ def __init__(self, client, use_stubs=True): Initializes the object with a specific client and configures it for stubbing or AWS passthrough. - :param client: A Boto3 Agents for Amazon Bedrock Runtime client. + :param client: A Boto3 Amazon Bedrock Agents Runtime client. :param use_stubs: When True, uses stubs to intercept requests. Otherwise, passes requests through to AWS. """ diff --git a/python/test_tools/bedrock_agent_stubber.py b/python/test_tools/bedrock_agent_stubber.py index 78f17cba5dc..f1635a4c406 100644 --- a/python/test_tools/bedrock_agent_stubber.py +++ b/python/test_tools/bedrock_agent_stubber.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 """ -Stub functions that are used by the Agents for Amazon Bedrock unit tests. +Stub functions that are used by the Amazon Bedrock Agents unit tests. """ from test_tools.example_stubber import ExampleStubber @@ -18,7 +18,7 @@ def __init__(self, client, use_stubs=True): Initializes the object with a specific client and configures it for stubbing or AWS passthrough. - :param client: A Boto3 Agents for Amazon Bedrock client. + :param client: A Boto3 Amazon Bedrock Agents client. :param use_stubs: When True, uses stubs to intercept requests. Otherwise, passes requests through to AWS. """ @@ -30,7 +30,7 @@ def stub_create_agent(self, expected_params, response, error_code=None): ) def stub_create_agent_action_group( - self, expected_params, response, error_code=None + self, expected_params, response, error_code=None ): self._stub_bifurcator( "create_agent_action_group", @@ -70,7 +70,7 @@ def stub_list_agent_action_groups(self, expected_params, response, error_code=No ) def stub_list_agent_knowledge_bases( - self, expected_params, response, error_code=None + self, expected_params, response, error_code=None ): self._stub_bifurcator( "list_agent_knowledge_bases", From 48a391575470b2d7d02114ec41ea7246af524cef Mon Sep 17 00:00:00 2001 From: Scott Macdonald <57190223+scmacdon@users.noreply.github.com> Date: Wed, 11 Sep 2024 13:57:13 -0400 Subject: [PATCH 87/98] JavaV2: Update sns RegistrationExample formatting (#6791) updated para description for token --- .../com/example/sns/RegistrationExample.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/javav2/example_code/sns/src/main/java/com/example/sns/RegistrationExample.java b/javav2/example_code/sns/src/main/java/com/example/sns/RegistrationExample.java index 842c0cd1733..35a7f2dd909 100644 --- a/javav2/example_code/sns/src/main/java/com/example/sns/RegistrationExample.java +++ b/javav2/example_code/sns/src/main/java/com/example/sns/RegistrationExample.java @@ -33,40 +33,43 @@ public class RegistrationExample { public static void main(String[] args) { final String usage = """ - Usage: + Usage: - Where: - token - The name of the FIFO topic.\s - platformApplicationArn - The ARN value of platform application. You can get this value from the AWS Management Console.\s - """; + Where: + token - The device token or registration ID of the mobile device. This is a unique + identifier provided by the device platform (e.g., Apple Push Notification Service (APNS) for iOS devices, Firebase Cloud Messaging (FCM) + for Android devices) when the mobile app is registered to receive push notifications. + + platformApplicationArn - The ARN value of platform application. You can get this value from the AWS Management Console.\s + + """; if (args.length != 2) { System.out.println(usage); - System.exit(1); + return; } String token = args[0]; String platformApplicationArn = args[1]; SnsClient snsClient = SnsClient.builder() - .region(Region.US_EAST_1) - .build(); + .region(Region.US_EAST_1) + .build(); createEndpoint(snsClient, token, platformApplicationArn); } - public static void createEndpoint(SnsClient snsClient, String token, String platformApplicationArn) { System.out.println("Creating platform endpoint with token " + token); try { CreatePlatformEndpointRequest endpointRequest = CreatePlatformEndpointRequest.builder() - .token(token) - .platformApplicationArn(platformApplicationArn) - .build(); + .token(token) + .platformApplicationArn(platformApplicationArn) + .build(); CreatePlatformEndpointResponse response = snsClient.createPlatformEndpoint(endpointRequest); System.out.println("The ARN of the endpoint is " + response.endpointArn()); + } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); - System.exit(1); } } } From abbaac6f3bf3098a5b501754c3fff9486fe9b7c0 Mon Sep 17 00:00:00 2001 From: Jason Q <81179619+beqqrry-aws@users.noreply.github.com> Date: Wed, 11 Sep 2024 11:06:11 -0700 Subject: [PATCH 88/98] Javascript (v3): SSM - Basics scenario (#6792) --- .doc_gen/metadata/ssm_metadata.yaml | 109 ++++ .../example_code/libs/scenario/scenario.js | 29 +- javascriptv3/example_code/ssm/README.md | 143 +++++ .../ssm/actions/create-document.js | 49 ++ .../ssm/actions/create-maintenance-window.js | 69 +++ .../ssm/actions/create-ops-item.js | 58 ++ .../ssm/actions/delete-document.js | 37 ++ .../ssm/actions/delete-maintenance-window.js | 39 ++ .../ssm/actions/describe-ops-items.js | 54 ++ .../ssm/actions/list-command-invocations.js | 47 ++ .../example_code/ssm/actions/send-command.js | 41 ++ .../ssm/actions/update-maintenance-window.js | 68 +++ .../ssm/actions/update-ops-item.js | 53 ++ javascriptv3/example_code/ssm/hello.js | 34 ++ javascriptv3/example_code/ssm/package.json | 19 + .../example_code/ssm/scenarios/ssm-basics.js | 534 ++++++++++++++++++ .../ssm/tests/create-document.unit.test.js | 67 +++ .../create-maintenance-window.unit.test.js | 92 +++ .../ssm/tests/create-ops-item.unit.test.js | 83 +++ .../ssm/tests/delete-document.unit.test.js | 54 ++ .../delete-maintenance-window.unit.test.js | 65 +++ .../ssm/tests/describe-ops-items.unit.test.js | 69 +++ .../example_code/ssm/tests/hello.unit.test.js | 67 +++ .../list-command-invocations.unit.test.js | 74 +++ .../ssm/tests/send-command.unit.test.js | 59 ++ .../ssm/tests/ssm-basics.integration.test.js | 11 + .../update-maintenance-window.unit.test.js | 101 ++++ .../ssm/tests/update-ops-item.unit.test.js | 60 ++ javascriptv3/package.json | 1 + 29 files changed, 2173 insertions(+), 13 deletions(-) create mode 100644 javascriptv3/example_code/ssm/README.md create mode 100644 javascriptv3/example_code/ssm/actions/create-document.js create mode 100644 javascriptv3/example_code/ssm/actions/create-maintenance-window.js create mode 100644 javascriptv3/example_code/ssm/actions/create-ops-item.js create mode 100644 javascriptv3/example_code/ssm/actions/delete-document.js create mode 100644 javascriptv3/example_code/ssm/actions/delete-maintenance-window.js create mode 100644 javascriptv3/example_code/ssm/actions/describe-ops-items.js create mode 100644 javascriptv3/example_code/ssm/actions/list-command-invocations.js create mode 100644 javascriptv3/example_code/ssm/actions/send-command.js create mode 100644 javascriptv3/example_code/ssm/actions/update-maintenance-window.js create mode 100644 javascriptv3/example_code/ssm/actions/update-ops-item.js create mode 100644 javascriptv3/example_code/ssm/hello.js create mode 100644 javascriptv3/example_code/ssm/package.json create mode 100644 javascriptv3/example_code/ssm/scenarios/ssm-basics.js create mode 100644 javascriptv3/example_code/ssm/tests/create-document.unit.test.js create mode 100644 javascriptv3/example_code/ssm/tests/create-maintenance-window.unit.test.js create mode 100644 javascriptv3/example_code/ssm/tests/create-ops-item.unit.test.js create mode 100644 javascriptv3/example_code/ssm/tests/delete-document.unit.test.js create mode 100644 javascriptv3/example_code/ssm/tests/delete-maintenance-window.unit.test.js create mode 100644 javascriptv3/example_code/ssm/tests/describe-ops-items.unit.test.js create mode 100644 javascriptv3/example_code/ssm/tests/hello.unit.test.js create mode 100644 javascriptv3/example_code/ssm/tests/list-command-invocations.unit.test.js create mode 100644 javascriptv3/example_code/ssm/tests/send-command.unit.test.js create mode 100644 javascriptv3/example_code/ssm/tests/ssm-basics.integration.test.js create mode 100644 javascriptv3/example_code/ssm/tests/update-maintenance-window.unit.test.js create mode 100644 javascriptv3/example_code/ssm/tests/update-ops-item.unit.test.js diff --git a/.doc_gen/metadata/ssm_metadata.yaml b/.doc_gen/metadata/ssm_metadata.yaml index 388f164611a..55a2c6215a9 100644 --- a/.doc_gen/metadata/ssm_metadata.yaml +++ b/.doc_gen/metadata/ssm_metadata.yaml @@ -13,6 +13,15 @@ ssm_Hello: - description: snippet_tags: - ssm.java2.hello.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.hello Python: versions: - sdk_version: 3 @@ -88,6 +97,15 @@ ssm_CreateOpsItem: - description: snippet_tags: - ssm.java2.create_ops.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.createOpsItem Python: versions: - sdk_version: 3 @@ -111,6 +129,15 @@ ssm_UpdateMaintenanceWindow: - description: snippet_tags: - ssm.java2.update_window.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.updateMaintenanceWindow Python: versions: - sdk_version: 3 @@ -134,6 +161,15 @@ ssm_CreateMaintenanceWindow: - description: snippet_tags: - ssm.java2.create_window.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.createMaintenanceWindow Python: versions: - sdk_version: 3 @@ -157,6 +193,15 @@ ssm_SendCommand: - description: snippet_tags: - ssm.Java2.send_command.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.sendCommand Python: versions: - sdk_version: 3 @@ -171,6 +216,15 @@ ssm_SendCommand: ssm: {SendCommand} ssm_ListCommandInvocations: languages: + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.listCommandInvocations Python: versions: - sdk_version: 3 @@ -194,6 +248,15 @@ ssm_CreateDocument: - description: snippet_tags: - ssm.java2.create_doc.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.createDocument Python: versions: - sdk_version: 3 @@ -217,6 +280,15 @@ ssm_DescribeOpsItems: - description: snippet_tags: - ssm.java2.describe_ops.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.describeOpsItems Python: versions: - sdk_version: 3 @@ -254,6 +326,15 @@ ssm_DeleteMaintenanceWindow: - description: snippet_tags: - ssm.java2.delete_window.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.deleteMaintenanceWindow Python: versions: - sdk_version: 3 @@ -277,6 +358,15 @@ ssm_DeleteDocument: - description: snippet_tags: - ssm.Java2.delete_doc.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.deleteDocument Python: versions: - sdk_version: 3 @@ -300,6 +390,15 @@ ssm_UpdateOpsItem: - description: snippet_tags: - ssm.Java2.resolve_ops.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.updateOpsItem Python: versions: - sdk_version: 3 @@ -328,6 +427,16 @@ ssm_Scenario: - description: A wrapper class for &SYS; SDK methods. snippet_tags: - ssm.java2.actions.main + JavaScript: + versions: + - sdk_version: 3 + github: javascriptv3/example_code/ssm + sdkguide: + genai: some + excerpts: + - description: + snippet_tags: + - ssm.JavaScript.Basics.scenario Python: versions: - sdk_version: 3 diff --git a/javascriptv3/example_code/libs/scenario/scenario.js b/javascriptv3/example_code/libs/scenario/scenario.js index dba44d545c0..b9cbccd8468 100644 --- a/javascriptv3/example_code/libs/scenario/scenario.js +++ b/javascriptv3/example_code/libs/scenario/scenario.js @@ -46,10 +46,10 @@ export class Step { console.log( `[DEBUG ${new Date().toISOString()}] Handling step: ${ this.constructor.name - }<${this.name}>`, + }<${this.name}>` ); console.log( - `[DEBUG ${new Date().toISOString()}] State: ${JSON.stringify(state)}`, + `[DEBUG ${new Date().toISOString()}] State: ${JSON.stringify(state)}` ); } } @@ -150,16 +150,19 @@ export class ScenarioInput extends Step { ? this.stepOptions.default(state) : this.stepOptions.default; - if (stepHandlerOptions.confirmAll && this.default) { - state[this.name] = this.default; + if ( + stepHandlerOptions.confirmAll && + this.stepOptions.default != undefined + ) { + state[this.name] = this.stepOptions.default; return state[this.name]; - } else if (stepHandlerOptions.confirmAll && !this.default) { + } else if (stepHandlerOptions.confirmAll) { if (this.stepOptions?.type === "confirm") { state[this.name] = true; return true; } throw new Error( - `Error handling ScenarioInput. confirmAll was selected for ${this.name} but no default was provided.`, + `Error handling ScenarioInput. confirmAll was selected for ${this.name} but no default was provided.` ); } @@ -178,7 +181,7 @@ export class ScenarioInput extends Step { break; default: throw new Error( - `Error handling ScenarioInput, ${this.stepOptions?.type} is not supported.`, + `Error handling ScenarioInput, ${this.stepOptions?.type} is not supported.` ); } @@ -200,7 +203,7 @@ export class ScenarioInput extends Step { if (!rawChoices) { throw new Error( - `Error handling ScenarioInput. Could not get choices for ${this.name}.`, + `Error handling ScenarioInput. Could not get choices for ${this.name}.` ); } @@ -232,7 +235,7 @@ export class ScenarioInput extends Step { state[this.name] = this.default; } else if (!result.length) { throw new Error( - `Error handing ScenarioInput. Result of ${this.name} was empty.`, + `Error handing ScenarioInput. Result of ${this.name} was empty.` ); } else { state[this.name] = result; @@ -260,7 +263,7 @@ export class ScenarioInput extends Step { state[this.name] = this.default; } else if (!result) { throw new Error( - `Error handing ScenarioInput. Result of ${this.name} was empty.`, + `Error handing ScenarioInput. Result of ${this.name} was empty.` ); } else { state[this.name] = result; @@ -284,9 +287,9 @@ export class ScenarioInput extends Step { if (!result && this.default) { state[this.name] = this.default; - } else if (!result) { + } else if (result === undefined) { throw new Error( - `Error handing ScenarioInput. Result of ${this.name} was empty.`, + `Error handing ScenarioInput. Result of ${this.name} was empty.` ); } else { state[this.name] = result; @@ -359,7 +362,7 @@ export class ScenarioAction extends Step { output && (await this.stepOptions.whileConfig.output.handle( state, - stepHandlerOptions, + stepHandlerOptions )); await input.handle(state, stepHandlerOptions); runAction = whileFn(state); diff --git a/javascriptv3/example_code/ssm/README.md b/javascriptv3/example_code/ssm/README.md new file mode 100644 index 00000000000..2de74676134 --- /dev/null +++ b/javascriptv3/example_code/ssm/README.md @@ -0,0 +1,143 @@ +# Systems Manager code examples for the SDK for JavaScript (v3) + +## Overview + +Shows how to use the AWS SDK for JavaScript (v3) to work with AWS Systems Manager. + + + + +_Systems Manager organizes, monitors, and automates management tasks on your AWS resources._ + +## ⚠ Important + +* Running this code might result in charges to your AWS account. For more details, see [AWS Pricing](https://aws.amazon.com/pricing/) and [Free Tier](https://aws.amazon.com/free/). +* Running the tests might result in charges to your AWS account. +* We recommend that you grant your code least privilege. At most, grant only the minimum permissions required to perform the task. For more information, see [Grant least privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). +* This code is not tested in every AWS Region. For more information, see [AWS Regional Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services). + + + + +## Code examples + +### Prerequisites + +For prerequisites, see the [README](../../README.md#Prerequisites) in the `javascriptv3` folder. + + + + + +### Get started + +- [Hello Systems Manager](hello.js#L4) (`listThings`) + + +### Basics + +Code examples that show you how to perform the essential operations within a service. + +- [Learn the basics](scenarios/ssm-basics.js) + + +### Single actions + +Code excerpts that show you how to call individual service functions. + +- [CreateDocument](actions/create-document.js#L4) +- [CreateMaintenanceWindow](actions/create-maintenance-window.js#L4) +- [CreateOpsItem](actions/create-ops-item.js#L4) +- [DeleteDocument](actions/delete-document.js#L4) +- [DeleteMaintenanceWindow](actions/delete-maintenance-window.js#L4) +- [DescribeOpsItems](actions/describe-ops-items.js#L4) +- [ListCommandInvocations](actions/list-command-invocations.js#L4) +- [SendCommand](actions/send-command.js#L4) +- [UpdateMaintenanceWindow](actions/update-maintenance-window.js#L4) +- [UpdateOpsItem](actions/update-ops-item.js#L4) + + + + + +## Run the examples + +### Instructions + +**Note**: All code examples are written in ECMAscript 6 (ES6). For guidelines on converting to CommonJS, see +[JavaScript ES6/CommonJS syntax](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sdk-examples-javascript-syntax.html). + +**Run a single action** + +```bash +node ./actions/ +``` + +**Run a scenario** + +Most scenarios can be run with the following command: +```bash +node ./scenarios/ +``` + +**Run with options** + +Some actions and scenarios can be run with options from the command line: +```bash +node ./scenarios/ --option1 --option2 +``` +[util.parseArgs](https://nodejs.org/api/util.html#utilparseargsconfig) is used to configure +these options. For the specific options available to each script, see the `parseArgs` usage +for that file. + + + + +#### Hello Systems Manager + +This example shows you how to get started using Systems Manager. + +```bash +node ./hello.js +``` + +#### Learn the basics + +This example shows you how to work with Systems Manager maintenance windows, documents, and OpsItems. + + + + + + + + + + +### Tests + +⚠ Running tests might result in charges to your AWS account. + + +To find instructions for running these tests, see the [README](../../README.md#Tests) +in the `javascriptv3` folder. + + + + + + +## Additional resources + +- [Systems Manager User Guide](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) +- [Systems Manager API Reference](https://docs.aws.amazon.com/systems-manager/latest/APIReference/Welcome.html) +- [SDK for JavaScript (v3) Systems Manager reference](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/ssm) + + + + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 \ No newline at end of file diff --git a/javascriptv3/example_code/ssm/actions/create-document.js b/javascriptv3/example_code/ssm/actions/create-document.js new file mode 100644 index 00000000000..9a012c4f3e1 --- /dev/null +++ b/javascriptv3/example_code/ssm/actions/create-document.js @@ -0,0 +1,49 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.createDocument] +import { CreateDocumentCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { parseArgs } from "util"; + +/** + * Create an SSM document. + * @param {{ content: string, name: string, documentType?: DocumentType }} + */ +export const main = async ({ content, name, documentType }) => { + const client = new SSMClient({}); + try { + const { documentDescription } = await client.send( + new CreateDocumentCommand({ + Content: content, // The content for the new SSM document. The content must not exceed 64KB. + Name: name, + DocumentType: documentType, // Document format type can be JSON, YAML, or TEXT. The default format is JSON. + }), + ); + console.log("Document created successfully."); + return { DocumentDescription: documentDescription }; + } catch (caught) { + if (caught instanceof Error && caught.name === "DocumentAlreadyExists") { + console.warn(`${caught.message}. Did you provide a new document name?`); + } else { + throw caught; + } + } +}; +// snippet-end:[ssm.JavaScript.Basics.createDocument] +import { fileURLToPath } from "url"; +// Call function if run directly +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + content: { + type: "string", + }, + name: { + type: "string", + }, + documentType: { + type: "string", + }, + }; + const { values } = parseArgs({ options }); + main(values); +} diff --git a/javascriptv3/example_code/ssm/actions/create-maintenance-window.js b/javascriptv3/example_code/ssm/actions/create-maintenance-window.js new file mode 100644 index 00000000000..eea4f8a75fc --- /dev/null +++ b/javascriptv3/example_code/ssm/actions/create-maintenance-window.js @@ -0,0 +1,69 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.createMaintenanceWindow] +import { CreateMaintenanceWindowCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { parseArgs } from "util"; + +/** + * Create an SSM maintenance window. + * @param {{ name: string, allowUnassociatedTargets: boolean, duration: number, cutoff: number, schedule: string, description?: string }} + */ +export const main = async ({ + name, + allowUnassociatedTargets, // Allow the maintenance window to run on managed nodes, even if you haven't registered those nodes as targets. + duration, // The duration of the maintenance window in hours. + cutoff, // The number of hours before the end of the maintenance window that Amazon Web Services Systems Manager stops scheduling new tasks for execution. + schedule, // The schedule of the maintenance window in the form of a cron or rate expression. + description = undefined, +}) => { + const client = new SSMClient({}); + + try { + const { windowId } = await client.send( + new CreateMaintenanceWindowCommand({ + Name: name, + Description: description, + AllowUnassociatedTargets: allowUnassociatedTargets, // Allow the maintenance window to run on managed nodes, even if you haven't registered those nodes as targets. + Duration: duration, // The duration of the maintenance window in hours. + Cutoff: cutoff, // The number of hours before the end of the maintenance window that Amazon Web Services Systems Manager stops scheduling new tasks for execution. + Schedule: schedule, // The schedule of the maintenance window in the form of a cron or rate expression. + }), + ); + console.log("Maintenance window created with Id: " + windowId); + return { WindowId: windowId }; + } catch (caught) { + if (caught instanceof Error && caught.name === "MissingParameter") { + console.warn(`${caught.message}. Did you provide these values?`); + } else { + throw caught; + } + } +}; +// snippet-end:[ssm.JavaScript.Basics.createMaintenanceWindow] +import { fileURLToPath } from "url"; +// Call function if run directly +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + name: { + type: "string", + }, + allowUnassociatedTargets: { + type: "boolean", + }, + duration: { + type: "number", + }, + cutoff: { + type: "number", + }, + schedule: { + type: "string", + }, + description: { + type: "string", + }, + }; + const { values } = parseArgs({ options }); + main(values); +} diff --git a/javascriptv3/example_code/ssm/actions/create-ops-item.js b/javascriptv3/example_code/ssm/actions/create-ops-item.js new file mode 100644 index 00000000000..950d6e64934 --- /dev/null +++ b/javascriptv3/example_code/ssm/actions/create-ops-item.js @@ -0,0 +1,58 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.createOpsItem] +import { CreateOpsItemCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { parseArgs } from "util"; + +/** + * Create an SSM OpsItem. + * @param {{ title: string, source: string, category?: string, severity?: string }} + */ +export const main = async ({ + title, + source, + category = undefined, + severity = undefined, +}) => { + const client = new SSMClient({}); + try { + const { opsItemArn, opsItemId } = await client.send( + new CreateOpsItemCommand({ + Title: title, + Source: source, // The origin of the OpsItem, such as Amazon EC2 or Systems Manager. + Category: category, + Severity: severity, + }), + ); + console.log("Ops item created with id: " + opsItemId); + return { OpsItemArn: opsItemArn, OpsItemId: opsItemId }; + } catch (caught) { + if (caught instanceof Error && caught.name === "MissingParameter") { + console.warn(`${caught.message}. Did you provide these values?`); + } else { + throw caught; + } + } +}; +// snippet-end:[ssm.JavaScript.Basics.createOpsItem] +import { fileURLToPath } from "url"; +// Call function if run directly +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + title: { + type: "string", + }, + source: { + type: "string", + }, + category: { + type: "string", + }, + severity: { + type: "string", + }, + }; + const { values } = parseArgs({ options }); + main(values); +} diff --git a/javascriptv3/example_code/ssm/actions/delete-document.js b/javascriptv3/example_code/ssm/actions/delete-document.js new file mode 100644 index 00000000000..1866a6cfa72 --- /dev/null +++ b/javascriptv3/example_code/ssm/actions/delete-document.js @@ -0,0 +1,37 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.deleteDocument] +import { DeleteDocumentCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { parseArgs } from "util"; + +/** + * Delete an SSM document. + * @param {{ documentName: string }} + */ +export const main = async ({ documentName }) => { + const client = new SSMClient({}); + try { + await client.send(new DeleteDocumentCommand({ Name: documentName })); + console.log("Document '" + documentName + "' deleted."); + return { Deleted: true }; + } catch (caught) { + if (caught instanceof Error && caught.name === "MissingParameter") { + console.warn(`${caught.message}. Did you provide this value?`); + } else { + throw caught; + } + } +}; +// snippet-end:[ssm.JavaScript.Basics.deleteDocument] +import { fileURLToPath } from "url"; +// Call function if run directly +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + name: { + documentName: "string", + }, + }; + const { values } = parseArgs({ options }); + main(values); +} diff --git a/javascriptv3/example_code/ssm/actions/delete-maintenance-window.js b/javascriptv3/example_code/ssm/actions/delete-maintenance-window.js new file mode 100644 index 00000000000..209f22ce5d9 --- /dev/null +++ b/javascriptv3/example_code/ssm/actions/delete-maintenance-window.js @@ -0,0 +1,39 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.deleteMaintenanceWindow] +import { DeleteMaintenanceWindowCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { parseArgs } from "util"; + +/** + * Delete an SSM maintenance window. + * @param {{ windowId: string }} + */ +export const main = async ({ windowId }) => { + const client = new SSMClient({}); + try { + await client.send( + new DeleteMaintenanceWindowCommand({ WindowId: windowId }), + ); + console.log("Maintenance window '" + windowId + "' deleted."); + return { Deleted: true }; + } catch (caught) { + if (caught instanceof Error && caught.name === "MissingParameter") { + console.warn(`${caught.message}. Did you provide this value?`); + } else { + throw caught; + } + } +}; +// snippet-end:[ssm.JavaScript.Basics.deleteMaintenanceWindow] +import { fileURLToPath } from "url"; +// Call function if run directly +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + windowId: { + type: "string", + }, + }; + const { values } = parseArgs({ options }); + main(values); +} diff --git a/javascriptv3/example_code/ssm/actions/describe-ops-items.js b/javascriptv3/example_code/ssm/actions/describe-ops-items.js new file mode 100644 index 00000000000..a5af766a1c4 --- /dev/null +++ b/javascriptv3/example_code/ssm/actions/describe-ops-items.js @@ -0,0 +1,54 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.describeOpsItems] +import { + OpsItemFilterOperator, + OpsItemFilterKey, + paginateDescribeOpsItems, + SSMClient, +} from "@aws-sdk/client-ssm"; +import { parseArgs } from "util"; + +/** + * Describe SSM OpsItems. + * @param {{ opsItemId: string }} + */ +export const main = async ({ opsItemId }) => { + let client = new SSMClient({}); + try { + let describeOpsItemsPaginated = []; + for await (const page of paginateDescribeOpsItems( + { client }, + { + OpsItemFilters: { + Key: OpsItemFilterKey.OPSITEM_ID, + Operator: OpsItemFilterOperator.EQUAL, + Values: opsItemId, + }, + }, + )) { + describeOpsItemsPaginated.push(...page.OpsItemSummaries); + } + console.log("Here are the ops items:"); + console.log(describeOpsItemsPaginated); + return { OpsItemSummaries: describeOpsItemsPaginated }; + } catch (caught) { + if (caught instanceof Error && caught.name === "MissingParameter") { + console.warn(`${caught.message}. Did you provide this value?`); + } + throw caught; + } +}; +// snippet-end:[ssm.JavaScript.Basics.describeOpsItems] +import { fileURLToPath } from "url"; +// Call function if run directly +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + opsItemId: { + type: "string", + }, + }; + const { values } = parseArgs({ options }); + main(values); +} diff --git a/javascriptv3/example_code/ssm/actions/list-command-invocations.js b/javascriptv3/example_code/ssm/actions/list-command-invocations.js new file mode 100644 index 00000000000..779b69a0740 --- /dev/null +++ b/javascriptv3/example_code/ssm/actions/list-command-invocations.js @@ -0,0 +1,47 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.listCommandInvocations] +import { paginateListCommandInvocations, SSMClient } from "@aws-sdk/client-ssm"; +import { parseArgs } from "util"; + +/** + * List SSM command invocations on an instance. + * @param {{ instanceId: string }} + */ +export const main = async ({ instanceId }) => { + const client = new SSMClient({}); + try { + let listCommandInvocationsPaginated = []; + // The paginate function is a wrapper around the base command. + const paginator = paginateListCommandInvocations( + { client }, + { + InstanceId: instanceId, + }, + ); + for await (const page of paginator) { + listCommandInvocationsPaginated.push(...page.CommandInvocations); + } + console.log("Here is the list of command invocations:"); + console.log(listCommandInvocationsPaginated); + return { CommandInvocations: listCommandInvocationsPaginated }; + } catch (caught) { + if (caught instanceof Error && caught.name === "ValidationError") { + console.warn(`${caught.message}. Did you provide a valid instance ID?`); + } + throw caught; + } +}; +// snippet-end:[ssm.JavaScript.Basics.listCommandInvocations] +import { fileURLToPath } from "url"; +// Call function if run directly +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + instanceId: { + type: "string", + }, + }; + const { values } = parseArgs({ options }); + main(values); +} diff --git a/javascriptv3/example_code/ssm/actions/send-command.js b/javascriptv3/example_code/ssm/actions/send-command.js new file mode 100644 index 00000000000..97f1de5d1ea --- /dev/null +++ b/javascriptv3/example_code/ssm/actions/send-command.js @@ -0,0 +1,41 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.sendCommand] +import { SendCommandCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { parseArgs } from "util"; + +/** + * Send an SSM command to a managed node. + * @param {{ documentName: string }} + */ +export const main = async ({ documentName }) => { + const client = new SSMClient({}); + try { + await client.send( + new SendCommandCommand({ + DocumentName: documentName, + }), + ); + console.log("Command sent successfully."); + return { Success: true }; + } catch (caught) { + if (caught instanceof Error && caught.name === "ValidationError") { + console.warn(`${caught.message}. Did you provide a valid document name?`); + } else { + throw caught; + } + } +}; +// snippet-end:[ssm.JavaScript.Basics.sendCommand] +import { fileURLToPath } from "url"; +// Call function if run directly +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + documentName: { + type: "string", + }, + }; + const { values } = parseArgs({ options }); + main(values); +} diff --git a/javascriptv3/example_code/ssm/actions/update-maintenance-window.js b/javascriptv3/example_code/ssm/actions/update-maintenance-window.js new file mode 100644 index 00000000000..63100db2d9a --- /dev/null +++ b/javascriptv3/example_code/ssm/actions/update-maintenance-window.js @@ -0,0 +1,68 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.updateMaintenanceWindow] +import { UpdateMaintenanceWindowCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { parseArgs } from "util"; + +/** + * Update an SSM maintenance window. + * @param {{ windowId: string, allowUnassociatedTargets?: boolean, duration?: number, enabled?: boolean, name?: string, schedule?: string }} + */ +export const main = async ({ + windowId, + allowUnassociatedTargets = undefined, //Allow the maintenance window to run on managed nodes, even if you haven't registered those nodes as targets. + duration = undefined, //The duration of the maintenance window in hours. + enabled = undefined, + name = undefined, + schedule = undefined, //The schedule of the maintenance window in the form of a cron or rate expression. +}) => { + const client = new SSMClient({}); + try { + const { opsItemArn, opsItemId } = await client.send( + new UpdateMaintenanceWindowCommand({ + WindowId: windowId, + AllowUnassociatedTargets: allowUnassociatedTargets, + Duration: duration, + Enabled: enabled, + Name: name, + Schedule: schedule, + }), + ); + console.log("Maintenance window updated."); + return { OpsItemArn: opsItemArn, OpsItemId: opsItemId }; + } catch (caught) { + if (caught instanceof Error && caught.name === "ValidationError") { + console.warn(`${caught.message}. Are these values correct?`); + } else { + throw caught; + } + } +}; +// snippet-end:[ssm.JavaScript.Basics.updateMaintenanceWindow] +import { fileURLToPath } from "url"; +// Call function if run directly +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + windowId: { + type: "string", + }, + allowUnassociatedTargets: { + type: "boolean", + }, + duration: { + type: "number", + }, + enabled: { + type: "boolean", + }, + name: { + type: "string", + }, + schedule: { + type: "string", + }, + }; + const { values } = parseArgs({ options }); + main(values); +} diff --git a/javascriptv3/example_code/ssm/actions/update-ops-item.js b/javascriptv3/example_code/ssm/actions/update-ops-item.js new file mode 100644 index 00000000000..6f35fc87390 --- /dev/null +++ b/javascriptv3/example_code/ssm/actions/update-ops-item.js @@ -0,0 +1,53 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.updateOpsItem] +import { UpdateOpsItemCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { parseArgs } from "util"; + +/** + * Update an SSM OpsItem. + * @param {{ opsItemId: string, status?: OpsItemStatus }} + */ +export const main = async ({ + opsItemId, + status = undefined, // The OpsItem status. Status can be Open, In Progress, or Resolved +}) => { + const client = new SSMClient({}); + try { + await client.send( + new UpdateOpsItemCommand({ + OpsItemId: opsItemId, + Status: status, + }), + ); + console.log("Ops item updated."); + return { Success: true }; + } catch (caught) { + if ( + caught instanceof Error && + caught.name === "OpsItemLimitExceededException" + ) { + console.warn( + `Couldn't create ops item because you have exceeded your open OpsItem limit. ${caught.message}.`, + ); + } else { + throw caught; + } + } +}; +// snippet-end:[ssm.JavaScript.Basics.updateOpsItem] +import { fileURLToPath } from "url"; +// Call function if run directly +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const options = { + opsItemId: { + type: "string", + }, + status: { + type: "OpsItemStatus", + }, + }; + const { values } = parseArgs({ options }); + main(values); +} diff --git a/javascriptv3/example_code/ssm/hello.js b/javascriptv3/example_code/ssm/hello.js new file mode 100644 index 00000000000..e01ac718481 --- /dev/null +++ b/javascriptv3/example_code/ssm/hello.js @@ -0,0 +1,34 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.hello] +import { paginateListDocuments, SSMClient } from "@aws-sdk/client-ssm"; + +// Call ListDocuments and display the result. +export const main = async () => { + const client = new SSMClient(); + let listDocumentsPaginated = []; + console.log( + "Hello, AWS Systems Manager! Let's list some of your documents:\n", + ); + try { + // The paginate function is a wrapper around the base command. + const paginator = paginateListDocuments({ client }, { MaxResults: 5 }); + for await (const page of paginator) { + listDocumentsPaginated.push(...page.DocumentIdentifiers); + } + } catch (caught) { + console.error(`There was a problem saying hello: ${caught.message}`); + throw caught; + } + listDocumentsPaginated.forEach(({ Name, DocumentFormat, CreatedDate }) => { + console.log(`${Name} - ${DocumentFormat} - ${CreatedDate}`); + }); +}; + +// Call function if run directly. +import { fileURLToPath } from "url"; +if (process.argv[1] === fileURLToPath(import.meta.url)) { + main(); +} +// snippet-end:[ssm.JavaScript.Basics.hello] diff --git a/javascriptv3/example_code/ssm/package.json b/javascriptv3/example_code/ssm/package.json new file mode 100644 index 00000000000..18c56b56074 --- /dev/null +++ b/javascriptv3/example_code/ssm/package.json @@ -0,0 +1,19 @@ +{ + "name": "@aws-doc-sdk-examples/example-javascriptv3-ssm", + "version": "1.0.0", + "type": "module", + "directories": { + "test": "tests" + }, + "scripts": { + "test": "vitest run **/*.unit.test.js", + "integration-test": "vitest run **/*.integration.test.js --reporter=junit --outputFile=test_results/$npm_package_name.junit.xml" + }, + "author": "beqqrry@amazon.com", + "license": "ISC", + "description": "", + "dependencies": { + "@aws-doc-sdk-examples/lib": "^1.0.0", + "@aws-sdk/client-ssm": "^3.614.0" + } +} diff --git a/javascriptv3/example_code/ssm/scenarios/ssm-basics.js b/javascriptv3/example_code/ssm/scenarios/ssm-basics.js new file mode 100644 index 00000000000..e5a0ae3ed1c --- /dev/null +++ b/javascriptv3/example_code/ssm/scenarios/ssm-basics.js @@ -0,0 +1,534 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[ssm.JavaScript.Basics.scenario] +import { + Scenario, + ScenarioAction, + ScenarioInput, + ScenarioOutput, + //} from "@aws-doc-sdk-examples/lib/scenario/index.js"; +} from "../../libs/scenario/index.js"; +import { fileURLToPath } from "url"; +import { + CreateDocumentCommand, + CreateMaintenanceWindowCommand, + CreateOpsItemCommand, + DeleteDocumentCommand, + DeleteMaintenanceWindowCommand, + DeleteOpsItemCommand, + DescribeOpsItemsCommand, + DocumentAlreadyExists, + OpsItemStatus, + waitUntilCommandExecuted, + CancelCommandCommand, + paginateListCommandInvocations, + SendCommandCommand, + UpdateMaintenanceWindowCommand, + UpdateOpsItemCommand, + SSMClient, +} from "@aws-sdk/client-ssm"; +import { parseArgs } from "node:util"; + +/** + * @typedef {{ + * ssmClient: import('@aws-sdk/client-ssm').SSMClient, + * documentName?: string + * maintenanceWindow?: string + * winId?: int + * ec2InstanceId?: string + * requestedDateTime?: Date + * opsItemId?: string + * askToDeleteResources?: boolean + * }} State + */ + +const defaultMaintenanceWindow = "ssm-maintenance-window"; +const defaultDocumentName = "ssmdocument"; +// The timeout duration is highly dependent on the specific setup and environment necessary. This example handles only the most common error cases, and uses a much shorter duration than most productions systems would use. +const COMMAND_TIMEOUT_DURATION_SECONDS = 30; // 30 seconds + +const pressEnter = new ScenarioInput("continue", "Press Enter to continue", { + type: "confirm", +}); + +const greet = new ScenarioOutput( + "greet", + `Welcome to the AWS Systems Manager SDK Getting Started scenario. + This program demonstrates how to interact with Systems Manager using the AWS SDK for JavaScript V3. + Systems Manager is the operations hub for your AWS applications and resources and a secure end-to-end management solution. + The program's primary functions include creating a maintenance window, creating a document, sending a command to a document, + listing documents, listing commands, creating an OpsItem, modifying an OpsItem, and deleting Systems Manager resources. + Upon completion of the program, all AWS resources are cleaned up. + Let's get started...`, + { header: true }, +); + +const createMaintenanceWindow = new ScenarioOutput( + "createMaintenanceWindow", + `Step 1: Create a Systems Manager maintenance window.`, +); + +const getMaintenanceWindow = new ScenarioInput( + "maintenanceWindow", + "Please enter the maintenance window name:", + { type: "input", default: defaultMaintenanceWindow }, +); + +export const sdkCreateMaintenanceWindow = new ScenarioAction( + "sdkCreateMaintenanceWindow", + async (/** @type {State} */ state) => { + try { + const response = await state.ssmClient.send( + new CreateMaintenanceWindowCommand({ + Name: state.maintenanceWindow, + Schedule: "cron(0 10 ? * MON-FRI *)", //The schedule of the maintenance window in the form of a cron or rate expression. + Duration: 2, //The duration of the maintenance window in hours. + Cutoff: 1, //The number of hours before the end of the maintenance window that Amazon Web Services Systems Manager stops scheduling new tasks for execution. + AllowUnassociatedTargets: true, //Allow the maintenance window to run on managed nodes, even if you haven't registered those nodes as targets. + }), + ); + state.winId = response.WindowId; + } catch (caught) { + console.error(caught.message); + console.log( + `An error occurred while creating the maintenance window. Please fix the error and try again. Error message: ${caught.message}`, + ); + throw caught; + } + }, +); + +const modifyMaintenanceWindow = new ScenarioOutput( + "modifyMaintenanceWindow", + `Modify the maintenance window by changing the schedule.`, +); + +const sdkModifyMaintenanceWindow = new ScenarioAction( + "sdkModifyMaintenanceWindow", + async (/** @type {State} */ state) => { + try { + await state.ssmClient.send( + new UpdateMaintenanceWindowCommand({ + WindowId: state.winId, + Schedule: "cron(0 0 ? * MON *)", + }), + ); + } catch (caught) { + console.error(caught.message); + console.log( + `An error occurred while modifying the maintenance window. Please fix the error and try again. Error message: ${caught.message}`, + ); + throw caught; + } + }, +); + +const createSystemsManagerActions = new ScenarioOutput( + "createSystemsManagerActions", + `Create a document that defines the actions that Systems Manager performs on your EC2 instance.`, +); + +const getDocumentName = new ScenarioInput( + "documentName", + "Please enter the document: ", + { type: "input", default: defaultDocumentName }, +); + +const sdkCreateSSMDoc = new ScenarioAction( + "sdkCreateSSMDoc", + async (/** @type {State} */ state) => { + const contentData = `{ + "schemaVersion": "2.2", + "description": "Run a simple shell command", + "mainSteps": [ + { + "action": "aws:runShellScript", + "name": "runEchoCommand", + "inputs": { + "runCommand": [ + "echo 'Hello, world!'" + ] + } + } + ] + }`; + try { + await state.ssmClient.send( + new CreateDocumentCommand({ + Content: contentData, + Name: state.documentName, + DocumentType: "Command", + }), + ); + } catch (caught) { + console.log("Exception type: (" + typeof e + ")"); + if (caught instanceof DocumentAlreadyExists) { + console.log("Document already exists. Continuing...\n"); + } else { + console.error(caught.message); + console.log( + `An error occurred while creating the document. Please fix the error and try again. Error message: ${caught.message}`, + ); + throw caught; + } + } + }, +); + +const ec2HelloWorld = new ScenarioOutput( + "ec2HelloWorld", + `Now you have the option of running a command on an EC2 instance that echoes 'Hello, world!'. In order to run this command, you must provide the instance ID of a Linux EC2 instance. If you do not already have a running Linux EC2 instance in your account, you can create one using the AWS console. For information about creating an EC2 instance, see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html.`, +); + +const enterIdOrSkipEC2HelloWorld = new ScenarioInput( + "enterIdOrSkipEC2HelloWorld", + "Enter your EC2 InstanceId or press enter to skip this step: ", + { type: "input", default: "" }, +); + +const sdkEC2HelloWorld = new ScenarioAction( + "sdkEC2HelloWorld", + async (/** @type {State} */ state) => { + try { + const response = await state.ssmClient.send( + new SendCommandCommand({ + DocumentName: state.documentName, + InstanceIds: [state.ec2InstanceId], + TimeoutSeconds: COMMAND_TIMEOUT_DURATION_SECONDS, + }), + ); + state.CommandId = response.Command.CommandId; + } catch (caught) { + console.error(caught.message); + console.log( + `An error occurred while sending the command. Please fix the error and try again. Error message: ${caught.message}`, + ); + throw caught; + } + }, + { + skipWhen: (/** @type {State} */ state) => + state.enterIdOrSkipEC2HelloWorld === "", + }, +); + +const sdkGetCommandTime = new ScenarioAction( + "sdkGetCommandTime", + async (/** @type {State} */ state) => { + let listInvocationsPaginated = []; + console.log( + "Let's get the time when the specific command was sent to the specific managed node.", + ); + + console.log( + `First, we'll wait for the command to finish executing. This may take up to ${COMMAND_TIMEOUT_DURATION_SECONDS} seconds.`, + ); + const commandExecutedResult = waitUntilCommandExecuted( + { client: state.ssmClient }, + { + CommandId: state.CommandId, + InstanceId: state.ec2InstanceId, + }, + ); + // This is necessary because the TimeoutSeconds of SendCommandCommand is only for the delivery, not execution. + try { + await new Promise((_, reject) => + setTimeout( + reject, + COMMAND_TIMEOUT_DURATION_SECONDS * 1000, + new Error("Command Timed Out"), + ), + ); + } catch (caught) { + if (caught.message == "Command Timed Out") { + commandExecutedResult.state = "TIMED_OUT"; + } else { + throw caught; + } + } + + if (commandExecutedResult.state != "SUCCESS") { + console.log( + `The command with id: ${state.CommandId} did not execute in the allotted time. Canceling command.`, + ); + state.ssmClient.send( + new CancelCommandCommand({ + CommandId: state.CommandId, + }), + ); + state.enterIdOrSkipEC2HelloWorld === ""; + return; + } + + for await (const page of paginateListCommandInvocations( + { client: state.ssmClient }, + { CommandId: state.CommandId }, + )) { + listInvocationsPaginated.push(...page.CommandInvocations); + } + /** + * @type {import('@aws-sdk/client-ssm').CommandInvocation} + */ + const commandInvocation = listInvocationsPaginated.shift(); // Because the call was made with CommandId, there's only one result, so shift it off. + state.requestedDateTime = commandInvocation.RequestedDateTime; + + console.log( + `The command invocation happened at: ${state.requestedDateTime}.`, + ); + }, + { + skipWhen: (/** @type {State} */ state) => + state.enterIdOrSkipEC2HelloWorld === "", + }, +); + +const createSSMOpsItem = new ScenarioOutput( + "createSSMOpsItem", + `Now we will create a Systems Manager OpsItem. An OpsItem is a feature provided by the Systems Manager service. It is a type of operational data item that allows you to manage and track various operational issues, events, or tasks within your AWS environment. +You can create OpsItems to track and manage operational issues as they arise. For example, you could create an OpsItem whenever your application detects a critical error or an anomaly in your infrastructure.`, +); + +const sdkCreateSSMOpsItem = new ScenarioAction( + "sdkCreateSSMOpsItem", + async (/** @type {State} */ state) => { + try { + const response = await state.ssmClient.send( + new CreateOpsItemCommand({ + Description: "Created by the System Manager Javascript API", + Title: "Disk Space Alert", + Source: "EC2", + Category: "Performance", + Severity: "2", + }), + ); + state.opsItemId = response.OpsItemId; + } catch (caught) { + console.error(caught.message); + console.log( + `An error occurred while creating the ops item. Please fix the error and try again. Error message: ${caught.message}`, + ); + throw caught; + } + }, +); + +const updateOpsItem = new ScenarioOutput( + "updateOpsItem", + (/** @type {State} */ state) => + "Now we will update the OpsItem: " + state.opsItemId, +); + +const sdkUpdateOpsItem = new ScenarioAction( + "sdkUpdateOpsItem", + async (/** @type {State} */ state) => { + try { + const _response = await state.ssmClient.send( + new UpdateOpsItemCommand({ + OpsItemId: state.opsItemId, + Description: "An update to " + state.opsItemId, + }), + ); + } catch (caught) { + console.error(caught.message); + console.log( + `An error occurred while updating the ops item. Please fix the error and try again. Error message: ${caught.message}`, + ); + throw caught; + } + }, +); + +const getOpsItemStatus = new ScenarioOutput( + "getOpsItemStatus", + (/** @type {State} */ state) => + "Now we will get the status of the OpsItem: " + state.opsItemId, +); + +const sdkOpsItemStatus = new ScenarioAction( + "sdkGetOpsItemStatus", + async (/** @type {State} */ state) => { + try { + const response = await state.ssmClient.send( + new DescribeOpsItemsCommand({ + OpsItemId: state.opsItemId, + }), + ); + state.opsItemStatus = response.OpsItemStatus; + } catch (caught) { + console.error(caught.message); + console.log( + `An error occurred while describing the ops item. Please fix the error and try again. Error message: ${caught.message}`, + ); + throw caught; + } + }, +); + +const resolveOpsItem = new ScenarioOutput( + "resolveOpsItem", + (/** @type {State} */ state) => + "Now we will resolve the OpsItem: " + state.opsItemId, +); + +const sdkResolveOpsItem = new ScenarioAction( + "sdkResolveOpsItem", + async (/** @type {State} */ state) => { + try { + const _response = await state.ssmClient.send( + new UpdateOpsItemCommand({ + OpsItemId: state.opsItemId, + Status: OpsItemStatus.RESOLVED, + }), + ); + } catch (caught) { + console.error(caught.message); + console.log( + `An error occurred while updating the ops item. Please fix the error and try again. Error message: ${caught.message}`, + ); + throw caught; + } + }, +); + +const askToDeleteResources = new ScenarioInput( + "askToDeleteResources", + "Would you like to delete the Systems Manager resources created during this example run?", + { type: "confirm" }, +); + +const confirmDeleteChoice = new ScenarioOutput( + "confirmDeleteChoice", + (/** @type {State} */ state) => { + if (state.askToDeleteResources) { + return "You chose to delete the resources."; + } + return "The Systems Manager resources will not be deleted. Please delete them manually to avoid charges."; + }, +); + +export const sdkDeleteResources = new ScenarioAction( + "sdkDeleteResources", + async (/** @type {State} */ state) => { + try { + await state.ssmClient.send( + new DeleteOpsItemCommand({ + OpsItemId: state.opsItemId, + }), + ); + console.log( + "The ops item: " + state.opsItemId + " was successfully deleted.", + ); + } catch (caught) { + console.log( + "There was a problem deleting the ops item: " + + state.opsItemId + + ". Please delete it manually. Error: " + + caught.message, + ); + } + + try { + await state.ssmClient.send( + new DeleteMaintenanceWindowCommand({ + Name: state.maintenanceWindow, + WindowId: state.winId, + }), + ); + console.log( + "The maintenance window: " + + state.maintenanceWindow + + " was successfully deleted.", + ); + } catch (caught) { + console.log( + "There was a problem deleting the maintenance window: " + + state.opsItemId + + ". Please delete it manually. Error: " + + caught.message, + ); + } + + try { + await state.ssmClient.send( + new DeleteDocumentCommand({ + Name: state.documentName, + }), + ); + console.log( + "The document: " + state.documentName + " was successfully deleted.", + ); + } catch (caught) { + console.log( + "There was a problem deleting the document: " + + state.documentName + + ". Please delete it manually. Error: " + + caught.message, + ); + } + }, + { skipWhen: (/** @type {{}} */ state) => !state.askToDeleteResources }, +); + +const goodbye = new ScenarioOutput( + "goodbye", + "This concludes the Systems Manager Basics scenario for the AWS Javascript SDK v3. Thank you!", +); + +const myScenario = new Scenario( + "SSM Basics", + [ + greet, + pressEnter, + createMaintenanceWindow, + getMaintenanceWindow, + sdkCreateMaintenanceWindow, + modifyMaintenanceWindow, + pressEnter, + sdkModifyMaintenanceWindow, + createSystemsManagerActions, + getDocumentName, + sdkCreateSSMDoc, + ec2HelloWorld, + enterIdOrSkipEC2HelloWorld, + sdkEC2HelloWorld, + sdkGetCommandTime, + pressEnter, + createSSMOpsItem, + pressEnter, + sdkCreateSSMOpsItem, + updateOpsItem, + pressEnter, + sdkUpdateOpsItem, + getOpsItemStatus, + pressEnter, + sdkOpsItemStatus, + resolveOpsItem, + pressEnter, + sdkResolveOpsItem, + askToDeleteResources, + confirmDeleteChoice, + sdkDeleteResources, + goodbye, + ], + { ssmClient: new SSMClient({}) }, +); + +/** @type {{ stepHandlerOptions: StepHandlerOptions }} */ +export const main = async (stepHandlerOptions) => { + await myScenario.run(stepHandlerOptions); +}; + +// Invoke main function if this file was run directly. +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const { values } = parseArgs({ + options: { + yes: { + type: "boolean", + short: "y", + }, + }, + }); + main({ confirmAll: values.yes }); +} +// snippet-end:[ssm.JavaScript.Basics.scenario] diff --git a/javascriptv3/example_code/ssm/tests/create-document.unit.test.js b/javascriptv3/example_code/ssm/tests/create-document.unit.test.js new file mode 100644 index 00000000000..0b0f289331d --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/create-document.unit.test.js @@ -0,0 +1,67 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { CreateDocumentCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { main } from "../actions/create-document.js"; + +describe("createDocument", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should create a new document successfully", async () => { + const mockDocumentDescription = { Name: "test-document" }; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockResolvedValueOnce({ + documentDescription: mockDocumentDescription, + }); + + const result = await main({ + content: "document content", + name: "test-document", + documentType: "Command", + }); + + expect(sendMock).toHaveBeenCalledWith(expect.any(CreateDocumentCommand)); + expect(result.DocumentDescription).toEqual(mockDocumentDescription); + }); + + it("should handle DocumentAlreadyExists error", async () => { + const mockError = new Error("Document already exists"); + mockError.name = "DocumentAlreadyExists"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + const consoleWarnSpy = vi.spyOn(console, "warn"); + + await main({ + content: "document content", + name: "test-document", + documentType: "Command", + }); + + expect(sendMock).toHaveBeenCalledWith(expect.any(CreateDocumentCommand)); + expect(consoleWarnSpy).toHaveBeenCalledWith( + `${mockError.message}. Did you provide a new document name?`, + ); + }); + + it("should throw any other errors", async () => { + const mockError = new Error("Something went wrong"); + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + + await expect( + main({ + content: "document content", + name: "test-document", + documentType: "Command", + }), + ).rejects.toThrow(mockError); + + expect(sendMock).toHaveBeenCalledWith(expect.any(CreateDocumentCommand)); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/create-maintenance-window.unit.test.js b/javascriptv3/example_code/ssm/tests/create-maintenance-window.unit.test.js new file mode 100644 index 00000000000..21345070f32 --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/create-maintenance-window.unit.test.js @@ -0,0 +1,92 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { CreateMaintenanceWindowCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { main } from "../actions/create-maintenance-window.js"; + +describe("createMaintenanceWindow", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should create a new maintenance window successfully", async () => { + const mockWindowId = "test-window-id"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockResolvedValueOnce({ + windowId: mockWindowId, + }); + + const result = await main({ + name: "test-window", + description: "Test maintenance window", + allowUnassociatedTargets: true, + duration: 2, + cutoff: 1, + schedule: "cron(0 0 ? * MON *)", + }); + + expect(sendMock).toHaveBeenCalledWith( + expect.any(CreateMaintenanceWindowCommand), + ); + expect(sendMock).toHaveBeenCalledWith( + expect.objectContaining({ + input: { + Name: "test-window", + Description: "Test maintenance window", + AllowUnassociatedTargets: true, + Duration: 2, + Cutoff: 1, + Schedule: "cron(0 0 ? * MON *)", + }, + }), + ); + expect(result.WindowId).toEqual(mockWindowId); + }); + + it("should handle MissingParameter error", async () => { + const mockError = new Error("MissingParameter: Some parameter is missing."); + mockError.name = "MissingParameter"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + const consoleWarnSpy = vi.spyOn(console, "warn"); + + await main({ + name: "test-window", + allowUnassociatedTargets: true, + duration: 2, + cutoff: 1, + schedule: "cron(0 0 ? * MON *)", + }); + + expect(sendMock).toHaveBeenCalledWith( + expect.any(CreateMaintenanceWindowCommand), + ); + expect(consoleWarnSpy).toHaveBeenCalledWith( + `${mockError.message}. Did you provide these values?`, + ); + }); + + it("should throw any other errors", async () => { + const mockError = new Error("Something went wrong"); + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + + await expect( + main({ + name: "test-window", + allowUnassociatedTargets: true, + duration: 2, + cutoff: 1, + schedule: "cron(0 0 ? * MON *)", + }), + ).rejects.toThrow(mockError); + + expect(sendMock).toHaveBeenCalledWith( + expect.any(CreateMaintenanceWindowCommand), + ); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/create-ops-item.unit.test.js b/javascriptv3/example_code/ssm/tests/create-ops-item.unit.test.js new file mode 100644 index 00000000000..4f29c9b72f2 --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/create-ops-item.unit.test.js @@ -0,0 +1,83 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { CreateOpsItemCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { main } from "../actions/create-ops-item.js"; + +describe("createOpsItem", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should create a new OpsItem successfully", async () => { + const mockOpsItemArn = "arn:aws:ssm:us-west-2:123456789012:opsitem/123"; + const mockOpsItemId = "123"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockResolvedValueOnce({ + opsItemArn: mockOpsItemArn, + opsItemId: mockOpsItemId, + }); + + const result = await main({ + title: "Test OpsItem", + source: "test-service", + category: "Troubleshooting", + severity: "2", + }); + + expect(sendMock).toHaveBeenCalledWith(expect.any(CreateOpsItemCommand)); + expect(sendMock).toHaveBeenCalledWith( + expect.objectContaining({ + input: { + Title: "Test OpsItem", + Source: "test-service", + Category: "Troubleshooting", + Severity: "2", + }, + }), + ); + expect(result).toEqual({ + OpsItemArn: mockOpsItemArn, + OpsItemId: mockOpsItemId, + }); + }); + + it("should handle MissingParameter error", async () => { + const mockError = new Error("MissingParameter: Some parameter is missing."); + mockError.name = "MissingParameter"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + const consoleWarnSpy = vi.spyOn(console, "warn"); + + await main({ + title: "Test OpsItem", + source: "test-service", + }); + + expect(sendMock).toHaveBeenCalledWith(expect.any(CreateOpsItemCommand)); + expect(consoleWarnSpy).toHaveBeenCalledWith( + `${mockError.message}. Did you provide these values?`, + ); + }); + + it("should throw any other errors", async () => { + const mockError = new Error("Something went wrong"); + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + + await expect( + main({ + title: "Test OpsItem", + source: "test-service", + category: "Troubleshooting", + severity: "2", + }), + ).rejects.toThrow(mockError); + + expect(sendMock).toHaveBeenCalledWith(expect.any(CreateOpsItemCommand)); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/delete-document.unit.test.js b/javascriptv3/example_code/ssm/tests/delete-document.unit.test.js new file mode 100644 index 00000000000..1d3484adff3 --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/delete-document.unit.test.js @@ -0,0 +1,54 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { DeleteDocumentCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { main } from "../actions/delete-document.js"; + +describe("deleteDocument", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should delete a document successfully", async () => { + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockResolvedValueOnce({}); + + const result = await main({ + documentName: "test-document", + }); + + expect(sendMock).toHaveBeenCalledWith(expect.any(DeleteDocumentCommand)); + expect(result).toEqual({ Deleted: true }); + }); + + it("should handle MissingParameter error", async () => { + const mockError = new Error("MissingParameter: Some parameter is missing."); + mockError.name = "MissingParameter"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + const consoleWarnSpy = vi.spyOn(console, "warn"); + + await main({}); + + expect(sendMock).toHaveBeenCalledWith(expect.any(DeleteDocumentCommand)); + expect(consoleWarnSpy).toHaveBeenCalledWith( + `${mockError.message}. Did you provide this value?`, + ); + }); + + it("should throw any other errors", async () => { + const mockError = new Error("Something went wrong"); + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + + await expect(main({ documentName: "test-document" })).rejects.toThrow( + mockError, + ); + + expect(sendMock).toHaveBeenCalledWith(expect.any(DeleteDocumentCommand)); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/delete-maintenance-window.unit.test.js b/javascriptv3/example_code/ssm/tests/delete-maintenance-window.unit.test.js new file mode 100644 index 00000000000..860db859e33 --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/delete-maintenance-window.unit.test.js @@ -0,0 +1,65 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { DeleteMaintenanceWindowCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { main } from "../actions/delete-maintenance-window.js"; + +describe("deleteMaintenanceWindow", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should delete a maintenance window successfully", async () => { + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockResolvedValueOnce({}); + + const result = await main({ windowId: "test-window-id" }); + + expect(sendMock).toHaveBeenCalledWith( + expect.any(DeleteMaintenanceWindowCommand), + ); + expect(sendMock).toHaveBeenCalledWith( + expect.objectContaining({ + input: { + WindowId: "test-window-id", + }, + }), + ); + expect(result).toEqual({ Deleted: true }); + }); + + it("should handle MissingParameter error", async () => { + const mockError = new Error("MissingParameter: Some parameter is missing."); + mockError.name = "MissingParameter"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + const consoleWarnSpy = vi.spyOn(console, "warn"); + + await main({}); + + expect(sendMock).toHaveBeenCalledWith( + expect.any(DeleteMaintenanceWindowCommand), + ); + expect(consoleWarnSpy).toHaveBeenCalledWith( + `${mockError.message}. Did you provide this value?`, + ); + }); + + it("should throw any other errors", async () => { + const mockError = new Error("Something went wrong"); + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + + await expect(main({ windowId: "test-window-id" })).rejects.toThrow( + mockError, + ); + + expect(sendMock).toHaveBeenCalledWith( + expect.any(DeleteMaintenanceWindowCommand), + ); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/describe-ops-items.unit.test.js b/javascriptv3/example_code/ssm/tests/describe-ops-items.unit.test.js new file mode 100644 index 00000000000..b3f86a9d61b --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/describe-ops-items.unit.test.js @@ -0,0 +1,69 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; + +const paginateDescribeOpsItems = vi.fn(); + +vi.doMock("@aws-sdk/client-ssm", async () => { + const actual = await vi.importActual("@aws-sdk/client-ssm"); + return { + ...actual, + paginateDescribeOpsItems, + }; +}); + +const { main } = await import("../actions/describe-ops-items.js"); + +describe("describeOpsItems", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should describe OpsItems successfully", async () => { + const mockOpsItemSummaries = [ + { OpsItemId: "123", Title: "Test OpsItem" }, + { OpsItemId: "456", Title: "Another OpsItem" }, + ]; + + paginateDescribeOpsItems.mockImplementationOnce(async function* () { + yield { OpsItemSummaries: mockOpsItemSummaries }; + }); + + const result = await main({ opsItemId: "123" }); + + expect(result.OpsItemSummaries).toEqual(mockOpsItemSummaries); + }); + + it("should handle MissingParameter error", async () => { + const mockError = new Error("MissingParameter: Some parameter is missing."); + mockError.name = "MissingParameter"; + + paginateDescribeOpsItems.mockReturnValueOnce( + // eslint-disable-next-line require-yield + (async function* () { + throw mockError; + })(), + ); + + const consoleWarnSpy = vi.spyOn(console, "warn"); + + await expect(main({})).rejects.toThrow(mockError); + + expect(consoleWarnSpy).toHaveBeenCalledWith( + `${mockError.message}. Did you provide this value?`, + ); + }); + + it("should throw any other errors", async () => { + const mockError = new Error("Something went wrong"); + paginateDescribeOpsItems.mockReturnValueOnce( + // eslint-disable-next-line require-yield + (async function* () { + throw mockError; + })(), + ); + + await expect(main({})).rejects.toThrow(mockError); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/hello.unit.test.js b/javascriptv3/example_code/ssm/tests/hello.unit.test.js new file mode 100644 index 00000000000..fb08307fc76 --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/hello.unit.test.js @@ -0,0 +1,67 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; + +const paginateListDocuments = vi.fn(); + +vi.doMock("@aws-sdk/client-ssm", async () => { + const actual = await vi.importActual("@aws-sdk/client-ssm"); + return { + ...actual, + paginateListDocuments, + }; +}); + +const { main } = await import("../hello.js"); + +describe("hello", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should list some documents", async () => { + const message = + "Hello, AWS Systems Manager! Let's list some of your documents:\n"; + const docList = [ + `test-doc-1 - testFormat - testDate`, + `test-doc-2 - testFormat - testDate`, + ]; + + const mockListDocuments = [ + { + Name: "test-doc-1", + DocumentFormat: "testFormat", + CreatedDate: "testDate", + }, + { + Name: "test-doc-2", + DocumentFormat: "testFormat", + CreatedDate: "testDate", + }, + ]; + const consoleSpy = vi.spyOn(console, "log"); + + paginateListDocuments.mockImplementationOnce(async function* () { + yield { DocumentIdentifiers: mockListDocuments }; + }); + + await main(); + + expect(consoleSpy).toHaveBeenCalledWith(message); + expect(consoleSpy).toHaveBeenCalledWith(docList[0]); + expect(consoleSpy).toHaveBeenCalledWith(docList[1]); + }); + + it("should throw any errors", async () => { + const mockError = new Error("Something went wrong"); + paginateListDocuments.mockReturnValueOnce( + // eslint-disable-next-line require-yield + (async function* () { + throw mockError; + })(), + ); + + await expect(main({})).rejects.toThrow(mockError); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/list-command-invocations.unit.test.js b/javascriptv3/example_code/ssm/tests/list-command-invocations.unit.test.js new file mode 100644 index 00000000000..6309f9eea59 --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/list-command-invocations.unit.test.js @@ -0,0 +1,74 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; + +const paginateListCommandInvocationsMock = vi.fn(); + +vi.doMock("@aws-sdk/client-ssm", async () => { + const actual = await vi.importActual("@aws-sdk/client-ssm"); + return { + ...actual, + paginateListCommandInvocations: paginateListCommandInvocationsMock, + }; +}); + +const { main } = await import("../actions/list-command-invocations.js"); + +describe("listCommandInvocations", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should list command invocations successfully", async () => { + const mockCommandInvocations = [ + { CommandId: "123", InstanceId: "i-12345678" }, + { CommandId: "456", InstanceId: "i-98765432" }, + ]; + + paginateListCommandInvocationsMock.mockImplementationOnce( + async function* () { + yield { CommandInvocations: mockCommandInvocations }; + }, + ); + + const result = await main({ instanceId: "i-12345678" }); + + expect(result.CommandInvocations).toEqual(mockCommandInvocations); + }); + + it("should handle ValidationError", async () => { + const mockError = new Error("ValidationError: Invalid instance ID."); + mockError.name = "ValidationError"; + + const consoleWarnSpy = vi.spyOn(console, "warn"); + + paginateListCommandInvocationsMock.mockReturnValueOnce( + // eslint-disable-next-line require-yield + (async function* () { + throw mockError; + })(), + ); + + await expect(main({ instanceId: "invalid-instance-id" })).rejects.toThrow( + mockError, + ); + + expect(consoleWarnSpy).toHaveBeenCalledWith( + `${mockError.message}. Did you provide a valid instance ID?`, + ); + }); + + it("should throw any other errors", async () => { + const mockError = new Error("Something went wrong"); + + paginateListCommandInvocationsMock.mockReturnValueOnce( + // eslint-disable-next-line require-yield + (async function* () { + throw mockError; + })(), + ); + + await expect(main({})).rejects.toThrow(mockError); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/send-command.unit.test.js b/javascriptv3/example_code/ssm/tests/send-command.unit.test.js new file mode 100644 index 00000000000..d90d4197ed9 --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/send-command.unit.test.js @@ -0,0 +1,59 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { SendCommandCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { main } from "../actions/send-command.js"; + +describe("sendCommand", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should send a command successfully", async () => { + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockResolvedValueOnce({}); + + const result = await main({ documentName: "valid-document" }); + + expect(sendMock).toHaveBeenCalledWith(expect.any(SendCommandCommand)); + expect(sendMock).toHaveBeenCalledWith( + expect.objectContaining({ + input: { + DocumentName: "valid-document", + }, + }), + ); + expect(result).toEqual({ Success: true }); + }); + + it("should handle ValidationError", async () => { + const mockError = new Error("ValidationError: Invalid document name."); + mockError.name = "ValidationError"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + const consoleWarnSpy = vi.spyOn(console, "warn"); + + await main({ documentName: "invalid-document" }); + + expect(sendMock).toHaveBeenCalledWith(expect.any(SendCommandCommand)); + expect(consoleWarnSpy).toHaveBeenCalledWith( + `${mockError.message}. Did you provide a valid document name?`, + ); + }); + + it("should throw any other errors", async () => { + const mockError = new Error("Something went wrong"); + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + + await expect(main({ documentName: "valid-document" })).rejects.toThrow( + mockError, + ); + + expect(sendMock).toHaveBeenCalledWith(expect.any(SendCommandCommand)); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/ssm-basics.integration.test.js b/javascriptv3/example_code/ssm/tests/ssm-basics.integration.test.js new file mode 100644 index 00000000000..7c56efebb86 --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/ssm-basics.integration.test.js @@ -0,0 +1,11 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it } from "vitest"; +import { main } from "../scenarios/ssm-basics.js"; + +describe("basic scenario", () => { + it("should run without error", async () => { + await main({ confirmAll: true }); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/update-maintenance-window.unit.test.js b/javascriptv3/example_code/ssm/tests/update-maintenance-window.unit.test.js new file mode 100644 index 00000000000..40a6678a68e --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/update-maintenance-window.unit.test.js @@ -0,0 +1,101 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { UpdateMaintenanceWindowCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { main } from "../actions/update-maintenance-window.js"; + +describe("updateMaintenanceWindow", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should update a maintenance window successfully", async () => { + const mockOpsItemArn = "arn:aws:ssm:us-west-2:123456789012:opsitem/123"; + const mockOpsItemId = "123"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockResolvedValueOnce({ + opsItemArn: mockOpsItemArn, + opsItemId: mockOpsItemId, + }); + + const result = await main({ + windowId: "test-window-id", + allowUnassociatedTargets: true, + duration: 2, + enabled: true, + name: "updated-test-window", + schedule: "cron(0 0 ? * MON *)", + }); + + expect(sendMock).toHaveBeenCalledWith( + expect.any(UpdateMaintenanceWindowCommand), + ); + expect(sendMock).toHaveBeenCalledWith( + expect.objectContaining({ + input: { + WindowId: "test-window-id", + AllowUnassociatedTargets: true, + Duration: 2, + Enabled: true, + Name: "updated-test-window", + Schedule: "cron(0 0 ? * MON *)", + }, + }), + ); + expect(result).toEqual({ + OpsItemArn: mockOpsItemArn, + OpsItemId: mockOpsItemId, + }); + }); + + it("should handle ValidationError", async () => { + const mockError = new Error( + "ValidationError: Invalid maintenance window parameters.", + ); + mockError.name = "ValidationError"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + const consoleWarnSpy = vi.spyOn(console, "warn"); + + await main({ + windowId: "test-window-id", + allowUnassociatedTargets: true, + duration: 2, + enabled: true, + name: "updated-test-window", + schedule: "invalid-schedule", + }); + + expect(sendMock).toHaveBeenCalledWith( + expect.any(UpdateMaintenanceWindowCommand), + ); + expect(consoleWarnSpy).toHaveBeenCalledWith( + `${mockError.message}. Are these values correct?`, + ); + }); + + it("should throw any other errors", async () => { + const mockError = new Error("Something went wrong"); + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + + await expect( + main({ + windowId: "test-window-id", + allowUnassociatedTargets: true, + duration: 2, + enabled: true, + name: "updated-test-window", + schedule: "cron(0 0 ? * MON *)", + }), + ).rejects.toThrow(mockError); + + expect(sendMock).toHaveBeenCalledWith( + expect.any(UpdateMaintenanceWindowCommand), + ); + }); +}); diff --git a/javascriptv3/example_code/ssm/tests/update-ops-item.unit.test.js b/javascriptv3/example_code/ssm/tests/update-ops-item.unit.test.js new file mode 100644 index 00000000000..2a3d613b654 --- /dev/null +++ b/javascriptv3/example_code/ssm/tests/update-ops-item.unit.test.js @@ -0,0 +1,60 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { UpdateOpsItemCommand, SSMClient } from "@aws-sdk/client-ssm"; +import { main } from "../actions/update-ops-item.js"; + +describe("updateOpsItem", () => { + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("should update an OpsItem successfully", async () => { + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockResolvedValueOnce({}); + + const result = await main({ opsItemId: "123", status: "Open" }); + + expect(sendMock).toHaveBeenCalledWith(expect.any(UpdateOpsItemCommand)); + expect(sendMock).toHaveBeenCalledWith( + expect.objectContaining({ + input: { + OpsItemId: "123", + Status: "Open", + }, + }), + ); + expect(result).toEqual({ Success: true }); + }); + + it("should handle MissingParameter error", async () => { + const mockError = new Error("testError"); + mockError.name = "OpsItemLimitExceededException"; + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + const consoleWarnSpy = vi.spyOn(console, "warn"); + + await main({ opsItemId: "123" }); + + expect(sendMock).toHaveBeenCalledWith(expect.any(UpdateOpsItemCommand)); + expect(consoleWarnSpy).toHaveBeenCalledWith( + `Couldn't create ops item because you have exceeded your open OpsItem limit. ${mockError.message}.`, + ); + }); + + it("should throw any other errors", async () => { + const mockError = new Error("Something went wrong"); + const sendMock = vi + .spyOn(SSMClient.prototype, "send") + .mockRejectedValueOnce(mockError); + + await expect(main({ opsItemId: "123", status: "Open" })).rejects.toThrow( + mockError, + ); + + expect(sendMock).toHaveBeenCalledWith(expect.any(UpdateOpsItemCommand)); + }); +}); diff --git a/javascriptv3/package.json b/javascriptv3/package.json index 4d4b0b39231..e9286e8c2dd 100644 --- a/javascriptv3/package.json +++ b/javascriptv3/package.json @@ -63,6 +63,7 @@ "example_code/ses", "example_code/sns", "example_code/sqs", + "example_code/ssm", "example_code/sts", "example_code/support", "example_code/transcribe", From 82fa8c8263a1b42c0de7b6fde5475c800019751d Mon Sep 17 00:00:00 2001 From: Steven Meyer <108885656+meyertst-aws@users.noreply.github.com> Date: Wed, 11 Sep 2024 14:22:42 -0400 Subject: [PATCH 89/98] Swift: S3 - update basics to match standards (#6836) --- .doc_gen/metadata/s3_metadata.yaml | 18 +- .../ServiceHandler/ServiceHandler.swift | 4 +- .../Sources/ListBuckets/S3Session.swift | 4 +- swift/example_code/s3/README.md | 18 +- .../ServiceHandler/ServiceHandler.swift | 223 ++++++++++++------ .../s3/basics/Sources/basics/basics.swift | 2 +- .../Tests/basics-tests/basics-tests.swift | 4 +- swift/modules/SwiftUtilities/Package.swift | 6 - 8 files changed, 179 insertions(+), 100 deletions(-) diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index ef698d4f835..cd59344ef5f 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -199,7 +199,7 @@ s3_CreateBucket: - description: snippet_tags: - s3.swift.import - - s3.swift.basics.handler.createbucket + - s3.swift.basics.handler.CreateBucket Bash: versions: - sdk_version: 2 @@ -329,7 +329,7 @@ s3_CopyObject: - description: snippet_tags: - s3.swift.import - - s3.swift.basics.handler.copyfile + - s3.swift.basics.handler.CopyObject Bash: versions: - sdk_version: 2 @@ -495,7 +495,7 @@ s3_DeleteObject: - description: snippet_tags: - s3.swift.import - - s3.swift.basics.handler.deletefile + - s3.swift.basics.handler.DeleteObject Bash: versions: - sdk_version: 2 @@ -610,7 +610,7 @@ s3_DeleteObjects: - description: snippet_tags: - s3.swift.import - - s3.swift.deleteobjects.handler.deleteobjects + - s3.swift.deleteobjects.handler.DeleteObjects C++: versions: - sdk_version: 1 @@ -907,7 +907,7 @@ s3_GetObject: - description: snippet_tags: - s3.swift.import - - s3.swift.basics.handler.downloadfile + - s3.swift.basics.handler.GetObject - description: snippet_tags: - s3.swift.import @@ -1392,7 +1392,7 @@ s3_ListObjectsV2: - description: snippet_tags: - s3.swift.import - - s3.swift.basics.handler.listbucketfiles + - s3.swift.basics.handler.ListObjectsV2 Bash: versions: - sdk_version: 2 @@ -1574,7 +1574,7 @@ s3_PutObject: - description: snippet_tags: - s3-smithy.swift.import - - s3.swift.basics.handler.uploadfile + - s3.swift.basics.handler.PutObject - description: snippet_tags: - s3-smithy.swift.import @@ -1710,7 +1710,7 @@ s3_DeleteBucket: - description: snippet_tags: - s3.swift.import - - s3.swift.basics.handler.deletebucket + - s3.swift.basics.handler.DeleteBucket Bash: versions: - sdk_version: 2 @@ -2199,7 +2199,7 @@ s3_ListBuckets: - description: snippet_tags: - s3.swift.import - - s3.swift.listbuckets.getallbuckets + - s3.swift.listbuckets.ListBuckets services: s3: {ListBuckets} s3_PutObjectAcl: diff --git a/swift/example_code/s3/DeleteObjects/Sources/ServiceHandler/ServiceHandler.swift b/swift/example_code/s3/DeleteObjects/Sources/ServiceHandler/ServiceHandler.swift index dcbbaa5a1ef..618c2d18a3f 100644 --- a/swift/example_code/s3/DeleteObjects/Sources/ServiceHandler/ServiceHandler.swift +++ b/swift/example_code/s3/DeleteObjects/Sources/ServiceHandler/ServiceHandler.swift @@ -51,7 +51,7 @@ public class ServiceHandler { /// - bucket: Name of the bucket containing the object to delete. /// - keys: Names of the objects to delete from the bucket. /// - // snippet-start:[s3.swift.deleteobjects.handler.deleteobjects] + // snippet-start:[s3.swift.deleteobjects.handler.DeleteObjects] public func deleteObjects(bucket: String, keys: [String]) async throws { let input = DeleteObjectsInput( bucket: bucket, @@ -80,6 +80,6 @@ public class ServiceHandler { throw error } } - // snippet-end:[s3.swift.deleteobjects.handler.deleteobjects] + // snippet-end:[s3.swift.deleteobjects.handler.DeleteObjects] } // snippet-end:[s3.swift.deleteobjects.handler] diff --git a/swift/example_code/s3/ListBuckets/Sources/ListBuckets/S3Session.swift b/swift/example_code/s3/ListBuckets/Sources/ListBuckets/S3Session.swift index 25e6527ee86..d2ca2c16f9d 100644 --- a/swift/example_code/s3/ListBuckets/Sources/ListBuckets/S3Session.swift +++ b/swift/example_code/s3/ListBuckets/Sources/ListBuckets/S3Session.swift @@ -67,7 +67,7 @@ public class S3Manager { } // snippet-end:[s3.swift.listbuckets.s3manager.init] - // snippet-start:[s3.swift.listbuckets.getallbuckets] + // snippet-start:[s3.swift.listbuckets.ListBuckets] /// Return an array containing information about every available bucket. /// /// - Returns: An array of ``S3ClientTypes.Bucket`` objects describing @@ -80,6 +80,6 @@ public class S3Manager { } return buckets } - // snippet-end:[s3.swift.listbuckets.getallbuckets] + // snippet-end:[s3.swift.listbuckets.ListBuckets] } // snippet-end:[s3.swift.listbuckets.s3manager] diff --git a/swift/example_code/s3/README.md b/swift/example_code/s3/README.md index a360140ff02..f3c196780d8 100644 --- a/swift/example_code/s3/README.md +++ b/swift/example_code/s3/README.md @@ -40,15 +40,15 @@ Code examples that show you how to perform the essential operations within a ser Code excerpts that show you how to call individual service functions. -- [CopyObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) -- [CreateBucket](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) -- [DeleteBucket](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) -- [DeleteObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) -- [DeleteObjects](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) -- [GetObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) -- [ListBuckets](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) -- [ListObjectsV2](basics/Sources/ServiceHandler/ServiceHandler.swift#L12) -- [PutObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L11) +- [CopyObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L232) +- [CreateBucket](basics/Sources/ServiceHandler/ServiceHandler.swift#L56) +- [DeleteBucket](basics/Sources/ServiceHandler/ServiceHandler.swift#L87) +- [DeleteObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L257) +- [DeleteObjects](DeleteObjects/Sources/ServiceHandler/ServiceHandler.swift#L54) +- [GetObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L163) +- [ListBuckets](ListBuckets/Sources/ListBuckets/S3Session.swift#L70) +- [ListObjectsV2](basics/Sources/ServiceHandler/ServiceHandler.swift#L280) +- [PutObject](basics/Sources/ServiceHandler/ServiceHandler.swift#L107) diff --git a/swift/example_code/s3/basics/Sources/ServiceHandler/ServiceHandler.swift b/swift/example_code/s3/basics/Sources/ServiceHandler/ServiceHandler.swift index fc966a7f085..28a7364f786 100644 --- a/swift/example_code/s3/basics/Sources/ServiceHandler/ServiceHandler.swift +++ b/swift/example_code/s3/basics/Sources/ServiceHandler/ServiceHandler.swift @@ -19,22 +19,33 @@ import ClientRuntime /// A class containing all the code that interacts with the AWS SDK for Swift. public class ServiceHandler { + let configuration: S3Client.S3ClientConfiguration let client: S3Client - + + enum HandlerError: Error { + case getObjectBody(String) + case readGetObjectBody(String) + case missingContents(String) + } + /// Initialize and return a new ``ServiceHandler`` object, which is used to drive the AWS calls /// used for the example. /// /// - Returns: A new ``ServiceHandler`` object, ready to be called to /// execute AWS operations. // snippet-start:[s3.swift.basics.handler.init] - public init() async { + public init() async throws { do { - client = try S3Client(region: "us-east-2") - } catch { + configuration = try await S3Client.S3ClientConfiguration() + // configuration.region = "us-east-2" // Uncomment this to set the region programmatically. + client = S3Client(config: configuration) + } + catch { print("ERROR: ", dump(error, name: "Initializing S3 client")) - exit(1) + throw error } } + // snippet-end:[s3.swift.basics.handler.init] /// Create a new user given the specified name. @@ -42,49 +53,78 @@ public class ServiceHandler { /// - Parameters: /// - name: Name of the bucket to create. /// Throws an exception if an error occurs. - // snippet-start:[s3.swift.basics.handler.createbucket] + // snippet-start:[s3.swift.basics.handler.CreateBucket] public func createBucket(name: String) async throws { - let config = S3ClientTypes.CreateBucketConfiguration( - locationConstraint: .usEast2 - ) - let input = CreateBucketInput( - bucket: name, - createBucketConfiguration: config + var input = CreateBucketInput( + bucket: name ) - _ = try await client.createBucket(input: input) + + // For regions other than "us-east-1", you must set the locationConstraint in the createBucketConfiguration. + // For more information, see LocationConstraint in the S3 API guide. + // https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html#API_CreateBucket_RequestBody + if let region = configuration.region { + if region != "us-east-1" { + input.createBucketConfiguration = S3ClientTypes.CreateBucketConfiguration(locationConstraint: S3ClientTypes.BucketLocationConstraint(rawValue: region)) + } + } + + do { + _ = try await client.createBucket(input: input) + } + catch let error as BucketAlreadyOwnedByYou { + print("The bucket '\(name)' already exists and is owned by you. You may wish to ignore this exception.") + throw error + } + catch { + print("ERROR: ", dump(error, name: "Creating a bucket")) + throw error + } } - // snippet-end:[s3.swift.basics.handler.createbucket] + // snippet-end:[s3.swift.basics.handler.CreateBucket] /// Delete a bucket. /// - Parameter name: Name of the bucket to delete. - // snippet-start:[s3.swift.basics.handler.deletebucket] + // snippet-start:[s3.swift.basics.handler.DeleteBucket] public func deleteBucket(name: String) async throws { let input = DeleteBucketInput( bucket: name ) - _ = try await client.deleteBucket(input: input) + do { + _ = try await client.deleteBucket(input: input) + } + catch { + print("ERROR: ", dump(error, name: "Deleting a bucket")) + throw error + } } - // snippet-end:[s3.swift.basics.handler.deletebucket] + // snippet-end:[s3.swift.basics.handler.DeleteBucket] /// Upload a file from local storage to the bucket. /// - Parameters: /// - bucket: Name of the bucket to upload the file to. /// - key: Name of the file to create. /// - file: Path name of the file to upload. - // snippet-start:[s3.swift.basics.handler.uploadfile] + // snippet-start:[s3.swift.basics.handler.PutObject] public func uploadFile(bucket: String, key: String, file: String) async throws { let fileUrl = URL(fileURLWithPath: file) - let fileData = try Data(contentsOf: fileUrl) - let dataStream = ByteStream.data(fileData) + do { + let fileData = try Data(contentsOf: fileUrl) + let dataStream = ByteStream.data(fileData) - let input = PutObjectInput( - body: dataStream, - bucket: bucket, - key: key - ) - _ = try await client.putObject(input: input) + let input = PutObjectInput( + body: dataStream, + bucket: bucket, + key: key + ) + + _ = try await client.putObject(input: input) + } + catch { + print("ERROR: ", dump(error, name: "Putting an object.")) + throw error + } } - // snippet-end:[s3.swift.basics.handler.uploadfile] + // snippet-end:[s3.swift.basics.handler.PutObject] /// Create a file in the specified bucket with the given name. The new /// file's contents are uploaded from a `Data` object. @@ -102,7 +142,14 @@ public class ServiceHandler { bucket: bucket, key: key ) - _ = try await client.putObject(input: input) + + do { + _ = try await client.putObject(input: input) + } + catch { + print("ERROR: ", dump(error, name: "Putting an object.")) + throw error + } } // snippet-end:[s3.swift.basics.handler.createfile] @@ -113,7 +160,7 @@ public class ServiceHandler { /// - key: The name of the file to copy from the bucket. /// - to: The path of the directory on the local device where you want to /// download the file. - // snippet-start:[s3.swift.basics.handler.downloadfile] + // snippet-start:[s3.swift.basics.handler.GetObject] public func downloadFile(bucket: String, key: String, to: String) async throws { let fileUrl = URL(fileURLWithPath: to).appendingPathComponent(key) @@ -121,16 +168,25 @@ public class ServiceHandler { bucket: bucket, key: key ) - let output = try await client.getObject(input: input) + do { + let output = try await client.getObject(input: input) + + guard let body = output.body else { + throw HandlerError.getObjectBody("GetObjectInput missing body.") + } + + guard let data = try await body.readData() else { + throw HandlerError.readGetObjectBody("GetObjectInput unable to read data.") + } - // Get the data stream object. Return immediately if there isn't one. - guard let body = output.body, - let data = try await body.readData() else { - return + try data.write(to: fileUrl) + } + catch { + print("ERROR: ", dump(error, name: "Downloading a file.")) + throw error } - try data.write(to: fileUrl) } - // snippet-end:[s3.swift.basics.handler.downloadfile] + // snippet-end:[s3.swift.basics.handler.GetObject] /// Read the specified file from the given S3 bucket into a Swift /// `Data` object. @@ -146,17 +202,25 @@ public class ServiceHandler { bucket: bucket, key: key ) - let output = try await client.getObject(input: input) + do { + let output = try await client.getObject(input: input) + + guard let body = output.body else { + throw HandlerError.getObjectBody("GetObjectInput missing body.") + } - // Get the stream and return its contents in a `Data` object. If - // there is no stream, return an empty `Data` object instead. - guard let body = output.body, - let data = try await body.readData() else { - return "".data(using: .utf8)! + guard let data = try await body.readData() else { + throw HandlerError.readGetObjectBody("GetObjectInput unable to read data.") + } + + return data } - - return data - } + catch { + print("ERROR: ", dump(error, name: "Reading a file.")) + throw error + } + } + // snippet-end:[s3.swift.basics.handler.readfile] /// Copy a file from one bucket to another. @@ -165,7 +229,7 @@ public class ServiceHandler { /// - sourceBucket: Name of the bucket containing the source file. /// - name: Name of the source file. /// - destBucket: Name of the bucket to copy the file into. - // snippet-start:[s3.swift.basics.handler.copyfile] + // snippet-start:[s3.swift.basics.handler.CopyObject] public func copyFile(from sourceBucket: String, name: String, to destBucket: String) async throws { let srcUrl = ("\(sourceBucket)/\(name)").addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) @@ -174,9 +238,15 @@ public class ServiceHandler { copySource: srcUrl, key: name ) - _ = try await client.copyObject(input: input) + do { + _ = try await client.copyObject(input: input) + } + catch { + print("ERROR: ", dump(error, name: "Copying an object.")) + throw error + } } - // snippet-end:[s3.swift.basics.handler.copyfile] + // snippet-end:[s3.swift.basics.handler.CopyObject] /// Deletes the specified file from Amazon S3. /// @@ -184,7 +254,7 @@ public class ServiceHandler { /// - bucket: Name of the bucket containing the file to delete. /// - key: Name of the file to delete. /// - // snippet-start:[s3.swift.basics.handler.deletefile] + // snippet-start:[s3.swift.basics.handler.DeleteObject] public func deleteFile(bucket: String, key: String) async throws { let input = DeleteObjectInput( bucket: bucket, @@ -193,11 +263,13 @@ public class ServiceHandler { do { _ = try await client.deleteObject(input: input) - } catch { + } + catch { + print("ERROR: ", dump(error, name: "Deleting a file.")) throw error } } - // snippet-end:[s3.swift.basics.handler.deletefile] + // snippet-end:[s3.swift.basics.handler.DeleteObject] /// Returns an array of strings, each naming one file in the /// specified bucket. @@ -205,26 +277,39 @@ public class ServiceHandler { /// - Parameter bucket: Name of the bucket to get a file listing for. /// - Returns: An array of `String` objects, each giving the name of /// one file contained in the bucket. - // snippet-start:[s3.swift.basics.handler.listbucketfiles] + // snippet-start:[s3.swift.basics.handler.ListObjectsV2] public func listBucketFiles(bucket: String) async throws -> [String] { - let input = ListObjectsV2Input( - bucket: bucket - ) - let output = try await client.listObjectsV2(input: input) - var names: [String] = [] - - guard let objList = output.contents else { - return [] - } - - for obj in objList { - if let objName = obj.key { - names.append(objName) + do { + let input = ListObjectsV2Input( + bucket: bucket + ) + + // Use "Paginated" to get all the objects. + // This lets the SDK handle the 'continuationToken' in "ListObjectsV2Output". + let output = client.listObjectsV2Paginated(input: input) + var names: [String] = [] + + for try await page in output { + guard let objList = page.contents else { + print("ERROR: listObjectsV2Paginated returned nil contents.") + continue + } + + for obj in objList { + if let objName = obj.key { + names.append(objName) + } + } } + + + return names + } + catch { + print("ERROR: ", dump(error, name: "Listing objects.")) + throw error } - - return names } - // snippet-end:[s3.swift.basics.handler.listbucketfiles] + // snippet-end:[s3.swift.basics.handler.ListObjectsV2] } -// snippet-end:[s3.swift.basics.handler] \ No newline at end of file +// snippet-end:[s3.swift.basics.handler] diff --git a/swift/example_code/s3/basics/Sources/basics/basics.swift b/swift/example_code/s3/basics/Sources/basics/basics.swift index 5dc88fd8f75..aa99c8f2686 100644 --- a/swift/example_code/s3/basics/Sources/basics/basics.swift +++ b/swift/example_code/s3/basics/Sources/basics/basics.swift @@ -62,7 +62,7 @@ struct ExampleCommand: ParsableCommand { /// example. // snippet-start:[s3.swift.basics.command.runasync] func runAsync() async throws { - let serviceHandler = await ServiceHandler() + let serviceHandler = try await ServiceHandler() // 1. Create the bucket. print("Creating the bucket \(bucketName)...") diff --git a/swift/example_code/s3/basics/Tests/basics-tests/basics-tests.swift b/swift/example_code/s3/basics/Tests/basics-tests/basics-tests.swift index c1bd80147f9..b3255c9d349 100644 --- a/swift/example_code/s3/basics/Tests/basics-tests/basics-tests.swift +++ b/swift/example_code/s3/basics/Tests/basics-tests/basics-tests.swift @@ -30,10 +30,10 @@ final class BasicsTests: XCTestCase { override class func setUp() { let tdSem = TestWaiter(name: "Setup") super.setUp() - SDKLoggingSystem.initialize(logLevel: .error) + Task() { - BasicsTests.serviceHandler = await ServiceHandler() + BasicsTests.serviceHandler = try await ServiceHandler() BasicsTests.demoCleanup = await S3DemoCleanup() tdSem.signal() } diff --git a/swift/modules/SwiftUtilities/Package.swift b/swift/modules/SwiftUtilities/Package.swift index c55afa8f7a6..a593702318a 100644 --- a/swift/modules/SwiftUtilities/Package.swift +++ b/swift/modules/SwiftUtilities/Package.swift @@ -30,9 +30,6 @@ let package = Package( name: "SwiftUtilities", dependencies: [ "Fakery" - ], - linkerSettings: [ - .linkedLibrary("rt") // Include librt for Dispatch to work. ] ), .testTarget( @@ -40,9 +37,6 @@ let package = Package( dependencies: [ "SwiftUtilities", "Fakery" - ], - linkerSettings: [ - .linkedLibrary("rt") // Include librt for Dispatch to work. ] ), ] From f6e9b07eef4feba775287b0c7731de9a3483b32a Mon Sep 17 00:00:00 2001 From: ashahidrahmat <37541521+ashahidrahmat@users.noreply.github.com> Date: Thu, 12 Sep 2024 20:41:04 +0800 Subject: [PATCH 90/98] English: Updated callIndex for awsm_stubber for testtools (#6695) Currently if we use stubs in a single test func multiple times the callIndex will increase while the stubs decrease. If we run a for loop for the doing multiple tests, and stub twice for a loop, the call index will eventually become 3 while the stubs available is lesser then 3 throwing an error out. --------- Co-authored-by: Corey Pyle --- gov2/testtools/awsm_stubber.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gov2/testtools/awsm_stubber.go b/gov2/testtools/awsm_stubber.go index ede887a9b34..30b2cd2d733 100644 --- a/gov2/testtools/awsm_stubber.go +++ b/gov2/testtools/awsm_stubber.go @@ -150,6 +150,7 @@ func (stubber *AwsmStubber) Next() *Stub { // Clear removes all stubs from the stubber. func (stubber *AwsmStubber) Clear() { stubber.stubs = nil + stubber.callIndex = 0 } // VerifyAllStubsCalled returns an error if there are stubs in the slice that were not @@ -159,6 +160,8 @@ func (stubber *AwsmStubber) VerifyAllStubsCalled() error { next := stubber.Next() if next != nil { err = fmt.Errorf("Remaining stub %v was never called.", next.OperationName) + } else { + stubber.callIndex = 0 } return err } From 7dd1c58b0db5053389cf7ad3adacc4f46c50f511 Mon Sep 17 00:00:00 2001 From: Eric Shepherd Date: Thu, 12 Sep 2024 13:38:15 -0400 Subject: [PATCH 91/98] Update Swift waiters example to work on latest SDK (#6840) --- .../swift-sdk/Waiters/Package.swift | 39 +++++ .../swift-sdk/Waiters/Sources/S3Session.swift | 144 ++++++++++++++++++ .../swift-sdk/Waiters/Sources/waiters.swift | 62 ++++++++ .../Waiters/Tests/Waiters-Tests.swift | 121 +++++++++++++++ 4 files changed, 366 insertions(+) create mode 100644 swift/example_code/swift-sdk/Waiters/Package.swift create mode 100644 swift/example_code/swift-sdk/Waiters/Sources/S3Session.swift create mode 100644 swift/example_code/swift-sdk/Waiters/Sources/waiters.swift create mode 100644 swift/example_code/swift-sdk/Waiters/Tests/Waiters-Tests.swift diff --git a/swift/example_code/swift-sdk/Waiters/Package.swift b/swift/example_code/swift-sdk/Waiters/Package.swift new file mode 100644 index 00000000000..c6161ce10e9 --- /dev/null +++ b/swift/example_code/swift-sdk/Waiters/Package.swift @@ -0,0 +1,39 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +// swift-tools-version: 5.5 + +// The swift-tools-version declares the minimum version of Swift required to +// build this package. + +import PackageDescription + +let package = Package( + name: "Waiters", + dependencies: [ + // This project requires the AWS SDK for Swift. + .package( + url: "https://github.com/awslabs/aws-sdk-swift", + from: "0.68.0" + ), + ], + targets: [ + // Targets are the basic building blocks of a package, defining a + // module or a test suite. Targets can depend on other targets in this + // package and products from dependencies. + .executableTarget( + name: "Waiters", + dependencies: [ + .product(name: "AWSS3", package: "aws-sdk-swift"), + ], + path: "Sources" + ), + .testTarget( + name: "Waiters-Tests", + dependencies: [ + "Waiters", + .product(name: "AWSS3", package: "aws-sdk-swift") + ], + path: "Tests" + ) + ] +) diff --git a/swift/example_code/swift-sdk/Waiters/Sources/S3Session.swift b/swift/example_code/swift-sdk/Waiters/Sources/S3Session.swift new file mode 100644 index 00000000000..d5ead898a1f --- /dev/null +++ b/swift/example_code/swift-sdk/Waiters/Sources/S3Session.swift @@ -0,0 +1,144 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/// The `S3Manager` class provides functions to access Amazon Simple Storage +/// Service (Amazon S3). `S3Manager` hands off the actual Amazon S3 operations +/// to a worker object that implements the protocol ``S3SessionProtocol``. +/// +/// When creating an ``S3Manager`` object that actually calls Amazon S3 using +/// the AWS SDK for Swift, specify an `S3Session` instance. Use a +/// `MockS3Session` instance to use mock data for testing. + +import Foundation +import AWSS3 +// snippet-start:[waiters.swift.imports] +import SmithyWaitersAPI +// snippet-end:[waiters.swift.imports] + +/// A protocol defining the Amazon S3 functions we want to mock +/// during testing. +public protocol S3SessionProtocol { + mutating func createBucket(input: CreateBucketInput) async throws -> CreateBucketOutput + mutating func deleteBucket(input: DeleteBucketInput) async throws -> DeleteBucketOutput + func waitUntilBucketExists(options: WaiterOptions, input: HeadBucketInput) async throws -> WaiterOutcome +} + +/// An implementation of ``S3SessionProtocol`` that calls the equivalent +/// functions in the AWS SDK for Swift. +public struct S3Session: S3SessionProtocol { + let client: S3Client + let awsRegion: String + + /// Initialize the session to use the specified AWS Region. + /// + /// - Parameter region: The AWS Region to use. Default is `us-east-1`. + init(region: String = "us-east-1") throws { + self.awsRegion = region + + // Create an ``S3Client`` to use for AWS SDK for Swift calls. + self.client = try S3Client(region: awsRegion) + } + + /// Call through to the ``S3Client`` function `listBuckets()`. + /// + /// - Parameter input: The input record. + /// - Returns: The output record. + public func createBucket(input: CreateBucketInput) async throws + -> CreateBucketOutput { + return try await self.client.createBucket(input: input) + } + + /// Call through to the ``S3Client`` function `waitUntilBucketExists()`. + /// + /// - Parameter input: The input record. + /// - Returns: The output record. + public func waitUntilBucketExists(options: WaiterOptions, + input: HeadBucketInput) async throws + -> WaiterOutcome { + return try await self.client.waitUntilBucketExists(options: options, + input: input) + } + + /// Call through to the ``S3Client`` function `deleteBucket()`. + /// + /// - Parameter input: The input record. + /// - Returns: The output record. + public func deleteBucket(input: DeleteBucketInput) async throws + -> DeleteBucketOutput { + return try await self.client.deleteBucket(input: input) + } +} + +/// A class that uses an object that implements ``S3SessionProtocol`` to +/// access Amazon S3. +public class S3Manager { + var client: S3SessionProtocol + + /// Initialize the ``S3Manager`` to call Amazon S3 functions using the + /// specified object that implements ``S3SessionProtocol``. + /// + /// - Parameter session: The session object to use when calling Amazon S3. + init(session: S3SessionProtocol) { + self.client = session + } + + /// Create a new test bucket and return its name. + /// + /// - Returns: The new bucket's name as a string. + /// + public func createBucket() async throws -> String { + // Generate a name for the sample bucket. + + let bucketName = "waiter-example-\(String(Int.random(in:1000000...9999999)))" + + // Create a bucket. + + _ = try await client.createBucket( + input: CreateBucketInput(bucket: bucketName) + ) + + // Return the name of the new bucket. + + return bucketName + } + + // snippet-start:[using-waiters.swift.waiter] + /// Wait until a bucket with the specified name exists, then return + /// to the caller. Times out after 60 seconds. Throws an error if the + /// wait fails. + /// + /// - Parameter bucketName: A string giving the name of the bucket + /// to wait for. + /// + /// - Returns: `true` if the bucket was found or `false` if not. + /// + public func waitForBucket(name bucketName: String) async throws -> Bool { + // Because `waitUntilBucketExists()` internally uses the Amazon S3 + // action `HeadBucket` to look for the bucket, the input is specified + // with a `HeadBucketInput` structure. + + let output = try await client.waitUntilBucketExists( + options: WaiterOptions(maxWaitTime: 60.0), + input: HeadBucketInput(bucket: bucketName) + ) + + switch output.result { + case .success: + return true + case .failure: + return false + } + } + // snippet-end:[using-waiters.swift.waiter] + + /// Delete the specified bucket. Throw an exception if an error occurs. + /// + /// - Parameter bucketName: The name of the bucket to delete. + public func deleteBucket(name bucketName: String) async throws { + _ = try await client.deleteBucket( + input: DeleteBucketInput( + bucket: bucketName + ) + ) + } +} diff --git a/swift/example_code/swift-sdk/Waiters/Sources/waiters.swift b/swift/example_code/swift-sdk/Waiters/Sources/waiters.swift new file mode 100644 index 00000000000..207a1ccc017 --- /dev/null +++ b/swift/example_code/swift-sdk/Waiters/Sources/waiters.swift @@ -0,0 +1,62 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/// An example that shows how to use waiters when using the AWS SDK +/// for Swift. + +import Foundation +import AWSClientRuntime +import AWSS3 + +/// The static main entry point. +@main +struct WaiterExample { + static func main() async { + let bucketName: String + let s3: S3Manager + + // Create the object that handles calling Amazon S3, using the + // `S3Session` implementation of the `S3SessionProtocol` to direct + // calls to the Amazon S3 service rather than mocking. + + do { + s3 = S3Manager(session: try S3Session()) + } catch { + print("*** Unable to create the Amazon S3 session.") + exit(1) + } + + // Create the bucket. + + do { + bucketName = try await s3.createBucket() + } catch { + print("*** Error creating the bucket: \(error)") + return + } + + // Wait for the bucket to exist. + + do { + let bucketExists = try await s3.waitForBucket(name: bucketName) + + if bucketExists == true { + print("Bucket \(bucketName) was found.") + } else { + print("Unable to find bucket \(bucketName).") + } + } catch { + print("*** Error while waiting for \(bucketName) to exist: \(error)") + return + } + + // Clean up by deleting the bucket. + + do { + try await s3.deleteBucket(name: bucketName) + print("Bucket \(bucketName) deleted.") + } catch { + print("*** Error deleting the bucket: \(error)") + } + } +} diff --git a/swift/example_code/swift-sdk/Waiters/Tests/Waiters-Tests.swift b/swift/example_code/swift-sdk/Waiters/Tests/Waiters-Tests.swift new file mode 100644 index 00000000000..c9a5bd5f556 --- /dev/null +++ b/swift/example_code/swift-sdk/Waiters/Tests/Waiters-Tests.swift @@ -0,0 +1,121 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import XCTest +import Foundation +import AWSS3 +//import AWSClientRuntime +import SmithyWaitersAPI +import SmithyHTTPAPI + +@testable import Waiters + +public enum MockS3Error: Error { + case invalidBucketName + case bucketAlreadyExists +} + +public struct MockS3Session: S3SessionProtocol { + var buckets: [String] = [] + + /// Simulate the ``S3Client`` function `createBucket()`. + /// + /// - Parameter input: The input record. + /// - Returns: The output record. + public mutating func createBucket(input: CreateBucketInput) async throws + -> CreateBucketOutput { + if input.bucket == nil { + throw MockS3Error.invalidBucketName + } + if buckets.contains(input.bucket!) { + throw MockS3Error.bucketAlreadyExists + } + + buckets.append(input.bucket!) + + return CreateBucketOutput(location: "/\(input.bucket!)") + } + + /// Simulate the ``S3Client`` function `waitUntilBucketExists()`. + /// + /// - Parameter input: The input record. + /// - Returns: The output record. + public func waitUntilBucketExists(options: WaiterOptions, + input: HeadBucketInput) async throws + -> WaiterOutcome { + let output = HeadBucketOutput() + + return WaiterOutcome( + attempts: 1, + result: .success(output) + ) + } + + /// Simulate the ``S3Client`` function `deleteBucket()`. + /// + /// - Parameter input: The input record. + /// - Returns: The output record. + public mutating func deleteBucket(input: DeleteBucketInput) async throws + -> DeleteBucketOutput { + let output = DeleteBucketOutput() + + return output + } +} + +/// Perform tests on the functions in the main.swift file. +final class MainTests: XCTestCase { + /// The mock session implementation to use for Amazon S3 calls. + var session: MockS3Session? = nil + + /// The `S3Manager` that uses the session to perform Amazon S3 + /// operations. + var s3: S3Manager? = nil + + /// Class-wide setup function for the test case, which is run *once* + /// before any tests are run. + /// + /// Configures the AWS SDK log system to only log errors. This cleans up + /// the test output to let the results be more visible. + override class func setUp() { + super.setUp() + } + + /// Set up things that need to be done just before each individual + /// test function is called. + override func setUp() { + super.setUp() + + self.session = MockS3Session() + self.s3 = S3Manager(session: self.session!) + } + + func testCreateBucket() async throws { + let bucketName = try await s3!.createBucket() + + // Verify the format of the string. + + let nameStart = "waiter-example-" + let namePart1 = String(bucketName.prefix(nameStart.count)) + let namePart2 = String(bucketName.suffix(bucketName.count - nameStart.count)) + + XCTAssertEqual(nameStart, namePart1, "The bucket name's prefix is not correct.") + XCTAssertTrue(Int(namePart2) != nil, "The bucket name's random number isn't a number.") + + // Check for the bucket to exist. + + let bucketExists = try await s3!.waitForBucket(name: bucketName) + XCTAssertTrue(bucketExists, "The bucket was not successfully created.") + + // Clean up. + + try await s3!.deleteBucket(name: bucketName) + } + + func testWaitForBucket() async throws { + // Create a bucket and see if it shows up. + // Wait for a bucket that doesn't exist. + // Delete the bucket created previously and wait for it to exist, + // make sure it fails. + } +} \ No newline at end of file From 0ab4a2d2da8711c305bf46350d5dc267b64a6adb Mon Sep 17 00:00:00 2001 From: Eric Shepherd Date: Thu, 12 Sep 2024 13:53:51 -0400 Subject: [PATCH 92/98] Update retry example for latest SDK (Prep for GA) (#6843) Update retry example for latest SDK This patch brings the example for retry up to working on the latest version of the SDK for Swift. --- swift/example_code/swift-sdk/retry/Package.swift | 4 ++-- swift/example_code/swift-sdk/retry/Sources/entry.swift | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/swift/example_code/swift-sdk/retry/Package.swift b/swift/example_code/swift-sdk/retry/Package.swift index ff4f77f58cb..2ed4cc575b5 100644 --- a/swift/example_code/swift-sdk/retry/Package.swift +++ b/swift/example_code/swift-sdk/retry/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.5 +// swift-tools-version: 5.6 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 // @@ -18,7 +18,7 @@ let package = Package( // Dependencies declare other packages that this package depends on. .package( url: "https://github.com/awslabs/aws-sdk-swift", - from: "0.36.0" + from: "0.75.0" ), ], targets: [ diff --git a/swift/example_code/swift-sdk/retry/Sources/entry.swift b/swift/example_code/swift-sdk/retry/Sources/entry.swift index c98a5b61e87..66052cceecd 100644 --- a/swift/example_code/swift-sdk/retry/Sources/entry.swift +++ b/swift/example_code/swift-sdk/retry/Sources/entry.swift @@ -6,8 +6,9 @@ // AWS service. import Foundation -import ClientRuntime import AWSS3 +import SmithyRetries +import SmithyRetriesAPI @main struct RetryExample { @@ -16,12 +17,14 @@ struct RetryExample { let config: S3Client.S3ClientConfiguration // Create an Amazon S3 client configuration object that specifies the - // adaptive retry mode and the base maximum number of retries as 5. + // standard exponential backoff strategy, adaptive retry mode and the + // base maximum number of retries as 5. do { // snippet-start:[retry.swift.configure] config = try await S3Client.S3ClientConfiguration( retryStrategyOptions: RetryStrategyOptions( + backoffStrategy: SmithyRetries.ExponentialBackoffStrategy(), maxRetriesBase: 5, rateLimitingMode: .adaptive ) From a0c04bb976cddf6a9b6e760609ed5e9c81f06dfa Mon Sep 17 00:00:00 2001 From: David Souther Date: Thu, 12 Sep 2024 16:50:46 -0400 Subject: [PATCH 93/98] Update writeme workflow to include diff (#6844) Example output snippet: ``` Dry run, no changes will be made. --- Java:2:opensearch/current +++ Java:2:opensearch/expected @@ -42,7 +42,7 @@ - [AddTags](src/main/java/com/example/search/scenario/OpenSearchActions.java#L270) - [ChangeProgress](src/main/java/com/example/search/scenario/OpenSearchActions.java#L219) -- [CreateDomain](src/main/java/com/example/search/scenario/OpenSearchActions.java#L71) +- [CreateDomain](src/main/java/com/example/search/HelloOpenSearch.java#L6) - [DeleteDomain](src/main/java/com/example/search/scenario/OpenSearchActions.java#L117) - [DescribeDomain](src/main/java/com/example/search/scenario/OpenSearchActions.java#L192) - [ListDomainNames](src/main/java/com/example/search/scenario/OpenSearchActions.java#L170) Incorrect: Java:2:opensearch Rerun writeme.py to update README links and sections. WRITEME Run completed. ``` --- .github/workflows/writeme.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/writeme.yml b/.github/workflows/writeme.yml index 3ed0f0bded0..865e73687e4 100644 --- a/.github/workflows/writeme.yml +++ b/.github/workflows/writeme.yml @@ -32,4 +32,4 @@ jobs: python3 -m pip install -r .tools/readmes/requirements.txt - name: Check WRITEMEs run: >- - python3 .tools/readmes/writeme.py --check + python3 .tools/readmes/writeme.py --check --diff From ae91558a2286856ad9d508c3919352fdfadd854f Mon Sep 17 00:00:00 2001 From: David Souther Date: Thu, 12 Sep 2024 22:08:57 -0400 Subject: [PATCH 94/98] Tools: Allow skipping writeme update with --no-update (#6848) Allow skipping writeme update with --no-update --- .tools/readmes/runner.py | 178 +++++++++++++++++++++++++++++++++++ .tools/readmes/snippets.py | 75 --------------- .tools/readmes/update.py | 24 ++--- .tools/readmes/writeme.py | 184 +++---------------------------------- 4 files changed, 205 insertions(+), 256 deletions(-) create mode 100755 .tools/readmes/runner.py delete mode 100644 .tools/readmes/snippets.py mode change 100755 => 100644 .tools/readmes/writeme.py diff --git a/.tools/readmes/runner.py b/.tools/readmes/runner.py new file mode 100755 index 00000000000..b5691a9c316 --- /dev/null +++ b/.tools/readmes/runner.py @@ -0,0 +1,178 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +import argparse +import config +import logging +import os +from difflib import unified_diff +from pathlib import Path +from typing import Optional + +from render import Renderer, MissingMetadataError, RenderStatus +from scanner import Scanner + +from aws_doc_sdk_examples_tools.doc_gen import DocGen + +logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO").upper(), force=True) + + +def prepare_scanner(doc_gen: DocGen) -> Optional[Scanner]: + for path in (doc_gen.root / ".doc_gen/metadata").glob("*_metadata.yaml"): + doc_gen.process_metadata(path) + doc_gen.collect_snippets() + doc_gen.validate() + if doc_gen.errors: + error_strings = [str(error) for error in doc_gen.errors] + failed_list = "\n".join(f"DocGen Error: {e}" for e in error_strings) + print(f"Metadata errors encountered:\n\t{failed_list}") + return None + scanner = Scanner(doc_gen) + + # Preload cross-content examples + scanner.load_crosses() + + return scanner + + +def main(): + # Load all examples immediately for cross references. Trades correctness for speed. + doc_gen = DocGen.from_root(Path(__file__).parent.parent.parent, incremental=True) + + languages = doc_gen.languages() + parser = argparse.ArgumentParser() + parser.add_argument( + "--languages", + choices=[*languages] + ["all"], + nargs="+", + help="The languages of the SDK. Choose from: %(choices)s.", + default=["all"], + ) + + parser.add_argument( + "--services", + choices=[*doc_gen.services.keys()] + ["all"], + nargs="+", + help="The targeted service. Choose from: %(choices)s.", + default=["all"], + ) + parser.add_argument( + "--safe", + action="store_true", + help=f"Save a copy of the original README as the 'saved_readme' value specified in config.py ({config.saved_readme}).", + ) + parser.add_argument( + "--verbose", + action="store_true", + help="When set, output verbose debugging info.", + ) + parser.add_argument( + "--dry-run", + action="store_true", + dest="dry_run", + help="In dry run, compare current vs generated and exit with failure if they do not match.", + default=False, # Change this to default false when we're ready to use this generally. + ) + parser.add_argument("--no-dry-run", dest="dry_run", action="store_false") + parser.add_argument("--check", dest="dry_run", action="store_true") + parser.add_argument("--diff", action="store_true", default=False) + args = parser.parse_args() + + if "all" in args.languages: + args.languages = [*languages] + + if "all" in args.services: + args.services = [*doc_gen.services.keys()] + + if args.verbose: + logging.basicConfig(level=logging.DEBUG) + + logging.debug(f"Args configuration: {args}") + + if args.dry_run: + print("Dry run, no changes will be made.") + + skipped = [] + failed = [] + written = [] + non_writeme = [] + unchanged = [] + no_folder = [] + + scanner = prepare_scanner(doc_gen) + if scanner is None: + return -1 + + renderer = Renderer(scanner) + for service in args.services: + for language_and_version in args.languages: + (language, version) = language_and_version.split(":") + id = f"{language}:{version}:{service}" + try: + renderer.set_example(service, language, int(version), args.safe) + + logging.debug("Rendering %s", id) + render_status = renderer.render() + logging.debug("Status %s", render_status) + + if render_status == RenderStatus.UPDATED: + if args.dry_run: + diff = None + if args.diff: + diff = make_diff(renderer, id) + failed.append((id, diff)) + else: + renderer.write() + written.append(id) + elif render_status == RenderStatus.UNCHANGED: + unchanged.append(id) + elif render_status == RenderStatus.UNMANAGED: + non_writeme.append(id) + elif render_status == RenderStatus.NO_EXAMPLES: + skipped.append(id) + elif render_status == RenderStatus.NO_FOLDER: + no_folder.append(id) + elif render_status == RenderStatus.UNIMPLEMENTED: + pass + except FileNotFoundError as fnfe: + logging.debug(fnfe, exc_info=True) + skipped.append(id) + except MissingMetadataError as mme: + logging.debug(mme, exc_info=True) + failed.append(id) + except Exception as e: + logging.error(e, exc_info=True) + failed.append(id) + + skip_list = "\n".join(f"Skipped {f}" for f in sorted(skipped)) + logging.debug(skip_list or "(None Skipped)") + if unchanged: + unchanged_list = "\n".join(f"Unchanged {f}" for f in sorted(unchanged)) + print(unchanged_list) + if non_writeme: + non_writeme_list = "\n".join(f"Non-WRITEME: {f}" for f in sorted(non_writeme)) + print(non_writeme_list) + if no_folder: + no_folder_list = "\n".join(f"No folder: {f}" for f in sorted(no_folder)) + print(no_folder_list) + if not args.dry_run: + done_list = "\n".join(f"Wrote {f}" for f in sorted(written)) + print(done_list or "(None Written)") + if failed: + if args.diff: + failed_list = "\n".join( + f"Diff: {f[1]}" for f in sorted(failed, key=lambda f: f[0]) + ) + else: + failed_list = "\n".join(f"Incorrect: {f[0]}" for f in sorted(failed)) + print(failed_list) + print("Rerun writeme.py to update README links and sections.") + print("WRITEME Run completed.") + return len(failed) + + +def make_diff(renderer, id): + current = renderer.read_current().split("\n") + expected = renderer.readme_text.split("\n") + diff = unified_diff(current, expected, f"{id}/current", f"{id}/expected") + return "\n".join(diff) diff --git a/.tools/readmes/snippets.py b/.tools/readmes/snippets.py deleted file mode 100644 index 2016f35747b..00000000000 --- a/.tools/readmes/snippets.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -import logging -import os - -logger = logging.getLogger(__name__) - -# This is in two parts so that it doesn't flag pre_validate -SNIPPET_START = "snippet-" + "start:[" -IGNORE_FOLDERS = { - ".pytest_cache", - "__pycache__", - "cdk.out", - "node_modules", - "Pods", - "dist", - "target", - "venv", - ".venv", - "bin", - "obj", - ".doc_gen", - ".git-hooks", - ".github", - ".git", -} -EXT_IGNORES = { - ".png", - ".zip", - ".jpg", - ".wav", - ".ico", - ".mp3", - ".pdf", - ".jar", - ".swp", - ".keystore", -} - - -class Snippet: - def __init__(self, tag, path, line): - self.tag = tag - self.path = path - self.line = line - - @staticmethod - def tag_from_line(token, line) -> str: - tag_start = line.find(token) + len(token) - tag_end = line.find("]", tag_start) - return line[tag_start:tag_end].strip() - - -def scan_for_snippets(root): - snippets = {} - for root, dirs, files in os.walk(root): - dirs[:] = [ - d - for d in dirs - if d not in IGNORE_FOLDERS or ("rustv1" in root and "src" in root) - ] - for f in files: - ext = os.path.splitext(f)[1].lower() - if ext in EXT_IGNORES: - continue - try: - with open(os.path.join(root, f), "r", encoding="utf-8") as search_file: - for index, line in enumerate(search_file.readlines()): - if SNIPPET_START in line: - tag = Snippet.tag_from_line(SNIPPET_START, line) - snippets[tag] = Snippet(tag, search_file.name, index + 1) - except UnicodeDecodeError: - logger.debug("Skipping %s due to unicode decode error.", f) - return snippets diff --git a/.tools/readmes/update.py b/.tools/readmes/update.py index e6f8de8939a..d54d579cba9 100644 --- a/.tools/readmes/update.py +++ b/.tools/readmes/update.py @@ -6,14 +6,16 @@ from subprocess import run, DEVNULL, PIPE, CalledProcessError from sys import executable -logging.info("Updating WRITEME environment") -try: - run( - [executable, "-m", "pip", "install", "-e", Path(__file__).parent], - check=True, - stderr=PIPE, - stdin=DEVNULL, - stdout=DEVNULL, - ) -except CalledProcessError as _cpe: - raise RuntimeError(f"Update failed: {_cpe.stderr}") + +def update(): + logging.info("Updating WRITEME environment") + try: + run( + [executable, "-m", "pip", "install", "-e", Path(__file__).parent], + check=True, + stderr=PIPE, + stdin=DEVNULL, + stdout=DEVNULL, + ) + except CalledProcessError as _cpe: + raise RuntimeError(f"Update failed: {_cpe.stderr}") diff --git a/.tools/readmes/writeme.py b/.tools/readmes/writeme.py old mode 100755 new mode 100644 index ee9ed2d1370..69d6bc2f255 --- a/.tools/readmes/writeme.py +++ b/.tools/readmes/writeme.py @@ -2,181 +2,25 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -# flake8: noqa: F401 for side effects -import update - -import argparse -import config -import logging -import os import sys -from difflib import unified_diff -from pathlib import Path -from typing import Optional - -from render import Renderer, MissingMetadataError, RenderStatus -from scanner import Scanner - -logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO").upper(), force=True) - - -from aws_doc_sdk_examples_tools.doc_gen import DocGen - - -def prepare_scanner(doc_gen: DocGen) -> Optional[Scanner]: - for path in (doc_gen.root / ".doc_gen/metadata").glob("*_metadata.yaml"): - doc_gen.process_metadata(path) - doc_gen.collect_snippets() - doc_gen.validate() - if doc_gen.errors: - error_strings = [str(error) for error in doc_gen.errors] - failed_list = "\n".join(f"DocGen Error: {e}" for e in error_strings) - print(f"Metadata errors encountered:\n\t{failed_list}") - return None - scanner = Scanner(doc_gen) - - # Preload cross-content examples - scanner.load_crosses() - - return scanner - - -def main(): - # Load all examples immediately for cross references. Trades correctness for speed - doc_gen = DocGen.from_root(Path(__file__).parent.parent.parent, incremental=True) - - languages = doc_gen.languages() - parser = argparse.ArgumentParser() - parser.add_argument( - "--languages", - choices=[*languages] + ["all"], - nargs="+", - help="The languages of the SDK. Choose from: %(choices)s.", - default=["all"], - ) - parser.add_argument( - "--services", - choices=[*doc_gen.services.keys()] + ["all"], - nargs="+", - help="The targeted service. Choose from: %(choices)s.", - default=["all"], - ) - parser.add_argument( - "--safe", - action="store_true", - help=f"Save a copy of the original README as the 'saved_readme' value specified in config.py ({config.saved_readme}).", - ) - parser.add_argument( - "--verbose", - action="store_true", - help="When set, output verbose debugging info.", - ) - parser.add_argument( - "--dry-run", - action="store_true", - dest="dry_run", - help="In dry run, compare current vs generated and exit with failure if they do not match.", - default=False, # Change this to default false when we're ready to use this generally. - ) - parser.add_argument("--no-dry-run", dest="dry_run", action="store_false") - parser.add_argument("--check", dest="dry_run", action="store_true") - parser.add_argument("--diff", action="store_true", default=False) - args = parser.parse_args() +from update import update - if "all" in args.languages: - args.languages = [*languages] +# For debugging, engineers can skip update with the --no-update flag. Yes, it's +# a double negative, but it's quick and early in the startup because of the +# reliance on the side-effect imports from `update` and needing them to happen +# before importing runner, which means before importing the runner argparser. +NO_UPDATE_FLAG = "--no-update" - if "all" in args.services: - args.services = [*doc_gen.services.keys()] - if args.verbose: - logging.basicConfig(level=logging.DEBUG) - - logging.debug(f"Args configuration: {args}") - - if args.dry_run: - print("Dry run, no changes will be made.") - - skipped = [] - failed = [] - written = [] - non_writeme = [] - unchanged = [] - no_folder = [] - - scanner = prepare_scanner(doc_gen) - if scanner is None: - return -1 - - renderer = Renderer(scanner) - for service in args.services: - for language_and_version in args.languages: - (language, version) = language_and_version.split(":") - id = f"{language}:{version}:{service}" - try: - renderer.set_example(service, language, int(version), args.safe) - - logging.debug("Rendering %s", id) - render_status = renderer.render() - logging.debug("Status %s", render_status) - - if render_status == RenderStatus.UPDATED: - if args.dry_run: - failed.append(id) - if args.diff: - print_diff(renderer, id) - else: - renderer.write() - written.append(id) - elif render_status == RenderStatus.UNCHANGED: - unchanged.append(id) - elif render_status == RenderStatus.UNMANAGED: - non_writeme.append(id) - elif render_status == RenderStatus.NO_EXAMPLES: - skipped.append(id) - elif render_status == RenderStatus.NO_FOLDER: - no_folder.append(id) - elif render_status == RenderStatus.UNIMPLEMENTED: - pass - except FileNotFoundError as fnfe: - logging.debug(fnfe, exc_info=True) - skipped.append(id) - except MissingMetadataError as mme: - logging.debug(mme, exc_info=True) - failed.append(id) - except Exception as e: - logging.error(e, exc_info=True) - failed.append(id) - - skip_list = "\n".join(f"Skipped {f}" for f in sorted(skipped)) - logging.debug(skip_list or "(None Skipped)") - if unchanged: - unchanged_list = "\n".join(f"Unchanged {f}" for f in sorted(unchanged)) - print(unchanged_list) - if non_writeme: - non_writeme_list = "\n".join(f"Non-WRITEME: {f}" for f in sorted(non_writeme)) - print(non_writeme_list) - if no_folder: - no_folder_list = "\n".join(f"No folder: {f}" for f in sorted(no_folder)) - print(no_folder_list) - if not args.dry_run: - done_list = "\n".join(f"Wrote {f}" for f in sorted(written)) - print(done_list or "(None Written)") - if failed: - failed_list = "\n".join(f"Incorrect: {f}" for f in sorted(failed)) - print(failed_list) - print("Rerun writeme.py to update README links and sections.") - print("WRITEME Run completed.") - return len(failed) - - -def print_diff(renderer, id): - current = renderer.read_current().split("\n") - expected = renderer.readme_text.split("\n") - diff = unified_diff(current, expected, f"{id}/current", f"{id}/expected") - print("\n".join(diff)) +if __name__ == "__main__": + if NO_UPDATE_FLAG not in sys.argv: + update() + else: + sys.argv.remove(NO_UPDATE_FLAG) + # This import must remain in the main, after the update, as it depends on + # importing the things that got changed during update. + from runner import main -if __name__ == "__main__": sys.exit(main()) From 691d704433171e567a4526b83684033deee6b077 Mon Sep 17 00:00:00 2001 From: David Souther Date: Thu, 12 Sep 2024 22:12:34 -0400 Subject: [PATCH 95/98] Tools: Refactor writeme scanner snippet (#6849) Refactor Scanner snippets lookup. --- .tools/readmes/scanner.py | 87 +++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 31 deletions(-) diff --git a/.tools/readmes/scanner.py b/.tools/readmes/scanner.py index 3907b67e685..9582264be85 100644 --- a/.tools/readmes/scanner.py +++ b/.tools/readmes/scanner.py @@ -6,7 +6,7 @@ from collections import defaultdict from os.path import relpath from pathlib import Path -from typing import Dict, List +from typing import Dict, List, Iterable, Optional, TypeVar from aws_doc_sdk_examples_tools.doc_gen import DocGen from aws_doc_sdk_examples_tools.metadata import Example @@ -15,6 +15,12 @@ logger = logging.getLogger(__name__) +T = TypeVar("T") + + +def first(a: Optional[Iterable[T]]) -> Optional[T]: + return next(iter(a or []), None) + class Scanner: def __init__(self, doc_gen: DocGen): @@ -110,39 +116,58 @@ def expand_entity(self, entity): return self.entities[entity] def snippet(self, example: Example, readme_folder, api_name: str): + if self.lang_name not in example.languages: + return None + github = None tag = None tag_path = None - if self.lang_name in example.languages: - for ex_ver in example.languages[self.lang_name].versions: - if ex_ver.sdk_version == self.sdk_ver: - github = ex_ver.github - if github is not None: - if ex_ver.excerpts: - excerpt = ex_ver.excerpts[0] - if excerpt.snippet_tags: - tags = excerpt.snippet_tags - for t in tags: - if api_name in t: - tag = t - if tag is None: - tag = tags[0] - elif excerpt.snippet_files: - snippet_files = excerpt.snippet_files - # TODO: Find the best (or all?) snippet files, not the first. - full_path = snippet_files[0] - tag_path = "/".join(full_path.split("/")[3:]) - if "cross-services" in full_path: - tag_path = "../cross-services/" + tag_path - elif ex_ver.block_content: - base_folder = f"{config.language[self.lang_name][self.sdk_ver]['base_folder']}/" - if base_folder in github: - tag_path = ( - self._lang_level_double_dots() + github.split(base_folder, 1)[1] - ) - else: - tag_path = github - if tag and github is not None and tag_path is None: + + ex_ver = first( + [ + v + for v in example.languages[self.lang_name].versions + if v.sdk_version == self.sdk_ver + ] + ) + + if ex_ver is None: + return None + + github = ex_ver.github + if github is None: + return None + + if ex_ver.excerpts: + excerpt = first(ex_ver.excerpts) + if excerpt is not None: + if excerpt.snippet_tags: + tags = excerpt.snippet_tags + tags = [*filter(lambda t: api_name in t, tags)] + + # tags = [*sorted(tags)] # TODO: Switch to this form so that READMEs are always consistent + tags = [*reversed(tags)] + + tag = first(tags) or excerpt.snippet_tags[0] + elif excerpt.snippet_files: + # TODO: Find the best (or all?) snippet files, not the first. + full_path = first(excerpt.snippet_files) + if full_path is not None: + tag_path = "/".join(full_path.split("/")[3:]) + if "cross-services" in full_path: + tag_path = "../cross-services/" + tag_path + elif ex_ver.block_content: + base_folder = ( + f"{config.language[self.lang_name][self.sdk_ver]['base_folder']}/" + ) + if base_folder in github: + tag_path = ( + self._lang_level_double_dots() + github.split(base_folder, 1)[1] + ) + else: + tag_path = github + + if tag and tag_path is None: snippet = self.doc_gen.snippets[tag] if snippet is not None: snippet_path = self.doc_gen.root / Path(snippet.file) From b0eeedf2ad0fd0bbc0dd4c77d3842dfd3df1ff79 Mon Sep 17 00:00:00 2001 From: Eric Shepherd Date: Fri, 13 Sep 2024 08:57:03 -0400 Subject: [PATCH 96/98] Fix example used for Getting Started chapter (#6845) Brings the example up to date with latest SDK and removes some unnecessary stuff. --- swift/example_code/s3/ListBuckets-Simple/Package.swift | 4 ++-- swift/example_code/s3/ListBuckets-Simple/Sources/entry.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/swift/example_code/s3/ListBuckets-Simple/Package.swift b/swift/example_code/s3/ListBuckets-Simple/Package.swift index 94634a9265c..48ed8ec49b5 100644 --- a/swift/example_code/s3/ListBuckets-Simple/Package.swift +++ b/swift/example_code/s3/ListBuckets-Simple/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.5 +// swift-tools-version: 5.9 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. @@ -23,7 +23,7 @@ let package = Package( // Dependencies declare other packages that this package depends on. .package( url: "https://github.com/awslabs/aws-sdk-swift", - from: "0.32.0" + from: "0.75.0" ) ], // snippet-end:[s3.swift.intro.package-dependencies] diff --git a/swift/example_code/s3/ListBuckets-Simple/Sources/entry.swift b/swift/example_code/s3/ListBuckets-Simple/Sources/entry.swift index 20c7b2c9a4e..c589bfafa48 100644 --- a/swift/example_code/s3/ListBuckets-Simple/Sources/entry.swift +++ b/swift/example_code/s3/ListBuckets-Simple/Sources/entry.swift @@ -8,8 +8,8 @@ // snippet-start:[s3.swift.intro.imports] import Foundation -import ClientRuntime import AWSS3 +import AWSClientRuntime // snippet-end:[s3.swift.intro.imports] // snippet-start:[s3.swift.intro.getbucketnames] @@ -54,7 +54,7 @@ struct Main { for name in names { print(" \(name)") } - } catch let error as ServiceError { + } catch let error as AWSServiceError { print("An Amazon S3 service error occurred: \(error.message ?? "No details available")") } catch { print("An unknown error occurred: \(dump(error))") From b3925e37ca5d3523d22f4bff57f643d899b294ed Mon Sep 17 00:00:00 2001 From: David Souther Date: Fri, 13 Sep 2024 09:30:58 -0400 Subject: [PATCH 97/98] Weathertop: Pause JSV3 runs (#6851) --- javascriptv3/Dockerfile | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/javascriptv3/Dockerfile b/javascriptv3/Dockerfile index 3cc3833909c..10b166a59f0 100644 --- a/javascriptv3/Dockerfile +++ b/javascriptv3/Dockerfile @@ -1,25 +1,27 @@ # syntax=docker/dockerfile:1 FROM node:20 -# Update image -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* +CMD exit 0 -# Copy source code -COPY ./javascriptv3 /javascriptv3 +# # Update image +# RUN apt-get update && \ +# apt-get upgrade -y && \ +# apt-get clean && \ +# rm -rf /var/lib/apt/lists/* -# Set non-root user -RUN useradd -m automation && \ - chown -R automation:automation /javascriptv3 -USER automation:automation +# # Copy source code +# COPY ./javascriptv3 /javascriptv3 -# Copy resources -COPY --chown=automation:automation ./resources /resources -COPY --chown=automation:automation ./python/example_code/glue/flight_etl_job_script.py /python/example_code/glue/flight_etl_job_script.py -COPY --chown=automation:automation ./workflows /workflows +# # Set non-root user +# RUN useradd -m automation && \ +# chown -R automation:automation /javascriptv3 +# USER automation:automation -# Set default command -# `npm i` needs to be run in the container. Otherwise it causes a dependency issue: https://github.com/evanw/esbuild/issues/1646#issuecomment-1238080595 -CMD npm i --prefix /javascriptv3 && npm run --prefix /javascriptv3 integration-test +# # Copy resources +# COPY --chown=automation:automation ./resources /resources +# COPY --chown=automation:automation ./python/example_code/glue/flight_etl_job_script.py /python/example_code/glue/flight_etl_job_script.py +# COPY --chown=automation:automation ./workflows /workflows + +# # Set default command +# # `npm i` needs to be run in the container. Otherwise it causes a dependency issue: https://github.com/evanw/esbuild/issues/1646#issuecomment-1238080595 +# CMD npm i --prefix /javascriptv3 && npm run --prefix /javascriptv3 integration-test From 16137f825bc5159e98d234424d956236fa673394 Mon Sep 17 00:00:00 2001 From: Rachel Hagerman <110480692+rlhagerm@users.noreply.github.com> Date: Fri, 13 Sep 2024 09:40:46 -0500 Subject: [PATCH 98/98] .NET: Scheduler example update SNS topic. (#6852) Add KmsMasterKeyId to the SNS topic. --- workflows/eventbridge_scheduler/resources/cfn_template.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workflows/eventbridge_scheduler/resources/cfn_template.yaml b/workflows/eventbridge_scheduler/resources/cfn_template.yaml index b24408fadab..7cd86232891 100644 --- a/workflows/eventbridge_scheduler/resources/cfn_template.yaml +++ b/workflows/eventbridge_scheduler/resources/cfn_template.yaml @@ -6,6 +6,8 @@ Parameters: Resources: SchedulerSnsTopic: Type: AWS::SNS::Topic + Properties: + KmsMasterKeyId: alias/aws/sns MySubscription: Type: AWS::SNS::Subscription

      Please see the the analyzed video report for " + - key + - " here

      xn8k#k(kI_ug#GGS(J;*8#Age@>*>`pMe$T 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 S{V5viqadRyT_$Pz<^KQ?{$#}f diff --git a/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/dynamodb.png b/javascriptv3/example_code/cross-services/photo-analyzer-ppe/images/readme_images/dynamodb.png deleted file mode 100644 index 8b20e716f6fba77ac171e4a7777af1320b7e1a78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80346 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

    Du9WuOTLXT$ZY`%GcjXE^niOw-1NfQv-79^! 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 diff --git a/javascriptv3/example_code/cross-services/message-app/images/client2.png b/javascriptv3/example_code/cross-services/message-app/images/client2.png deleted file mode 100644 index ab00c8e02d1fe9db82031c9c5a1d544ef407edd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45171 zcmd43Wmub0(=J-4r3FeUTBNwUdke*_Nbun9?$%O@Lm@y2mKJx4OCYqkySoRM;J)*= z^!@h!cg}V8k8@oCB2Q+mXRTQ?_uMl>=to5<40Iy&d-v{P$Vh)sxp(i8*}Z!Yo{Fx%}tn{+t<^ z$Gv+$pUQlAujZk*eeJIKdgn8XSAQYoI(2K?_oT9a()%Rsr&$qiBKva&X)Z&>kZ13e z)$}TG_ z>+4h0Qr&zGfOr*mG16l{d!(x!GjsA+mMD`pHncSkKofhqH{bn7l$xq4<*U%l_|X3M zrvKTzdjU|iqL6VNNQ=?ILVR9TRaG^IVcfGn-}j@*mH#V9T(*SC+5 zzn^{m()H-iGd3zUnm=kp6!pimQqdC$P_$<8j3O?!OY?p`|(y z4|xGjM)Hka&k~C#$&$+$ntwlAu#Oz>qyEPpStSB9G|2n`l4`n^U~ZFPyjo zJ|iBvU#sz#~Q>*)s}2d+D*Cc1f%N?`!Gz7#(?^ zKEwp6cJ=na{hfki>r{PYLccK@$(}YFd=$ig%Gfd_yl(=Xh_-pWkpse&J+~nTMb-UB z$M4+>eDkBL#T-|t0pYdUmysApOBgLwGNm)kpVF|6laSQ@>TrG1P-GW>d&g!6C`{Ut zz51N5Oz#7}lUCt~)M<%6pSiWIx&Lk$qIsf12s@fu-;zLH*>4l{4*w9i1?~sT8QGZ| zlYEPdZ(nj~J=!izgu%i6eA-YqmwJyw#ff2|{MQG0m#H0jPG2f!W)fi{U=k8r8{$4b z7@Ck`zj+0Y;|V(5s# zoh+T9=nY0y(&7LK85!&I3vR~L&(PI_#0?oggwpo3B#(ZzRc{?GqlWE_onIU4rq=y% zMFi*M)#n_UYF5p?*$OxA$;+wA0&t0@u|r3vC<8ON)xfCmuO6*L>YAd9lzR25;8s!# zGAZi$6Obf3Tn=>><*VY`@JzssN@kDI77vs@vp{(URDkKQ`NP^o)fO*OC%5hgMF1EU zY%VIo7s-W;0?+O;cY|5k>*BukUs>F~5GctFIKDb)mP6z1)ezkVr4XOS_0gq2o+K*K z$}BV58?^ou`s^U|be8zEWGE#sfA19}K^*6haMFE;*>x1b!dn4vCGFLoS*eU?=i)E1vi@kvPXtWt zhg#adLQ}hvFtLd-1GRdhoX7PmEFx>Kug#6vl{$>j`I+uB|MmtWw@qn%mdhl1q{dH+ zb>Jf%7k=tlA(RFjkD1g71uwFTlaSfNVDVuI-4|ScPS~$@$)6k~I#n*$@82|1VM1Gt z*&aXccY46IM#n$`1Ep%b6PB0xg}eHAGIa)K6X|N9{C@Lc0YvsWmcSgc!Tof%dD{Jf z{XE9ABe9f@f+*2h4l}s|x#dkO#8BY1~x+;;ikO^1A z0Zk~?@|`JzoD;WZe${fOlp0>+e30kkZSOTJ*@EcH9JAosMEjYazgJ|L6zH~#B!%!; z`_0>l;z<&~O%8^ne{Q7Xl9XY1Qj6(m3OM+>@F9t^*U2j`z4TFwnz_l#ndE?GKS>#Z=GnMVpIBP) z1cPp`vL{bg8NquMj?W{yrTvqzednhw8~cQ^Dy4SY%wFR?cLJ5@5EkjxPb|bC0?*7h zl%VZ%hgI_pb_s3Spt&FY=n_s!{(l_hJ%ZYHkv|Y)mAaE+OU7H!0<5>vUo;{ z?NQ-OinM!jyw!8{9X^L&{8U8&`Y%a5P8Lou-i+CB3s@L=4LD3+01B#iD^KNmGKM=Y zgx;%ox9=9l&DnrP>lYbJ~xz_Ff*B4(MN#=4KOnN$M^z=lf zo_fT!EpvFjc+$vLzAz}!oGMr%(nrr^vQKD2Ldtxxra;SCV6DuA36e4o@i^KZcms~w zo~%^RaNmj&R!7V{1a0Wf1y2%PEV4tkXL4lpaw6RAW(&Q0cv&(+sOjis{hj7VfBWR5 z^<~>WX=`Vhlj}1M*K|QT>Uv>E_u}B13Bmk3`+DBl53dyoo{+dVfZ`M`h{DzQYOf#u z+2#l}Q;J8reuPj)v%y-f$yWl=t@QZl9kFvdUpvgpTZR1S!ILoD)c&>Chv%kZ_q9M% zDc7Ct-5dlDSfaJHT5#C2VAOJaDX;EpiJkmnT`hgw5N&YrGt}nsCS`{d2-iXQuSUNx zT=|Dy5`+KmftLS^_~-xMq9`N!ez5a%@g%ny;vY;%_^8Kx2md_9haWMsXa$QK#~gR6 zKRh`!e|HBgvEPkSvU5DSQR_^9`UvLMg^&#tXoc3oRFw&Zk)WK-YBvVMaeQ-iI- zO90_Q3_;c19^|bleD^s)uW7Axh;+1}D{dlTcR+Jtnp`3DebTFQi4HIIrpWx4GX>0U z)-2_=B?4#JW8X6jeKkN;nG(Pu0sWzDDofS4ir)AN203jm!Q=#YE*l@9^@O_Vq~@A* z5`bUyXCe+`kcS5Qsz<5Lk{S_c`O}Qc0 z^;0GQFqAF{$i|EG>yQ(R^r{8~X@ib(t33DKXf)>XSkl#MwqaqHg3cp|SyIWF6*D|~ zN$)hyhg%?8kIuj>-XR@z?{g!zdxTQy=&`zj7ZjNvn7>u@?%8Rbm6_Q`P5^rpzv0mi z$x0S*|C^S^5<611Hd==<%AJ=r^J^$Pp9UjnB;1 zov+ylecA%5{~WCasdpI1ubqu_7^7XPEo8L0(2i2D2PZ4)^LpNQcul##ptShHfCKII z-7PiV`+6?B#iZ!n>UhpH7vTEm`v%)a_y^LKmJH>zkF#N(%6r$+$YZldAE85|^((&1 zNp(vFLXslEZ3%)^_LeOSIC~qTmC2QUx3CL4xoWz!fXKh+Y~OfcKy$@Bi*3QQS5E~9 zzxbLZDjB(Mqdll@s@3G(^Mg~;iUk={Am3kXJ5lAaw5RP|R4jGav2}k-8uuWP30q%{ z9uIKDu-H+&%DBXlD3nf@^jl;H$xRnqGzi_Uq*`ee|pX~8t=hxY}1wFtj zuVxC8vX*!Lk#*@q5eJRCb^CAWq1~@K{9pc2Lm%qRjZ*5F4h?RYH&jCKdxZ~?<$G2x zYSuixk=g8nGW7=dhoa9p>P;%Rob=Q-0A$&Z4?C`@0;5UNffS4&1(Rb-zTEI5yefcp z=!BAqyN>T0e{EBvpJA4RSp7P7;}a$(j+|*a>c4xs{QSlZW4^A9bT-;mH=fme-#i!3 z=TJz^%PsTh%%Wn^n4k-(D>ZL8iLeCa^lMjcNgMdtVw8mJ+Sfb4hg^aH?e#`!gA-ys zmYDyU`98C9xd+%GLw|hZHU>hf&0Uwotv8;}t5E1F8D;hfK6h6xDuo>-}pZ%y(h`&=nC zfJ4a**v}#!c=_4Ax6<97jO5JePZaU)OCdxDy&wisK4;A9s&I;Js(-wR=hsijBmit- z4HJR^m3*)Gic-B+zi%E`jqdsKjIwoM;`8n1o3{BMAZV0~P_OW>lr5%KYJ zPnm?YG~bN(4q*??U8NdE~~8N zNwgsWqESrEXRBmIM;G?e!_-BAx}}!94FN@7n=&$+z1&vf#e(k(8 zmCpn>pmE$xqmFd?p}mlL?j31XK&PadSjc87tMvF{=p%;J=18Y%?k$Tp-}U+;|Fgj^ z=FyRQ?2%C~=&zNC(rT{ps|F?e($UjB*TLJ|jga3?U!sq8iMsbI-SC z;JG(3`MXDUJ~YW-;?HTx>3TNUN3Gf0e$I)PBJiWeX7XrbIL~@B+XtvhM4*yFqmU$E zeo~=O$7!#dI;}>Zs-v{ac3}-17_6yM@zBwR+^qX5Q0hP`a+H$Ut;ZrPg>xp7WtRQ* z{YFG7kbTVE$Ikw#KhjI>f?EeEgPG*V7?o1_t=mTEL2l3nV(|h+|Ml>{u8M7QLZTl1 z_jUEL4s{U&QrP6XdZY#h5o#wcrp^1(t}(vGi;!qJqBQIT>DxY8OZo{KyBSV>&CU~qW-DE=EXb4TBb|*UnXs5*e>U9ZSw~0N^)?8 zEKOzWD!kW@=o@d07Kl><2oL|9R5+e^hnHm1*G!2+PSr3_@lf%gS{|u~J3Oi{!g1N# zPKRjYn=Fqb#Sa5Z{>yWm_;J@Ew1qAb9jwaTwIBu4C?83lV6VEk83<-GiXI{jPsQ<= z+E`EXy~Io;>gJrYHd(%*qYu|;_ITxfIkP+Kt$?}BD`>F>Wmsshh4LF(<(j)6x;Yv8 z`Hb`~OG=t0B*61rh=SkaJD{sx5vTUJ6QtF-@C%iH>0KE-oZP@-A>-oap4xF@z3~)D z>;4nC>;t4LEtrHa&*hNP`c}ia^y-JFkZO~Iqxts8m4P7x@?)E&M~|CH%43b=^v6`t zDE+^16m^kcyvdhHvmw&il@B&W!5Oe#3u0d`C>_1@rx;g&rdpfnGXe=>0o9IGK$t|? zYAX{_bT2b5I%8|S5oTb!0lMdB+0vi7E!Z7yav9HR>Q!QLRemuW4)d1JV4fl?FG zK-qhm|HLW*zeD+-?Y$ZE^Gm1)6S-1vl8z%7`k_32^-Wyo(~gpqnOWD!@XvE&kOOR} zox-91*f##pq1%pk!y$mb>?ncrx{#!w-0H#ZS}Qb-x&$V%tPt2{3$2xv6&{|v4n4ni z59+Ps#L0*g)X6f|e;Ac8(s&wKuql^%+cDyKN29)#Kny*XtBHmsJ0y^rLw#q-{CpM8g3;zr*6a5{j?x;}mt-Z&inAD#1NAh3<&jw|p*7pfSVR zo)s|9#T+wVi?MaPacQ}alU1f`yxVg6wUky<&w}#MBF#1M3*5Oe_{`D)mF1Qa;v2QB zq!#};;f)D7&N8yr(MiK*4Eb_FFT&=2mjcdFr2u&@Z~xKA3j>J{%p}Djpv+@V@QN#Z zq-H5Sv(8|uMMfBCYCxlyRIjEWVIDfRvMBt+61hT;##>a$JyS1c{JVv9AKpb40piBt{4yjMTPxOW?RC>!XY!+w z0-UrM2ld)z@`m|MnKB?HLR*;M(J!hEzBrdfgN|E;Q~}$~5l0*vVD${hWwgy=dGi3} z;W831LR?z%MO6~UEb@9&M2bqd6(C|es{YeGQ!15x?^*g)!4(z_dEEbEBvvtnI1Oqf zDp0}7CA_Y%bg8f+78ODff|elK(-9&qSBOwhq8R$CgXu5No&(mT^vV?L7TJ8KDr8i% zB~MPACp;hkx_uwMOdrJl};!UYoPM;c_)Gx?YP8IyiU! zODRg+ICQepHeMa-;kGmF6={^MEt`U@uvGOY<26OC&@zoYv8dy#JeJ`cML-g_s_mSv zZRF!O75H{Kl}AZI$`TzI+5z2tmEF7+tV2M!$5vO?MFDt6yV_{)D*(+!gKVaL%xKGt zu>nK<;!X7Sgh^hG_#tcpdpX%}^rY#%_?GZ=2nbe9I$gQi(WelM;nHapeB{zWVy*tUx$ZGulvHp%ipsuyb zp534olk*Cv)7Q%gnmbPfB~EUmUk;8{dOqCg~+l)ppY+M8@9pT^Er=k_*=wpEj~U{&9JSDDZL;_JO8$TTU)TdqD3W0E4 zRokJs&akjyd8{6ht?wP?xo)7Yqd}XONvMPWRBNL-RRHU6I%WYONo&=z8_Uz`*N_fX zk33;Gmilyfvm=@vL8b%@kV*=jryoX)Z%g0OV>nrd9Z?BO#k%Ok`UGD?&zwxH=Zi7Q%$gvpbyBtH-NsP6R3AMA?@&jw0w zQ%|}}&=<)M=P@|2zGwpvsPA)HYmTqo;mE6=+ybP>j}mKlOixNsA;;ss+nrN-92y0Y zT4&W`abB7FMjv3zX2gjf;i49aQ^v1;{-c>vPVedxU?#hB8w$>3Gphh-iZ&*>lTQcd zMmz=sY#Z;FAv_ur2*`|QD^Z~RY!&>20p#U9`W~Axeng_y-uUI6y%*(l!)}yanI5f| zAL3}ifp{?ve>oT)S)&gPEWsKDOB-88pE$B}>*jL&$K+Pzsp2yyHY%CNBc2)8oz{j) z@g`FW%}ecJ@@80?|t3_uh=-IWO^ZRn1hhKmB(e2vWt3 zN5M7HQ)?LOxDA={^eeyX9hb8ONZ2f*k?FfMv5X8HLtQSTO&v~`U%T-n7tNzrJ=2QN z>&Gr8GC0R_5bz9EV*Smi>|MLqA5UUTo)nJhn^(A-?jNUGSNPxBT4@f{|7O79&wIRj zWv~(C35BKJbBm@EjAd|Xw%$CWF`V1HKAFYd&Yu(NJ>>Cw&YZmu;hE$8wkH)cg zfNpzb`+Zq;3tRRSLNFPHbQdIx_%b#Ji_WAo zM@O}=A4Xs=YF(~1{JOb$t=?WWz5+Ax*-ux$$cfbUj_a!(`F{(~j2Q{&3AHZapu`n} zt8rONPmNO9Zl=a}cMXl#3bN>BW$V3hYS?lP6jFOn!5vEUk!XL+y!8U^x2^0n&V8C- z+~#^Y(#<1-uhfTKcC zR$$%9U^pxAYe|Nr&Ds;lqua7ejhX1}=`yFzY+N}W3s&vM55~P>#{g}sZZ13~WmT=} zkJm}(EHYiGO1#y(1oQaHdSAEHy-25M>b!p*Z|qj5kIs(B9H-8Hu40g5r#(32eE0ot zcK51cg3B&`U=MgrbH0Jp9u;J$)Pe5h*7@cywbiCPmjXss=fDKrFzgp{lZg-qKkPhZ zU#y26dMn}4Jb6)IO??KQZ``)4bf4~`791~`DS)-PY+Z<7yip>sbDOB1opeD&ihHN& zmhCDY-S*I_MktwohAzW*z$bRyjsnW7p4m60=hl5+izSQF+NY}WW79R8B8~jrp8QvT z@n9huIzG$3!wf3q7aG~cbrQXKlDKf5)oS7b-|gqR(Oz1FqhDcI6gQ8o%1q@hIdG(+Rl)H%;&%6S58sBJEmE2ph`(S^oo$pIN1rJK}gumxB zei*fwUF!6|9`C$8x7Wd^A8zP(^*IrtgJ|ljq*#&a6{PD@Gkh+g)fGx}I`A<5Hoaf+ zq6f*hRby^l-(Z;vHLlI^tpx*pYxrF~Nx26y=TKx|3Rz3G<0>5IAG{Q0Msd48j+i#E zRED}n3I|7vweigqyIv{pT57D?_QN~{dXGP7i2eG>p!!)R3=L3h_qf$>uVxmy8izT|?`k$aqGc=_6}??$y*&c^Q{8ln-VU?gUa-DuH;MnNTZ%JBTBLYclg6^}RnW<*sa&lAg&1t-tm<*6Jq|B5@u zgUV!?>a1=}5V=%(pACmgd4sItJZIe^y9)i!_ilIeZ!Z0TY_4KMS)dY1Vej1!6eRTL za4KfaSiBFOL`)K`}AUD3H{~RUgL3J2WA}cS2b|1Rpz>LTa7*;DPC`2Q&NY_U481}%7k~lKFLFgpPA*F zxdgAYo;SRxmBiFjhe+#Fh$iElxN<9VuE}Tv7$3PS|E@JO3_;cn7|o{MX=V;CJVs9Gd7LO_Tqpft5fP&)V;szOWsdhM>y2WKjHFc^hm97vlh}%T7SeE5#P0o+=DrN$FC|7X41zItsl)wY zil85H_$Os%(V2jAasAEF+4MoJ#&vFYpxox%i3Myo(H;Pih8%#XW%YbCo+PWT7J? zh3EN3mcD7fyB+35kq((ZzI~>WvI{DCy_M{E%yijV2L`M#WvZ_Dx>zwBQ};bEdlK9h zcd7UJ z%q6YFpYb9kj_=D9bOl(EkNzh>xS?}^BMUuSPfJ|{q6q-XDV?zHsp_r++1|s%Mf|QoYyx+B@E3GOtEFaB7PrL0^(^=Cz6fn3t zHR7-jaGSMCC>r{bcRwa_Z7C1bqbyc|Rb>aLzhiZX&}qKy?LW`tL`(#eU1zlmvW?lq8eLkA3(y^WgH4hW6wl?}&24!!uHYz@Q zPFl!OX%WIN)4VD7=)cjp!g8Dg<^0HojP{dc`uExpv4@CT5xc1r2q(m^59n{9xbKct zT#s3Eb`t~pz_T;=5&x|9!cFS3-q#^(^mqjpJpNUu^rGbg9<{&EZzafG7oWj#V> zf;=~4@p{3dmydgT41w`d|FGVQwCBsRG!@lIEH6P-d((>@-XIxJ4ng4<3(Q?BcH!2P zGqC*ve&Aj#==pu|=(olkqOK!0Q&4U1Vj!fR`rszEWtxP1T!)3Ugug83ylJqQmBfM~ zIPT>@l85)KQSX0Z5oAHrudb2V`kz%3k?kFqS4T@6{~)ihKyV-3aQo6ty8b;ruRunpLzZkG;|0c@yX50a2uVfe zyHy_zRo;+@7o*ZZ9HwD6Q>GFk_*630t8cnaiN$D`3ALJ70pYP|Cbmn1!2E*4JdVAz)K;A#0DK== zPwEICsqlVu9#lc1@~y+qL=IlT)Jb)wA>!i9&8w2a?L5V``4&x$=6DycNP}B)2$r~_ zcm?|J0Kbh_P@q?uQMEDe@QGTs<#2W+l+SW&Gb7wUl1tGl? zD!h*6$-W<-2Uzu8-eib5b)fCqx+4YdHH3XAjEnkuOm;D35HFK}BH%VlfC-*k^0eG4 zM~KR7zD>Mr3&e6=H(q2iUmjv%g%MPj3AjdOphYOnf6@D6-sR?x(rF}e869_Qv`-Ab zTZVLHe*ey9+7*|&rNOqV>-A>mI;SFgmjKGEtVa)4ve$#3RUhEwbQX7l)-t+A>K1^3 zcJUoxg=HTfcyqwr-d!Ig)(*8#<)8MX@qRF+fTVwaC(xCEE60I?J#x<@bh8MRfrBFU z#=aSSWct<8&OORPDAe1?h>a-j^u*xp z5IaMV``nm)OhvzS!O)qFDFvaZW!X{>gW5qra+9KHS2Z|{^8E5{dz~dVVqZlWSRKaJN`J;fSw%iTRf%N_~ONP3m0rx0yt zHs|6Z>Si$hHNM=u@62`Pj9wg*_1NUo9oj96y2+mh&=D3@zsv|99D*GJw#{) zJr+9|Kc>EO%J)PWvMSKVVbn0 z8?=3hra$jyaZqY`ATYaRJG-RdH}#R#*GAh{vHDDtSM_;O=iVr34u#^I-ZV}v2`xVj z@niw};->T<2DcogFn$}-Wh@1Hk(YPY5W>|-%w!W+eS0#G<*d>v>z5u8%65#=D~|q!Snt1R;1@f`t6HG=vTeU!Y$@)d}N;d zi|``J4OT}&8U%=VrKb=wQzKMGM9^`X(c%k=nKILf_zggP>B{i~EAiTfPV)8vkyF6z zF1q1csMbED5A&Q$g_sb*!1GO!x(&GGC4nBoPkwEr9NrOEV64 z^DXbX;i6;#kH<5w;BKa>p}x;}!`kVn+G*S?=I`CDkPkLyDi_Yz#8kEBn!%fqZQGRu zUUo10r6WMPOUey)XsX_#*GK>G>AIjy)+Fv+3#Fq9Q`6f(iHoGXZ+J z6nhak)j!*>AJv!bTvJ;SdzP3axT^q8o!XA76d<-2b}l>a$@`sR<0>#}Wj}0XE~sl_ zTGknGT`@^!@60#1?gqd36wSvEQT??v(754)<#cCq7O;#4_~r3LX-l}c>Q6Q!C3Bt^ z(b{S&rP%SCP8-?se%!L0R!=q*ygpD=oK*3yswSbBy zOygU>VR;9li>y=nUv|j;opy>xMf%d0Gb{c1ws3rz&L4H4R1!c6yh5;(r?i~X+d{-S z`}b(&<}Qh{75e#GBz=Zjg2}%-(n&8KGu}T$$}TVEKYTz01m=y6NEH)xZdB9I%N>sw ztIsuRq{Ou_GErT|-F_eZhdU@g$3>=#=^1`{%bCH%Qp~}ZJ2jru*ITr>)VjuLt}Xq( ztjbPU0a!n7WIyjRmUj>*E_zw zHx>K$2_Xv3{}c6A9A&Wn&C{gg|NS5lKBivR7p~6E&c43BB>x=`E48hy?d0SH)$epV z^5Zx12S?1YwzhVDem<)0s@16U>Ax{of)yPd9VH|re0{GAG)la@1_O@NXokSjzZvN1 zV{FxRRgl=RNGC^NQ4OAf$EH;{BO}^*_1_wWYdRJ@IaK=k_~O`Fi$7LQ$<)fuj>b2% zP}Wx53iR>qt0Pq=mcFjy8t+CSwxuZ% zwD{L?y-?cW8dlHzM*kJ4s>RT8gNvmo7fXkVsdi!LBKo%S-2dv$FNX>grwZ7eX=cGY zy$$|5m(&Gmepw+T)6kFt#%icg zyn4FgP9D_tNdL}Fw4sY6Q^QK~GBZsUDm~Rq^NWhIin~C7?EB*Ks8H31{x8-fcw-^q zgI8|P5Yn$fvl%N=3w(hp*Wvkb?tc@1r8RSPdn0&n_4e`<>sIKm{UD6fT}RR(D%pv8szMuTg$yj+iJ4!IOGL@8lXO^gR+@1W5o0{&WjeK=u6lS+9y1`YbXP@X8Z7O>jfY|Iv< ztM@FKyqcKqpUg;2(+eHPZ~D6O9wsxOdNCR(dG)i@{;uvwUt(;c_uYlsiD8Q~i|5Kb?l55+W}Yy4D6(<{#hPNWp(rZ%^Oa4q^l3^zZa*N84yJ zN|>REFmmil72c}kdhxNV}rW+AFd zL7eE}Pt;nVcLmQ8%BXu3>UFo%u4&u$8902;sJiJ3VrER(ncTZY)$6UWud6r}bau?e zUYs$PW!`p^BA;LK>@|MGEZ0mSHEJ;58`{Ycw?LIfSnezB1?S73ANV1T0Be&H9U9qb zN@P}tbMC7eZ{;o;;|OaU25ixe7c;#?OZSSRkKl~Avt1>k6Qp0KXz%tEFfU=cbPULT ze{*!ZpP<%Qy`tx*c{WJ4d(FG2Ll>=fjOQoOOg{`2&YP7E=qM0TzMR8u|b?xf4-U(C8<-jL7ufKWXUj)Yp_3Ze9 zh|_s=S?B7BT9e-o0LNK%X#K*{^mN~qo!QtDDJ0$W;>I5@+irpB3RpCMzO$~4ib+*! zDW^#IF2uUIc;2w3Zr|{#cXx}{r%^{hxxDX<&vBMD zhLUc5a?4WL6Rt>9`V|ChlU71jl~2@Y+7^dhG*wse+|x$(GJn*o@ER}eexK(l!F2F;Sc9#lX=J+1%d8EPmrNvzuhD;b=`n*{8Atlv@|1RgML7dH&@*m5I9zplw%2O{>U&2gWeJs8BfwN8*^Jnjp^b1<@?hSL;%VE(%fg7%R2&z(Jz0!ig*Mv$ni`;hb%XtJ zSWtI0nJZTJn(quFfta?e*g*X7w0g;?<`4I?Sny>-i;qBbJc+B_B~5QofmyVq*MieKB*T6*r&cQxOt@WE1(-v6kvqOVpjju7@eG+`Km7B-RUH38psM*4> znj@JaSYsV}!tgMh6Td{yS;TqjgNBZbg7ffXKn>HU^>gDK;Plw$_P#Xz;*tDs+LfI1 z4Qu9UwQl9O7`^m-LES@&;%xBr~Jz|JT0q9 zp>?<4)~_-chfGI<%AApj=ac7_gZHa0rjK997t=VL_e8VUQ}T6UDH82yWxFrg(d3|F zCbbT~?aXRv)4&ahekuA|e*TKW9Lx8-ECeOVwbFZDOpy{>^XMqn>6?C{%WntJT=6yH z!7HfQAUbkm(o#uGnB*A2%6<^yrHCVR{Byd@?>f6#gA%%Gj=(cDH=+JIFI;7m7W+xz zomkqtj;D?SSvln+9SD9X^YvRVtvc9Xlc`{#Z^rZ53Mufmdy$@v6Fn6RGb?X21Pn=i zy=GVI)bN`;c-rzRx<87@^p)_liE7WC5s9sces8Iql~{X0Ve-Mf^|i^vQ@&to1d@^C zp}qEo73;K12Qvq?a5)_TA46nSJe1*rWY}fUZv4i(a|fs)NX^7^KHFS zMdz_hYBXD4YbJ$w26941vqX{~W5nnJLF~mD5cEkVRRDUBAT$T{Gg< zg}6?yCsCW-X>7PGGIp8l(F`01(z}N5JVC)yt){DfyHa?Aj1(-oezo43<;jkXADKXB z+mO&=GHl^f6@Y7zos&_$C;#z&i%%Zg-L@t?ooJdD1F~t~}1+ay2YJTZ1$Q-=t0W z1ncPw1*QdLc&!b4v_8XY^$#Tag=Gi(y&W!JYnZm+!J}32atc1s!`$Zxf;^FA|}$%gfZRyy;fMN*i?=6}By0sg~x zxuTvI!K>a8_M!!AT{MKOOU@L)O10PSwHGa`aZdb3KXU6TYEl%;S2GbJp^+H1?ueP2 zRV%A$rJ0Bx?0CmAC|WA7R(eG*b5O*JziGulyr{&Qx=BBfywhuxVKq9w*!V(Y%hY%WLfBe zqVgh05PyumS7-r}rt#}?pO3z_>jSGC4DO$mu(otO?Vg-S_KhTKp{!arTpJzk&(Z-8hPDm;Q4nx#qF8R(P;OSLB3z0x(lFF^q4V8b8 z@VYZTG>M(H;WHx)m=n_PwVj^DF}_}A?_>8E`ny9qqH%A-^*A_Lrd=Xv_hGZ+pY z&83?iFe{JG7-7y0Mtra(k4h2GcT(51D*Qx4FB9=DxY zdnd|Ly3xI^Ppw2|r_NeV?w-eg%b)|;HwAO$N1P#<&qdW}8oxBjN;;k4hLb!;^bKoQ zS&d#4d7nb2>t}ICzbpChUb=O^Yt@nMuynH2j za-MzmIcJ|Ozumd*t@CHZ*Kd!PA6sOtS*%uIL?<*0jDZi*W8XgA{*WsX5VKY+0%2i> z0UAhM`3cm!ki9`p!VPazgY7I$ebT?RHbM?#^Le44px zs~0Zgn^cIj_N6Xs{PPB>BKHAG1rpK}0g@zL`bFXn90Ts5*F2{W;AML4eM^pdru1yf z!$xK!FpKb$PB0s4=OBi^iyrbL#`;pmJ3e-!2Ua!vPz5&=UFcf$5w{CoMT>{7uO9+o zeTAgW2kV+vz>EW(hZYvL?}9RVg3PoE2>HeGS-JGhr~ebF}WWfe}+1sjbwkmQ-frOREIYjBcNTnud z4lkNz=pj{zta6xETaN;+Sb9l`0A!-wq=1WaWBFZvoRi7!oI+T_ZA^vJGngB1Qh&BTqF|W(T&7(wk7T zY~e4k0GQ>-486+QVLZD*oyls|3lGK; ze+&83ZWE^??h5l097kCCA-GLy#zy%%|A{LC?3n zix4t$rIZiO9u6v)w<2#$Esmwt@1Ui7`%C@X=`5ZMyGsX&F(m0ZlWZlV9l7r_F@LLQ zz1BQhEhwaZtHSo#+iNA+07%Q&Ld;M{HIL01I&M!^O1b@^l{&gVj6V;lIx2dxt}DiW zQ!X9&Xq~LPUJo)!O~0(7&ML!_>%=6T=6}ec7oL?PlfYiH@9WwaUrd4!cFL z63)cCF84O9M2KY*NXaalHGw?_)w~Sa_Ts@04iSzXrv-N_N%kC%1Cbn5?rv#CiulkY z7QegQC`QG&zSP>b^|oTqAsYPK$X)$RAz9PxSOpWV=+;H<#Fm!ajarrB1TjzvbU5lA zXzFg!o8P#{T89-qXX%QS$YGi1h=@qCA9)kseG-bbC8|aZ^9K@`&#^C7kf~@~UhwuI zL=VuvAVUnzA@H%kF3QJ{AQlf<1az(5$J>Hg)sw|#b){X0^hC|bPs{#@P-h`78W(ou z_1Ef1j~2gz9E*%sCKHc5VJLDuj_Cd7XdXdF+Z!@Dr2_S$?5klPQ&Uw<7505UE-%Ug zYVI6J;K6*s!8s7z&UiXs$WSHG84Wi7H1oB7L_2x@p<;S$8KBVgK|~Z<98Epyme5HhfU1~*-7Z$d&6=pjtxyU_r{2nCRv|~QM!!k;|$6F6$ zzp4SozGyQ=9>0K>%qjJ;Jr^z5hv@C2k8t>khSgNHw6uows+aaxW}>X_O7l=vOZvZq z#m9g1G2hMVjy^S1>0^Jx^~pf&`RsY!?lEZyf7*Ss;N=_b-5*($9eGg&iZ@&0As;V^ z7N46DsU6}b-nkCUJ<>gg9H??em_>6x5SxA6)`k277ebL77p=`?!YOc9S1^bm>MQ;$ z>U;ivve_d23oo52GpIYI8G*~kqQv=u3cZT>kMJVAlhTZtu9l4a8~lQd_b(xrOM#!i z41W1iCQHzrpXfriv^2Hs!TEHyWxJ74bx7j0^%a$9Z#w2_TDu7_J4;&B<8oi3tMyyn zdRx)3}Sdb$KNC@U%xficxAyJR`sGn zFrxe0a*lWet}lg)`0_$)CqcPN+FI0z3O;_Al6zA8yz>}!zRdO|$m;9Yh5MwT85#JX z&d>hI0`)3s9sYjebfD9hBCO23qVdwfVVBxU3zdgXX3sO8FRF9l{!VRC+@>@P2wziEKK-3#%!`L;B+q6-q^kj-&l=``@xsKD@&F*f1ZIe7db` zYiTZ}sD*lF+>7(m#QfXqSol&zP0Fo@#@i}Vsg6e|t@Xufg|wnabI9!aE2`R0t#rPp z(SFMuPQU2}$o60TRSal&@R0_~eyKQrDrVdMxn>cM)nb{$H79cVPVJ`wwpB+d+XAbu z(vbi!ie!vHg~hyjvb$njphC@xe8hYD%R&BS)y|FuwMufYo zj!uESc5@RcIVRtlyHl;76KIP%vdz1e>oyHG2g&Zde}3h&JiZ~FsXm`|S<7~X!uX~f zlmDpz*5O*8pcic+G-}>UlR$nDx|S%M{`HO~zz4W%`*lt>Eh;~6K>yF&x&L4A82|r& zVtMEy%5%%}!~eCjU7S)V9{G(^=QeTWr!-Ca;Cy0K;WyNu+(_;U6=1eb7Gr`)$o!4S z#x2ni4XMha#Z*gXH{1NWS&aolZ88lS#Xl>Y>s^Qgkjt0#t*?Ix+lSbND*DCpzJj|S zt(N)MN^({F2#DdF_mt|uM%}Jeh^uUvb|N_&H>!O3-Sr#NkU512ioqH_;{_M5eqd)9 zN*mp>yR96-yRt%A_@~fB{9HaU;{%C~?m8>iNY4^<~vFIlp7!4~_(pl(ijW^uXc298i0*Q2?Wq-1SNd&5j% zndt(mIE2-WqrBX}r`x9$mMk1it-l|FYis zpyG(=IkkbXgPmFR%%sWK_}J!FJgZKvj@{gw!;mU6t7z-2`Y4?ez=L6&3cp?+*Q)#0 z{jLg3%OrD8$b?;a`oSDcCWy_ZcvG3he6?_p5+EZ`i5#)WGmMS5E(V@|;QFmu<4gP% ztHlW9&dEMn;Gx$2G`2U~?o~~GE>t0g%qF-`y%oNxV5b%v9@~Gu$hl67m#n}M_z1Vb z4Yiw)e=TD-7E5+C!Ky*eYnAD;EeCGzyt@(2M_}%~!H^{tHD2Xbj!E*{+#)G-FwS*s zbB~HI+>P#9O1WL?WLojA{o8P&Q^4^~7?gXIYHd?CuNPgu!dtpXt=kXyo&dbxN>HX_ zpl9mg)Ob^D6X%JJ@6$HO%zibN`b1A-hxB#8^~(zWH*GtJ}1$)Y`o{rn=koH53%PWqY|xnPLa^2D+hZBAk(|` zE47=&p}Mg%S`a7P&@+W&`42e>X6DbipFSDAOyb$t-vLc2>PCDJ$Nk6W_67e_=jZ5* zmag6~Jny%d$OEUba~l%2$wsxNO)vc{-lzzy4wcI**j>FrOUfuvo!PR>HMeEcA13-4 zbOcuC{C(mcDoi1wPcVfV49tqjq5)Evj~GFl>E-!{9H_8f!t#VG>xVF}y-{tBs}sn_ zsu%T7JW6*n{Ud@Oh`8mm3{ddf*G7YF(*vKsaXu#<>P@$oA=X&`(qTS+9eEWe6 z<@b?Be7JmpOn>qO2*MbEc}EQ^<<)gdWue6x9_1_ytCNGtP^Zggw?!zhUrB~l38VE%nv2yiEfG~aa&Z`v7$#J?; z1v+jy5*BgSH2()rrWwxsM6{hav6uV%wiq*MVUHrB|rQdUFL%KFx;Q0N0H zSSsm8lTB*Up@Fn?yP)$bQavfN4rQL(Z5m*Qh1)^hWVjrzMY0ot;dE5l9jCYHp7Q(o;q1 z9J9JX<%odwF|U+C&PfxE7<%Ka^ZF7Bo*`(g7tQ^2ogb6f^77Y5zd(9>NrPLeHn_V9 z>9ci57$YtWdrexyuR66O$V*>hu?`lBFo9i%-f(z8_5p-dBS#$PyWTvNoqOJD{yXMk zdu*o6QFqVQeI7?GQHw)^cdnd{?@Z1PnBj8mc)oPA^tZlTrp^DpR_idN%i{z65Zuuc zOJ3_RUjZq6pN=ZdZC`|9)J$Ilbmwya{^2qdC%$-WO)({#$82fi-REz4U4Knn^~SMW zaoGp&qSR^p+V9?tnh0l25jI;LbreQI=6s%#lRkkg)#ZmD&gb?SWjMI;$0kw|J>JgC z%`OlC9ug}AB)`88=nhgD{^-!4Tav`7V1-P%!(O`=(3Z8l`dH4v3o7pZGiq#>_|D^< z?a&=#2PM9NZbx~HiPd=uB{?l|r_9r1o{rkb3_17L$K$a`Nq+SXC?Xoqn-J_|V z->2L}r-EFxM}4|hB~Pm!De#W7YKWG3Z)6I`t+eQ{Ut!abqLQu`e6NZZRsT9uVu49l zUSH3A3W{b>N#=9i4AmXcB1@palIRY0qeHzo)3o)TUVWRTTA2qi*^s6--h{TU#63AW znhP7Zn`|6f-ppKoXd$6?89UdbZoz__hA=O`fc3MH1ox1>NRL-^iS6tk*2`am8TOf0 zUWQfkK4A=m8)2v%g<6 zZ-fXFnzr`#4)X9P++gnI8E02Dtkj8poZQb+;x{%qIuiJxvyFpD7}?t}W_`WC<2682q?i?AgIW{wFF z(mwOY#O^!s$~R>fp&-Tgk!&XA5K>M8kokysir2mfPITx^_xEIl4hFH1Zg%E}xQ#ZA zX1xvVqh|3QEWzXV?9iGa#6^Zh)^%>(1RozM=V185cMuLX#E@ON#q8+(3ER|pm#%}i z%=<#Jr-B2=&Z}p_N4MDzf%fn}_6!J78yA2p+PbAzTHnr$=~zh4QwEM)dftMcT>#z+ z66~5kc{|-U<`iE&w0ft3#UnO>YiDLZ>nP4Kp1SJFxgD78rKMT(`9-G-}3K6!BBKPID z#-={(Ry%%kReRQ}{o&Qe%tbY)VE2{9#fHO*hQr}$E{itRYI@up6^!fFfz41=OXqJj z`khK@qdFDyOQgwUz&C?_cU6d}JLyEaO%9~CWB&3z(p3i)GTApkQ?$PTRU^y@_wSyk zuMOCe@;jm`{A71YID=pI93#Fb$v*w~$yUqyRZ72UWh_~+H%tnY*wK(}J)_0uGTY3y zQ=l|r76AtQ29@$H*lGJy460-Nf_n4RAp_*l1Qjp_d@u%m@U@B2em^m#fCIMGueQ8W ztG+%J05A@YOlHHGM15>xzo@q%R|lJRU(`O=NHn@}y zuc#m|ub}AVF7H~t846J6*D=5w=nkv*wOBj8AFWwMObs{w^5*65*pODr(g|=&YtQw* z2Xfh>UD|Mx&oc?S$a<6vNPI}F-u8yX*=f<9a;8wwzMx~1cS6nYxaD@K_i&H-@-n41 z-D>b81?s4&$A$SNcbZZ^AC2$iOOGF#K}PlQD|-*z?W^e(Av$bY6lR`zjN#7=>y@Oy zk3!Kxh?#=$*TWCvq&$01QwT&KAna4GW{yks$h&^A}AZ zJZ1F+J{9khg|VzYMLim}A=fLu9V}LZb;{P`xqn<5$!3-3Ns(Z1B}4ML6r(t3WW8!I zBp1w1!EZGUeKa#icvnPEBK`DzHkmvTAD&3oH$ysDx2jxj7`94(RQ%k^Ug9^n zW#sb!)$f+}%kjXv?ZANAKCqomVf9~NT@~YD!*o}tc>5gqQnC(qj>WAwG~SaATFbnz z5;&Jv+avZ!6RtFNm?`k9D90wtbqyf&NkH^uO~u&MemiYs*i}IQZ`de8@#bP;Q{O@c zQ^=qK!l~Bmz+3*3=0ONaqmzMaW0?T8unlYm~la4+?`AU$YVZ%%xn^v2m z0vsq}*TE`XVcf2(?rMv8p1P=7<4gA4c;ocfWe>%D%Rg7IYIa4qnO|MO>|}kKLz{-{ zkdaN&`zVjoH@LRkN017%ed>^%u0rxZ&@g(XwygF#w7gd>(hbx191*KFjT?x~cy=LpZvPRO*Z;}1^fR~nD9t9J> zx%LZUxn!yPGkb;T{@WD_Q&o(o$f7g>JF=;*toaU77;Yd3VcFd~cvL?U%f2MEfF6&> z3yJT~+SWM^HPCNn1=t$olpBMA7+1Kq>b$CPMjHkZdK_Hue)(;DY%4AgPzdusIH5n! zhtEg#XgILvbK5+=kRRB>H%!GALvEC|?Empz?h8^`DIz2=Bse%%3Yz8!AXOBS{F24s z6lt$KMr9;{QQv^abako>b6H70q^Wec>;EnlEy5rqQ4`SB`67QH*wXfW6^H6m>8h$p zM$RZl)hI`T0~PfO9oBofOdR5X8kLHdg2KWPR|}G+F5j)xP)Z82LgmMkMy?`Vppg=# z5CCu(dtE(^vllb5Z`8LK92glk4b5e$X<(a-It6I+=g6ru5xghEr zufK-88JTnf39`Ku@OC3P0O>5i)$~xB{YEB+j~7S!iQwnJ3>(&q-QXT713^%uchvN3KMQfv&Zvdx{G6%{dp=`q&?V1Co|q=vALq~SDE;zg zbo@cEbq;4H2OuD_nUK*th${~TE$f0^gJzyVRO55xsb?c|#Ix8Js5AOmkEf&D` z!!cp<@H4J1>0W_t_UTOmm|vgH-=3dSr$J9)&S!5N3&q)tqp6QOocl~Q662LCHoMet zUP4cH6uxc9-ZwWh)yy@P=sKa>#M<1Ii9c*9cK6@Z%P*(lNYJu2?kjpUj;D}Ji1en} zoh3>ImpIFFiWv?-!`ziOs*6rqGsnF-TqmtcA-AeJCSqHkfjv@_LDv{sAU>(* zd6hB#A1}&9M>?leQ7Fkuy!lQ>a)DypKqh#1%(%|A9V!q{1dZ_=Ws|(q&;!mEMx_ya z%c%8;8WY=re(=V|5Rpaj@q+9&L!m*Q?fm};)oWf3$h<=5gRSII${gboM!t9_F$oarucjKSR)Au^2Y(QiNPIYwLjdPik!CMIQkSX zP|<|Pbt=Zk51!&{CHBF$Sf}Mn4@m2?n0mbNKmNz_MQJvo^Q4h!N(w?Qq*r(0FXnGQkkgrmI~XZVm2hxFWNg!}gS>`3={LbyO@U8aHFZSs4e zykp66M{nGZTTBg;u|A=nPBqW=bk6qe+~RC|QGTwd3Jr%7W!v*qSCRJlbxhPwzP2s> zi_-=%)x^B=XAT9EZ5IlJm-C%xJbrVJQHYqGg_tEs4c{4t#Dz*N4hu@UU1|XlSn*6_ z!Ec-x7nDmt>sQKj5I*?f4W{Au zo1SO2e=)LbrG!`W9BMcMIr1TM!hbj1P=-vJs38tnr0y(e-w zcb9F(7fO<@i@Udh^_79>l<&x+=bDMvE8^{9K9^NI5^reVJrmS@N~sjab>&L&eFFyj zDVbr{Fx;k?4s9{#x>`!Ar3tp}ncdlH9H0}X3N7PjL2NMt9zM19KiJiwR}?o@sCI>6-j&ZLmaX)xUul z&Nr3x^lUn5WmZTXi*yp5Ub|xCz%rwD42hPB7fd?bgt0^v{asU8WH#UWac@iORcDfr zP56^a_3OSKsVk*Rhi1N;Esk5>Vwkn>&#K=i88tdmkHsehu!!vRifl7CZf|-~ zrowntoW=C0T?`5L=AF~je9M~*%bS!IsOqUeSIWs$oYNKBzO7$j4O(!1YQAYF_freC z6x%SgddcK#lI`vs=QAF)#KkKtR7}Q5#L;$uuh%fSsLSWXR z!jf;fXp3_m-Z<&f2!+SNqsAVw>$EmF$@e)hEvJezxg zSTOUgwC{QF`=XJeQTf@&aajvrgs;;vvg0dR91!)`{P9k)ne*2rGaKVCPg5@fm)kBh ze>Z~LfJ`m&Jm0R#6fA6`6e;Fw`@3fc*N(qt74p%)*KT&Xz6VIz3z1Vn+L5TGlu*w& zfEt$8Q;W@Ovjh^!H4z*^?A|!B{&?`uiiLA*&*ZLS9bkGrPF1%*~k41d?`1k zNLdiS0qkc6XsXw|LkD{QhzNdGdpqq&m7P(vNQtuFjf!vj&704X4T-hYR)$?+B{U^Z zyq+w4JrH{CBtEB|7L#X9V`+*X#J^`uemVV%@3ghB zr;?JkvLhk-Nvi1Gk9mhRW^mY_7cftv72dO#swocG#rUaroQhFtSCB%!(W3PbT;lFt z%-eTmmlaQkE#Y-if&Tf7v}1euu&a}PJ}zr+FBt7jv@mqMZqfab1%g_mHB`n-C1719 z18;MKXP-?xkpG*4g!`8Lpp0z~EVM%9whS~p>pqPo9;H-5=hy+Yv71_2Gi+ls>*Tm3>2+zcyj^8Hn}hdly<943_nC)?cTx1Un&NwzjpTPYPKBeW zvUoM;${~ybbgWN*i@B-S|2`WRRZ?&q?=1`6E ztcx@LT|e}c&6X_J$fdS&bHDIID=*k?nOWU0*Usi!_CPJn(qYOROn=G|kRtBkHAB{Z z(0sW;72RURYDz6-8@Br7fSW~vS{-5Z*{WDp$=~Aqdq}rJC5mY6 zKTejyJ1%+q3s&D>GO5?+Dk*%+E=e#o)S7@fP2B9KVyRWyYOWZrgVGy$FgP*`MZH@M zDQ_w!NaZgIy(a8#WjIt~x?isk-1|;9U-~ zpJl32%<5)AwOOd;M_aEA*JV$+yd8n^2=K_8wVP|-8&8#?C>cmk-64)P9RMt*ks~0! z$*FYJetxe^C*#fCmlRX2ZT`v<&B)uM;XSbmlXK%B zGS&MUBK4zAkS3~URAcdlmB_xb`P5U-!^{_}O<7z~3?r0##+d!hIKQ5oqvo61n?n`f z^IWXxYke=`k7SbRRj9q(w{5H9>CRLCVJ96+Y_{T`GDOKd-Wxasi`7Y7++6rxZ~30D z`C^*?=1!fI-Z-_7erD(jW7bYW;?h5Gb~YLsg}+cv;+HL<|fT{XPX> zR6;azRtfO|OV=gxAt&3Ju|8Kq9VFpg1cvv2YsAquICYrGDzL25;B8wqQICnIYnpdX z?COodVvAk^Fq!zN_pqC|!x__f?Q>*2cphEQeZqTWVLy>V?cS3m)K$C{tuA)V@Ba66 zJTW<^Qh&to)%VOh=&4R(kLXS>Vw)^OSxr)L zH0&pd@8!c$KS+Bj6mus_&SfGIVXCV+Uzx5)g#I?cfn_e0H_bWv%sGBkx+}KbBP9ps zYV#2TlyF6jq*J}Q=)&+`L}umJauA?#z8?y=zNzPJPzUF4P-i`9!5ZP0Pv#2PFEz3w z>=K2uSKe-wtjPf35+gX59ppk zD_=e{!|KSFWBh;C!b>`}M6CTaeEp2lC%q%7Z~kquo?671e@ek|t<`;(9kPy4+*UMw z>;`@&vwE3+cCBP=vz=X@tHLy=lZ@dQv4$~iaegjG6nAyeH|g&e;#*%L%_Ayy3aU5r z6*X+Q;&~Flak`Bby44^`2yB_v`@v4UAsK&`YQEweC(6N$qgG6CEY1 zr%5Wob)15&Gt>4T`u{f~Inz7>F)w3h12yn|rp%BD1NOkTf4Rl(l;I(FtW%%})hR7e zj4ydmxa+aWN*88v2SaFjQi5@L!T(;#?Egew(>!R!?pku2N;q*3tepg>6N(g}6eNIZ zU~}*OJ)yIPmi$lAp+D3_5(`aAA(!lFWn>}R;GWOplJ*3o&c=)2W?QSJjed48POLDb zi^ZmZp>bwS+BP7VHF# z<+4OusRzYJ#&)N3F8`NlhXc_?Z7`fhh8a=AxRl!BcwASI(#6j>qk>-{-H(!_`+aDVxm02Zi(OXZH z7znSe08lvHuu4;0XpYYOu3YJa*qV_+t>=z!Irrr_NKgGkz$YL7O$A9T!EpLHeM-#0 zeAiEa#U*w-W?pM=EUt(i^%WTq*dWj13R009o~0wW9$kSr^_!2jT{Po14ttFkob0E@ z9m&oI7+{Npu*oqT2XUXwPKWBdxIHx;joRd8e{66ApDo^*-9pD#B zHzIv_Hc+VO=wqmAw8L+^6~0$k{?ZoV@}co^nJK!KZpx5W1pW83Y*_0*sLaRR7@{GO$Ot%uIOr~7(vxY?Cebdn_8I%3av#XD|OHO)Ox zy{d`}SSN3N56)Yttz8@&i1yO?r*!r2W&A}YTqB3jt!FE^658<99>grn3_!3`T9Un1 z^)D9gSljWQAlb#+v3J{kL@-@;~2RMxJi4cM!1rd9pTHB zK99}s3QF27y$SMa%Rp>byi5GSo4?gc>nWt3IjN%NfKi2iF6rmarg|IWYeaaU8NKQ% zc4Fx&sOssWQoT}w9eu$2BAH@cuou?VU#Km%Cj4APj9Zlo3!iFXv+fC|VTu0xfDC(< z(8=_4Todvm@A1}K%TO-+#>P5|ft0!FnT@wiHRAn==cyb**;I`(w8z;(Zg<{MpAjhjX-;Y9@ z;cPDu(O%N4lme{TJQy(KdDkY|J5djec;c_=vww0hves#}JY=h@y+$Hmh%x}+d_}*d zsYJ3!r!my-C<_a*{r+D+a-8?yTq@PrD3Je)ngBs`qtHLkIVGsnenRr8Z~M30OTix-#9#|1r1aj&beP}-}6w_zOMysa(TN> z!>~lM!cL#E%#q4eivPp*eAt#gg3~Obk~3~VD*`Y~C!x3DxWn8Z7<>{-=PqZd3}t57 z5Y?7MXMdy|8_&9ky2k`|Grsj>==T=?#>^`#bQgbRA#$Zj@yj}^qr0HhG@-p(*6;s= zCQX_S1s$ZMkImwEBv2MH_TbKWsMim9pPdNsXx(Sr0Jh%+wEEODzoIG5H^P+Vd^j2w zJeFzTg{T9Ayn3RO3FAc3mUAkie%%JcZ$D=*=S0RHXnOx-&b^~~eMB$kU|kVAO5O`5 z{7{wS|8aC1HS$F7je+oC)~R0Ypyw6(avSxt|TQ1)5v)=$FT zt%t_+HwPCBS6!;*&3;&Wf2Vvu~FFV`!hH+ zO|$#d?46uOsTrN;YMYgZp1E!7ubSA!sZ$k$VzS7U$KTVRZ63we2K}=@z3vYKu(Y(b zu=XYxuPjcQSIXJz#PI6b3Y%=^Xr)3G2TI!J0<$SUVy_QX=y zU&cRyUf=Ms-5f+bOkXgjmrq{6wsmW-LPlx}6m79Jdp@~j(_1~ zk&IkjS&e0o9rM57Id9-G6d76Eo^<+}zS8KuB?upPt|$`|M#C+EAUme0}mXu7(X!h%ZNpXw|vsqeWJZ!ET3 zFy<0_UTEphXbB5vw0})M-=6AFV0Y!W*SI*34fvgevF)g`GQWStO#t&_qD{<)EN3%b zQK{;DVd=_UUL&|Ps)!eLh;j{n(42|-xjkgQm$U-yC@j@M%NiQ~Hz z@mEjW+}!N)6wOq0`6;rXeNQX{5!<2~`zNJUAoWTtImqUF+naB>f3aY5Mqg2BkH<5! zum}qa1OMUec$^;sv7Nkm2Q>^>2_MLHLhbtgx&7Qalki?w7-p6l9vvMW8>6?8_fBUf z(w&~1lpBw%W+;Enw0zJN_s>k-5@%19`w}1f3>q994BkU^TdUo?jt%>O$VY#(wU5I8nA zhHU~aiukANICOV+H=e^7x~QS4DQ!*sFVZF=si&uBdU`r8E>5DfbE{YO7dYql4Qzef zzfb-DF_Gv0W7r@60>wE)808+S339bLRv52ggutSIcHrU2lHJrNKj}geK9>(w6NL)g z55!0!c7}9w3Pivs+q%I=yyLbtZ_)B^v=H06cYoo32Hy3I4rx)DIb};jLUUwpVpvn+@aR% z%b)zs*lMnq9G{K{)rI3Ijv;zupN4;;mAdd@__6u)9A7%s90sPAp{WhWHO%~%C+JEy z5WA=JU~iIf4K8%IZm!4n*-8QJ_?xNKkfDuO2Vf!X&mX*u+$dI@Tl_>m&fvL2yP3@~ zAG`8<1GZ+|p$c2q=iSi}fUJYVA+Tz_qPi_pHrGe<7u)JKXafh3hMSzW>`(cg(~Mvn zv4ahFRGu1jXZnW;B^3}+xM;@Nig`0Oe9p?zO1YUtUsCO~C*2DWT6#_`(8uMqNG}QH{QuQOgxF5@RCJBl!~sfGA6s#mK`QO?C)}Ij)g- zeOb%4wTWubHvO;V@KhIQJ3@nT8W!!liQ9j#mGlkqpI$w8tat^Oz_qhFTsvQtu_46KNU+^awNS%=SMwGxw3jb}j)7SsmpQH{*NI)}s(^Xojl z;TPU2v=GK%F^8gR3j`qan5(h29Uq_7$Z7+oiDLG?X8ZO2NvI8KDoR1f@Z#~v1YvhC zL(;_c2DYp7?~IP}Ho=wDhH%R!$Dvo6Vb$*BSvAbW(FSSZd?V(#h zxrsTMWGZo?b#f+vioRQOTN4hmSs?ee=?x31gwnz#pW=;5O)Y!gL4L6fvY45hU=be1 zpZkr^=&@D~vZ5+E_aQ%ZW8@Xom{6y zK5Yem{mT(s?(7ffkt%r2&Dhg#i9XypX>y#pn*t5?kHZpAnjtd>yL0gH+ESxxe%_c6 zfqFnX$!UpRi6>X6J{#-}1<9}J$jtEtW*jyJ5kS7aP4u6B<=snUe@zq7l4%AdTqJ}p zwY;MCFcNh8%UEAhVNL2UA9dLQ;$LcDi{*N-8lp2moD(p--7&+Q{DKS~ZGctN^kTcd zq9PL0wmh+LQ2p}@mvp3!TmZT`>`n&T0|<$IYTVr3-0bjk|Mvr|qy@iFYtOK47p_Jg zQe26Ef`16Ai@#gEOHazp?WEdfLd17AvNCgIV_9)1>F3%a^~qDsnVp@@%gZ~X7LAIE z!qUwuM*dxTq{?|c%ZrQ9xHtySt2+UsufX8bRFa=R{|wvlEwRM7IW;MX`R{*gFc=%p z|IfewOLZfa0d8(?yI*Wdd+OULD6jx7dbJ&dgql|<9?Z?{%_BC>Ub0Do*Mv7YUmJ>Y zG;99C!<`R%HE|)>k>QPyH=PaAJ=_+^L}6pQu!RK{&bzLALLR7_X_sdE0#eN$8w z!_$++hg6ueN}CM-=Q%lCy!67dUSE`BMLKjQuhr6!kltB~ZO;=_9N%>5_KQxptZ>xbbId$5V%c87HeM2y z(h)ZvS5q@S9+xu>tq8U0a3-;wk^*WVc65&-vex7qCwLFoD`W8Kk9UH}-OQu2v0Xd) zM?)OW9@GCilACz2j!fVwxHzSGqc3wdF7+-VUqL{~J1H(q#iIWrl^#a$)Spaq(r=FJiuNoa@pPK`%gT$KDARqly-nb5YXsSARo=NL0 zFvgL$Ix?mcyW!h`EvAw29%*%RlkIccESatwI5%~}k_~rfJX8;P3n{nw*7YgM%PR$I zWF62+{hkB!{dr#W5cL5smu?*g*rI`5>vKkB_uRF1PtQqP!-5=y*A-sxR+Ew7u*yZG z{YIX;x;jxvJCuzyVRh9)2!=Y!F#exu#2DpF7ul@B`PcV^T!t70gkD7G>y4ZgRIVYK z8i}RmYxIPDgQoms2c}k(lwvPuJMrL}B;-OOJyv^O0MB*nGE0lf%Te4_*2S({~v!HLRDClyog# zDIRR>vDmB-k!V@DldQd4|23vqVWl| zz@uR1RcebqmIoqPHg1FGMBJ-Sh>6L_$dF0AHvLJwJY>a%As(O9y}c0#gs5(v%Z8eY zipo^d)h{w+SNy7TrsAE$g1Cci)W%N8s-nS~dv2NTVa5LYR^l)vhV)ob7O$9!I$>FS zONU3$X1Q=m6VT^UnS>!Lzg5r>Bz|4XP}oA|g}< z?o%8QV%VAAZ^dnsuZ9qT=Eru7BE=vX5>rrd@zquiUn^ zJ;P^YhV!-?>oE6e_(DkHX~YK7(1F-!<_IsgVGR#sqm@YUh=t)%zV6xCrERQaxt-{U zxC^nUK-JLfEWPTr>FbZ!`%6Vd1)F|NWYc2;f}tTA8^e$PBXPz(phy2BVT4ocxL5Tf z&myEj^MwEnJ0I;LDr_W2UyDUW*Nv5_SZ5kqkR}bA5>WwwPRAxiBy{gG_Mhg3Csj0| z5tr6MS&|8F*9M0-^k#|>!?+>6@`?AswvV)sdRY$S$3;Q5vqNfxD~%@pn5f8y_7Ec8 z)OH^i_ujZC9U$7aut%dGVPfROA+hoC6DSnw$RqH7goRzS914|0SKF+QCagG&>LPWj z-Y!7tLncTm>b-7)KA*b|a3>kn-dC42z}s+`sj^yH?N8<}nzD9dcm|t$24g5a(iCMG zpYTaTSr{JX>~@UV)NBj732xVyY4U}j;1&{_f{1o&J(h`0l)KRg?FOsowv&debIo*( z`Z#`8p;z+%3`Y@bbX4TjG4V1Sr>0FPo$6CjUE{Z?KM0=jKyB|Psy4z46XPkt^J^Vp zTU0(@^S7t@MSHWw=_$vmMmw)l`5g?JS1w-Gzn+y>!bKg~gJeAc7Tbmq$rH0s_x{n> zs+DC-=S}cr(A&57s$2LU{C9sa)yNrAR_TRi!!I)9jfwuN$n&N^vi$#!^ViY%`~MBN z6?+$^_?wOd*M}qLlNu8Tw}qyk|2U&20JzG?h}#`qJn!%Gv1RG^l5~fU5ED`(*aN29dZ6hIz!#S-A5` zOhUqD2T#1jR`(``M67I1$Ufymhm)(yuhIL&9cwZ$GI~D(#-crNw2Rs60Q(!HI4e7Zj$7krxuz2&ph9nHh=86*ap<8N+kItbXOJ0y?7f@W)zJ z;h-HAN})3E5#s1*n%Pw(yLD#LF%F0oY&&D;HH+---i;YceN=d?RJx`i4~nqtI%#&9 zG^tGA;PlL`bYsNZn<}$SK3_R*r~!}WaQLa7BDV);8b;ct4^lEe&e61nDU51u%!qWA z+Qsf(xJt_$pTo$t>}KEi40oTjr6XqgDI;uE6YXrbZmJR+=g}pJ=gZK<_u<#qOEq}P zpzWeiK8N8MPj;qa4I!}fS~8w$)kj3JwukEox%F@V-oiegzfQDu(I%w`x6o`i(i87| zmW8o11{H+Yx%G5xFD|{(3q(^q!g8F!(?=z{V?)AkJJ{lAN*p|g44xysADh_ZRSz@2 zI?MUUlk=xD0(Nm~q(H32Tf;Y@&9%5kt#?r9uatEbE2Z|t4Dq#V@bXnrU1NH2c2i37 zCfH?#qkxfcJq$(&&~FMDvWHa*bL0;8Zt5qKZ3Q2tol_a`8akGO@YejK4x8vkZYFDh zEN=B3zy}3MTk=nX_?36{(|OGrht9wB@eKzuLxw=dyvKN+9Y7L(p4w`D;x+nueKK2a zz9vj#YRb^XxV9DJ^$E87z>UM6SYw9V5#s$(?kxPYX$`SARSy@2b0c@_DwpUwIscE= zzWc9COr^p zD4~ACz3=<^3%>i)zBXsi*_oa5oHrq8R#mcF z#2OI!d+RywdB^$NcWG_yaOmwci_4Y<=^p`nxF~ zE7ftMIY)yTUEu&Xrwi6%xJ1`KZhsb>Ajo@R9^v;+rhjFE+6yl;#f^VkShdzidY-5X z^kr1Fad#fQDR(}Y=_D_&%0>oNVP#?rz4-one)VKyU5aYboF{Pf=@W+J=}?{j@xGk( zu#MQdfe>2<>pIT!AId@E)F_NdYqNJNCo}UV`fdj;*Td7S(>7@}!PLu+Ru|sXwqZ9l zVv_y+g9Bn>Vz&zZdqS6IEy3ijJ73?Ed34@RVvum6Ofnzdd;2!v&uCkON+9c$sY`v$ zig;(##ZbYt|6QeY4RkTY!3bMBs=}6dU)`{`D&ES=%m=PaxF7)clBx9NKx z0Kq{Q6GtKeIV&39z!&m+>E@9#=X=ezC;-({0tL>+zZ?8nqz8Y`96mz-X$DF>g#r4B~B z13Y%8Lm-Q-r0bGg)$^a_GqiV12!eh?&MD-$N(s%f4XU7#_7CTd!*|EV|BAT!yGvF? zaE~D}(?&he45r!<`1o`MblbZ-HfT9#urmg+)J@U+;Z52?GTk zaUcr-JZN2u+VJ8ijefexIJ!{2{j_Y3;Z=WRS9zzdLmkWXPQ^|O7XlSiMvHCGeolc2 zbl?`+pdyH{PI{|Sl)9~&brKC*KzV}Tq!Y1w?w-e6)>j&-DwV-&z1H=58APRRYO@8 z!gnY6xn<<$y_e;u%dJrS18XC%58NeX=eMDduDg+1O=UnY)_F4iLJrh51xv^r!%mV55OIO*5L*<*yT;hgG zP>@&EBm{wQA8u~kemt{H!YY(DrofI;s5V}z*qI)QlONx?rKf(Dv##;!AQ1Hd8BleF zQO}RleS~@zcv1J-Y4}EpWiETX(B{ua>25s1=mddjvZfh6__!t{>iLrt(xt2OTo*Eb zc4dtFE9tiV?WmTzLKW0j)Wx6pki}y|>bnskTF7eRCeh}!AD?pxp?;@Zasgb)st-)x zqL0P#k@oWRGWfKyb6)Dm(#v7#oO0zCI^2Q0gW*@MKdP*B8xnpo66_eVNeRlj6qr6^ zM_OhO>@3d$Q!IkY_a>(x$hPHtH~ZcTR}~u}Nw=xZIceVv-EP(c(ez+R{LjRz0oJTa zZ`BI{7BWQ1ouJeH%f>|9`O-cjg(QOcCx@ z-q!hN-J1}sTPo*s^hNTbC|3}GTV7*K;TR+ZB^Qy10xqkbu#}u`PZVw#@%wGth0+G^ znGN?A3zIoiv2|=LH@8e8d3^+=g~cWJ){nkwr^JU}mhT*2aqQY1h)7b;`Mmmg)_O6Y zs>+FZ>VM&PLdc+a2)$^zTECiN*O$pe_O_>NpgkuEx$k2D%40`SEy)bQ`bdBD*7U1{ zYJ1XE71KBuNOZ!)#Kb4@KAr-k3%5}L!H6Bkb$=_`JC2`xS|DTz`JPMjmO;847bz4prPr1Dj@TxFTHr7&xSXd1U+$ipqSPM8^ zUR+Y*0QN;ACQbd>sXY3MR1Jh8;=Y3_zbYX;1!P~_`1N&->}J>PA-;{6u?*7^OQIGu ztG{-pc?*aMi3m#DI(hZYwEdDRY;=M0vNe%j+Ke9>#|(!zUo6Jvqw+&?!LGV?8hQ!S z9KixwJU)$T_3UKZ`oW&%H63LxF-ReyYAYYbRj^X(`QpK_psfWiFHw!hDoPX-mU@D!38X-b)WhvpST1a>~snvn^y;sgo^GN+RsNy6hWp%oX#IJ zD~6|AiSh~27*;!(EaXsy6q1;RXAYawcC{Ws-&ozgdStW|lo#3CK-sdFSrv4I&}|jf zj-%sYb<7Agc{fr;BEy`!)0k3fY8y*l-n`~zeyWC$*O0w_ zGg44RmnGbWcf;(tg!@243M7GQ1#H3FY&tn4R>sE~&hGdXZr+wcvsuK;-QB~DE_~~N z0hjb}j%hm^1nw;GfB;5ysRxyX8I`pHXAUNw$3<_;$NGnc#4=vL*YXBsXKQ6m*hG7b z8^D(>`v*Aln#aUlisc@%N_Sr$N+LY1DlycUk| zC0^N`9Zaood*DGTM_g4{xs#U9*($D?*;h5NT7EJ*?Xm71N%wNKCa=v2vwMme+NYM; zo@6~<6tiRn>M2r*2;6s!`yUp>zN|aoGiCF&=OIFYVq4vc)eoZ2C z?(@)RMIc4wFe&Leh9F&EUe4c#T||zFAGa+N)L0FgE~p5)KAoJJY_~U+(@p;68py3o zI0%V zkc&M@=940v(M}lT_uA}bsYCSL=M=<;a=b&^u(6oR55m$k_N1Z&FPB5Zm7qrT!xPL% zWngIfHl3e}20<78(3{=r$tj5w7$)`vKUZjW&SddOHj$>wA;&e0l_rSsytA#4o-Fd4 zfmTLjJDbnyyMDsljb}(OiXCB{sF&9|-CpsX61!fnFINV$fVM2>-~Cg67ZcZY5;Zqu zeI)dvhE%J$`G5%pp;ZN_a-B1*T{-f;xF^V8fs9&zifl5SWd{9(T97h0I!UX0CN3%YsKB-7kpz^=!v3&jG2^aHJ zZ9h4k8lU!OaY{16eezhtH#hA$hU>>7!cNR#Znp914?m_8%gbO-j;eg8Mm}|2gR{}o zA_!O8j(c*tvo;rk?#7KEI(rU&nPrLxkRqZDgktx&r(mFR{BHkk0^QM^nE18#`wu^tvVFP2g3fLHtiY^V+4~xiQ#cwI5I-Z1@It@vnJSD z=i)Zj_Jh1I(QO%*xg-50F3Nvw!t#xPvNHQ4!ub#X-%9LpiFUr_Y#+?Ug$4&IN27q4 zk?RaqSC|J~po`xP*R_Lu7(HxyHq4M_i371+?TMw%Ts|0@zaL*$;636Bp()|HeLZN? zTb5xStzXMMBEl~kDG|$`frQ`vBX8mhV+ab{4O;Jl7n38#L6n|Eava2lp6+{3CZ*KbIUpy1MVVd(!?sK z5J+=vZQgZTuNYu}!u7ms+N4%u|0>T#Mbz;IzfFG&WzI}RtVlK#e8TbaRERhqr>uFr zmJb&iTxH*&-mq7`4{ZF*vS^^^KQUwuB`6ky{ms>=(5*vpiA}(Vh)sMVr5V zYyG2gzcp&*oI)MkbG@^eXd$-RI^VVEh)Q+YA2A-H9@N1qE(%S>Zx(f|Geuc^jSDP~ zGDNa~Ilm-Z0^l1v=Nq3%X999(`9x;0=5PvIJ4kbV<+p1+{qtUMXgLX?sx>wrpVJjw zIW?d(S2-*^T)6|pw`0Q>IYLjQ;UeD(_JXhEDky&n4-Hf7U|rUiO*YLWhrXBbEnSdT zo4Wy0t;bA{DK!)lBJt*YnZ_FvD$X28_&XFn-3?bl+0JkI_YBVZrMP)!S1}I_4vzKp zp#c(HQn@J_^%A(`{>edq6oTlF-Tqpx4vnG2UcpIEtl19$U!UcR5h-&4+sZqqk%CyD8TPvntsswVPTJSZ2ot-ZG< z^ZOICTD2g+k6X5Hc#=a}jE#*K|K{_(pFL<%i3Z;o^v6W@$Vr|RsehQ3zTt5DU6h86)EpEzR0XZZoctZ^jeK9* zUJ0Kd0ngF}Wbsu2`5;3aJSGfSF6jMT*Mmr)ih2|LDdmEV?^LUJb)z>VUu(k=7zkCFGf??yx!&4vuneEcYXVkHyti=Dr(F=ah1 z*wqHZ)7&m$V}qrE1qWLtci8a*tHDaf^fl08MgRr{HrQU*5yUOMYXSMEM;94Q}c5a+*?&nN}#cL_?X$CVDDdCyH%oo(kS}p3Hq#RU65HS^N2-%Z#QA)~ z!_gETvVmBhjsfw$8=ELXK<6+LTEpZFiDqZ2tfoN$;vJK1h3okN4WO!#bj$`d+(1$d z9rP9d_s{u0mdrfV+96p=r=|a_cZP_Oe_`_R2t!aPT0 z?%BNDGv~DyJ+qM0RhB#6nfbd#qnrcq{c3QZ!BNk-k5-`R=c+1yeUs?|p!BTag4Yz6 zKQNCb#uU>3z#ZVZn`hJ}+P}r%_GI&Q5y1|~$$OW*Z+%1lhd+Ms{J){EF%&wI85Z(9 zRTi#gxE>zHWo@{t=O0a5ughYiDNhFyXPULyK;6hrRVU-MLok4L3iWVTTr@9v%Up2zpN1U^z=ZztbxF~?|vdjTL?Gin2U`eyKJ%6&9W7F0qmDdV7 z39id~DB3yo%->yjC`3LBF=LjGQZ1w_}2F9%NRbl%3+yG49xx6Eu+( zp;hE56diO$5jIJFot~ISPxg=rVSbXge~k)<(#BiR9I-c7m5#XQsr&1Gw3bItnB8g5 zrW|~t$!8~rt`ZfIe)lFcl&}VoTrXuWcFtXZR}1mNMeZ%pZ&^EsM|sP>xd(NAbx}j; zmv^tdt4m$XkqG7=Snj*|WHRJ!al`JHCoKM76vHXhB(!4#WS>7Tjala1!@S5};v}E1 zjO$6BGOMa_fXvpL%p2>$0|$Rj4N2B|CPLdoOQ#_n(*k6b!mHhkxwX@^Y@%B0nm2Oe zpy0w(P2}hLy^jZDD_|)Ylws)^-{;*L_d`{l{KC?#n39sP2pi;ZXYn6e0NC?a9ffY0 z@%L5}Gc#=QZkabRcd5UsY?Fs)Cf{sp5B`~6CK}jSZ5(_|ve6$eAMqw;zPV38jI^tu zUQssDZ%usDWqg@E-P%|xJlCt`>?}^$Oqj3M?+!)uhIvgVW1p++Qi7puSC-F(H=nPm zPqz0?YUC^2vO{us1xWV{4zHM?b9_xU*rywZJRA`{uBa1LtWz~1g2AHHDXO{|`46Qw zT=&~mshG*v`LA7#8%+l-PY{jX(uu0Oti8h>GIie_KcHW5)d6eKCML&R#jyy z@U;5DJ}D;v5LO)GqVnSBms3{&!52HRD1#&j`qJywyGIw=w0%v`CW)`;_*vMPc0r%k zrJxyh_*}H_EH49ERXm%L6<;oA4Yp1jnh@0Z7$eWTP)5C$qg+3|J#N{n8SP~~@svU4 zslJ=FN7|Nl_0j$yrJ3*mW*nzLF|*C8T(ka1$xlJ0Qoxw<_~$zoby~l97cU6d#j*ds znx@}30AEfN)xe`D)GAg4ea)v|HFvVrwA%l zuza=j`QJagce7#8{QS_gl!~iRb%W5258Fp2d(bottrrDzhXOP!UwLmgOhLqtWr$_> z&B`sm*jH_!#^8>wJ_(o9mQAPo4Zhq$MD>4WiZk7&L7R_MU|p3n6i%<*nmv|tS%%fT zha@>_Mz{k#P9{fJ3mZlSzbth=)adUkM*Gy?YquMt;%JyiLh={UO@FJ2EiUn}73xFJ zCF|(YS|nP~EaGRgq|4>M{{{sOPNeGyYPcL(2C)lqPRP`d4@~(QML8PTcO#8#)4h+s z6bGtlfd%y!A$IA)%x`K?4YzG;8vpEaY}`p~!+%AJvW$z2MZ@IPg`_k@u>-Q6WK zK0E6tkVoh?-o0?RYcPI&? zs^UrLCB2)H-olrAS175o5>SF>l-ha@=)hf^FC}7F+CpI~pctu&FgR z3!ka&9ihoH-QoK#F7_ZVxc=}x%DH}6E*4iYnV7h2k9n*&mIal2cJL7Ta*n8qoIlKz zE7P1#UX5W>(?`~wd+z6-g~?3XsV;?XvDGs^q*#l#0hM#NO6{x$2%T$*eg@I1lCUM$ zmPMI-Q+i|kx*Z?sTigJI?CHVs8`_0AB$zzGm7tj;c}t{^YsaKG8oz^_)a5e=r8ziru`>lBV^?dExpg} zxs}c01^7A`4wSkxrN@?!%Y>M~SpiPbXTv2chGt1J_gb4VON_6SXHeY0eu zr?|fO^H;Rjnj@&kAZK+o@-y&T%l}*%{x87ZK%>9tfww;HGy`aFW+XNFOGdojOp?u` zMV#tki)pCKr>RwV7PRCVVSgN5oHn*r*8DGL@UbV{lu;cyfk2seD8;|5xw%xiD&nB@Nb2U_T+QC%{K z?V^X^!R67&l8|J>S=`F;JOgpwQ_v_POAGb5JiUerv|mx<=5esUx9{cdiu!~+lvL3$!RU72otCgzr#h?26N(h+WvUW>m z(Auj$%8QG%9QVI)UEW-JqM>(?jN%S--WUs(d4tt$qtN4WS786`_}^ApiG6V>9-R;t z&6lIe?)R#yl@0@eKg<`whsHv|=D);C)RK=jy> z=rPXr&i-vfh-7o2`B81q@RL{Fr)eyDCJ%WhVMDeX#f@?y|`+_G8^<+d?;Lgaf0PCPXuY3D@ z9LGx%4d&`+WgD3%w%Isu&vb7CL|4Y41yif(-3ByOmqizZ(A{}fZ~tgdRD_&oO-_!N zPl887Wp8!fZ4wsJ6c@u-MlBQDer)&v*r(xvKt88$=~;cU*-lK6(+(n_x}&p(Hu>xq z^;{}EN%SZWRUa{DZD7&4PLYV)zK`|$s#`u`=Dw-)GhXp#+Sz?hfBVL!#%h$cp(f{7 zf=SQ+XVMYC>{s8N6VpFzXJU7}d1h8L09*B!Yjd~{m*|GG8^QA|o7>nOy!-T?x-PTO zhvru{gwJ7r16o|+L^u+HeZW_blks2d_$kJAHl3$?IG(-g`Oo9rWSe@bv{%MNNegd8?2A E50DN5y#N3J diff --git a/javascriptv3/example_code/cross-services/message-app/images/client2a.png b/javascriptv3/example_code/cross-services/message-app/images/client2a.png deleted file mode 100644 index 255c3f1274db048f7a201e2f7f814ce31ca098ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52198 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 UMy%+ub5WOy0#Lr<#hds42jqdTy8r+H diff --git a/javascriptv3/example_code/cross-services/message-app/images/client2b.png b/javascriptv3/example_code/cross-services/message-app/images/client2b.png deleted file mode 100644 index c73381f79061415b4d06b27750e9b915e80ffc19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58001 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

    L?P0vSL7p$YWu5Z7OTemTXFJUn5Lp z;joGF;twyR^Rcd8k2ZjrT$_;IOUi_!n$Y+`!rjxau>MJP)$U(Wy z5NHrrq}J+Us9O6JXms4}YXCeTUh(30sN`rLScGjqtu3LLq1(QLHJIu7bayjuXVj=f z1FzRwOI^pkbPHp2F@Yd^-p{#mqzLG3JvZ|_99Qg0LvFK|8R&(bM^u{Zyi1hb!IZ_o z+5?7j8%!#BR`Ju2@XZ%Cu|^O)X=2!eXZcqRnn;O`dkIT8D~ucJdst>ZtLO6F%qSjn z$UXiOb-rvk%XZ!MuByUO>@X%p6i)9{deZU$==1X>80NmWw_N{F+Aj?3NmX^O2_q$6 z5*x)mZ9>v?IFH6krbp^956+k7mXc|u6pE#6BrQa~#1cmyA+y}SotwU}-wegMvG#d2 zTz_f6MAkDT1-pD#o4g=kWiNMan64Z&?NJ*?>si#${5VaQ)mrI25G(kGW%L}jHwJaL zAoZi+Qg(l*nOu=p0xZ5z-uvy2U-5mLI!Tjke%-Mp)s%ZXbvfLhlDb z9-%?}Z|m$@O2}-fJG)ys|uTY zI;fT)9qkTZu~tyu_9m~FYfV1O_i%suCsNoXNuB#%9P7t!TslhN6ab@3yq%Wg4I!3h z)X>nGSEpYSJ46T0h(C=|*GnppjzDSMcnrEw*X3HHib(MUoK#=ZO>|QhOVqE4B^@sF zU4AON6HAKknol&%=ceQ;bBKWcb8CNY^8wW3-Q+?-*ZZJpI|AluD2ePmW^DSmY4nOy<2BLC!)dprP_$UbD&x2%sC!f`3rw{80ze2lS6DQ z-g7csIiamxL{`w}&5&PE1J=M7-a-_75L>t@!tUa%arQ-~T2UC-UF; zOQ`fa2aLuyk!_a-*gYmRGzc(6X7}?nLup{-?9UJXU;oKUD>29JJP@Wq-v&U0p*3k( zAuxZtNUE@(<&myGkLh8W&F`k!3?;5dy*UJ5-!;~D%f3#NabU}u&3^PE>OJiRkec~I zdrG}pTnac5``(PwZgd~HQOWpK?E%6~HP9n;9wbjo9##^MTKvD6Cw8mWUEz6Q;@M&?gpYG%`n+KEhE_l;56f5dCQu^FGpLO(_B<5QbB1M6bz zu|An5X%KZ?!sWHYfNJud3lfW!eS>njxRlrEVj(Kk(CGLC{qAF4%!eyu4olx%Um;`YXhbC%h?)j5sPYcc zwJe53up`_QdB@-Dk(py#ej`v2OfIlQ9LQNbfqRT@FmhF^-Jee^)>VbKy~VwH8pH6J zqRA`hIzr=KN;xvHWHhLIR;P}Tt0$1kZZPpKm;Q+M>j|0fje8;w|Ue$aHtpZ!}yw*)9WsP6;`3LrXKLJs2B=IN|;R;6cXca8fwp1kXkppC|?yBWDw!n(>{GQ zUBQ)^=Bgz5iCYjzSf8|Og!+&J?I0V?)r-~83tfk|dbyV@1iY`%KvI+$DlZi2gIRjNUicXN#I5+&?*zfT!G-#pxb>lVoBd5;uMd(6Vz}>R7|Rd zW+7df_U_F%o%Oz{27XFh?!3i>1-)`t)zfEg0?Q8I@Em{E{-`;^_Ljd9PhmFS=dvT7 zUaEd9H%b`GCLDq2V?>&l?hzWSpRAZp0khS5{A(2ro{mP^Wi=fj$GMKX+$qAY!@Akj z|AExdXq|WP-o(jHul&<*i20uW`g44H&MP3m7CIqeTk@vkw&sw1By+RKK3~Qv=x1xh zU4=2XX6h3^@Xfn}S7!H@Zz^CDetzht=)JkHebA-BfKCX*uzQ=ne@9h5>(-;^{{x#` B@+1HN diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/cloud_formation_resources_tab.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/cloud_formation_resources_tab.png deleted file mode 100644 index 7c98018d46ca43580a3281d5d779b8fd6ef46085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116124 zcmd42RdgK7vIQuxB#T+HShCn+W@ct)W@ff5X3Jt`W@ct)W@czHYue}B``*m_%*U)* zYd*TFYgcAeMP^1+M(oTmd08=d7;G325D<6?abZOekT0DeAYd|IA%O@VbGtwA1Z^*_ z;RFJL(Es-bnm~ns0|cR*C1gaP4j{piV91rN0%iY!MAV%HT%67A96?Gd$HjpVoHGy- zHgPg?w6J%!u(Jh0g(e~f;xK=4Av=2yM+-A^XOMElaZVtL@DJ)}V(_;pp|gdJ2?)z0 zA~f(0^xr#5cBam52972mI`*G`i^KjS+``Go+5lM85u~ZRJ_ZPX{R^uZINDm+nt^oV z9EJcfsDJCbI2xIN+>hzTj_l?AOYioZ{UORSV7V#Kxl4yw>9rhxANN z8cj{jS64I<1x3p(#hJjs!04|M!;-E{(s5e^al(lbB!NheN3D({?PGNvS0sm%@7#6` zWHzlwgn>wcUy1%X2%{@?)Z+Y~fc^kNf4YC~{VkwCO8KJ=6j)kV#B!^X)TW)MM72WG zgiQokzqu?u9ak1A1R2e_u{P~{Ad*G}{x6AaZY|Gybc>QoU zNBs3z>F@6ymRCxz%`Ycc2@dyO;#ohJuMQ_nPtW#l^-}kPSp<{C30ApQ>rcytQihX@l=e>m?(7^BRhiWP%FYE_DAPL1oT``~ zxDb1l8~fy?rwEM3Yd>D@iGbLmA%FXYpM{`n{o(QV8PD&^U*(!^d-Gbjc8(@q!2*5( z%rB!WMuR8TTv5NF{n1PO+x)7Rmr*s1l@ke6HTn7Z%C1iTcAYzkdy~b;m(Q7IwB%Sb ziSq^aL~0$e>yvOl`4F?Q!?&}!$EWSMPbAj|@0O{myCO~mFIx~=IgZ%GOabR}meV$N za3puez|M|Vu5iX)tyuefq;tOF7T5t5 zt*q&1%?-tPpRif)RDbBY%JR!squ0+(yY0&Htm_6^?>WEPd)M1lm7gmJNszxvcLR&f z7EX@mAie8iN$;^nzo+S2)S#sGiVnp>v5ibViRt>iya*o657K1Y{#XO|uQpy^xWjyC z3vnOCS19E<&E@m?AoncG1S*CJ4+ir#r@2jV*M=(f66mguK)($)C;lp_4@j__Z-7T< z?mV1%?C{1PUr`j4f-7{lLsdLWzW%+UmF zSKCeRVq+?z1rVL*)+&cAt>@M&byxJRjg8Ld(}~MvhlDeSS#AurB@z7i5U-9AY`^8_0gs6ym*Pnw>tE7xvG#9>ne+*nQ=&-6Js z&(r(7gd9-G??}GxfSVsxin?$GL<}`m-|Me~TeQ_4Q4}(NHGTMlT0pR5!mZ?47TRV> z$hz-^knTx1K?y~pv*`}a_HMa&>C12Ar01iW?JRE~>HWr+op_Hw!h@X<@GG(na>V)0 zqk~|uL9d3b_Pgfu_OY&e6mQ9y#*>mV#}xIMx-v7}+vc(8>FDgx!{+P#{tfOkHcz}l ze*rmivoodw2!*|$E!qXzj`b^L=o@{~lzgH4+sOGXHszlHvrW&wtm!&rQpilv zsBhXiE-}~)$pXGU8lQVp>+K$>O~LmmtOw{QD1W}vh#jf{yY2;Oo?=dJp1fRtlFJT1 z-&R*jZZPW+`Kriyh~s=aT6cEOg@HW->{aehZNHyy*_iyAo{(cpw#Lt^QSQucX0O2o za6t0_BHqItv)Q#HySp_Ylj)FOkEAzgaS%n@d4Kt4VvC3BAI%0?cYyfX`Tjf$+S)$( zU>Ct7nk}G`?a8{?0s*lKZfC)Zp@L0`JCU`DLHqR-z{H9l>Fz_3p;KOx;u6Fol~~QP z;`rR!qvXD!7J^!${q`=#tL-poI0h@KK$G%tS)?7_s#w!U8iK;byvT z2aCWvaWIyY!my|F_V!Zebacs>SlD~EkaR7v)puz3U0k6#*Q(r`9v*5veSt(Ls?{oO zwcd&Jau|2<(oeaU9ZML3fb7R^&zFwNwyB4Wr!Hu0gz?Sf*PSPTN~0G^(h=dCS5dWl z55DAtlS5@p+4r!3824$|dh;{>^_JqBEX~E5V)ID^bMam45+g5ych6o@h$_>*9xxm< zJOE%ZS3n|d>(^K52IoX7p0|+R!m6*+nCq1T9aX{k9R~X{k!rlRC?6TpU&?i(KFF4v z+j2>wf8UouI}nV<15Tk9Sb#QLjEi^1P;o>BaxmH2iWva)V6^3L6jVC_gm?HpKHbkY zXkWM!2DG%FG{&n>vnxZHIAVXg=TZhQ8%hFLgbL+Mg)`(A->&Fm&8sPE z-qzZ0{NO`%t3ypRwvDyw`V-BJO%s~03VZlXRYzWfkaivRE;o~lG9671MjHkmF4o*a zXY#~mbA;9$zjSh2=x+V=bwP4q1Nr_{Vtk`uIva;Q6u)9V`7UIonl}^To?tb`^-?l2M@+r$9!i?ft&BQ)X$Ka^_Tubg*7O;Sqph2Lat)&%A2q0_l`kBq+4 zt4gWqkddoik@Ha(P|G**CRd!r{Qd>z67unMf6Z?cZg_PXl`ccOep&wHj7@oGy^L%? zJ7`Aedw*xmTiTnKLbD_0zwYSW#w;R*BIc(nBcESTn_&KmklU4nqZ&*B)?`gWvN+39 zJ%5C1%zQb}ebjEAE50MX$xg|942h5(Aq#H75O}d6vMnR$4b?DI&+X=FSxlHc^GjSnz3>swVaw|+48jvue-ZW8eDdz(N8*> zs1O&iH}A+VqHWVfT1xZ5^saB!A?m0Fhx>F1q3~+ zm}*@0k%!baL9HggpHE(jE!k>=Wxj_%cVz<9z$klz}tN`&d3q{JGmTwpeTW$@1$#)IKj3O30?$^fy!#s%#Be zu|D30`4xg$Bdx(1zs5C?@%p=to?Giw%hFdi9f;@9gYsbxjSeSeQYej_R!Mu#_`k5#y=sPa>^d zWYJzlU-{cE$jIf!@h-w~Fr$g1nsu*hjiU`33(tlFM0eC-X2mg6cg9*xQgh;I^ws=M zeGA@rBLQpe>prP;^R97KcSQo!NJvvPn}X2R*8F(i`Mb|TN0bA+DxJ<>O? zg~Pk4vlUkXnXDQi2XOOqf3-B*r&gS>u*kyg*^gF*yz3oysxI}(LSp1^AQN>}fZCW? z@Q5x`vsxS;uNHJGxAGhW+f00Or=e^kHbgiE&uNe8%IIIx{0l(oSq|H~Rc9J427E93 zD5DQplVcY<-Mdv9Ej#QAqyu==cN_y|XiAw&NHqX0j4Y+uCNnYl=DpWRtGi;n$;kwq zu;R+TJci%7#_vj@-a zm#&>64IW3M(wjkp_pJslk;mQ@;~5b|w$u(<5VO#JtTN9bxzGmI9U01>t>#g>O2aUS z<%tjQD{te2MT>$;Do<+8Pd1cAQ5?2lHuYuyFvq>~k*2eG$p1&P;u;E2w|a?ESS=0pd4+ z#gz$yc?R1jY2Ef+KhG=T-sM8xv`2vG6Q(DguWpRnk{Q6lPWP4S!BYEUeq=OOaylCQ z%Z0i?#u4B4>r4k02VJ@*iuxfo(H^l6SfnHc>!H?2?z zW}(e~Di6LayC2t>NEzVR0hu-tjoEDejTO)VCBslRdRtwwdw0N%Arp!!`-#oDxpsCkV9Z`&c2yy+>!AK=a^cIW?8L644YD%P7N7t~&G z8PqE7?Sd%87I>S}Et=8rw6)}Jy+a_A*}ZYA9LEG_`yP^VGa=Nu`ygR8&xt1VG!(;$ zLs4l#I28SoXn`CkOgO=v&L46hY84E`BEJdJ$O1#w{h>!MB4W;*R5=v@I#DwZwsWRKGiyR zH@J9u{6ZYtyuTzaTeS?UdO;o9d+RrC0kwK(>t5zAlFKYi#18%DN=wVh0{$n(TK z1fn!&GHH1h0xRCb33;Zaf_`wMQ`Fy4?_gU7!%=)}_BLFrv!~IksO5M_2AvqAk@8(N z>|5>amJT9${A@`31HylSa+RG*M;y?gDEo1eqgDepl#l z2#rD4=AOh@S#$V=?t7j2OD4byH%rGk+<;;Ry7QPjwHug_XiSjzbtD}7z#FbL-Fy0| zbG_4tvXU%*R-8v){Cr}{6Xk|VE@Gd2J-lR#MH1w;Ra8`bx?kG*#^cGJM5kxE)hYCo zt|bD_r)_mQ*G)Yid*x#WGUz+-dH%wH@GiQl46upfl&>p*l}JH zz-eDkyKNF<5b?8>RExqCZ9p(Qci0^V2%j!dZa@6 z1fE_~(R_aYK)fS-!(ILL<_}hkrH5+AmM{ZiGC&h8xjL5}BF1OE=B)evCY3`@&fy+f zrMWfJv>s%Wzb4#ERLj8$umJ?#4!)nwCd|`K=_U^4WQYMC(H%@WfnP9e0ypLbmAfp4 zjE|qWttdiJc%Uz#ZRuD&GX==}YJ=mpqbmhvuym?fmE^{8nZGNrTctCFr|@ml6GD)_ z5|w_#!Lc&+bYEx0`QR0Fv3H`^OpK%CS!M6RNz<^&GV&Vz%k0L{L=vkFYBQ&R?8=4mm;uu7K8c; zK}-zFblg1&7z_SMOcag4;Iy1C2IarntZ6fog6{k~7~9)9jraDXk>q#7xu*PURwHK_fhzu3+}=?- zx0E_PG#JFd3-IP@mc zO4`swgS&By;dd>r@Mwh;t{+}3$j=8B3R>VRWc*=TesbD>h?ile)gx46dk5O3E-xb? z!H<;uJvZ+xDu_e~pqg_inN20pU{I0Ux(uBN-74##>4lN&@2I4!{Dj*~v7-l*<(F80 zJLcJM7fnAMK#Dn{?l=`;W|9o#SYTbHtuJA+*4~Knkws&TX6e}yE$+G}zg9@d5%DpQ z(tRstYbr3)!y7T{Bpc}jM;JvD{0{Pna=EjLjYcsplE$B-Z1|&O6YK^|!~x_UYFaEw zV7i?m9uG2m9R4!J4g$3>6=pmpN`7x|PxP(jB7Yt$oRN-Ttb|Hu9lie|8qDnqr84K> zF|p)W9i(vh-TLX#1~{5UP(yh7v6zd+iHJM8C)9SmT8BG!eaZL6dsLxCZ{Kq-7eF(< zhh>QPtz>a_1b-ek=BHaJTkB*k}0-s*4 z0FBzfjz4)4W4uO>RgS>Yi5nU57a>1WRtK@Z$Kt}sVCG{vC_=7jUf%2+!$P-#y^4a% z?yMwoDYtbH@{2uQ?^Zed2x@QN${e)G6ijePV8Wd6E7W?Z>7J?cc| z*tOLaxb#q!(>aNidwW`~{ozFiIo&*=G%wjIEo{AlQJnQS!KmrMnnW25qyZ+(nHhn( z&Zp=5BB7ARy z@WOTXQV#P-XyKU=$YkxlLioT>K3onZvoRb0(5aE*8lNS7`F;UO??AKivx+ugf-ex= zu56cHKt~j?OMaOwuRncd3J9LwHK_vaI>D1CHRb1lFPx4#)_GxasAVGheC`~MTMobD zU=00@vj^}xVp%mQoB7fEytR&(-uc_#?+WX!!V3mj0aBU`Wg;hNpX86N$KLCVv#0Qd z*~g3duC2!|@aiT1ENqw_8576EU_AFLv{cV$3LDnkWZgKM@$J7LWq(G2X z#y2q5!fD5G=ND5OgO8VAnB~JRb~}-*_t>Bij4!*r#Qa$bgRi0yX>q@r^AwD~*zPwS z#Xv3PQt(~F$zUtFS9ca2 ziSH(nuJ^@?v19WT)8FxF=vz*}gxLs@bDV~~KL1(i3J2;B(U<{EZg@?& z>Y|8*o+d82W&3tv0{*E}LjI!$lV?bJ=vMR_73O&_x2J&hd%1mM_Th@eQPBsM2U6~-gt)lr$A`&V<0plzECOPFw8hor=x1lF7Wm=RdteGMAe*i`I(e#R zBWQnwoZEblmlDC~pp*H_+3_upq!fJ19oxRri3^ias%Gg;tT?bxV2 zo?}NvoS+%BaXCB#1&niO#>CYiUOL@#!&008sW|Frt+6UDSreIuLb*_UMiJh$ zApn6T5mcu;Dib!U0nfHOJZu#`Q0o*kwo!<6Lq?3grqN7UI_^RN2k~0YZ^2+RK6_#r zfu)(4T-D_tX+^n@X$5=|V@eY+@;`r9)qXSOAWFw}x2d0hRQqi)Wy1cn7-If=88}*Xr?#GR}70&#zTfTXihU z*ZM>JC89cF(9e$^m+y1gICOkfyW8Uj@s0FjX>(iqA*7#P@)f9pp~K2)*pIEAO(4@2wgy%SGFhT2$IMO5sg?RW zBb?G32l0Fh3cqxLy?LpkTWxhT`Lhkz!n76H%mZ+CN1`|zfuAlQYKVnnc=G0@Y=|Re zC_bWd-L6lBWvt!yNto^dIR3r^9$|vXJ&Dd%_O;PAy7iHh9*TU-)f0x&BobK@cMWVw zc4pLn-bd?_=NRIk?cdJeuuvw^dq(Zs0AnX@90(+;F~=)dC@aYHfmC>bV;p5>O&l%S zw^CVUX+QHC(^lI&Ni}7GUTNL9;naJyw~=PsZ9d~F>3>L~M@SrO1@jB$j#f0xZ9Z8? z)H_-aIwnvS8SvG$oW8#hbFvDJpgx+?1#$s_)EceP&>wkNEQa=(?Zn zc8NEqPYUg*_aZmW6j9@Zyhmva<2gC#2?eSBF<*i$PA^I{+ zAum|i0_r0`GX{s1T2{1N8)_xmR5C*IHS=-GZeJHxNojw7u92RFth)ZC%0q|rBs7E( zYe(T2!%fj){zA&xVr17U^1_N0Zx+%2%Mc5$N8D7A(EUr|{w3l2jrhUzfalWqba2(6 zpZ{G8kdAA)Sgx@$@wdomzUf5j{ysO#7%eQ3aKfFqtP2_tzFaujrUz2$;tiGyKiVk& z%F;R5-?!&vFRx7lzJkgk@vXAh-*@>B)&Jv<^gk8Tc|E^?y--`=9P4q=Mm*5rN*n z1NR?U{d*GsDEuG6xsrd&{P$*H@gI_FApP~<>rxVEZ|MI~A@s-p|EuPU5nr1~liVFM zM5oL4Kk-vZ?oH(lu{+*TLnAikhEUO@X6Knn(5tu#{jZkzc;O*xD%d$%Y}K|)zO?zN zP0ZKcQB8d3A^~SZPnJ*2t_Z1e$Gbi3yw$A7D;(a;PRCPCMV)&dX4`i^f+tpV-lok= zYo8Mm5z9%@$)h@)S{Y19pJ+HoYKagMHnO31yK{_i*}WrA?BoUqS6i1q#>=TYpDdAi z+FT0F9w!r~1^=gsxh?T!2h|QWI(=FYeaNRwS00SC#X(R$j5l)YNVwx6<9p)=V}*vo z{R())DGmJSuPE8l$!w|UZC#z+4aoAuI>)FkN=>J!rdF>kE*O=;RlUclI z&HAR)6vzHYZ2*NQ1(sfp6`$c^rZDd7gz>Xl)l8@D$`p(45-N5kh-_xPV^d%0c4s{^ zoVtNsQX30X)O;5R71#MKBJ-b8J}L83yb5lq67v_i{;rM18{W8Bsv|iE(t%7!T^b90 zrDEiKYyk_i5Oh(+xyZvSSX;J2fSLNYl84NCwV8v9cEkS5Yx1$Zlgo78>|6Y}e(rpB=U&b-WNJvBJe|(K?sUhkLWtkLFTyj@oG< zlynhRJAV%TDyzY?H88l!$#;zI!jVdeIw;kc)NEG+fL<=OuCA+TdF@f@k6SkTj~T@6 z5Pj*KbTr;0;FlunQp?O%WA@@pA51p!TVI*CrMAL+59quH{n*ypxE6D`OE*_=oi*ia7n%f1=}b<- z5i0UmPn1{ce+PxTBllBDH1te52kdl;>ZJ+a#b|I0R^2%wuHI962NC(o>wrG4T!rB{ zUsHmI=Y9e_0h5K&_X;w)BjbK7LADO5tv?974GDIbK6W3g*H9%OgGSyQz*a$By;)4{ z)BdVGsda&}!ga>e$)jTb!}$Acr#AG|r14@%hC{i7nb(^VxH^V=@N@;!3CtH8@$7p{ zJ_jO0Iz4zW6jfx`5$}4HfF5tJV-n2ollDZ0beSDmnH-qDS z1kN)hG9UZLbr>YN&Zbdup1zp5*;Mb5HbOyf{ES6DFS5=xWNV^>_0gLB$){L34j|HUi2M&a;M24gV% zg$Oto7w$&dY;``6FEL!?GfV4w5J_9Z1wfsl{7l+1cD#C7Ub+hU4D9LFNW`bYCA{&n zW6<+?!j2=0DX{XduZ7Iauu$1T7%Ezufd`S}tS^h{$l#iA4ocJCs%6sIxNy{KnJdTp ziM*%BujAJ0xj4mBO^Mfv#{Hl>REekK)wXA@mbKVoLY|C2&@d5RCfXqQscN&5uN!VW z5B<%Qtab1-8vbIN6nF@ALklEF}q&12D)Y^X#URDBE%V50G|2yNAQFaPP zFZ1A03$fFb3nvW*=1WQ_A6`$}))$83F@4j^Fj5x3r4A@8zb*XHCBIFhI7xX2A4tYr z_Id-#EFXrf7C!3(^*f!H6q{Ys#dpypX>CMk{heRW-VXzci4elSGrPw4UwEQj`Wv6E z+wHStfRl*7#;aTkMetO5#t#nC+l=CqWCTl(4SKp4&&M(w3(5PN;A?9Uqa?#S`EHeH zO4m&$wMB0_(Sdo4k1kcFB@A~mNG#y|hwjOGx@qeo^BjxWGUlVYEJWl+-YL*a1HA~Q z)!C|a3OzpX^w+0=heWHm&f)*IrX_$YJUeubr_p}83M7lPQNXzXuUtS%lFe=iu6f5k z^yN`;oPP2j)_<*avhK=!ot+6|dr!B}Iop}nMfNA`JF#ztd>hD~!7oplj)bmcq2IqK zKh8FRC{Es1!{x%LB2}NuY9f1P0z4zkcg$Ih{Q=i_6596RIqpZRP4T-L&AyHJXlJn? z>AX)^A7Aq@AkVV#s%O#wuJiiaD2S5*dV6D|aR|gaYw&FvttW_Yo3>*cs9ojNWw7?) zRBE7RKg}z@fUz5@4U(Fdmxm`R$VyUag61I4kW6EU5fX92{ZwT|??6yxPUCw`&QLJY zzyTn>tO`u4**+z3J*hAlJyLMmAAf^Qq8_Rc@GgOL-a%RAEsmFu_eu2EuKv6#ir6Qx2O25L4U`_8EFj`Lo{U z#MofLRI%P&kB~xZ_ZT23Lqz|Rv*&->U0$%Cr80G_g%37t57k>v!Zl97SlB_Z% zllV&4nv^42!v^EKo|JPY$hKDmpL8~+BSsz^-LBMM&Ll%uSnsI9Kq2ZLEJF?h4j9H7nz`pVvg*q+W6o$lhJ3+=zoTY->lRmKgqKG0E^`YhqNi|;{31Z{o z$ZZeFnS%ZDj*mS$GF|Oh<(H7^81WRW={e7mWprimvGm(MnU6Jf`k2sumwEC;gC9^QS0jhoX z@o4sE;chzUAdNKRpQ*b-%btWVwuN=RPPm($JPu)eqjp`NVZ4WQr;V4xzkO*+wD9N) zklxln1*<+qCR%B*jI9wx3(v7hI4dY?y%9B> z2Pfk#$WF~x9P_biTAC{>6JfkB@DN5%9 zthS+$f^5v6Q4K70yxy2ikoOwR#vTh}Z{e~>OPUQ9g)L(a7D?`I3SiFGy{R*k^SmDZ zh~N`gTmS`&^vNtEx45~Yy3i?}qdpb3>Z_Ufl>inbHIj%KeL@!ExcSI-mIB6Smjw=0 z6Rzu-K+{MS5(fJX(%ZX^dFss#k1&Ed%ehton{v36H&5p1EfvkeX!GGYz>>Rz7YzIw zi|GRhmG6dQ&|J$xbA#ouS00c0avo>dqRu|EDzlxL7>?z1o{`XCV=cH4Sr>-6+lY_M z&RMpz6Hnen3og<`)l!R@D=Vuzv*ox=T-dhL&H?9Ai3whCR?Oi*l&7y;b4Hg=iR*rf zC`-4*#IoSjd?gcP1HMHet@p{>Xw3ysJXJXE9rS7IvI|-cE0P5l1)DXCsT~ zls@rdHlQJ~h=*B!JK3u!D@akCA9Cy{e0!nV{dE zeBKQaHfCqce$#<#VNRB`d)QJrHTCD5kqP`~H8nmPBGENOy?0a=!i1UP)r(Z(prEu__D5&}3xFItEH3gVCVxF6gT-lg8uJ2gT#~LBdX+hsmUGe85LfE27td zESI%J79!W)Fu`~lcdEo#?g_oQagOB$)VT5OT80C6LwJ)O?nI=IYW<~7WiXS)j3b## znCZ&e9@fL|D|N)>cz(idit>yDohIXXMl7>Fo1L4TOkHf5c!?f~*N6>>UDpcMP~iJG zfM8-Pra*)Gn|0$%FZ9;FRq#*U$;ztib#U!7~tdlKD1o#m8?>P5?V&KE*rf4!<@`kE{Z@&xz^ zFLNx115T)0Fe#aa_LUM|p48F_EY%-ctw)VwM_=G|SeUD<0(?-lylWY%^3wF50Vj^Z41U zu?eCce*Kmif41h8k|hCE2n;N-I4JPff;`7&%Xf9=hK3<+T!blBz~M>=Uv--hP|dNr z5Y)=pN;+N)!KF8mnmN9o&D4sa3vjX8u1ysnk- zoHSYxO&3#p#u*D^Ex%OvZqnMdX5;Dby@fp?!e$7Rsdet{s}q-Kh!z`!bjZZM$1Ne> z8Da;6nM7q?d-xljA9MQP;$2;X z3N1Mio}-_L2IQzZJ80~5qIN65v{t+DMBdgQCb6zL$mu3X7Tk+6HG;6M#FntmzGfKo zo7eVA8nmRh#pnPU4rYn6oE-2nQBeKZ3wT)Dj$<=KeV@tK6%d|1yybj8L z7*!jUbESXW(p}Tr#mIrP!7fqIa>m{M&`K}AbzL+$$Kmwl!=8Y0%42A>>PGBbb(8~? z|K`o>ZtTPq(!Dp_E&w?!XBQL}!_$C7Z8DC;1!2CPe$iqksl~ReZ=m&w z_dhXZ-qnt=H@dM&NJoZ_fA*3NMfvzp()IILDYc14g14_m%2^Fn-;43%NGbLGI<#lP zDXkGXKDbN9w-v%T2vF$!!y(sNqSwhL5ZTHG3)Hlc1MAztF*V!WedV-vEIZ2J^%B>@ z^S6RQ*evk%R;g?8yk0SnxX|SFJwrz5^2+=jA7Q%PJ|&5J+u<}GY=-qFTANY($&D9H zJj1u zf2ljS%B0lLfev}B_{^QB>6YU?hOopNWr3C z&5_oF(Wk>{2n|>tX4C<$i~4PPs2^+e@tB8@IV#4eNj80}Y}z2^#T6qlTmc+)U7XRA zEIFQ+Yn@@w>HeP|cx-2<^{Og;CG#!Snz}gYDsYf(DFc-aElt_HG!JPwDyvD770{ADw!>712CH^ngRnLmGd| zD%TznU#EYPvB3RB#ffooaY`#uNV^K?jt{s|*z-l64VDQTXv3W{ma41|rHVJ8b{ixM z`Q4kXraKqG(u!qEgPn;%6bm%OkU{99wUE`dc5$gDy`!zJD^rwFBjTkcqBRZem!V0h7W5g-^b%LQtl>07*bjVe$oouGfTPyM8% z3P@XlvD8XiTKKU%n1%%@4g4e&M1_p-zt9AEyjOWkyfx}GMW%`qc!9H(QNdP0n=<~k zrB7M9Z5`_{9%cMlYrb}~YL;6lN$H0U+&={zs=497j5I8uxmXwVwT-4yr_A*O>^O+R zM$)%hfTrxG0z##O?4dLqmNlok_e0kgC1HN)RbDBlJ5RyLT7?xI1w_z5#WR~x&n14b z;mSZSXY_^uMjju1(~RGsVpI>ea~R*UY_wXiT`qFBAjB2>{Z5)XIHnntu%`uv+?~o+c1!w?^Kv@bBKHzpy%)9~Vu>Q_GGDF3riAD|ul;D0pL+5%j#z6X^^!(vpkvGdvbFQveD{``vc>rA3 zfAaV4h6Nd#J&|2gq}#Ox9kk<5lpuanuVsDd9m=q6lF`&y#BMhS<#g(v-$#0N;rlRc z4Q2UcV&i5dm?RGq{%Hb=whga`x|fiunp#ihkJ=yq>=BeJyheYDNtL3<=8Q@njsV9o zN@}B`Vg0=q0@mZ)m5^>~@yg)MvF#K+_1L%L8_}l5hQM%C@Td{@wGzDWX0n=}^%#;PlElc}#w0W}JYD!yTw1q} z8YhR+R8(ubR@Uz(Bs8}eXc=T0#xFSlQIexcazl{#Xd3gGx%;wl4BKY z;*yd>i`d|L=h<0DHY)3yI@;wS5?bBnWIhc2khUf$gaU-p*!pGhNzo!u*Lk~{Z%d4_ z5EEKYo$6fwCS$Ar<)t#kJyw=_j)-$~_87A;>+EQmcr|+f{k>})dYb)e1TJh)iM^`Z zTn@CDx6v!N44q!QlRh&^bchps95i3(uKKT^w_guHF%YP0J5`S*SEJQIL<%JiW%%y0 zx?&TFoKotzfB%wkIA%`}*^=&FyPRaD3W5~>PI&iykcid|`i|6LyN{v$#mM?2QKZV% zP+>E|!fHm&0$jKjuplwcj%Jk;$=d$3;g`IyRcdQICv@UOQK|LaQnQ6+?mKJx6BTQm3S$QVei$gbedWaBssvP|GK zde^F|2$!wUoG_yMnriU!#cpodt{ANDjW=C4h6e%o`fJI^ds{)tTPbyyNbXMz9>1X; zK$aD{z!(z}Wz&S?{PR)(eaf1i=Jdf(wHF}})I2pmcL-YSv%BL5F*b&F-nUx5RDC3? zp(}ZqwG(V6GR}hlC*xjdOzX4kZ9dR^Awp9#SF@B=)q@_OoWvI4m*Y>hI5gTi4tD21 zRXpK_+`K2sKk*GG#L@s4j0v(3rC}=o-oC9BiSM*eot&{pt!?^Zmz+igl|`oeyDzo(?HWMQojE3DT5Hu8K`%Rb%$z^^x7#`{!j z6B?#*+8(RmqU+G?iCB|Mk?XE!b<^eImWz0hsm5jr7HR9;9#Zh}C^E98;~oSoyou|k zKcEgJ`Hf#65bUk`pjAcV4LIpw8>t>8GQsS3jCwo}D_0#7 zPGn8)$RRe(7kJx^;13~gbu|3R!MWJ>Il$z+z!K=^Hoq6&BDMAi;u!+6lQ~ZvLWNnP zkWr@ByOU|hzQ6#9LW_JCRyBFav=T#} zQW$M&aKch;TBF5E#dsx+?p1>fRR^C;RpGiM4dWwCJ#!MAva);+1ahp5!Eb*D{ik<^ z(Cl*CpT1jFYE}CllTMjVlXY;n2h>uX*78yiXU?31e2ZG{+hHH{72HI)HcT_X=Fx^q*fC z<%<4ca*~{Qgw>H%|IWdoWEI z8{=IChxA>^T07Ar@3jj@#Qb6gz^$$arn>ghdOg$Y7fsot{STdi7^>N0+#6i#G8C@= zt_AR4Bwwy|ArFbpJk+G}6ODu~@^Z>%Ppa#(BjIF7vRcIZ#!%}wpqJVpwsO-4oeB>< zu=T<{!&hN225o=Ekz7OEX5=+RMF|XH^duxC0$@BrDH28@7r-lI;~$*8tWjX`amG63 zJ_nyf#MIf2#CoByj!H(Qxs0TfaHlGFnVRso*0XedT6bqoKQP)PIdv9Z$IC62+^C&i zf&uH6d-T0Rx0p4TH9>)G3ol>T$kM7rPRHl*8YY^h&#wlqsp0fo>ZKZ6SxV$5*4F?t(i$X9TsUD9qedeM*u%T z*ywex+$j2eZhYz6%O>`=nPZs{pN0|!eq?;;!znIX*B^4x)PAM6GEj$xo>Q=9Gbv$N ze!V#U)m}Yok!dfKUbCP~=&Fk_^2OD)jRFRc%gwvCR=8Cb2fN{3or&JEw?nqyo}cvB z@vN&I?fVyVnXl4Og?%jHJY~)e;fhPLs)QS}`3RxC7}hv#|}FoQjdjT50Y$HgB1 zuuv)WTGB@U{CUV!L4~Wy92*83ZQrB`+%yN&mzh>Z`3FDZK=%QUH7}TM##)Y`e_aIp zbJ&sHIJE1=0nZ~aHL7nK;8o?&&f~^g=T%T+|9>#{mSJ%%O}j8oaDqDlg1ZNI_uy{9 z-CYvg-DPlsySqDsy99T4|0a7s&wIZ2{5tE;%v`h9)xEmAs;jH+y6a?GI$@9a1x4BP zEueXG|S4dM7l^UIhq_G$e;~lEd{=g@nRpt-ww1#7*e>?wkd~8ZSWO zSe!Hk?AD~fuLbw9tejS7sXCJ!&R+y)otIW2AwyrT`Di~!*8z*#qKQKJ{*zHHq>G(^ zDmDe9*641fz4^PcsO058XPRx2f&*(KJSqYQ+i2!TXdN!6M3JFrN44pnxj)aEOJeRp);!~pNk*$*%;34In9E>$#?qHiPPqZG7l`@?Y^x=sYAXQe>eMl+1V=EviyY_3QImK(yq#jybVZAYagCeuHv_&jeLalta+2wn5y;e zR%J~=?4k~~_O;A-`AF|0Otp`D=#wHovHf=@@%x*hWxQb-^7kpjMx86Ot;{V>ibT8B zpP#;5KRkrG-y!bstoH3$)n_n;8Niw!5C%fR{iyVgp)NfVy{(Z*Y0c0rYpkPC4S`hQ z^IO<|`1J0?MJ5q6UBYG0^>bdpZkKK9>@0$yl}>I?o7MUWo>sEpESWPdCuw`bOKq5D5ALy}Jr1)mGD+ z%MG9G&Bun}h^y_`=#H4<3RP7NM}-&IH;3mwUIJYf^No?;WnZmfW{Iq{YxsSum>h4K z%3rQR9ZW_Y306=JS{^n{@&I@A#fRVaAx#N=qck&6s!e;qyR%*GP*~LHcag9DP3WPM1br04tYw<6EhTYcYFG;di@M4TByXDoGFbH2I71G4N&5 z@kb3>ilvb^KUIsFQoKdzC&@*Tkcnf4*5{#>(G$1{&8VoiPM)=frU=6Y9KvJX z`B3Z_6}Vl^^=(=M6T;eG9u`X_Q%3enIz0H{^`1!LIK9-8$DkMFkAX7Uus2tYT!?Ne zd1@)X^W%%L9!G4&EbuiBN6|4i75YLh>9UjhQwAreks?P9gM#TbLyNTQV9w@jgH%c1 z3&kyvclG~h=)kvdFgV*DM7GY@HF+YxZrC(GrL@(BY$ti>Z#P;>;B z<|ityRcd}ZL}?{g1&4os`)k?g+MtRTkBFGrMzzK#nL4Md$Pbz2S}$T9>@RTcW0r~T z2QMD7+rYLz3&a;W_dLGpKniL`u>2?*Oo&Iw87wr`&a_feclI!MR^6?d5K)Gj+8u1m zFDUmJi$YF6L4aWWPMRb8;QZ_KLQFh{Hl6TeLtCa4fR~hUr z8s!aij|Fk$WK#-h$^HdJ-fO)YMDTX^%gl1J=mwbIDP} zngmFo+-bcdgi+8^HpEFjsnf69do$Q6wR$RkvR!bJ)%P*Z&YKGIda`VW#5@XpGUCnW z=L_6CDbswD=A5+i4xyy1+Va-K+u?e%rT&nL9)hUvoqZeBu2k;##!83K)c$rmyQLix zp5~gT?6&0k2QdWw_V(!M5^4lUUYrQsu>oLyOMb&|w5DWaBt}3W50f%G&JBD3e78|( ztGu6cnJfEl6IHj;wWc_nKC6zorc|1Bi1SBfU<1#o(xtnk(xlTN#|5*;Owh!~i1Gd7KRp!$dKPD`Hz4lsr z=(0}YUz9n{xIOCAUSR@wBCpecCn}stM*X3SG%#+XWO?J~V}wV(7X>x3i#^3#OA6=K zyNsJBz~+970?HQZJ+6M|3=;WO`P&fQBy7h3&~Fgck1e<(BkG`iAPFIJ9g2x9Q&>hFaCLtMZ*x8j2a~^f33vbUOI;tOI0mo#XU2=C$*JD(7$~W)ZdJwi z-5jbC?6<=q)M@zcN2gWKW-si{VoiAGH_j?^by#|>MhJ#D_bari<9k-iACu(8Q`2oe zL0eIKstX9R{}_}Y1DY1(TD$^#JlwpoT~U-rsNxXGz#pHY=M9)Rpjp>$#mIu>n2$7BX(o-AHCSqndrXQ_a5X(WD4QPl%=mb5 z#>?k-$pJcj?CzxX6#lGf>o>?e*E2En;B>ONoXp~c>9jOnwDbCFI`LZf^D!j-MksXB z-|(%Yt#7E}s`=Nyg2MGr|J)xgs@Ah26OnH{?x}-;>jT%azdfs0q4VCK_%ncF)!T;x zpOiLJt2^1q?7>)K65?TeRm-8cwi2M3?AV-&6?PDSN$oQg&Qw2cY}+pfu=G+ffh)j` z{X+7KYS%eEy{iuDfPL3*;9=&&E%0-O@z0SmgCxZ5a%=z|3;WJo?5s?h5td|vAI%EP#ijQCyoZ! z*fxP&*zSh|Xm>z%I+~YdaG=u1pRpzxb+i7oEoF+j`+niP19_4aLmKU1S&GvJ`_8ob z;3JaN)D2T6MyR{e*fO9Kpoa8}P*1-$HpP_=DigPj&3`IG;ez*u0S<&}2G+Gp?vTmQUsQb!Q}({S@Bk@aq6=hI0NIu(=@q5?)%m7=S*N;2 z9CB2nvqAp%sMhfAc6nILU-#Tdc!X5*mZgz7%<=QyA*{L|~3?OfL;o(M^X# z0tb<~a`X$Oa_hVaM`d*mcyAoUC}nR`UBRYnfg|N%udS0q713Hl>A&xsukVdU3*az4 zeN9YF>kO_~qA4@K@>)aX_lYlXeO!hfoUje8oqhAAxoXUo`&YO0_lbd2%k(F%C45Ls zP)|SmZL3tws*mV|wXPh-Pt)_MTER=tlU!(Pl$4n2z2aNLT%YcAvAh-QFXOPrQ}bD+ zmg{-NMrG9IYAR$SS+omP@i_3MHh>Na3B{daprul-LUY}q1yT}VYpzrOjSu0Wfu!$m zqpQpyTN5Oym8vUvkor-Xv%@G)jg8EBstOc7%L!5s^`c0dht+Ys+lx_A+OGBtTtPc< zlomV3!uE=G!6<~1_)Q_KRG_r{zhdKF4e}a?iXR((G7s}Ai^@Py)=O2~9Qaq>LAgOi zSan;?`eM*6 z82EIG8q`*V;ByBDMme@aDnmJAg`e=#sqCtFg+oIYFLNPrKi0+)6BFm$ltxoiQ<=OE zyPp~Un~VV#_4Tq)MoXb5xDba;@J5JAoHwK)11;S75Wag{%R?KJT4yJk!G^iC>jQdB zi!e^8N1bp=`G$G%+OcOQm|`A_4tb)j2ZP5qV7~q{#(c})HkX^HV_0o(ckXl%|DDx9 z^J+Zbp}abo;SV4y&S6-|&==VZ{k(7F*kFCr3eDUnwD2b_p-oH#U;UDKRsz$}o{gAo znZrqZEF1+!|4)L)6{^K0UnhLLtFo~ExWq*FV8>eYTEOnv8gjkp#~FlUo2bD~oXAEn z`C$w(v<@?pFP!S;JsWs6cxtf7c!nAxgMkBctolJ2 z-t{z?BY-Sgrf|?a9E!qTvap>$EA%7UW{Un*qkm@`B>-k~ zXRLPTi|k`mUJ$sB-W8-e;}H{>xntx9BO@a&q^@FQYH*$$_kaMfhzW9dU4ElWgj!nJ zXo2<hJd|?99Zey|3LAVg(+m!F(qT|^he_si-Ihnd}u?5>v zUICRO#ZwDc;_kXmwGLvM0TxpfMURmEE-w7T4=`>-3A69sY)=cV1>$*c9B8ew`6GY6 z$T~weE&Bie`db1+{Mbtkakpy4?B%^y1SEc zAqJ^;Z4~QfgN(_LFW8yt)d>lv?-K?(e}B=%Cu^cJkNnx>txrKRluFypIAho_h91fh zhtb}0a61;)yPwkUk%rcu2l>wc`rnOav7Nkf3h|3Xzk6>WoeaSkL!{nk{5s3$Q=0iz zls{;^WfURR_BnM~L`uu??#|XS0L~#X^P8B|O{d14YZ-sXe}oJ);J%&d!Tn#sP1LE~LRk*8Cw&u_rH|~lJ4s4yf-UjbnCZ!R%cLZq4Y~G0zcU7FO^ANl9 zu8kvD{%Em?!AVd{PZ@4=V&5buVbVpfp|r*}86iFEFDhp0PdruD;r^VjS4~Z`J6OR! zH}8xR(U0i+uOx#yp%j4PjcL*!2S|@#V8rfV2tgw>SVv2!#Tdc)?lg_*&)~sH9(={- z;R`SK!v8&4{OJ0Vy?@@4^5M1PwC-fbXVF?;qKINMgLv++U&8@9W$vEi1QKAYRN*6g zT0P`DPcqaiqW;L^zp_R6Y~j`NdzBLLsWly`adoq!^U9Sm4onQVZ$+#nLX6ecW$#-F z5TCdap<8g$QF`|aRWj$!Oi13xLKg4M=hWYJ7-G1O+^v1aQ$VL(cz+8h zx%YQy>6h%(w&vW;nW(Z=)123bFXQFfiWtk8);B__i5Uc4ysRmozFkuUMQ9n_A9`G; zOn%)2`xAVW@1(SzMS=N03)r116{PwS=Q7K)ah-L>7z_I6AcB%=pKUG0xSc)8rN?Nl zr>QNzFL&Z$U>C1$sy~=Q6>6-%!{yPP z_q>uJH9d7Mvzb6d3eF5zJXO+hK$!L6{v9oB(NkwNI#B;Xh@IS}~%lsZ72sqIv|4VOMi1eZE--W;J`@hoU+`s%U zD8zrZ7U9q~qp|GGleSMt(e)!8WH#DvGp2VUD{trV_ZY%+Nq-F`e+;bSW_#wS(=qkq zHmd&)s%VE5K^ZqZNvR7tWeQ-yZr|WEuGVH!J{l2!4sfo^z4?ZIj4<3{8s3l;-^QZ) zv_5$e9iErlT~BRU_^K=TpG^;s=kKOFtUEHYS679VkmQp_wB9x~IG?5?NA&U@x^=R* z$-=;!n6vTjGOQ#qGyUy5!l+HHEBO>nl3cOe)zK#A5G%7a(1BvD3&|jdNk1eli9CF@ zT*NTw^<1Zh0U)eQTYjwbh46~`W!RNSczB&U{J(pz=ilr_ycST`DQI6<&;h>jMC+}I zHpDmt{V5UeW2GR|ZGV)oH=W*-WwyUb#}VdIYBsRnH}={jNSoy(h|P2ue4H=1tV<>$f%)u?c%&aKw738?eVg~$h2q9EhVpJ#>I>KqBD*+ z%gXa>G^i+NIz=k84xMln%lyVUAG?Q zO86P%<>o#5OQ!H?8N`bAVaQ@G)g;kg%}qR%`z!hO#uiR+GOdq*7BsFm;wq(&$I!?F z05W>wxr&vo3zLy2W4NytIU`R2ujwb!UC8vb1$E~8{tB>+1oVP_TyX)EGs9D~_VC$5vP*S;yVv;ufV z()FU604T?E#sn?Dd&-kI-`WWxMR@O0xUjH+%LI^WlY5N_|1lt%=~=>}Km)h1HwISk z;8N+_72<^t#!^>n1t{642}(}ZuwdIYXES$(5fnKtw1$_f@F!pkN?vLNqa!powe8OH z&~9}*3{8RD&0Lak4(Hkcf4i(1r64(Cu}?!tVTiY9K?rK)axJ~492ZhH|0Au&A5G|E zPscr!n}9c0#9cdEHw^YA>(OaBRV(EpypV)}<0oxnCnC~qUt0q`md4EJ3PHdOvYj1c zYYUHJ=I5cJ4zuQkQZk|S(?8!Sa0MO23AB+5jrUJQ>^T{E)6+yIRpC`FwF-u6?*2fJ z>-f+>b^KwmI9mQn{`LFmQWz0E$=zvM?JEtBg62AU)SVND6s7H^P<&$L?Wuvx)-r1* z1XHFN&~9kz+apW8y3Flj)Bg;V&CCwS>Kvcxh49yr(<^+b+TF#Q)zq5f2G*}Zj7uYa z&H4uCztTXtuBE#lzJS(-B{-;hon+Zg-;L-5?+jB;kXfS&8GJ(^$=pXajPUZBaN24V zY`nN1>+sXtM8*^9(Q)jsFS2Zxmf&#vA}E2{d^}e}ABuiXW8feba)}&p5FbPv(^%^M zyCm#quQw93>12I1v#ph*oJ7qixLX6>l>P1xZmctiqccl5Tx=?pQVYY}t*M{Rb3~Ar zZXKUL6vk+~5&68L)3)YVV;LGb-)y>L`;vrZ)?V)WC7^d{yVnTV@uF2diN1)4boL?x zh&YeU_NKBnDy63i0!omfV-xJ7>3A50vnIZIeU18MYGYq@r;3h3AOfyMPoD*>rxgVnOO`7+MX3>llI}TkO@A z^8|F^HL69qE#+HNTu2q|p5K|hi;H9g6~>VVYVJ~;>Mw{Sv3Yj94Y5jRATWy@sJo~u z&yzVP3mpfQ5=L_&*w1bE{1TWKbd{i<;Ca?;kv+i+tcKM~EtFP_>FKM$f|6*lRI`dt zH!GM27a8)Y6^&LK>ungVhMN?PV}k3Jp$}c)$~W`-C#O@kvM21kYQP+bacjd?air#m zm(7)Srp=g)gP)Bc4;wrVF&7#Tq}NY(AKKXjvO<^bJ{zg4=DCv=`^eR==6k;nez7hc zQ>Y8^VD(z|(7nY|xfIqRe5ZO=!m}- zY`A|wy8dtxPFlOofp#Z@D3#Ka8$~Q49I|7j9-*Hk697?KlwJiIeDUZ0Of% zd9TBZ$w7tC(pGny@|jP~K3kc|UK5?$lJ>mfydkr;mr!XsZ{e}LOA{q)3$YvKYsu2T zCoufrLPEA_MMZmt@;%+X!OgJux^p6JKWPhenUkyvKz)dRt^6uV#%ZnSSE)B~Fedgv ze(nyTWdmM<&3JW|4p{1VK+*cPG(EXqk=&w7pC#u!xb^4nUcs(`U+o)zlM_{fA+sqT zO=a?rKqpbYSI}^2OcMYkeqGf}9(*_DAAIUX)X-&A?2NWb#oKg#c8)IC!>62PWKoO+ zM;!d&DMefhs*CV%jQ}4d&2>Vbw<{$b12-Lt0nV&SMJLP-Y26j83BhQ!kfc_S$F> z%8hBe#O_F5I!g3McFM+Mb|4RZ|N7`b=Ty8aRq|oL(IL2xDdHHvd(1$H)wJG&*p6qT zl?=cqy4g6ae_)`-%Z#oKg#yn{zB97369G2rl!#+=p+KN0|Y52U5*<$e0ZVh1Akm@_lI5=Jj@BA-n$gVS3Z0 zs>I7qQNBOU#i&DN1-m55ISK-;;pUK1|v+J`c z0Vd;}aSpj-;fx_h-wHcI>mdbhwBdILUuA!YOTa|Ji6&jLD)FF8O3vmvo(eB5QC`}> z;9P&}^266gCLmEi8#3O?|9v@RV#7OqV%)q`k3bgul8oTE=Ww-6&JZ8HFc!TAN&8f| z6w}#{dS^w-MgQyZWJ#zQYoNxr>1u2fkf9!bWOB-$QkWeb1 z4Biz*bnYF`$u%Fs#)&3^UCmA9ze3z^H2Bt*wrxX8)pGo6gbZkaH3v5fZ}DQxeTX}* znRnETkRfV17GXv7Xb z8>e7Y8N8jpX}t8pO1{X;1eYD{VaBc_m*+lfgh)+2<%npSFT!l~ebYws_?U=Py-*m) zJf5!cOozW+<8fovSh+qj)rBJL;)t#k(qs3S@6IV_@=VLl{HaHALbukQKshD zX+aZ$ew#5vY}j+M*))3rnP%68_|>pGMEYQj;kx`gZ(5X^i9~nk zr(W+VhY+lwpT<-ewkd9_Lvj6}yC|=ED@Wt1;GZ zZxBy=8$A}VYS#!tk=5M2&k@;yNY+x{A#L0;HWJcS@rO4iPjNF09x+UB8GR&F)w_%Y zo*n&FGl0Jq4SJt3t`7F!`gb|Z4x6t6n>CXgJwA7CEQ{Ll3P(o~?*ItJ+O+v`A^{F3 z4@AuO(YNr1vKma4Vh&9keR>O+{8potb|SeEN&(T`l+_s8KqKc7FS>JM`J!Mi`LK(AP^-KijWHH{Cz7I6omCj%2^V zK5dr%PG|k@b#tibx3XEk+^`BJ?#uyWm)Q!1&hL);wvrwohA#|*L}J|yCfwHctAzIF z+sh1a2;svYJn*?mEGpgBCj@n-s1{voYu4-2RuA9No1|awvs4)eA$Ufd3x)egYwItx)K0_hU8<^9)3FCH;28B1l zxmuu`3MMByBSjW_L?dte?#GF+tivGx+^%qqYkd}}bV3EUi5TwCI{zZVJ&n*sacxgT z6!W+-S65a)G?1%O4>~AmFU%Y7zF}; zz0vO9JXImpnThsJCW%&RN$r-(ebs5`6H1c>S-EJ=g02MGjs1BI&JwxHecKAY6eTW9 zpUHHan~j)H62Nq6{La@VYk%+j_HO&5lsLK|mLd83lv{UY_yECJkq=F}|B^xD2v7PV z=^B2k6sB(vNBTQh8&)dV0Dg9ly=2(YpA=?Q-x$MrQ^dvl@9o>r(pvm6M}Klt6+bP` zp3C$W49%vd+6-1(bBk$$;U*G1g~rzn7IH~5oE7X2%TqzYD^qb@Qv`p=_S!pAl0OZ4 zhc}f&hcKtM9{!<8%+!;;LMhAX8%uTl{{6a70>jD~qY6KOWW7&=ADgO0O<_VkZLaPs zn6Iwa+Nbw)*ZxJ6Z(ctmV5amU$vn*nEV%ux<6Q^Qe2T&kWKu=}JZ?4bIYbxWLhe8M zYyQ-!W>y;WTkyR1wd>O#VG>DesIz;n^H~S*BxT59<$Txrbv)2Fzq1=HEqV$O;>^iZ9;5FIL;8=G>4TCyJo*cfnasV|!| zKA5}lY0yMJb43xID9wPta^6_I39||CLpdc3# z^1`PR074a?O|>Tv$mc%Vv<}i}E8m{LCGu)t)uTFv`NhgehU8%d-~GJRe9=JI?Vm(G zszdDeZegeol4PH}O&lCEu&RdoJRCLr+Hbww{f({?Djt(k(F(PEwS}#_ zyz2giYw=hqCx&FXE<%x=Ly4|NRiJ`FQGKtPjpmzX75cf`_Go zVM%2Re;zn9C{~S7Vo zCe~j*M*tv?b#=O`3D)t^dwVGab?5iXe_`>4kmPa%!5H`3+foTp}o)~myMUa0R<5uTRJXqqY zz5RoO8p;XR{}m%wF8rXr7hizb$r0s@Qhqa-!6w7Mmb`)xUQ)W{^Y{%ucXn)cz^7~I zTQNcMMJba2dg!nHSz@c>F+=Cq-bQXiDLDN1x#sT)iEMxfO$|F)uIMdA#O5cQ1hxxA z>;$INRYCMGTrlH2#w$Y?;#yTH%om)91NlIIL;B#rQs0`=;UCUya(W-gL1q^G8y7}I zSm7RBW=wWS0}@z2TRABvz+tgvAG70C$SF#(>^&ICQ<73|;Ro6+qKaGn5XBC`lS*rU zqTQIPTFoybjj^i+1ZhfOeTc-W>1y##2}&cPpsg@Y-Bl*XGP$0BEzMmQkkD5~%9OxPWwL){^EFM?AQ ztuaZlcRWMytlq%AbI;+u)wsvo!o@Fb@mOPkGc0H{AQhw_WOgR%9r0ye4*5C~@?JGU z5}ewTCGF06tz)?;KA)~?sPb{HR{#j->^IeXWoJg9Zb9n-&;R1i3-9;U3OE&AwNmd> zAXF{JITW;usOr2!)ZIUOuw*bdO?5+K&*)0-Bn}DOPsWPZOFIX7sdXl{KjqrRpW7G&)P89@Bn3c%Rp)c zgfJBythqDKuA$U`_Bj3MLea=vi_fW~ACZHh0}qef{DzU_LtrH(NdtB+bXn+(%(Ww} zN@H#9?~OM|z|0Ake%T|3j_~sN&l_tToZogCUr6c2%_B9*m?9KLe4>3Of#B9`mY&V= zw`38*@kC9~Zn)B4yX>Vg|KYJ8eYDj5YkHR1#}7^PelWI_8K#knO>dTVh)Sv+oR{h7 zC?L#&a$Ijs_Nq|~NA1PXyyjCKwl>ae`Y$+t=_okG?*|^x2(f>LD3a6zugJoea`h+ zbO=ipT}~;vt0M}-?nEK><)>SaZ$wD9EB&y{``qrl$I^Szk}-=^-VlzB@`pJkfq#Zb zXH?$0ozlzme6nyM1pL(IYmb5CSId3j#!_CmYo;n+emY3SSh?@L4jBH%AA;?)+DE@T zm)M4gBqjM_`E4wHmTcCWR6C8!I$cdLq!*v+>Y_3xmWa;P4?bK-D79q6CR7 zD1mV<>?mjR5cS+UO^{x9QC$SZCI$H&TK*gM$pw94&Bz46z)MAlQ7kL_p$YuZ2oeS! z(CyZaW1cC$aj%--0@>uquj@>{sw|!qL~FHiftP&!ik-ViKyv<-N=KVxSn8rd{l@mS znDu@R{_p^a`9#BIDL%)R5WL#WK_Upt>q3!qFp`q=R_Rr1;T-#=_9PJy(x{2jOX1gD zuE^u~&>!oJa^m`un2M4Gw-Q6Okt7V4omvlb*?(IjMI{XAp__tDu)>p0cQ@d8Mi`fn z|0R<_-J+AuafdUo=!_G6Q3wSqtCjfDS}-x7SP;;DJoq(f-^rCxEQKAX($t6wN;!pc z3ojLlH^5`*>v%AKbct4o5G06RWA?{$O6pv0$g+4_nG^ZToJMIzgo+E#E$TdOe+CLfZyA2dhTYF(I zRI4gFcpv0hdaRt^8TYTg5)F(Yr|Ykq2@=8+Yun7bzbng5&Mb$xZB;RPmke33vA6P^ z?L2k*`a`7q_lRiV!_Z4|^b_a#)`G2kPQZeYaTpG3HZ$3;D_hA9K5ba0Il|h;*Ax>T zbg8yYs>!qUCR?IxD#;%Yj5Ym)vR_)P73eFo7-Doxyo52$cIT0u`H+9Nh z5|H0vZRVLoGJ`e+dF+uk*y9_=%`}%UJ)Cqx1Qb#^{V9FlDwaE(a2d~>NsT5E+@0Ae zJtw*zPqeHEqR3Fdt$q#i39Ypgr*V=YGnozJ6SMAnCd>JRrQTDG5L+8<^q!4pb9{Pf zLq%_d!%+}Dr7TZp%|i0;t>meSy6(7%y!iPhvuXTsNBk`Jr_0z!$^D^QA*I_l#Nb)) zLVBAyo*FWm)o#m66w<_Ixx7}Vs_lro6KWb_Z!1Noj!A=OyjtXcScd(hx38BU@*mKPb?wzEBJVoURyzBS{eyo)E20YTl>XTfgM8= z7k@ZE;XY6?e{A$erZhq3ToMhesR!7Nu-FWB;Tg7RqpOTPt5$`+(QX)vxPGS6zFry& z0HMK}?1!{*hk}9F20UIE8?Mz`WhJL-T00u&@$1)gfhoQV-b`7lVDOX_-j^^!qoY9I zkA|;5MsIdsH(44hwT91C2P-x{UutpHc8H(7D16CDV=twN_EOv+7haR20D+^ByfIHTlEn$S1+K-U%_;@`{vZs# zEu`(uz8Jfl3Iu)}0n^Q@U^_WjjE_AA#XCb$YUrXgB4!VWndZR1MA6r6kliurvtD_c z4rmg*m>_MwIb*!Vs;3gJX+}`V|O8EhkQ_fX+=Dqvld@C-x$& zc{|$G4biA0xiVV3`odK!5A8$@ODc=J!MWQa8!>6wbegeXVYS9H`L%?`dF-5dOx1T@ zeE2CW8cSb2Y4tUyzs_!6_^FI_XT}8%K<)Kf&zpC`i>m-0{M0e#@5F|3vShdW_W9PV z@F{)vPOCC{ZDX5*0++eD7nFxF|WG)=0OpZ%tIiie3HJ|5Y@15rQMZ2 z_vrB>I?sZzQ+#2|sdgh(E3b5nX}oo#NxhNPYk|YjhJM=WdTPbxpdowjAh-NzMYZ8W zsH-@rnFmkm&k5CyzFz=EkXGfN;VCIrkCg-0Y#oV}=cQ_+9{m2&)|=zvtYv{a{OFb? zV;63uZ12D9mqJ(0PJ6{?JjZP~!fUG8wv~6fP@qD(Zs~Vs$CThyM9sfz-E%znM$`dc z9?m+9I72zjyyBhDSv;*M+t;5DHw8qO6->_2TEjV7;k(x^r zUWc*Uclb{Xo=9^4P8W-cp3i1LZG5_n5hH)tcn~p zNP89LgvwFYE<2NEIIL^cdOL@B>9h_?6;J1?(4K(i>YtWELoz`S3UkqDO7gf=@6OJM z=`S9wEi)s1`IAHQ6o+@y)vml}2cZ!a&|pKe*BZ@?NkLwWU~@E&g%R4o>$)>{R}~4{ zzyNvl4l1mSOTB_|kC2=EuKlEJBsz`6DxqSP{PNl20TL{i4GF;R$m4pM<3B_MAdmq) z2uTCVrYL~sCubqisX{Cwr5 zNLuAwb`k$ybi+CbXA&wd{!6c^b)7@=v$D?=ZMjo~_AkA?3HP~>k8`fR@YLJ%gBMF8 z!Qn${(GTV%exX6I#hUe#Ltb0*O7l=IG?~g;{7N-JC5kQydXqD5q~o})cJ5aE(dIik z;Nc(wWES-aH3tWQ0J}MI#a7#zUOVck_m200YYp!}Q0%rw=W;Vqlnhh?1@d5B`0Kp? z{vW*kD!rJZWrN@-e5r#(cDhx>^vFUw>C?%j>2*bQ2fC-?Wdd9&mH7DBYI%%>ytg3t zCHMM=k_%E^#dvwbvJ29`FPHb(yuFMY%W8yiZqW_2wxgChch@W*9;_D22YDf~lGyi+ z3n+fYKuaydwFnslV z;-7@eZEKA4BFjY;yQu;8+8@^YL)7(hZMYPS70SD#UM1=lO@?ub1#N^E|YxLh>rns&OT!=0m=5P2WWl5V1>S3K(Z zW4Z07`SyCWl2VAM$Np zJfwo3tXQsKUCj9}V(b?Ie)Kl+R3&-wIp3!fdr81~m{o0u@h{U0;T`>uI>jn&>_yiy|;1npGeR^o_cdAN$1 zLz95yT1zh?SiTjfi3T4oqwg{FX?p;>+#~-UsQn*1pYSCEo1noSn8vntY8PtEd!#$Z z>g)%)<8&66dpBHeQoE4hoi@xC^p)1WRg*ET7H1ATziK8IB(~D8V zdT%n(Z+P*OTm||}zYm>}8IIZJ30r2TOWe0b4e@&uy)Z61&S$9xiggM(vojRe_@OZH zSl$~6##k-A-y@zPy|6Chglq4<(CNhkG1b@Ac5aBP{KkFzBYopj^_*~TUC|c!x7e-m zMHi<&j8_4u%Xr^Z3fMbE|6T=pzu*4QeoJ3^<@7iv$0rL$`P!YD>yX8${nFpRauVxjx`Y|Bf|^j!Q?|7$a)6ol*QvlCAKE0sZF7e(~Ox2m`(_@ zG4#KrTA2h)kX0`Czm*9X(vJ$4wYz6~QKad`$o+9?65W^09w{}Wm@PBLh?_tgK4gx> z=gF`K#vHV8Ay=k>%7_qPSmH9r-Kd@N&#?U$3!w8OVh2V)BL3mp!w6ULtk|I!SO%JGaz@o*Eoz=zXrg;o~K z7mE7{;lXeU#BZ%R&o*?7@VoV6Qi}H-(6ST|u#`|6L7VN3z$*T$?e5Qj#LnYLu|UGX zhK`&~Ze%u={Mv7gw~D}mqQh~e}-}Q)Jjncbe)({PZ}RE$~-wcK#W9xInQQ_ zKEx6nl@0bG>b@OSCL}b8SUBisJrjX^P_R(wZGK?py(UD#nas zjrwTLb6w$tRa-OjrZ2n==ZnxbeMKq|kgpCFQ-2Cpk`j|^S@{BxZB{dOpoEI3AUV`Jy`qXgda!IK)rJ@9pIPO3@@;1YGY#7&gJgNq%PLe@N;jL z))VS^Z*SLfH6EOaR4WrKL)AB)CR{nw$e}l_g4UJOr8DtJGsA_QBAZo(qdMw;#1K2V zuC|%45(~mB@`q83;i(Q&+>qK=bi&1})INA+)9Ybxe09XbPulUza!|2D?|d*?Y7K+V zws<36bfUUHxE$MhQmWsL(>%q9;64a}r|fSnUHvdmY1ZrKy!~@$u12MJ{aaWAZ&gq6 z)kZ|h=M#gBwgfv~kJ;yhs9Z0OXlV}?@Zcibq5RYOTOzL4r{Z+ylPUN58%Dd{etKRu zsFcjfM+I-S{9zyTAC)U_>O*=$O~aR#4*)n~B)8zLA%rfX50Z?b6x*MW9*W-)+5E*R zY;jO0hB)0y3P&STtthX!*<7u6T|c{uE`cBRSE!si|Hp&}XQX?_uNQR^HvTg}~HE~81UtxKUQyFusYtVG|cla0C4e)(qKO4oI% z-eqSPHrrL6#ZK_8xd{nFE%aiL2O#PBpZ5{nodapo24jwVeTDw@AO58HFYEcKYy(`q z5FhuVXIjI?JKGkV<`Bkh;<4AyqS>weqPabSB%l3*4x8g%UtitNH4O5U!mvds6>^M( zl_P%2dX5j)QvUB));y$sn}i`-7Yvgj2^!v&SkpSk-AfIW1`54 z(il?$HB(uAc*BZ5o%@YPFlK9x2>CJI7n{uboX)~`>=GpQGy$}6xX6bXH`%$!WO+Zg<*9f*$iEKY;23>{A}t^22c7Nf9Mnh%)mqJrW$MGe3Y zsA{Xi4>?OI`MnmIF4h^Ji~wo5Wbb{$w)+W{wF(#6{Z;Q_a}%r4%h-4`$^0Ea`AcYf z-PEREbf5oTaW~_dT03Jxxf3vz6lP$qyvX=LsrFUdOd%66;^@KXQA;$9O6E@fJ%Mej zN`ze27+6ANvkuSHWleD-j@wQn9%q@lJ10P3^AQpPtKP{-6}m+A+kRo>85l;T;b;=z z^X29hqKz?0)h7tL>bDz-Q2DN(HV>lPrX0pPA6WDoca%?A2A$20$l!pEZcriUrc-diIH$I#EjF4fOF_3dRG#U~?7;E81*a}e zs)5(9jvJ5qq3C2*FtXLUl#~&18x(+q`$ay~_B>1Jp%b!x(wW*PS!v8SFo@(msG-=LCxzrJ@{DGj4TaxYF+&WE! z{J!nFEGyTiP=rDa@rC#JoJpGGVqznPjT(rx4(74dz-p_^SzvXUxjr+87^-4H+op)K zQvpwCzgk>{9mi8>2pvi*Ot|Je1kIQslDb@!u)Md2mBpAs)S7T$%$XB*b+UkZ9EC)0 zH-h|DcVnDCb&s=WINsSG4_~p)#}mMni4F;mnTfx&-}uqCsMquzwMoDAz0jo)F3N|KSz!{hsxkXE}S00hvIKx*!Ardrnc@ce<(tdb$s9W zj-5@P8=798hbOH?t^M*YkdaM|{gA+jaid{u_o)dFZ(_(3pI~9>A7cD{!150(BC|1| z@6F|RZ7*1)kPw&~H+KU&`;v{&ViQ^#{UH)w-wZJcG2Js$g&E3!Ool;*sw4Xu7sE1` zikt>!69K_vW2^*jTlrOoPt&nh=xJ3Uk`E>KD!iDQVRy9jf zf8W^0jle4*F%f*d%pXvP^yfg~g@XLVJ&09|{cz6udJ{v=GPlmLlx2`MOkYLX?M>l( z0Rm_7<}zK=+34N=H*~V8(aB9I7sJEz+~a06y?9J7_|=q@+xb?e2H2 zB!{nr0JNBB=p0m5?q&bS>AxRd*dyjs&IrB7<`zzR+?tB(ZbFid%{RU|`4{R(y-oCr z4S103m8)vO1=4r+8V>a3Kt+qZF};qZk?+kr7#Q6CgWb73e@7@Ns4y`wLwob2h*TW) zU2owjtiCDjQocOd<)GS|wyL?N3GwEXyf=(1hD=kBW}G173u}2gLLzy{4komlS00{~ zY-b-ynPUQa#O}l$yEnI?xiC>J*1XNfyar2pv@~R-%osjxOHCPA!Wl0UQWJM{V*Lt% zkDsnVWq$p}obsI0&Gx7k!zFg02_6X-0hOFgF!Q##bvL;_vRv6@-E~WH-3^g@0ox?5 z!GT!kAsVo=<%u`Xh%bm$L7RE|^x8IXh^KAP0yOr=^?qfYJ~|6n%DpG{7Eea^>T8>7 zx)5@k!--(*K^L9L&cqk7Z@#^GNaGk7hC9cCc{wVUOpT4>kFi26d};qdQjFUcUD;Uz zu&&3Eg6a=BGjoJy#~4kj6W$3cD{0hXz}#>p{P^grO)I@|93(I;irczS}&}nKAk+8QtD4!uW4KJCCZL*0NKkC4y{SALW=>SkvB80&|8+AvvpmKY|F)P1fCmkM8x= ziClRE(tWz(G}TWg+t$3`HOZZ3yl4^h^osh*i3o^IiPlVPWs@@fp>l&E`+gFz652^oPA8Kgr+go##!+cI)&}5 zXmvLxKx$yfBNmCRdZF5eRtw7zQ^7Ia&&NGI^s!iu4|rjL;sfI^5c9GTD|z# z&0!MlbGJK1cbw}`4SF+O7ue)RFIYC3{idTSgmRJ!!`YSYnqj2)V0~W|`>do+@7N75 zgMhpKa7YID6^0qk08jI=aE3BoA|PixhHV85NBj7vI`^69n|%4J&t2A_ZiF=2-&h>K zn)bN-sApJd_;{VKBG6-Hr!mVN8Am#W|*Gx)JnK@aGCC?_QDlt(hgwUZBKL zwMM0SS;G8mMmepce!Y5SVm)o?h5hXrwA?P=h{#^s{Tu$l%pXdlnQ?fc<$3}7gIV*> z^_&Sh*Bm+KCQsc-3LbAf7A8uhshbj?%uYOSa#(Qy6LVErE7K-FCX1eNt$*Mj*9%-A z8|W33DCTno7r)|m=Qv{9{5KlbirZdmF^3p6(;T53NgqaxdgfS~RJ4_5@H=ALE_Ls^ zDiLxnas_AR@Q1hyCV)TDnBR(t@QSloxz6oY4JU*j;7XYS)r>qT&b|R9MMyG-V)twV z0OFWDv;%X_^CHA;eBon%Dtr1aC~A&G>4sj-_ErHPnD2>)vI#bVTj|0x(aY&j&JIhn zh$XJ8JpJ|EFdbG@ez4b#GuSP*!d|if?pzKDmAP$R}JZAJ@EHzH- zviU2W$GXhFo0p|(9369`ZHb)gnI=lgT-PI!)R%?V4UBwYN+6ldjC=zLJ))Tjyp|Z; zo?t1g2F8BWD~jbtXUy{_RFey7``{*`hFErY3>m-$rXq>qosKWbCw+R`7!773odwj147I}7GBteq7xf^Ysl zf#=s(=A8cqS8i)BpUPpoe>+Bgnc&60dXJzd--b}vc}71$=F*0&yrYtiQGjm@E!Br; zbj2zV7reBFI1XK)OSm}2eBoLq@;TW7UwM!m<4(fc$P031if0(tD^Fq%>KAIK}NFBhj4NZJc37|9c+ zbUa5Dt&esp5g7`-;>VXd}QTxs7U&CR#T^P+E7?%PIAiNkn|37-*LzfA!%x-c|r^>^D zYc-`_GM$mu7E<1W8*@ij7hRs8aYr4nrpF^+3SG>e!HrB}G8ih1V_3=J$2Y7tj?zrd z{sPP!e=4B2xN8oXo|NC1&WrgqrZBMz3G4;tgzuV|%t@FfFWjz?SoElJ!y`jITsD$w zcg)swr>itsbcvn~m~TuZLF9$pk5>=K%C|RqS`Xg$%5f~bmur7cXIzZ;?8DtL#IM1A zt#hh(+TBKQ)_v~dnwhSAZ>*3UgY2iZW*6R)_j%Hv&&(pdIV~)!ClJ5hmmAMb5R8zn znoUA?fq7p+yCi%bmNwBqYQq#(J2X=X;*X!!-YP>olT(JRx!||k&wD{Hv+t*r3Mlw6 zZ}EllZlxTxLi=6KL}#ejejkt(>mE81$f2e8ww~~T2vitWW27NWuA^~>c#!v?a5Xij zcuq^IcF>!Tp3Cnu=Tem_AF3n@>`kbBz8`xW@Lxq{_3)yvbV|T1^EcQ}vmMh7wYD_B z)fYQR7}mLXZyR>s@N;4*eD{*y`j3EoLc(3<Ti-Yr;Li{O=a^;Nf=nwEF;*j!+V)ddP(Rgcgqz7#3c)lON~0_g)EDx9 zJo7D3xwO}3JiIYfE&RjL@V3G9#CkMQ$%vOl7Q2#ZuewE#$3@7{U7*3Wk~@*a+*L2z z^1LTEXxVvgt+odZTd$VHFUTsHfMo8b!`j~UqJ(Pka#L5N_MQLpEJ~Mpv1PRe0V;CwwUu+zkf<8^n#laYTmqj{J;N#oo@-P%Fb?7jEJnZt68nOi9z^z z{zKb-zZs$qGWNdO!kYfmpgX|+yha!dTN4QV7>x9}mVL(b{qE(vTUSksC#|xGQWkKc=qj@=oyIi z=OdLjYBNmEqb&V%L#57jSj_7PE#9tCM4irKh3rBIEA7?(tGtkP6Inw&J~7q0Y8x}Y zD>MTa8;94%9Zk-NYOQ@^-3zEb+%0gr)aI9j0@?_-?kfh~6EUtcc$o4sW3uRXUAhdX4sXACh!etVtl)Uj1cEX&z5AFFy#mKJ(-Ij~R;DP+nYW znd%TPLg?bChSwl$2N=x?DmvJ;*)M)K`Z z&%HJDoChmiRSQHD+?|y;y=#F!4bX~@?efF0EPO@vRquhSX_(oj&TnErMyQY`L2xv$9U;1m@-LxnC11 zpmdtntxmrS$7VII#$Z}snr}bkdwlIUznLCtrUODhL0wNA$GAxuNq%U_AjOML0OMil z_#m#dCfV3e8U3@=gVPzHQg_EM$k^|$=WO$E%7d^uL`ui%)#0q-(cuGYplq7LZ2Sgj z#QAcw#*RYe8_}+l(5wdo zM3mhuS7Jma==qU&3Tmsp!^YnbUP=xOizR9xGM|kK-@p=UWPL>H;7kr4qddI9>e3*Y z%kS>TNlx|>tmk_}(!Om$y^}Pdu;Wd@_IrWnWu9(!6|73QOqU|h%E~j`M{E>ch_O)4>*^yN|BB3K_mK%iq8^-8>D1oDtBTI1Jrxj7{v z0j`##!`i;0oaT#NIFY6x1HLgH^eaVMy#K00j6WGw?%}ceU5CoUO`_NA0im@YQYX>y zpy%?`D15W0lV`8(^a!i188aAqRZ@ zdNVSTNi6&)CcfFtew8x&%sa{YMn^|zIoQf18ru_i#^|74czL@o$M{Px)5-GQ97~S zMqmx9*(&}9TjoG!x)rQ?0THW z=-WQ<;(4XZj3bfVH+QSsZE}%v*rQa|r){R~6~aCrrxDsZ9AZ1-7ZZ=nuFkY4sULnM zSWQkjezNALiC!-V!;6@%oxElJGD3@i41DQGaXcuvt@?s4G4ln_-bA}WG-4V(?_Y?X z+WXEHvFff1UJ&Ny7nNJ=XT-BS;WmoEZyKwaz_e;Vt|GRV*|Lbgey7H@`}@0BY%9zx3? zs+Eo_%)mxYhyP2%C#cklnVcvHq^=IC-8$}F=>J@NmuzgsWFV z2t@TB_%%FrSN>pM8?N&tW|Y+djKD;OL0I>^OcoB=%TMq8WC+Exr-Z1MmT;us&f`zF zbk&rz459UtLnbPRL&LbL^gcLlQKn~WX_KK8fDAl|XTjMJ@67E2G^$Sn#^<4~9$+ID z(kIubG@c&<@+@H_86zMVuKopcy&GvctPLY_%d>Ntr_LZ~p$K|v$AhOQ?NoidnRRzE z5OEz|h^i#h({Gs6U~Ma#`q<*ZxeR(m(E^26hCgvs53 zv?L<}!2Go{pFrq4MfMYwgpz%na?2l1Xj8P`N z)4q%EV~2~&S&UprET1RQsK$*q=pM>=Ru`# zpAun#3$k7MHDK}Q_lWNZER}&oP|GQcsL!Ew)*87Lbsx%XTl9?c^-kbS9&AdTEZ{Bbc{6Q>9XDD=|tPT z`JY^X0xcF4VwXTANayN@?-*U&cIP%O?s~8M?jk4){23!?o$DMq&|9lwTfhn%SvyPV zor_B#?qXW^9c+&UM7>uwNMxTVGJ0fP)2lL&N^K56J~SeXKK^xlguO(m9n#$yU!c>@7i!1F*ng3tDlsn4o0J8uNmHeXbq7cM)S5@&vc45irG25&4f~8NIQjLU$UH7{>C-kLJ$peM`p7m?093~5!R$Z zJmzk+Z@aPl)V|(U2ALT~+r`bO$`zdpD~hiaB7?g)7`eVnv0B8;Ytj%Mqfu&26Rd=()N1Q<*R~}kh z6$!G-b)rlub@L<+XGqgmCEuDPvMhB!@KUxomJTlrY-eH3@n^js92)3eDo2Qscib@2 zLdA75iUr1utKD8&WS+lHQAwJzkn5nOPoWz;)(|G1la*mBuG;vyd|s#RLaFR|^2=+s zZUa5hqcuIl+X!YXTNv&Rs5!do{r309;ET}s7ct?`P?YvEUQsbgPv=t`|f}_t zCXTOF1It)q72fPbbzx*w_C$gv%ATX*R474UcA*I2*NDI3>K1M%>bO%zGUgR8+wG=W zb}~Sttx1Y;b?1!QX^+HebKDnEdn04QDp=SPksnq(LFuOpNvKSg#^D1 zsip3lc1(8rH3I^JeK%Ytm}7t{R9N$pkPg)g zt^Rtzv$cE;?_Em%OAW?%gl_cVeCMo}7)7N=d@aR{?5D28qH`~+cRge4*VtP!FQP{J zJ1ovzL0_tDuBZ$_`prq}i5yQhPP9F_?9Wm0zmVAWv3vg9yvDz5$uMoNwpS7RX?V`J zd;?uNa*vkpF2Y{%dO^ona#&Sg+cOima@t$NN-)$8#L$!3j^mt;F{wPA=yBQUOp06& zJScI^)iq+kK)sbCo226J+!rG7-V(P31;EGz$)l>Bqduiz3)u)$H6}$EDNLr;jzHF2 z3m!ni-#=Q+t!K~hWBp{CFWGk*@BnvUdgvs}YzAH58UoaWU>Sq6>-5~UIf0r+_h3=F|;78n8`_~towyhR5yRUm5^<}&k~m&kHV zb-u6}v>j!V#i((Xlm9$c?Hc6#HEcM$11poo@-B<0y3yc|FMxzlT=!9-pd}gjdq%v| z4|3a{7>7q-<>P@E8P+;`IZia(eq&Z}#Tj!tA(j{zVW3ch1K}LqKC||Bu^klhP%vh( zKwI<%F?FTQsq#PIDLZ>c7Cp4gay)q%6ZC;kvp*uYd1e;cA)GJEYD1H#P={I}cAil% z>Ih#jegkr(QvN^UEnPD>(VV#&^h!IM6I1G@OnfcdpcWxGxR>6K6S?bvb^SCx#!1jz}o(B zh91Z;f)sKnQb7ucm(`G3+36TtjFN8F^rHsMHuDEYc<(4o%%;`p5v7w?Ut3a>b_=N{ zO}o5m=6w2Ez@7ew-qKW@K=honSW6sIWmFkPspGFpM@M9lS>r z4rvpVoI?!sE;TSy;5Zi6+Ql-Z;H5>R6&fXWdU`-4xMuIEPN9~)dK?Ak^EccDj#IY~ zb;=TmSiydwRGzqIE3n*|PDXh$w7(mN-->QDA>pmdU$eRHDU=emt1s145*HO|()pGQ z5#TuK*8>J!9_F(%LnF^WmtJvx?Z4;uWmk(pdK>jIUmm;Na`qcWbTen146jS#W%~gM zEut2F;=?^>TD`FW6K7td2KIs1SN(cv=_c*@z)`Oe=J@=$Qv+n>lW#p&roIL{Bo^I+ zCn0HbCvzdQyOJUdSO1(vcD~$@PL)TVZI4*-L#6QsINwg;LwdGx2C~rLU}(63XMF=f zw}aZ^qXBjM@X^S|?QQv2PqqU|=XUziZw_8*+6~lki&&Xl!A=?HpV%Dfc;((>3g)$M^T<>&y@Zh59PUiMJ^Z;g2sv`)qmUC#F1{wbkrr?rrMVh=D?9 zIvP^;Z?jb(1yC04QxF}yLbtdjfadsMVfb|k*p_!V4@s2 zj2kcs$I;5W*qjcXd+Uu@HMKhQs`Yz==O&5jbJ-MFB3?_>jB6r7!8f(0${A6TJVqp-JN?z^kU;BmDa;IzQLw$g zbO*f+IaKgRl>4#0{!JI~=@ndk)jH6DV@J~unhqR_QtENuO+2h!7P5B);I@Y|$LAm) z1l~SOTa~=6r^;;5H?eLb;#}DteJpLBbMKJREg4+#=Z>wKiAV+#wJdF;2k-mZz*m(|6}Hj|T-(jO_-atRc}(ux(eB6sFVLT{z1*|4z` zA-C(Ncj%l1c{F%)vW{qFo3CJ&5jpBd@WP; zV0fI{-_PW)sGTik)kFjr*q_HWZ#`Qyc2>M7ohq;EM>0Asr;eO1DV@4d^~1oQ9B^%} zKcV~*ZyCPG)TxWJ9wY)2dfyKg(qmg+aalMepoyjW*TJ)f)E^ryml3R4!Rut#H7_GjM@_t~r>CfJHNMTtb=9v_ zfTrMazJB`5v5JNHB^c#B#4WCgGR7Jl0rdqnz&lcJuVb^xEqv{AR>NIPGq5u4IYd&m zA8=%&YOvrS9bq7yW%Z3ef!6&?Be9`no2U+80N)?gEBxSIrKuirgW**CB_V)tvz}I$ zFlCNxW521ei!EkdPS+;qyt;-E2+#1^p$*qV=JlZ_$a;mkqVWa>kzX{}YzFrmnNbY9mDK=l^bJXgQTp-4l5U)6h)7J$`N;dK9=x@-tZCmjMxC>FD@I!g193 zas#0~2x?$%4y!hJ!26d6KbupKzY6~6PjgNG&!C@n*Pnp6OxiQy~QZ)hYLIBD@Jj*edGA;vEHV5m-M1fRs-bC zko6tpc!UY-4sSe+{k}dqEp%(dHy$Bs{#~&BkK1l{_semC8^mOW-E3WnvI6@uqAqJX zqPN@LiUXY5KkDeytL<(sMR75T-MeA4Tcaz87(l4Sx}e_ zEkjqylr*207CN8iquyS4BAsQeKOP($ZPUQhnV@FeL>%aZxbt}MQbkjRLE2;yMO45< zxAzDF_{B=*3MBS(p6keoPF%V%1)>x>%aT#A&6hxC{wpflp?~%lE=HL>mAq*!cs%eo zxN_$_E1PYDj=^0`xSUJ@pz>N=a}-xLQfF{Gs}6f`H$p~mlS0qIxnkoqxzr8@RphXi@nC&t+C;pzl)i#bJ+mEK!;Tuhih2V|j7>halPDf{*p8a@1TC|k}3{aD3<9($b55Yo9Pe#Wd8WgP| z-mEJFc{rZ~+$X4J{=;61y_xDCT}6!VJwpE4bJvxIvbP>X)_K53t}WabDB3sBCDpDh zR_A<4Y`!cA``FKKq-M}Y9p&c`5L_9(!Xc_I@$4@{y;SR~*3km)4xs}KfHIDBQu<3- zR);iB2u96Xf*p4d12M-Es@vl68X-;_DN0(D-!;mKvTuRk97_`mcn0OsKHyA_U5bH7-b0_9Tabu` z;m-l4*f&XN*pz=}7;1hAQ^8oHY4z;N>EB#atH7KdcA(=fn*Hdlgu)LSD^c@&lS*OE z#iJ?40k|uqim(w>R!L1POy0n_=~lo%VAtb!mN4h7(c`fKyzvm4`&3v%W+fZGv$FK3 zYa_m#Aziyu!)2#Fer>Ma82DnsdiZ2E1kh0RYIcA-Gwu#k}For(B~Q5T5#8bfSuYcs(bv zu~`!6ED!uc;-d|XLFqZ({23nKpnr8RM)-{_{=t>jm-b@haz6S~E;%98kcVVioaN5i za-VwI?;h+MK>nT^SYFqQBU4lSNLO#Z=Ct;nNn2k+e!G(5u@bk0LUs|!o{|8WFBTsc^Syd4h}iD+qud#z4;W_N1_dCabsq%8V}`SsK0>Jdrlhx|%n z$-pR`-5dQMhcc6fg!8D0spG5%Tt`@*aAL{Q(kD!?(7XkBp^2y{Q!im;NzYtpxb9N( zB)bHUSRe>q>g3gEA#Y;&E&OPVcDeTxt_~H**ySd91E39aoQZ2*y{fpi9whO>o+={I zO}+euxZuC;(6H7htX$9NYhB@qW{(uU=Jn4}TayH^L4c?tu0H}Sb*R+EMp`PQ&+01~ z84l)is63cj-(;e2g#AA`Uv0eeH8rKBv1-W?D(FwJqW-61q_G1UyyFI3pf#z(CjGmi zg^Df{nN!TqjM|En+Xr(ZgAB;^!r|0DhGdG5!kJI!~h zD1RGG`7N5S?80fT41FIZ`M37geD&( zK~w9X=@|r`i9m^k#(V#r|1Z*bU_bt&pW9^boZL~$`zfDc>bl+gIrjO|9$)s+F18>M zd@SlA{f$?J%bH;e$BsxNOaY7Y28o!>_RByy!B4#+HE3-ml(dAhiH+1p%sfpda*yzA zc;+AP;D!VL0>=A0fyq+Awwll?=;rR+++^*OnG%&@?rWz}LcVVHnMP~Up0`r3bpEYs z@LW;89`w9_!pnvR&j(x4f2%LpW-z76Br_JStFaagmC^Rp8gj@h=r@9$=)CRKM$+rQ z+sy}T-6x<6Klky3I+E%J1MRa%aC-dY_S)O4`*K|J)x4ITMmycw8f@5^R&1X{&S;V{ zr#rk>x83dTP85>4lBbH-1TvVO>@t2!0*X3lA8-i z_XkEIb*FB@Rnm0pz{Li&mdq#I6A;oin6a5q!1E{4!aRRpERMfzQ+#n@+r~(W&bU_} zX5W7C3C-;#ZCn43@sl%w8i5Sau5GRNi6;&ds|QPnGwz2B?tex8%7LzGr3kAkfwd=G z9vV95upw!YfnB8$rSmO-4a#h*75|DD|M8+vkggm&G_=bHUeivyJ8PTo`qX9|>#>@x z2XZgG?Af}rCplkM9X{vBCq2FF_>}0KEj(UroA*5sg3V(6)Qn2J{5CWy=Dttl!k?P; zcUa2d7Hu-8JvRvWBv|02$o8{+eShID%Q}V0jAbZ^f%InFOO`+V>leh?#P}}G!l-h)+ZhCJYW`=6h{bIPd4X zV#)~S>I7o4@y_u|np-j4Kg=kIe?wb2xoMn!@N^dlFHBotCzO{Jk9@N8;rHn^&F!}U z#N9a^!T^Y6x#-3}{dqb-|2mPxv=Ikaa|O;#L#`m)j)rxh`6T1&Z^r9+@U*_}fn8Ei zn%fw`h$}YPI9DzR-3A2uLa6wf%_Oxv^34Oy}l2Unv03H zoy0r%)v{S>b{DxG;yZfU^T`8v!+PFY{ziiz)iN&&-nKSbhAPwb$`$7M;BTvmY)u`E){5ZMQ1_C6;w)`pYi;(w1IEFPLnf57~U zO19NH-mxCfyQZ<#dD7mr=Y(-@@`YD=uBAym0qv0jeNv7{o=C7};xSqHf)m?IxAr)( zW6!BS%&89C8h41yggj1Y^2bo$W9QCX7#=EaAeqMur2hu>H{|-(b#gXP zd$jv6cHK#b9RP1a<*>MI?XaSLb6}$eQu@F}UKyn!+s&H&T`f_x<$Iu2 z{`G`TZPG70|Fw&eszdD9S;~SIrZ7&!<=`QM>x!_e!54kav<`-n5H#Cc7jEz#4lvz5 z7)I-)kiQpJ9u}B8*^x!f%q7@!8WXivPWSOK@9n1cK#O+0Q%4B^Gm_-vHHemvGI!wj zNn2VbF>x{|9kv5F2?ukY!g_IZ%e3Fj$j{|wxfoHsq*v!znZRG@JLx`K=Y<2bHV@R= zV|JpV#CSSaa}f62yO6*R!}03NIrlk36mT;jN7O)Mv8o8#pcOEVE8F?h%YG);@W`{b zSg`>^BFGyT9fSQpxd37H9KUS;nr6t1>$50m=2?sn#Qo+M#pP^3{N^fH;UbN#o4;G0 zTJ{(vD%CujcrBRC*US;N@eA9j%suNDkPVfDJD`ohrU0YB=Y8GM;Y=2E&6{^3!QzQ= zReq>J%tyDd0jN=ii+O=P)JHkdEB!aQ@5G--3?Nq&`6`?XZ{I%-_dTgd_J@@-IlH_g z?FOtBz2-qY^DyQ7OY_#(*E5F+$Fnmb;?fDg3(LA)tuh_i;IyoD4=ec8QaxWsBv@GO z(OW3Xnyqf(?#_a-QE=uqp*9aqqK@JnbTWl5LyaG7y<$}Z$7SNH>>IHE@gRwiZkw>m z3s&bzfQ$Q+?YgyHHJajLE~1`5Dt_x`1^=G)DM6<+x&Iyku2lwNk=Dn!SIuh(%p ziD;h8WM%9a>TBc4=p3zVdR^i%3b2OB*+2EIJp$hxy{b9v%LbO6kJKKpMvgH!Z_E~> zx1sw`KA|Izukuz9lzkq$duv-l-aUp^$ZG|-huh4o$y3bIb#VTxuFB?@c6%2G-GT_Z z-(dgn4ze#;)06TmyDkTuv8kl-lv=f8VBbRV4kWG3`$N_rIcRO6I|tQ~d3cN+lQRL= z!5EuoP_wDeqGvl8T3XAK#^ya*++8z9EEXzgXAW%(<)`yB!j7BS{?1RjN~a3bykCa%s~wa~y`p<0Cm4Nt z{y`i7TVca?f?m;_G)<46!#$qg<#(53x}1LEd>@|cYTxDeCyyKaGjCrsn)C495l2mp zd)C$UEILA>>yR)N7CThB({A(?E_ZU8s4{eS5pf%(mT;$8s zF8^bnZQunr?`&J%Vf%_qgA*~rAt}TM@4QH+&KiD)!P2IH+{z$>^h~hlWLDTt{Lc}B zhGV|F%Iw1fh>#_PDMcoE*k(5g)bD-qlnmCSAcxcy$?q|SBFj$usCj;sNk;ZIfZ(9G z9;~e18tU+sAHEMZHv~pr(9V0)b1&!gtf5g}GIadtJBDTS7+BByz&(3=-6stjpZv*c zt@qRn#noVU>HR}RnE%vI$LtKW{&}fsDJ;suCkc5ZLO~mtusZa(zDR?H8GfA0%bl#J z?g<|W5_)5DN^11DgoXg6z18=#h#4Mkk3dB>>u)w$0x++y_xy8R#zMQ6{VlL+$r z&c^>NAnhM0(I?+O_n^;Fd9VYgI}`KGvZK)wk?@mn89~=95XkJbYj9yoNgKyedvJS4 z%bnRh9!K@{TiU13pL1|4nl+SCY8`WZHVS3qRnhD}b&E8w+RET_zg~ebSRJ_dX2wo> zt5`ANede~#`Td(OTrX#n5s?R8W_`+8V$FQKnjhk=at+ff>;5pXdG)MIeo*H$VLKSq z;k$+h7JM_F>qlzA-RvXmXxwo~lu#!zM|JVyKF`CcIyT_9A~H9xq%~M^4P253t)HNA zp&O{J6Wjww!fL5xohFhSuxuqh)vpEHwXN!W-?qa)y0IJcQn`x z(_wNJnW5!_TUSqc$DN22W02c9L|S89nfUXKXHgn#NJ&nXu2$;-1;l-nl?T&lAHSd>xs2!aJ#36^ zf00qu>(VdmF+bEbU!8S)GwE*!m0D^R)pbI|Dzc6Qgi)fI?>le(TA za6{ccxFq3T7NlX__^Sv&7GO%T!>G9`*+#5YXns1-J{z!?{_5An73P=i6P;fhxa33o zZD+P<=)bE_U44B4TNkH3E#>Q)6D z_BN<&CTa$U(+#b}+qnC)js`R+s61Tnv^YAB#}l)S)^Gw&=VS^$~ax2_QXh^Tz+QpL;7R=)*QI*na=}fd2c}rgeq&tfSFqX5UuudX+I2 zB{nbNal-=`NSC^J>GdGh_YAMLwOlmv)3ZMsZa@18JcfPSSGW))>b|~>Li$ZEDlO02 z^{b&lmh|!L@!q%B+JfRBKM+8Lpp4K8V^!O|7KtEM{=Qx%OJex=iib)Gdp+ydr%O-m z5MH62MmV|4J>BN$rK7r?iRw6*iiX$q%gd`D<1<9N{gs^1YCYWKKiNhzo{Ke>I6Sa> z_RVmk^ioo?Ie*u4*4SV(`^;>IfJj)rx+fhAVw!$PqpVzFXhU6Pl|eXsaDPq3n^}Ri-RExh~G!qYU`%064JKj0{ zeA+fIErN4oa!@Cu?(VYTb(SkI6HaPIEcXkd=5Mf-u&MW9@|pOsy-1oI0E+= zv&9oL+{Xg;J5%THI_Ixqu5ubOWJqt71<4j3`a%s)kB!y}9T)m@$jJf!hp~4KlC*2y zgd5Y=G^UMd+x9f3ZQHh4t!aDOwrv~Jwr$(S);#a??(f_9Vk5Txs;H>@+=rQYuDmky z)sc)hvm%AG-rETt^%vKU+6zvJF6ouF2Op$TGeU%((`6J3e`0TIeB6~P8O{RQ7CwWY z%it}i_fizUr-l8Oum|tqlK>~g4=<#R_aMf6S5aI)!;;bGNq1W?vBO*2$J@h>58+6- z0C?64#7kiUgwi(bO>rwSZ+O+wegI{hlV4gX%dwpkA?oQG0qOe|r~ zXC{gNJ;{r5{+VAcS6728A6;u(s(@Dc(P~>}_u{tI4DHs&Y@5f_Xpq0|m|;&L*jzN^ z^yz|?fsSWzMPR(KO@U)JbasGY+stw+b(TSQtu1Snce?nszW}@)gwXJxbNo?Ba%Sd? zF)s+Ular$Ib5`5-v9dI#;kR|Q1y>r&PPUolDq@#cCihQ&dd{5d-EGgv{L0Y%BE=uW z;_yy;F@wR3{T%^&1!d1AUni0y=5Q6{b+|N}&WoVG+p;oaSnodZe!#mgMP((@?M3GQ z8gVEySeDB#NNNi+7WSgt9Zwn znjexqRiK(M+)t*-uks4U>`07>M%qPIqqMu=^K-7y}I*F$B<#PJ@%9l`j6IcQDL8$9vAjYHk(I@c?(n*YaXUZ%#=~n4cu$zr ztOk*BU0|EhT5Ly4$+~tj(>iT zR4IRt{kC~t)J*vPMdbQ;r|H?P*>gEaAnP5>_AcK|q@JF!qcX~rdFi#C7e2wY#N~cf6LNL&gTQ!Y#cA|x>6p&L3 z(bLfo+lQC>UhvoLe;z`MnGS&e3)66^;oDfg!C#4+MCL_1U!AnqU^Eh=z~_BGGTGJg z!*g9f2Kii6V*IC>HLoG=syOG`jn^}UV`)X`{0;= zMuh$E$rfbkgoNr$&$u+{pQ^T46@f?STYkQHq2^xq#~$Lm(d31o)dNjUDuCiFZicf! zx{K$web>F^svX7;^+=1}bWe*edfIhrd7mSvPb?yn-u3TS`nWy!hDWGSwSGff+y9d8 z&#cOncnjP}ho))tLaC>oH{lESsix2QsTQ0)h ze~T!PhN6uZO!H+Fj>_yl$`NQ@hp||sB^Wy>U|HGIrw_cprusI^LkdfB!1fq)|VSK0yMU1_ z;!@WWJ++j)J?p@0F0>2XV4tcq4MDiw&CM)hHPU2^r+OwLbJ9iJ9l2!^B!T&IQG_Ae z{3s#lp=DZr8HOiXaOuzU2S?LfmFGwKX>`D&($4K)@lau=dnpk^1!i%22wTkUBw(G? z`->5^rcG9v_G-Sfjs1jRM*VAoOi>LSrn+%f+~pUd*~1!>3nMl#mx+ybjRFWg2`#V{(W{p@a(7Qf9_pz2+(`e56_J^wPN^{+%YccAo+Zu45>?fBuGLcG# z>zclT+e@eg_WNAEPf8_1ePWUp&rHXlUvC=a*^E|Q z9b?|wSCO)v_fnDxj@FF_>nGJfrV0ME`}bD|8~IC=?*G8$AwJETY5(Bd|J|rs2>(YqWcL3v z9WqYrKlsVNOZxwYy8}}h8<<3pp^C({*lRGSn58G$z%T9r(9#%ErIIIg&ZB^@4v_?= zAp(9Bkpx3d=LrG>*9sKuM`@c_{;o~r9+;dFi+$Bf3(ywtk32MkWvmfD+elD<(8X_Z za@pmBkV_Zs9kgY7eMc}#(YW$$gB;WZ9m}V?GW7U`b$jhte`gUrA~HJ=!J+c!vUtXY ztSx-b&AD8?^>ZQ)UiTZ*R-_?pyiFg~wqJErM~+l%Hu23TrcQHWi~>eAt7#0tEI`69G9X z)ECZ3V!-)rE~GpCp!;W4`hTuGePtX$1u=XHj@Zm4Q-aYWGXLP{e9-zcBKGY$?EvLE zhZkm+SMK-V1&1sVswqRW^0{=`nqY`s1;AP?U2+bYAeYWG{Xl91PB-kP!@YbC^Vw#C zBR7q-Iy>tI1!tztewxLkil7fX?tL2Ui2Zi#ObFink(NkFkFIjYdO$Sdb1dbEGmBvz zKcb+a!4mj(HT2Jmum?HZj1F>?rAmMeUndzAO~?IEV;fWc~2MY?BEw7 z5=A}9?M}}e`o)(wyvUi?ozf#4VKNLwiTQ#cY<=1cZ{A-iyW91LY6UU?b=y3WWxvWN z%@+LNYRtpy=k)sN;jDuMm0xOYkII(%k1PhNR%9h=gHOkK*LBX> z4V|+1W^ua=QC@LBB2ljN*Ob`b8jYDcAxH}L{eYBlQmp0=OCp^=z`;vHmSCCGvkv?< z1hg!f2LImkfV0a3oKA$0B5Natj1h2UiEp&?9x~}vo)y)DFuXyE67`*2Yg0h34+klNgbHdu_*>~*Vh_69?nJANuL!vhJUA)%6ln@X?dN^{rs z+2>wlu?Ktt3gO~3TJI=+U6bToHSOTM%c4qOWV}KH-=%5X09eb7sm1qRVE%*%uF}T! zQuBh5`d#>ja2V}tEZMi@21*m03~Ed*%`JGU_Y+a z1P5wFm&{ZVz0@U3Hy$uYv*?EYz7z+t~I$)>g=<2@5Cl-tKgA zV^`EB54!=MPwGV!K71y|;O`HA^^yjtgkK71!eFokVXL5?2`C9D5u1fqia!|YaL40! zg3@HaaEfjOpzrgd#a5FAUMrf$LsZ@wk(Y&P?M17=909IQew)#j+KH@=MAY=dV`Hp2 zFjJGct8%WaVs?ZItvYhZKa}pj^O-p+gkZ4*p=K_GBuT&|JG#?z1z!`iM<IOHzD9|+dE67-t!hC7{93ehV10o7nLWTn8? zDG5|#!W5?o{5pdJi9PFNmrA!LT=4Wk?CQ+T)evL4jXC!b1O(tw1)k>~yNAiN=I@s7 zXDym}{tCTy>fhSTtZOQj?`aFM0%}`J-5*i&MJWtEcb0j2C3$vK%L*hf^Q<AEGl%I=x%W+a>D0 zp*I)-Tx%=$9``&)o$f$^;lta$tD!?S%w*y%m;TFSt)ojNng)fu)|`LJdiY??631_7 z+b82Td@zu@%(IRbV?TP*hl~GccWbRY&dxKtR>eSKs8^)7UpPL*ilu?$J@WlHvvKNIny1L;c6PeOGdzn8R;WpdKPy zgnmqarBH~7(RZINW*P8OVfIu?IZ8r)z9?Ld`yYD`Q^*1e$LzDJ%>;y1JV zzugJnKuP!DAzZ|fYk<4%hw<9$`h);@s9uyFGkba`_94)4`y)>Mv6VP>Pt1+BU3iht zS$s47J)O-y3n*|*dBl&IuTCp`4S2hZnzvmE%-W<#N;i!&4;(7At`tZNs_shwxTwB@ zAQF>_1e1i`;slYKL{n6j$BPTEd&m=&_gI*{zvK-~9+4=8?=k~m8I;P>B~OTua&P*s zEg>%o(Q-lK@r8%>9tGcs0kIEknhsrhT|Gdxg3-VY?$qZ#V=96gEfq5AcuwBLUz>Ht z%{@~F@w+M2l&{Y4;I1X&joR<1sWX3khtY|vHZ_G>A|&+{H-mDkEP6A?=!oHMCEm_T zm1}TSCVO>yznlVLzru_*K2fj7FOiqmtg8@2x=WvDWdxLCxJDbsiuYu4D)XYgvy3?L zmY~|k_A7pevYwQwWNu(g&f*)*U#o5rsSbu%nH&*g=LWOW%dZFSu3iZo61-GC3+49v z4?-B`EWLsa{0S_MX#*Cym76>)C1Hn{AT)lrxdvImnn%m99`DR|H{42IuuTQ!H9f#HBW^vA@tJ9dW2$?u+uK zP6k#U%xS4dk^}s;EK|69IeZ!M`*S%~p1OXFHt8nf*UoKqWR~VtU7DAnZ!Bk3VEB-UAuN$G0B%!jUUy`miLaA;PLY7T>=^egbz%pEJj*N6zoQ4(2vFWDz zC4RfjPg&|bK9*L z;r^rpB+^RmT%y{Bxw+bJM*qWv7@I)9;6sunD=*_srx(mZADvmp z8RlNa*G_`YguWSUX=zBMv?R^?oQ`DdSufS*E*wh$e7wF#9BrZ+kMFkS;rNfNQmphG zmRwbR@RoQSr`1~F`STA{uuh9|{tun4|yl6q}L+>iB(zI?ro8!9|viC$|4`0g|T>JyH|G$!5ChfUt6rnyf-l zY`6TjF#MH30x%ULaZ-#n8*&ukp|it>={qO?hkI_L9U+!iFBNz>-$Chz+JW`#cr>fZ-T1ed$BlNzcUG9-^)an&gAwObitHV^gAGBGEUBpb>-vmiR9e67LLgZvO}ui=NFfg$zXqe;qEzQ zfTv7?GTA0mxzBqVSp0}n-UWCip%1AD>j7pWHy%Q5iBMhU_{nInH-U>DetVe43mjyg zOk{jzG8djM|Ne~Od}C{pJhX0@rVZo$mAB!ynb*-1gaK)o1O86JKEnLkirVuAuEwYm z0%^iLcMwC7a#NGb%w{T3iQ$m*$+>q|MuUEj58mycf)c7<8=df8ZWl^{kLrI+P?m3~ z7Ie(um2a@cJO@W7zE>*ob_%#9R(`iSCOZ{6A{7-cp->%uV5}c(I&=0F(nxs!FtbSC zEL{zpXN3hM*dvlsea}k1Usm&dpu=NC6VAUlls6yucNg1eVv`S`&|Y z*Kgw-Wb=*yJXq^oj~}+B$06VbB;`HaE|lR$lK<7i&d5OjYpj-N7Iie*^z2(SwAll9Es97q)x8-|e@_guTWZAJ;4wp2mBvc^07&vAQ zNW<+dUnT@RI;Y-mE~wytfy}QiJ8S%%kudPYXmj?WY`b2~@1GF&ey!kJ!+<1YOYk8e%T&lJ^T)qH2;kLQ|Qx0NoK)If}A|wRjJW@;~8Q2{D84e zh$xg_vo0HLq}BnkNvLkbBkbl#I~+b&Q;Tt-cL=FEX)IyQK=jk?_UK%V%XyE-x*g7KELHwk$uR(wk0hX)99i^>{N#MOd znt;)(1C9|6QisLQbyWb>o#$ML4P7r|_UH(c$V1g#j?@(kIUM0>9FUbvJ_q3SLRgl- zz`vgMTL{j{>pfO(bgEq-Pd~2m?%k1xHOO1|t*zseiQi?qX|N!NP$={=(wM;Y!q4dc zN78i5^#}&t+fs14H}Z!q!qHnO=C@yMGcKIK^QJn`&K)`Tm0-=84}Q5LVNMYQ`%O@Z z#Q4}x5Yf2#dWeExXs8d`$h3fAV-*1+8<+y`YQ;Q4w>@PYLK&Q`r5qMV+={N+6(L7x zcjy4+(m1M;XA5sIhd3e4YGbstUiaM8*CaC{tHfydL~1Nq{GA4|N?iFQQ$pXx2=-)X zF(l(OT7Tn|BwZofV<<~U!|oJAMmS^wJ9+lyE8{(>3LUIyjSDulBd8R~IKkjzsU3PJ z7X<&^o>GKLsOP8nn8qDUT?erA00jiG1Q*29R#1?Re{bkj&B4%8yX(f*15WMn!T^q< zIWnOn@3X_@Nm#b(1%W!xS|t+5`ih&Xl!vZ1a&Q#sOvm{9y{TvBa{{gqJJ0HxX5%(A zC%2;5YKq{>gl@^3u)M^;2by53i_jwLuk}|2v!Nn{*w@2&<@HgqU9q>K)I1H3 zI`xB2PDsNiHqA=m$sE%iecwBu^G4_e+J?vKeS+sx3hcN7=U)NId$XM;jtNm85*HN} za`VhxhJDdFv3&dmxiT9iFQc1Ml|6e8_`=>Q#t=!Xtqd>zkE1&EL~aWxza%5kG|%kX zXLGFDz%zm-_IGnYL}D=t?e-RGZ>C2_M#gpwyHLU;OB7@SH<=}`%4R(6?kpRFoztMA zo$4&(iP3y{A%Cp)lo!(GwBac79|Mj5n`K(tl5@3%NMq)+CrTsLNKMML={Z>1V; zPfwl|@2qTVlfwGID4i2w#BVbF+Qzyu=7k_;2N8`4&Yh$zbj|xF29P&(3TB)K(qOC- zKZ3KGf~rPWRLr%?Z(p;sE6T{p!^X4i8u?a?Y~K$Ee(0B_1MjNTdOJl`ibwn-tqz%+ z)wt-NYGP)|%qzifjNXaC)8$(jJSpXl+j26n!FJnvwUAYRjD3DK!IF`!$E}Cjm%FV+ zQ!G-J16)}yqPQ}bJIcoKd{*4o`O|X&&ki z+iJZABG9~Hp-mF=QWVzgZbQEx4y6Tnlvdk9HkHMH0|j^HmR|M}6DopoT-Jt7b`;a* z{XMif%Crvfx*{6a$O(j8tZf1RcCLNJW!wv298YBfb*8)@eZA7@x*-L;fOI>i4c0A{ z;0=aF-Ar^RzW`OSFH54V%yu7fXdm()7&G)5G*;VN*@@?<)9GSR%H}hDt z&A2V42<+#FWX`3wE93X?^vKxTghF=FT_>ib8X-Bn(gvYObFDM6n`bh)O>r@^`jRtN z05P?;Ve+-=%4+_{oc7Zl-sDUbdyI<}_yPXtb-ir4ydmlBrp!R5!j0smvBHw6+d|y0 zxhunBBZf1=A}cdG3m+|wInDi6{V_@6SK;OGL?9T&vNA&dL$UnCEW87Du=H}bL}|fl zWfHGaV=1lILlX1Sxlw*{0(4L^Ok14+SB#wZS~BV`D@>F3Hsr6fr9r;QRjA{qEFV6G zvDLDIhE?x+&CTvCxZwu*%MeQt4;&6(Gsmgqv?of8Wk>S7!M75w?|BYcEgTrP%RIGp z73b!Iz~ZTJTaVb0N9?HgR@g{97qX*@=6l(N1bPhl0-l-#*<)uqJW+oJ{Dj^5=vVI> z$_Eyv9Ds5b`%DQNrc4@_2SotoM@^`bGSjpEwwZJ0ovai|TUVHN=0~x8&-$w~qRG+F zKvuDe@`^miEbp0lYj7l)`2;wPI3l5muj75!+lY5(y{9^5fe2n0Ra3Oar7_z}X}-3dfZ4Q_9sMCYEiASN zhjJ=7u2#j}&Nx+?T8cJ?FK`B;4jx?UFZh!lwJyvfAb|+)S~>omY3;VViub9IQ z#GI{34-sh`s`EUXWpL-u2yYU3xb)DBbH!a8S5wH(R|*3-n){CX|hQC<^4GP zMXt@mAj>RzVX^4qhn4`DE)En5?=rTP;`<9z8>mLhRzdjTmi*BMB8R31=wc}QV{RewGd#uj)O*k$`WDExD#>RhRro+@$f)ZTDE z+Z8LJ$8JZ=P7T4@K_ajbL$<>b#-5pufHzAX`_oO*#q*y|4P;F30uB@S2k;x?`8R>h zNL5CA188^etL!uV=Z`z5Y$=@Pl9+o;DPhM$6W}(4JT=a+*KI<{GaXig)6V65C$efk z#=FyaGxJ>HHYp5SIn7_CNlvIllB*`WG4zT~LefMBMQj&KD%d}#z83?9_i0#EF)4FM zCU0_L6~}H-;M;qpu&rmDobMe{C^j+_BriEj4^P{N7i3fEa?r1f*~ROVofu)7Orf*8 zp!FQ3cVK_h?0J}^q(@gleuaJjST4?;BPP95?1^`-!T?!jlV9VvcSBy5QT=&~r>3gP zKYDG6u5hviR(r7?(M^sFdC9s`ZbPwO!MvkH%3u{{Ntz%fS3d&u?oTycbuyO*Lmf#V(N5CxX-*M`(&)SORODhfsJ09V6QkbHSH((>i(J-lP zwCI{6CygKSp%*-4NXTX$fZORYe-gfN&$}l+GLK5dr5x)nwbmZ(qJjsAdIp_~wDOHY z1*ME>d*e8!J?HIHKqZ7Pak_9n-Q%Nx_vcwe^9;Q28=%- zuP38jqulae%KUKP*4WT^PBswZjn>eK&6RiSWGme<7K`2;>*_b8P<^JL?B)R?LFVcv z?6sOe{b`p|0tMtDQBk`RoHtaU^S#EIgJJq z>Xrho({nGpCsQpy^V*i+qc9d()1>71WYzGnHDuPb#@sbSpWP7n6PmwbbNXNNQW2;! zTtpaNw~iYnHGk#sfR*o@xL>HDqz_ECP6+?Gg)ODTkMIlx*|z2GbEz)vh;`HsS_}M zbj;r4%MG zZ?)CwUN`;4Ilk#s*m%FK3Xd;K?IqrTB!%Wb8>+vxQLhNuJ3Umw1F&|oOcT9PYO=Zl z-lsWo@pXevRzvTND)(x*C*p?su@-11Bi0}@xCpVO>ohvQmN;(EVn6Dr=<43fvwY`( zX!z0rV)dnCWYt>i(|MiSR?qtKIdS1pZ!DABLoAE($0Oh znq=}^2r!bfm`vR0kF{#b&jd>ii_`i~jF|}hCP0w)D<)g&H6dMs4}e3Zl1U@Sg5gOC z7AEZ%Oom25gf}x>EV!HV%K?>R4aG65Be7qYAR8aDs&!N%>I-~3kMjcCs{77ia}X-o z2$(LAUmR^X{DL-ik(a`^0tM7h!6=GL##4@4v&QL1TjBw5b_+u}{l?`HlX=EV!UKWL zS`Snne;LQT$IQDkzqA&)i!viHr|U{Y2~*{G!_EFfT$^Tq6vDnp9SQzaqMgHhIAzQx z_X&s6_(=vVDL_m{7YI=Fat5hDLRQo@*w3{?vn;BqrExENu5@R_o~A=AyY$+{2v4q!jTV)mAWmGc%b82fj_&m64r&L9l{aLW z-IXwfe(}`EW(95jVi{8|OJ!be){+($d(Pi9spSV`=!#70Uy;&5m|X6NOU|lnynn~2 zD3o|mgOYu7nkbH+ctXJQcTvP%_7yDIap~46CGExE3~pzb?R;b9(7B+Pal2~B48Ob4jd30Z8BZliY3~$Rs51Gw6h}it1ck^~2XVg4>dGB&qYhGl)DGfL!paKbMxKUu$?& zqw_?&Rj*sGu>8*eiO89j6HE!ptgKA{MXCn?DE`tE` zCfX0s8}eKqMN0jb;Wb@s(_**X8(4@BbmEnjuX)ukS~TA$YNmQn0Nt<-AH5J!d#CPV ziw*y9sLGZCkV&Zq!(CIP$?W8Ei=Xc;X`RQ&m|+VdIlIH8F()ah4yRi!#xSK#o|MGZO z;yC{X-2F3?Kve(#DNy_G$pSvmOb9I34t(a*^zvgjmuB`)v=51cN#a3pKCv2jtR7W1 zVJv41ZHTGzkFnCLZb5ikt9VPnGTBijbfu`hH0U=u zRCs*_GnRBLgA{q}E}t3Eaq+T*;SIx?=uklp&YDrJRAN#=oQZ%1-*v|Nf^z zlK=07NFS#zK5=PkuA4(~;b{}2zr6-r zPC-`M+IC0uDMu09f)&{d^n_wXegM*uxV0is38^K{Jw|8mqL}D4KN8j!fif;A7Bk-> z)OL`Q3bzS`g(^U4QaI%nw?(tG7^W?4uZQn5b>i>h3P=BD{m(iIM_=JgC++2tr`!~w zJj}b5M;pJVbB>NZkqgJ%8|hj!##b+&MA{@1)bM>}qzagWdY`tB2}6PVhH&A4;B1sM z*CG8)TcY7O=6&YdE0P2kNP>rd-`;38?t0DFKV+dZ3=qv2JV}H#3Kuk zU{}^;Xm(_O zKe9eJBSiGSMBs^vXP+Tuuu}`U*tpDD1-5hRp3}qVPeP$@`jE&uIy7Y3Amr+k{`^Ya z(V&qRN@mwViX`Vu)rIrb-Le+OEzau|KYc>$%;(<~8o+sVi)3s^Dh_g=RbTTAsI-mt4a{pGxRv>%~t$X z+7UYiA!&P%f5+tg-9x+8>3HTIQ7{B&K4&KH3k2rX$^5AYFxc*ha6&SvxR}Xa_NW@a zWU}3rIPC^@n2{2b)dQ?#Hu8v@egT1uZStMI6#o-^a-$4bBPqHEz(^Do)e&po=p#DTQxf6QB?NMKqzh0b8`CP3Jf0HDZ zn05STsZ05`@DThCq)SzaOoO!3H=3eP8)DsYyk+8fZY#DaGdYm-mw*=fR55k-VEOg& zpU(HJK)ihuaftk73|GXtuH{n85IiwRXc+defo{x`$8~1s?Uq=@SmQ`YM zhZO2ac`ixvQ@>m1Qh3=ynn4w-ZMH0~b^Thq{r+Z&i<=B6wL>mR)&DU+nyC;G>7+@# zJ0g8W52_!=u}Ib`iVg=iF)<(S04PG*tOQ!T>B_-va^)Mq(xpMoCE_IfM#7q%$xnle za%V^RYuAEIqOyiPx6G|scNUY|tnfP8OK($JH`tto3j)cKI(d7imbRsJjh+kYwV6JC zo06@o=7O<6n&PuYsDvB|w~1+r=Rs;7`EBpn(fPCD%8 zTU3cMD?9_7cF$?n%Qj{MLv1hwRU|6W0vffB3{=pXF|U0e_pLE{H|j^4t!%1CR*6oP z><;oED6sEV0F+@=p=kr+!+l{k78#SClO(YgV>rc`+tecV#zH+iHIkIUQBVq!x9r;YP51@QiLrMI zW7e8?2*ft^pn`^CnOre;2pLRCZ(+)-BQO!}K|gJ=OQf_#qS|&q3{f0)-Gd7hzZn%) z6k%!+ucp3ywM)JkV&vqqd9?%PeX#;|v1s@@V;JXDhv-6zE4*nL42Lz^<+|Xfxp+Soi`l&hO3|@; ziY9C$m`kN+@|>vuv<1tTfWQW9!k_su&0F4PtdO~vS-!ig3-?qk8u1(1GZtFmgY5H3 zC}BEzgnQHGB)}7v*@#s<8ee-T1P+6Q-M#$-$0YxA+hJ@2wqC<{RE!Z~%kq1_S4>#8 zUap0;6PxA?G0;n|Awj!R*iha2-NFi<&;vokKL!flq4`B%IvT{s6(LBkR{~EpDle~b z_0&)kl>2c2g|5p0y*8HgGrz52=pGs+GB-UVHW4^3aYAk>+SHyDbXmt9cAkv@A#l z1}_z{HgO)&9*5Y?MyCB5F^+iIZ#9c(wY_b+tLW8>t~uGqs56pA377{uOUKQ2((A`sXo` z`)F?A%GdRcrk@su(|=c!b5wW15AJzW*xBXg`#v#%AH81xIAd}-^ZF(KXjz@fXxNd+ z`~BTN6n4EgRFT2ryIpAn_zOesyWa`hVJhGDJv-~z3Oei(behRdw{?v0rsuxB+MhNI zW{U&L*h{G1^1b{f+`2h#5D1nP%_{bJ=m*3TIOvQazsP4LY44>3hI0Dvhk2NgvK==C zsc?<@o_C}(WH{OKeTQ(o=oL*XX{&W@LMP~-dbwz;a*&v5MWn6i=O#btUVe-9@>5wR zpmi9$X@?bzTdp@w{w2fX-^hFz@X@|A503u!3|^y=3o0Qba3^)ZWCvIn1csA_jTs8T+}v3tj%Rx{K!Y5ITx0pqpSJWh<{n4Jv_a7slRo^njt5aHdiN@N&e2b> z(B8??^n5b*zUc2EdQ)wK;m?rFYj1Ef=;lv-xtMo^BDp@dV2Tf?p}N0^@0PG=*57rd zLf6H7@jFYIQ14F&#PHqrsTW0MgyZfUXFiZa)nPQ?E0GmDd*G{lV)wGV1wRR}Fpce| z=0KAg*7eVGfZdPSGY_@0i=Km%ea8#0B0~33YA9X4*Aca5Y(=6cEC*ogQo~Snm+Q>Ta=!5MsQZc7AR?*iHgHBv+8!ZUchmT ztPSEiYts3{x*lS)=Z(I8P`#XuGrRYvp^WDfqK?laV&?=b0^Bf}^MDg1taEMhbMFl! zEAb;GA=>+gURGPBW4@r1Y?WjZop$Sn0JMD`my$<(HVC**hllnhFwBa#-~AZnn=;u2 z4Bmoc0vlKL2kIiWbmob*S_=T7*rdQR#B=e-!76H{@fyZfw}oSNdl)@5Vj99Lt!l`$ zbL=VCii(bH-^u#Kt+pj*8F)PZO!m=<>zoLbN^ow58lIZ<`JK+s5ZDBjFas7 z03>m#jw#M(qm{l;LCl3|($1yQ4rZHK4nvV4y9L$w#jEb1lHf-G4{$wtt{-nU-?~1H zF$LDkpgq07ive;jrauj$y&G|P1qZf89zp5fM8CxFly|_avuEG%sJxGhIGywbP*br@&LX6Mgci{Cl+A<4Hn;d&BzOOl&ElIhVm^vn;eIeO;tVj)+i4mUUx%yFCPpQ4~H5v8UzE%Iw$2GrZZPVqqyV2?+ zyhkLq9bH22@eaWCJxn5Lr|8;NfXbkQjMaY1xMIucLl2O;T)rzoH~0IqNy?$DmeD=B zhXcSidvV)W|4Q4KVa_EkTFscU1VSn&Z~;Z2c%eS%E1JyNxUZcDSk&Cp3DIBa`kCD= z*t5`p2ABm_I*36nM0K#BCBSXcdI02Kz+%{N4m7Sw-IP6SPf7KWR?BDfxt!EG;c6H3RHqL=!%!7efQ_kv7g?E$UvP@na~7g?a7V) zVn+8`EB`iac~%pMyk$v7ZioXDzR@+1kKwyh8pjt_NivF-qzg55aqpbBeL^Ol zeQ!qK({*+J(Xef0U{(KZJ#=40)`PYBQubA>WTD2*0Xpq1CwFc6wk+-$E1CU|!0$Ht z2e0}r%i**ju3G92@hrRmpNzn@uB`s26?L`_j@S_DJIirBi@aUJ84mkLC=`5 zSPd$$D=~m}er`Wl-qCaa;x)>P8`-wUObcrM2eL~0*C2vyTokcZjp=b`GH`KU~Ig$WSwBRo*2v*2&8398{0og)kdXMbt?TvwKvh~TFsQX5*I6bB`m?pAsT1>_T`FIl%5BITZ*MkVR5 zOAqRF5b5MrR$oL4qN;0VVeG+3C84R=6`0)NL0}P4FGLw=YmU!wnar?@@R4e{Y`O)gdb{y>$AmE-^o1T=?-Wr5t!W-2Chs(O0@6(75 z_P|hg{HXNGxA1NaY5Q@+i?0vAYtSASdcY!t<@mG;D)QxlLOibMFes)i8Br^!y{Q^SVx#`SOnJ02dW& zUytY;_9nEKm^Qr8npLE;K5E%E*}ULb*7V!wiDzCb```!RsO*oAO*r*f?PKimc{Rz( zwz0PgVHqODiyjZufDVxb9`vD#Cij}1{ z7E`zT{!a6@M_5Nq=ZNHkE6g>vqH9fJVWBtf)bP&+TfGh_9o=GR-cST7NjzFGe*?QT zmT|Pv=5lYF-|D)+c|IG-8i{}thgl7-#tVR)Q$?(l7_ z*AG?jy|?55)QaTYV=Y(J#r>Y-t5TCqGO+$yBd@&Gixqs{xJ?uGH91aw&E8r>1OwLC zEmQwT@z_!m4+tq|6h!4vPs#DT*yQA1t_Q6IFwU*exPmRBQ|kxxHv#c{k<}&^8rPTa zG-|C`byb$(L~RH2b9@Fk81vS1)MoGO058TY-~hsa9J(?)&RMVQZ#ZSCgM15X#`g%E z0l`i8g^KK@6{k6faWr-0gnOLOU+b~j$E~)*m;b%k8g1st$=uwyaQsA*vEf&J^QN`F z@_@M99wxBIdnrnFWldRZI%a)$F|Uwvc$-q2ki&#OT=ED6fCX!EqP=?!pgI+yiy74) zjEIis@yQotLqxs{?dOlHAF(7Ywrg&+lAjQ-G@TlxU;I*>vPj%`rb5+hoOkr%7b2T7 zwzv8*nAQ2*>;Mn*=wspGf%mu~bu5bKRgwU2$1T45m&aATQ9(j7CwcjpktuS6x_&o! z&WpC>gBPS5KjfrbYsgu!XStmtQe$uNTkYl&ibJjOo_cecMrP)S9~Adqi7+4G^+NVd zPdHSoo0gdI>Q~EL3kmN|Oz=Wj9;pPwW^v8O28dQ53Pr*Y-t+r7F2ucC6Jkz*7VvRp zE@+lxHb2}Vph!^#gFlev-~4ijgtd5$`xt*sJ@klP=uVY;m^EN_4bah1KotnRhqOK& zPo&f{cgAHW4XX*h)p$(PaLH8@kOcpXDkCK1i^tr&aOanm7Y>Kyv}@T= zqSMi?1xrf3`o+yhH=X#1>;>|^)JqG(>uR#AqGS@L2EZ&WHS#P+G_ zoLq6ouKoGCx^&*Ctlj4~BPQ_XH^)N4rz0>@v0dY6O`!~%W2nq!6t2oQdTLBe*Y(ad zcen29tmT0oVPUuNOKKo1zjl>Y>KE>4NXRk^d8dR0g57oxBxq=hgX3-9W2HL9t37u9 z1Oz$-}8A1esqZ%V*3}9B?d?Dd{ zgV#mNEzx^*)|m@rn4vxQYfp>-`?<1{vQKk^YqQry*XimL;3>Q z1|S7PC{{T{#~8{{rcoCY00h;kgE7Pql=2l%F)>%%c}p0G0)Klg9zi@ImqU7#^Yds^ zcqNu}{5;5auB26V2|j~iaX^84DqV!bwIOKTrM91T`u1*SA48FfQW^k@@B%ltqhnSm zvLlF(Zd=aA*=V8lV-tjjlg?KY8fzxwBsfCr?6>poIf_l>BY4}3wGh63)X_6aywq;Pp^s0lm#+(yeO|W@R&jPN8=P6fi8J=6IZ8x|gM#dpDD@ncVaAN490Ur~V z`eb~fhU96fRXT#O^{pkXQp&1~fowAtuilA0Y zPUZt!zQeLr+Et&<{_lOwwvvbtv$k<3MK7DurKTD5x9pw0;(>GPxO>e?853yPU#|2X zx-Dk;GiLSS&tB)f=deA+alwLyvCYT>W@uCB#(exBLZ~mOYg2Ftye)`FMRX{d<@_!i z!FSbN`kUo+Wc6C9J98tUh-N`lwdu!R6ATyd>G@U_iXZy z-gyeBJvT0%NKCj>Zf!dI^zYD&lZtEHgmp{wP z*glXF9f1WUU6h)_>nOTbvGKcKVdojlK{K^F$=EI_+EoR>DXShgVkqC^R5~szs*84| zgy%jOw`Ni5?cmV?_)I~73FQ|?+!jIfi6L4)g72(M^ggic5zABAyx7AG`o(bPI0J0E zcKlEIu(BG`T_3GPL0=gibH8UGs5C?_l`+@1%J}J!Z=XekS43js3!kjCi)ZCpyerSo z9#vJx{Xi7E{qx-wTO#5+KQRQ${jP|M(8Mn|4nq=GXy@7;Z|qRuJC2-JwI6n?}*`iaT<-)TOdy{hyZ3%LzZ&+O;{H> znjF2W5MNz#)!~5P5W=@Gmnh{~O0CcJRV*DXJ}S9%G4ms> zL^XSCY4Aoo(KoV-o%d&s4nDq+n1tm&?Aam55`%4nF|Yl`*Zdz6V>~`PwqSawZZCZ> zO*nV#wkKXoS>bv&JXYJ4i9#|wVvDfT$W)lgNzXGUzfYYmEPs`B3uJAsYod{9!?Z= zw85T5DZQ4cr+zz#7Mv`g^sd5aZj(j89he$u!tZ$x#g*qDJM{=t_JrM<0wC+~yWAP~ z7xAE3J@#E9fV;NxnV))z@oM+BOm3Y?b?nu-5|ahTww*Zyzq^p~Z~dhx-v>Jy?1q1gSy##{oTwAQXLC@;W&+#RpOscI3gMP)z29A#7#OfBJ)Wj-!A8$Jh(7l zdU$9qD7=BAz%!nM+BwcHgb&-;8EO2_?+U23>6R1+=$mUIf%708kNOHFLK-Q0rknnJ zjQQY3Tvz7+`ncP;FiKbfo@^$hcO2@Fh2<2_|z#-u}LJH@Ok8e|f_)Gqtn*4CfD zn`r_KwYY-a^ZW-2p0>;$s~dO>#m?-J4d&kP2Q-J>+mw%ct?lq=6V`L8xW_{eP-v0s60Eoax-n1jSo=& z5ghVNxh_%UA(hav(KLNQ@Ta~=H0J6-5ud^B=j)-l_Z!)%MUFn;W;yp!?u896|D>w& z%!|f9ZImwVqnAS80dj78TqbEVCM{vxKp)ac3w>OP$cLx#d1t^wHeqYh!t@5Pr0MEl zF`uvc{G_^xZRE^!>U2C;D7nl9qdn{hWNy z5|%-RU8*x32toS3ag+&y)!g@aFQ`Ry{%l)bEp925)XY7-@Yo!Twv6+aHtK?d8Z~hf z?-x1qN$zh@m$5-0ACplpVQGazeuw)xe z7cE-8w4hncd^P6z{F={gOsLMcJ~H>n_xmZQcYx;_&g}8Ay#xLy7iZYM*s9zsWN9sE z#9lJ%sTzxZwFSuHfyK{OcFMJuh{5*@J;5^;nRN&49t9udLfLT*6|KGS*$W_#dve64 z|5w`6sOTby`;89Y5!Z%zsWzCCCQ5rVVpTo{eDUDCas5-ZS3c$dOm#L!wPc!UD|+`* zh9(-~thvmctSf^*|H~;Ku5AQFcFGY$ z(qXsml4y+lFD+j?T{vWyXoz3)*tfC=$QSsdW1@TnHPc#Ist-}%8O;cjQ8lf(^U;&e z&sU6tF^&}6TSU05uoRkn%Xc09rHNT6-NS|hf78~ooJjAZnX1(|61lgh@nF&+d0Fy8 ze#h`Iei3%Uqi#Of`zg5bPJ3F;F6D+ZGi7ot=w4x@>FRY;U1RyqV%Men!wr5slz0N` zpr^wH*NpO@rN`>p^@TyRhvX zY>$l5$0zyLkN1wlCHi1^k;bhSa;fa*Bud7MMI2u>QuV`qPeP_qvhbo$CJMJDy$&Yl zVY~s@1^hb!RpgMRO;OGHPwl7?0*j-k_h0rZO??c3ns?88v31qe;Fuyw3uj7ZAT0NU z3v=f1U7d+{FY9g4Q{%-%<*(6GzI;Du3D@MQ&4$_0NmI+~Pfb02RL z7+5YoOR2|-w|Eq&J7i_+{4&2Cd2t21{&eg2?4*yq{;w9`44sYU%P1vGc=WOzFMZ%f z&IuO=JWxlmtF!Zc=y_Ape)GuD!1b(_0myvY;g0(10=GhWkZLhWwgi-^NV%@}3EUnO zsSRvC{Ts+++L=wkyWxqVbPQ7lSrKC>%PKP**iBbH;t637E6k<6=Kbal?^;bJOIubIxI6)r zU+B7<$~HBh%vB;iXfaTgbD~Lp%8vjVEz}wrsyAut%bhEV&7DzZZ%|8*V3M*!L-_{~ zlK)D$2;GzaY6nBh?~m!A@#$kfzCbVl#i%l@>?PTNl#4a~c}s+GdtJn?+;CC7Zt0NWJ#M_%j1wj~;enr| zx}YT_b1}V?B&T9iMPNvlAe?(nVU6SgC&==nGkZUbr<*$FA4yXn(k5Yd=|8qS)zjbG z@^2UYrigUpc7=012h)D}XfZx|Nq@YSI!W6@+_81^3d>ps?$z`R=LLH~&_2Cjb#Rv$ z-)rwdJcTjSJDD(?x~XZ=k+`B7MytRtD+#;xuSA19S(Y2wG#B!j#2jpPP&+xZ3%SVZ zm%OSDYgHtgYwA9rmzp*S#_yn~yY!4N#&np<%s7a3c>IJI&F$fKUEG|SC_3;6^h&1yg|M2&O1C6o&&O%XW#Ktu}NW-T&SnBt3^m_9!D~bSuSsl=O zBb-$}znzE;ayEb59==qHLDoc2kvvWKNGij_6S3rr4;H(NgIb(+9b$rN-@^+w?WLwg zOM%PHEl&YRm3qt|AFhzK%;v+rdm-s@bM2q_AoI?E9~8P{n%!ho%AUP}((3|KAJ0ND z%0D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 diff --git a/javascriptv3/example_code/cross-services/photo_analyzer/images/cloud_formation_stacks.png b/javascriptv3/example_code/cross-services/photo_analyzer/images/cloud_formation_stacks.png deleted file mode 100644 index 7b3d853b7a7d9ab1609b94b250daccfb0077f8c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43167 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