Created
December 25, 2020 05:17
-
-
Save inoh/1d03209da75243af7492ac439832b673 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Resources: | |
| Diaries3B600A46: | |
| Type: AWS::DynamoDB::Table | |
| Properties: | |
| KeySchema: | |
| - AttributeName: id | |
| KeyType: HASH | |
| AttributeDefinitions: | |
| - AttributeName: id | |
| AttributeType: S | |
| ProvisionedThroughput: | |
| ReadCapacityUnits: 5 | |
| WriteCapacityUnits: 5 | |
| UpdateReplacePolicy: Retain | |
| DeletionPolicy: Retain | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/Diaries/Resource | |
| HttpApiF5A9A8A7: | |
| Type: AWS::ApiGatewayV2::Api | |
| Properties: | |
| CorsConfiguration: | |
| AllowHeaders: | |
| - Content-Type | |
| AllowMethods: | |
| - GET | |
| - POST | |
| - OPTIONS | |
| AllowOrigins: | |
| - "*" | |
| Name: AutomaticTranslationDiary | |
| ProtocolType: HTTP | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/HttpApi/Resource | |
| HttpApiDefaultStage3EEB07D6: | |
| Type: AWS::ApiGatewayV2::Stage | |
| Properties: | |
| ApiId: | |
| Ref: HttpApiF5A9A8A7 | |
| StageName: $default | |
| AutoDeploy: true | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/HttpApi/DefaultStage/Resource | |
| HttpApiPOSTdiarieslangPOSTdiarieslangIntegrationA1A5913B: | |
| Type: AWS::ApiGatewayV2::Integration | |
| Properties: | |
| ApiId: | |
| Ref: HttpApiF5A9A8A7 | |
| IntegrationType: AWS_PROXY | |
| IntegrationUri: | |
| Fn::GetAtt: | |
| - diaryhandlersave0ED605E5 | |
| - Arn | |
| PayloadFormatVersion: "2.0" | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/HttpApi/POST--diaries--{lang}/POST--diaries--{lang}-Integration/Resource | |
| HttpApiPOSTdiarieslangDC63781A: | |
| Type: AWS::ApiGatewayV2::Route | |
| Properties: | |
| ApiId: | |
| Ref: HttpApiF5A9A8A7 | |
| RouteKey: POST /diaries/{lang} | |
| Target: | |
| Fn::Join: | |
| - "" | |
| - - integrations/ | |
| - Ref: HttpApiPOSTdiarieslangPOSTdiarieslangIntegrationA1A5913B | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/HttpApi/POST--diaries--{lang}/Resource | |
| HttpApiGETdiariesGETdiariesIntegrationCC8B76D7: | |
| Type: AWS::ApiGatewayV2::Integration | |
| Properties: | |
| ApiId: | |
| Ref: HttpApiF5A9A8A7 | |
| IntegrationType: AWS_PROXY | |
| IntegrationUri: | |
| Fn::GetAtt: | |
| - diaryhandlerdiaries221AFC2C | |
| - Arn | |
| PayloadFormatVersion: "2.0" | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/HttpApi/GET--diaries/GET--diaries-Integration/Resource | |
| HttpApiGETdiaries07F01514: | |
| Type: AWS::ApiGatewayV2::Route | |
| Properties: | |
| ApiId: | |
| Ref: HttpApiF5A9A8A7 | |
| RouteKey: GET /diaries | |
| Target: | |
| Fn::Join: | |
| - "" | |
| - - integrations/ | |
| - Ref: HttpApiGETdiariesGETdiariesIntegrationCC8B76D7 | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/HttpApi/GET--diaries/Resource | |
| HttpApiGETdiariesdiaryIdspeechlangGETdiariesdiaryIdspeechlangIntegration134C2CB5: | |
| Type: AWS::ApiGatewayV2::Integration | |
| Properties: | |
| ApiId: | |
| Ref: HttpApiF5A9A8A7 | |
| IntegrationType: AWS_PROXY | |
| IntegrationUri: | |
| Fn::GetAtt: | |
| - diaryhandlerspeech07153E8E | |
| - Arn | |
| PayloadFormatVersion: "2.0" | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/HttpApi/GET--diaries--{diaryId}--speech--{lang}/GET--diaries--{diaryId}--speech--{lang}-Integration/Resource | |
| HttpApiGETdiariesdiaryIdspeechlangA9D4EE90: | |
| Type: AWS::ApiGatewayV2::Route | |
| Properties: | |
| ApiId: | |
| Ref: HttpApiF5A9A8A7 | |
| RouteKey: GET /diaries/{diaryId}/speech/{lang} | |
| Target: | |
| Fn::Join: | |
| - "" | |
| - - integrations/ | |
| - Ref: HttpApiGETdiariesdiaryIdspeechlangGETdiariesdiaryIdspeechlangIntegration134C2CB5 | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/HttpApi/GET--diaries--{diaryId}--speech--{lang}/Resource | |
| diaryhandlersaveServiceRoleF006DD95: | |
| 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: automatic-translation-diary/diary_handler-save/ServiceRole/Resource | |
| diaryhandlersaveServiceRoleDefaultPolicy8A38E364: | |
| Type: AWS::IAM::Policy | |
| Properties: | |
| PolicyDocument: | |
| Statement: | |
| - Action: | |
| - dynamodb:BatchGetItem | |
| - dynamodb:GetRecords | |
| - dynamodb:GetShardIterator | |
| - dynamodb:Query | |
| - dynamodb:GetItem | |
| - dynamodb:Scan | |
| - dynamodb:BatchWriteItem | |
| - dynamodb:PutItem | |
| - dynamodb:UpdateItem | |
| - dynamodb:DeleteItem | |
| Effect: Allow | |
| Resource: | |
| - Fn::GetAtt: | |
| - Diaries3B600A46 | |
| - Arn | |
| - Ref: AWS::NoValue | |
| - Action: | |
| - translate:TranslateText | |
| - polly:SynthesizeSpeech | |
| Effect: Allow | |
| Resource: "*" | |
| Version: "2012-10-17" | |
| PolicyName: diaryhandlersaveServiceRoleDefaultPolicy8A38E364 | |
| Roles: | |
| - Ref: diaryhandlersaveServiceRoleF006DD95 | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/diary_handler-save/ServiceRole/DefaultPolicy/Resource | |
| diaryhandlersave0ED605E5: | |
| Type: AWS::Lambda::Function | |
| Properties: | |
| Code: | |
| S3Bucket: | |
| Ref: AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3Bucket766D1809 | |
| S3Key: | |
| Fn::Join: | |
| - "" | |
| - - Fn::Select: | |
| - 0 | |
| - Fn::Split: | |
| - "||" | |
| - Ref: AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3VersionKeyA6913BB3 | |
| - Fn::Select: | |
| - 1 | |
| - Fn::Split: | |
| - "||" | |
| - Ref: AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3VersionKeyA6913BB3 | |
| Handler: diary_handler.save | |
| Role: | |
| Fn::GetAtt: | |
| - diaryhandlersaveServiceRoleF006DD95 | |
| - Arn | |
| Runtime: python3.8 | |
| Environment: | |
| Variables: | |
| DYNAMODB_NAME_DIARIES: | |
| Ref: Diaries3B600A46 | |
| FunctionName: diary_handler-save | |
| DependsOn: | |
| - diaryhandlersaveServiceRoleDefaultPolicy8A38E364 | |
| - diaryhandlersaveServiceRoleF006DD95 | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/diary_handler-save/Resource | |
| aws:asset:path: asset.be8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fc | |
| aws:asset:property: Code | |
| diaryhandlersaveautomatictranslationdiaryHttpApiPOSTdiarieslang23D30534Permission87E94D56: | |
| Type: AWS::Lambda::Permission | |
| Properties: | |
| Action: lambda:InvokeFunction | |
| FunctionName: | |
| Fn::GetAtt: | |
| - diaryhandlersave0ED605E5 | |
| - Arn | |
| Principal: apigateway.amazonaws.com | |
| SourceArn: | |
| Fn::Join: | |
| - "" | |
| - - "arn:" | |
| - Ref: AWS::Partition | |
| - ":execute-api:" | |
| - Ref: AWS::Region | |
| - ":" | |
| - Ref: AWS::AccountId | |
| - ":" | |
| - Ref: HttpApiF5A9A8A7 | |
| - /*/*/diaries/{lang} | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/diary_handler-save/automatictranslationdiaryHttpApiPOSTdiarieslang23D30534-Permission | |
| diaryhandlerdiariesServiceRole6A239C59: | |
| 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: automatic-translation-diary/diary_handler-diaries/ServiceRole/Resource | |
| diaryhandlerdiariesServiceRoleDefaultPolicyF0C21C34: | |
| Type: AWS::IAM::Policy | |
| Properties: | |
| PolicyDocument: | |
| Statement: | |
| - Action: | |
| - dynamodb:BatchGetItem | |
| - dynamodb:GetRecords | |
| - dynamodb:GetShardIterator | |
| - dynamodb:Query | |
| - dynamodb:GetItem | |
| - dynamodb:Scan | |
| - dynamodb:BatchWriteItem | |
| - dynamodb:PutItem | |
| - dynamodb:UpdateItem | |
| - dynamodb:DeleteItem | |
| Effect: Allow | |
| Resource: | |
| - Fn::GetAtt: | |
| - Diaries3B600A46 | |
| - Arn | |
| - Ref: AWS::NoValue | |
| - Action: | |
| - translate:TranslateText | |
| - polly:SynthesizeSpeech | |
| Effect: Allow | |
| Resource: "*" | |
| Version: "2012-10-17" | |
| PolicyName: diaryhandlerdiariesServiceRoleDefaultPolicyF0C21C34 | |
| Roles: | |
| - Ref: diaryhandlerdiariesServiceRole6A239C59 | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/diary_handler-diaries/ServiceRole/DefaultPolicy/Resource | |
| diaryhandlerdiaries221AFC2C: | |
| Type: AWS::Lambda::Function | |
| Properties: | |
| Code: | |
| S3Bucket: | |
| Ref: AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3Bucket766D1809 | |
| S3Key: | |
| Fn::Join: | |
| - "" | |
| - - Fn::Select: | |
| - 0 | |
| - Fn::Split: | |
| - "||" | |
| - Ref: AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3VersionKeyA6913BB3 | |
| - Fn::Select: | |
| - 1 | |
| - Fn::Split: | |
| - "||" | |
| - Ref: AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3VersionKeyA6913BB3 | |
| Handler: diary_handler.diaries | |
| Role: | |
| Fn::GetAtt: | |
| - diaryhandlerdiariesServiceRole6A239C59 | |
| - Arn | |
| Runtime: python3.8 | |
| Environment: | |
| Variables: | |
| DYNAMODB_NAME_DIARIES: | |
| Ref: Diaries3B600A46 | |
| FunctionName: diary_handler-diaries | |
| DependsOn: | |
| - diaryhandlerdiariesServiceRoleDefaultPolicyF0C21C34 | |
| - diaryhandlerdiariesServiceRole6A239C59 | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/diary_handler-diaries/Resource | |
| aws:asset:path: asset.be8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fc | |
| aws:asset:property: Code | |
| diaryhandlerdiariesautomatictranslationdiaryHttpApiGETdiariesC1A51623PermissionE32E9568: | |
| Type: AWS::Lambda::Permission | |
| Properties: | |
| Action: lambda:InvokeFunction | |
| FunctionName: | |
| Fn::GetAtt: | |
| - diaryhandlerdiaries221AFC2C | |
| - Arn | |
| Principal: apigateway.amazonaws.com | |
| SourceArn: | |
| Fn::Join: | |
| - "" | |
| - - "arn:" | |
| - Ref: AWS::Partition | |
| - ":execute-api:" | |
| - Ref: AWS::Region | |
| - ":" | |
| - Ref: AWS::AccountId | |
| - ":" | |
| - Ref: HttpApiF5A9A8A7 | |
| - /*/*/diaries | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/diary_handler-diaries/automatictranslationdiaryHttpApiGETdiariesC1A51623-Permission | |
| diaryhandlerspeechServiceRole7C9491A9: | |
| 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: automatic-translation-diary/diary_handler-speech/ServiceRole/Resource | |
| diaryhandlerspeechServiceRoleDefaultPolicy6E942FDF: | |
| Type: AWS::IAM::Policy | |
| Properties: | |
| PolicyDocument: | |
| Statement: | |
| - Action: | |
| - dynamodb:BatchGetItem | |
| - dynamodb:GetRecords | |
| - dynamodb:GetShardIterator | |
| - dynamodb:Query | |
| - dynamodb:GetItem | |
| - dynamodb:Scan | |
| - dynamodb:BatchWriteItem | |
| - dynamodb:PutItem | |
| - dynamodb:UpdateItem | |
| - dynamodb:DeleteItem | |
| Effect: Allow | |
| Resource: | |
| - Fn::GetAtt: | |
| - Diaries3B600A46 | |
| - Arn | |
| - Ref: AWS::NoValue | |
| - Action: | |
| - translate:TranslateText | |
| - polly:SynthesizeSpeech | |
| Effect: Allow | |
| Resource: "*" | |
| Version: "2012-10-17" | |
| PolicyName: diaryhandlerspeechServiceRoleDefaultPolicy6E942FDF | |
| Roles: | |
| - Ref: diaryhandlerspeechServiceRole7C9491A9 | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/diary_handler-speech/ServiceRole/DefaultPolicy/Resource | |
| diaryhandlerspeech07153E8E: | |
| Type: AWS::Lambda::Function | |
| Properties: | |
| Code: | |
| S3Bucket: | |
| Ref: AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3Bucket766D1809 | |
| S3Key: | |
| Fn::Join: | |
| - "" | |
| - - Fn::Select: | |
| - 0 | |
| - Fn::Split: | |
| - "||" | |
| - Ref: AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3VersionKeyA6913BB3 | |
| - Fn::Select: | |
| - 1 | |
| - Fn::Split: | |
| - "||" | |
| - Ref: AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3VersionKeyA6913BB3 | |
| Handler: diary_handler.speech | |
| Role: | |
| Fn::GetAtt: | |
| - diaryhandlerspeechServiceRole7C9491A9 | |
| - Arn | |
| Runtime: python3.8 | |
| Environment: | |
| Variables: | |
| DYNAMODB_NAME_DIARIES: | |
| Ref: Diaries3B600A46 | |
| FunctionName: diary_handler-speech | |
| DependsOn: | |
| - diaryhandlerspeechServiceRoleDefaultPolicy6E942FDF | |
| - diaryhandlerspeechServiceRole7C9491A9 | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/diary_handler-speech/Resource | |
| aws:asset:path: asset.be8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fc | |
| aws:asset:property: Code | |
| diaryhandlerspeechautomatictranslationdiaryHttpApiGETdiariesdiaryIdspeechlang24CE423APermission79BA7FBE: | |
| Type: AWS::Lambda::Permission | |
| Properties: | |
| Action: lambda:InvokeFunction | |
| FunctionName: | |
| Fn::GetAtt: | |
| - diaryhandlerspeech07153E8E | |
| - Arn | |
| Principal: apigateway.amazonaws.com | |
| SourceArn: | |
| Fn::Join: | |
| - "" | |
| - - "arn:" | |
| - Ref: AWS::Partition | |
| - ":execute-api:" | |
| - Ref: AWS::Region | |
| - ":" | |
| - Ref: AWS::AccountId | |
| - ":" | |
| - Ref: HttpApiF5A9A8A7 | |
| - /*/*/diaries/{diaryId}/speech/{lang} | |
| Metadata: | |
| aws:cdk:path: automatic-translation-diary/diary_handler-speech/automatictranslationdiaryHttpApiGETdiariesdiaryIdspeechlang24CE423A-Permission | |
| CDKMetadata: | |
| Type: AWS::CDK::Metadata | |
| Properties: | |
| Modules: aws-cdk=1.78.0,@aws-cdk/assets=1.49.1,@aws-cdk/aws-apigateway=1.49.1,@aws-cdk/aws-apigatewayv2=1.49.1,@aws-cdk/aws-applicationautoscaling=1.49.1,@aws-cdk/aws-autoscaling-common=1.49.1,@aws-cdk/aws-certificatemanager=1.49.1,@aws-cdk/aws-cloudformation=1.49.1,@aws-cdk/aws-cloudwatch=1.49.1,@aws-cdk/aws-dynamodb=1.49.1,@aws-cdk/aws-ec2=1.49.1,@aws-cdk/aws-elasticloadbalancingv2=1.49.1,@aws-cdk/aws-events=1.49.1,@aws-cdk/aws-iam=1.49.1,@aws-cdk/aws-kinesis=1.49.1,@aws-cdk/aws-kms=1.49.1,@aws-cdk/aws-lambda=1.49.1,@aws-cdk/aws-lambda-event-sources=1.49.1,@aws-cdk/aws-logs=1.49.1,@aws-cdk/aws-route53=1.49.1,@aws-cdk/aws-s3=1.49.1,@aws-cdk/aws-s3-assets=1.49.1,@aws-cdk/aws-s3-notifications=1.49.1,@aws-cdk/aws-sns=1.49.1,@aws-cdk/aws-sns-subscriptions=1.49.1,@aws-cdk/aws-sqs=1.49.1,@aws-cdk/aws-ssm=1.49.1,@aws-cdk/cloud-assembly-schema=1.49.1,@aws-cdk/core=1.49.1,@aws-cdk/custom-resources=1.49.1,@aws-cdk/cx-api=1.49.1,@aws-cdk/region-info=1.49.1,jsii-runtime=Python/3.7.5 | |
| Condition: CDKMetadataAvailable | |
| Parameters: | |
| AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3Bucket766D1809: | |
| Type: String | |
| Description: S3 bucket for asset "be8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fc" | |
| AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcS3VersionKeyA6913BB3: | |
| Type: String | |
| Description: S3 key for asset version "be8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fc" | |
| AssetParametersbe8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fcArtifactHash9798EB5C: | |
| Type: String | |
| Description: Artifact hash for asset "be8aa0c89666e07aa3951d32e83611347714a5b61d87322a3785a3681ca879fc" | |
| 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment